]> code.ossystems Code Review - openembedded-core.git/commitdiff
linux-rp: Drop old kernel versions
authorRichard Purdie <richard@openedhand.com>
Tue, 8 Jan 2008 15:40:50 +0000 (15:40 +0000)
committerRichard Purdie <richard@openedhand.com>
Tue, 8 Jan 2008 15:40:50 +0000 (15:40 +0000)
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@3428 311d38ba-8fff-0310-9ca6-ca027cbcb966

85 files changed:
meta/packages/linux/linux-rp-2.6.17/00-hostap.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/10-pcnet.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/add-oz-release-string.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/asoc-v0.12.4_2.6.17.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/connectplus-remove-ide-HACK.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/defconfig-akita [deleted file]
meta/packages/linux/linux-rp-2.6.17/defconfig-c7x0 [deleted file]
meta/packages/linux/linux-rp-2.6.17/defconfig-collie [deleted file]
meta/packages/linux/linux-rp-2.6.17/defconfig-hx2000 [deleted file]
meta/packages/linux/linux-rp-2.6.17/defconfig-poodle [deleted file]
meta/packages/linux/linux-rp-2.6.17/defconfig-qemuarm [deleted file]
meta/packages/linux/linux-rp-2.6.17/defconfig-qemux86 [deleted file]
meta/packages/linux/linux-rp-2.6.17/defconfig-spitz [deleted file]
meta/packages/linux/linux-rp-2.6.17/defconfig-tosa [deleted file]
meta/packages/linux/linux-rp-2.6.17/hrw-pcmcia-ids-r5.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/orinoco-remove-all-which-are-in-hostap-HACK.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/pxa-serial-hack.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/squashfs3.0-2.6.15.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/tosa-lcdnoise-r0.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/vesafb-tng-1.0-rc2-git-20060629.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/wm9712-reset-loop-r2.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/wm9712-suspend-cold-res-r2.patch [deleted file]
meta/packages/linux/linux-rp-2.6.17/wm97xx-lcdnoise-r0.patch [deleted file]
meta/packages/linux/linux-rp-2.6.20/connectplus-remove-ide-HACK.patch [deleted file]
meta/packages/linux/linux-rp-2.6.20/defconfig-akita [deleted file]
meta/packages/linux/linux-rp-2.6.20/defconfig-c7x0 [deleted file]
meta/packages/linux/linux-rp-2.6.20/defconfig-collie [deleted file]
meta/packages/linux/linux-rp-2.6.20/defconfig-hx2000 [deleted file]
meta/packages/linux/linux-rp-2.6.20/defconfig-poodle [deleted file]
meta/packages/linux/linux-rp-2.6.20/defconfig-qemuarm [deleted file]
meta/packages/linux/linux-rp-2.6.20/defconfig-qemux86 [deleted file]
meta/packages/linux/linux-rp-2.6.20/defconfig-spitz [deleted file]
meta/packages/linux/linux-rp-2.6.20/defconfig-tosa [deleted file]
meta/packages/linux/linux-rp-2.6.20/hostap-monitor-mode.patch [deleted file]
meta/packages/linux/linux-rp-2.6.20/pxa-serial-hack.patch [deleted file]
meta/packages/linux/linux-rp-2.6.20/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch [deleted file]
meta/packages/linux/linux-rp-2.6.20/sharpsl-rc-r1.patch [deleted file]
meta/packages/linux/linux-rp-2.6.20/squashfs3.0-2.6.15.patch [deleted file]
meta/packages/linux/linux-rp-2.6.20/vesafb-tng-1.0-rc2-2.6.20-rc2.patch [deleted file]
meta/packages/linux/linux-rp-2.6.20/wm97xx-lcdnoise-r0.patch [deleted file]
meta/packages/linux/linux-rp-2.6.21/connectplus-prevent-oops-HACK.patch [deleted file]
meta/packages/linux/linux-rp-2.6.21/connectplus-remove-ide-HACK.patch [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-akita [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-bootcdx86 [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-c7x0 [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-collie [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-hx2000 [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-poodle [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-qemuarm [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-qemux86 [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-spitz [deleted file]
meta/packages/linux/linux-rp-2.6.21/defconfig-tosa [deleted file]
meta/packages/linux/linux-rp-2.6.21/hostap-monitor-mode.patch [deleted file]
meta/packages/linux/linux-rp-2.6.21/pxa-serial-hack.patch [deleted file]
meta/packages/linux/linux-rp-2.6.21/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch [deleted file]
meta/packages/linux/linux-rp-2.6.21/sharpsl-rc-r1.patch [deleted file]
meta/packages/linux/linux-rp-2.6.21/squashfs3.0-2.6.15.patch [deleted file]
meta/packages/linux/linux-rp-2.6.21/vesafb-tng-1.0-rc2-2.6.20-rc2.patch [deleted file]
meta/packages/linux/linux-rp-2.6.21/wm97xx-lcdnoise-r0.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/connectplus-remove-ide-HACK.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-akita [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-bootcdx86 [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-c7x0 [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-collie [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-htcuniversal [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-hx2000 [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-poodle [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-qemuarm [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-qemux86 [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-spitz [deleted file]
meta/packages/linux/linux-rp-2.6.22/defconfig-tosa [deleted file]
meta/packages/linux/linux-rp-2.6.22/hostap-monitor-mode.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/htcuni-acx.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/htcuni.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/pda-power.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/pxa-serial-hack.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/squashfs3.0-2.6.15.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/vesafb-tng-1.0-rc2-2.6.20-rc2.patch [deleted file]
meta/packages/linux/linux-rp-2.6.22/wm97xx-lcdnoise-r0.patch [deleted file]
meta/packages/linux/linux-rp_2.6.17.bb [deleted file]
meta/packages/linux/linux-rp_2.6.20.bb [deleted file]
meta/packages/linux/linux-rp_2.6.21.bb [deleted file]
meta/packages/linux/linux-rp_2.6.22.bb [deleted file]

diff --git a/meta/packages/linux/linux-rp-2.6.17/00-hostap.patch b/meta/packages/linux/linux-rp-2.6.17/00-hostap.patch
deleted file mode 100644 (file)
index 20432b4..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-Platform: Sharp Zaurus C760 running 2.6.16 and pcmciautils 013.
-
-root@c7x0:~# pccardctl ident
-Socket 0:
-  product info: "Pretec", "CompactWLAN Card 802.11b", "2.5"
-  manfid: 0x0156, 0x0002
-  function: 6 (network)
-
-==========================================================================
-From: Jochen Friedrich 
-
-Yet another card known to work OK with hostap_cs:
-
-# pccardctl ident
-Socket 0:
-  no product info available
-Socket 1:
-  product info: "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02", ""
-  manfid: 0x0156, 0x0002
-  function: 6 (network)
-
-==========================================================================
-
-Signed-off-by: Marcin Juszkiewicz <openembedded@hrw.one.pl>
-
- drivers/net/wireless/hostap/hostap_cs.c |    6 ++++++
- 1 file changed, 6 insertions(+)
-
-Index: linux/drivers/net/wireless/hostap/hostap_cs.c
-===================================================================
---- linux.orig/drivers/net/wireless/hostap/hostap_cs.c 2006-05-17 10:23:00.000000000 +0200
-+++ linux/drivers/net/wireless/hostap/hostap_cs.c      2006-05-17 10:25:45.000000000 +0200
-@@ -923,6 +923,12 @@
-       PCMCIA_DEVICE_PROD_ID12(
-               "ZoomAir 11Mbps High", "Rate wireless Networking",
-               0x273fe3db, 0x32a1eaee),
-+      PCMCIA_DEVICE_PROD_ID123(
-+                      "Pretec", "CompactWLAN Card 802.11b", "2.5",
-+                      0x1cadd3e5, 0xe697636c, 0x7a5bfcf1),
-+      PCMCIA_DEVICE_PROD_ID123(
-+              "U.S. Robotics", "IEEE 802.11b PC-CARD", "Version 01.02",
-+              0xc7b8df9d, 0x1700d087, 0x4b74baa0),
-       PCMCIA_DEVICE_NULL
- };
- MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids);
diff --git a/meta/packages/linux/linux-rp-2.6.17/10-pcnet.patch b/meta/packages/linux/linux-rp-2.6.17/10-pcnet.patch
deleted file mode 100644 (file)
index 2e1966e..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-
-From: Marcin Juszkiewicz <openembedded@hrw.one.pl>
-
-Add TRENDnet TE-CF100 ethernet adapter to pcnet_cs list.
-
-product info: "Fast Ethernet", "CF Size PC Card", "1.0", ""
- manfid: 0x0149, 0xc1ab
-
-Signed-off-by: Marcin Juszkiewicz <openembedded@hrw.one.pl>
-
- drivers/net/pcmcia/pcnet_cs.c |    2 ++
- 1 file changed, 2 insertions(+)
-
-Index: netdev-2.6/drivers/net/pcmcia/pcnet_cs.c
-===================================================================
---- netdev-2.6.orig/drivers/net/pcmcia/pcnet_cs.c      2006-05-18 11:06:43.294022480 +0200
-+++ netdev-2.6/drivers/net/pcmcia/pcnet_cs.c   2006-05-18 11:10:31.548322552 +0200
-@@ -1768,6 +1768,8 @@
-       PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "NE2K.cis"),
-       PCMCIA_DEVICE_CIS_PROD_ID12("PMX   ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"),
-       PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "tamarack.cis"),
-+      PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", 
-+              0xb4be14e3, 0x43ac239b, 0x0877b627),
-       PCMCIA_DEVICE_NULL
- };
- MODULE_DEVICE_TABLE(pcmcia, pcnet_ids);
-
diff --git a/meta/packages/linux/linux-rp-2.6.17/add-oz-release-string.patch b/meta/packages/linux/linux-rp-2.6.17/add-oz-release-string.patch
deleted file mode 100644 (file)
index 22a6fd3..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-
-#
-# Patch managed by http://www.holgerschurig.de/patcher.html
-#
-
---- linux-2.6.11-rc1/init/version.c~add-oz-release-string
-+++ linux-2.6.11-rc1/init/version.c
-@@ -29,5 +29,5 @@
- EXPORT_SYMBOL(system_utsname);
- const char linux_banner[] =
--      "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
-+      "Linux version " UTS_RELEASE OPENZAURUS_RELEASE " (" LINUX_COMPILE_BY "@"
-       LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
---- linux-2.6.11-rc1/Makefile~add-oz-release-string
-+++ linux-2.6.11-rc1/Makefile
-@@ -827,6 +827,7 @@
-         exit 1; \
-       fi; \
-       (echo \#define UTS_RELEASE \"$(KERNELRELEASE)\"; \
-+      echo \#define OPENZAURUS_RELEASE \"$(OPENZAURUS_RELEASE)\"; \
-         echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)`; \
-        echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))'; \
-       )
diff --git a/meta/packages/linux/linux-rp-2.6.17/asoc-v0.12.4_2.6.17.patch b/meta/packages/linux/linux-rp-2.6.17/asoc-v0.12.4_2.6.17.patch
deleted file mode 100644 (file)
index 4f96722..0000000
+++ /dev/null
@@ -1,31713 +0,0 @@
-Index: linux-2.6-pxa-new/Documentation/sound/alsa/soc/DAI.txt
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/Documentation/sound/alsa/soc/DAI.txt
-@@ -0,0 +1,546 @@
-+ASoC currently supports the three main Digital Audio Interfaces (DAI) found on
-+SoC controllers and portable audio CODECS today, namely AC97, I2S and PCM.
-+
-+
-+AC97
-+====
-+
-+  AC97 is a five wire interface commonly found on many PC sound cards. It is
-+now also popular in many portable devices. This DAI has a reset line and time
-+multiplexes its data on its SDATA_OUT (playback) and SDATA_IN (capture) lines.
-+The bit clock (BCLK) is always driven by the CODEC (usually 12.288MHz) and the
-+frame (FRAME) (usually 48kHz) is always driven by the controller. Each AC97
-+frame is 21uS long and is divided into 13 time slots.
-+
-+The AC97 specification can be found at :-
-+http://www.intel.com/design/chipsets/audio/ac97_r23.pdf
-+
-+
-+I2S
-+===
-+
-+ I2S is a common 4 wire DAI used in HiFi, STB and portable devices. The Tx and
-+Rx lines are used for audio transmision, whilst the bit clock (BCLK) and
-+left/right clock (LRC) synchronise the link. I2S is flexible in that either the
-+controller or CODEC can drive (master) the BCLK and LRC clock lines. Bit clock
-+usually varies depending on the sample rate and the master system clock
-+(SYSCLK). LRCLK is the same as the sample rate. A few devices support separate
-+ADC and DAC LRCLK's, this allows for similtanious capture and playback at
-+different sample rates.
-+
-+I2S has several different operating modes:-
-+
-+ o I2S - MSB is transmitted on the falling edge of the first BCLK after LRC
-+         transition.
-+
-+ o Left Justified - MSB is transmitted on transition of LRC.
-+
-+ o Right Justified - MSB is transmitted sample size BCLK's before LRC
-+                     transition.
-+
-+PCM
-+===
-+
-+PCM is another 4 wire interface, very similar to I2S, that can support a more
-+flexible protocol. It has bit clock (BCLK) and sync (SYNC) lines that are used
-+to synchronise the link whilst the Tx and Rx lines are used to transmit and
-+receive the audio data. Bit clock usually varies depending on sample rate
-+whilst sync runs at the sample rate. PCM also supports Time Division
-+Multiplexing (TDM) in that several devices can use the bus similtaniuosly (This
-+is sometimes referred to as network mode).
-+
-+Common PCM operating modes:-
-+
-+ o Mode A - MSB is transmitted on falling edge of first BCLK after FRAME/SYNC.
-+
-+ o Mode B - MSB is transmitted on rising edge of FRAME/SYNC.
-+
-+
-+ASoC DAI Configuration
-+======================
-+
-+Every CODEC DAI and SoC DAI must have their capabilities defined in order to
-+be configured together at runtime when the audio and clocking parameters are
-+known. This is achieved by creating an array of struct snd_soc_hw_mode in the
-+the CODEC and SoC interface drivers. Each element in the array describes a DAI
-+mode and each mode is usually based upon the DAI system clock to sample rate
-+ratio (FS).
-+
-+i.e. 48k sample rate @ 256 FS = sytem clock of 12.288 MHz
-+     48000 * 256 = 12288000
-+
-+The CPU and Codec DAI modes are then ANDed together at runtime to determine the
-+rutime DAI configuration for both the Codec and CPU.
-+
-+When creating a new codec or SoC DAI it's probably best to start of with a few
-+sample rates first and then test your interface.
-+
-+struct snd_soc_dai_mode is defined (in soc.h) as:-
-+
-+/* SoC DAI mode */
-+struct snd_soc_dai_mode {
-+      u16 fmt;                /* SND_SOC_DAIFMT_* */
-+      u16 tdm;                /* SND_SOC_HWTDM_* */
-+      u64 pcmfmt;     /* SNDRV_PCM_FMTBIT_* */
-+      u16 pcmrate;    /* SND_SOC_HWRATE_* */
-+      u16 pcmdir:2;   /* SND_SOC_HWDIR_* */
-+      u16 flags:8;    /* hw flags */
-+      u16 fs;                 /* mclk to rate divider */
-+      u64 bfs;                /* mclk to bclk dividers */
-+      unsigned long priv;             /* private mode data */
-+};
-+
-+fmt:
-+----
-+This field defines the DAI mode hardware format (e.g. I2S settings) and
-+supports the following settings:-
-+
-+ 1) hardware DAI formats
-+
-+#define SND_SOC_DAIFMT_I2S        (1 << 0)    /* I2S mode */
-+#define SND_SOC_DAIFMT_RIGHT_J    (1 << 1)    /* Right justified mode */
-+#define SND_SOC_DAIFMT_LEFT_J     (1 << 2)    /* Left Justified mode */
-+#define SND_SOC_DAIFMT_DSP_A      (1 << 3)    /* L data msb after FRM */
-+#define SND_SOC_DAIFMT_DSP_B      (1 << 4)    /* L data msb during FRM */
-+#define SND_SOC_DAIFMT_AC97       (1 << 5)    /* AC97 */
-+
-+ 2) hw DAI signal inversions
-+
-+#define SND_SOC_DAIFMT_NB_NF          (1 << 8)        /* normal bit clock + frame */
-+#define SND_SOC_DAIFMT_NB_IF          (1 << 9)        /* normal bclk + inv frm */
-+#define SND_SOC_DAIFMT_IB_NF          (1 << 10)       /* invert bclk + nor frm */
-+#define SND_SOC_DAIFMT_IB_IF          (1 << 11)       /* invert bclk + frm */
-+
-+ 3) hw clock masters
-+    This is wrt the codec, the inverse is true for the interface
-+    i.e. if the codec is clk and frm master then the interface is
-+    clk and frame slave.
-+
-+#define SND_SOC_DAIFMT_CBM_CFM                (1 << 12)       /* codec clk & frm master */
-+#define SND_SOC_DAIFMT_CBS_CFM                (1 << 13)       /* codec clk slave & frm master */
-+#define SND_SOC_DAIFMT_CBM_CFS                (1 << 14)       /* codec clk master & frame slave */
-+#define SND_SOC_DAIFMT_CBS_CFS                (1 << 15)       /* codec clk & frm slave */
-+
-+At least one option from each section must be selected. Multiple selections are
-+also supported e.g.
-+
-+ .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+      SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \
-+      SND_SOC_DAIFMT_IB_IF
-+
-+
-+tdm:
-+------
-+This field defines the Time Division Multiplexing left and right word
-+positions for the DAI mode if applicable. Set to SND_SOC_DAITDM_LRDW(0,0) for
-+no TDM.
-+
-+
-+pcmfmt:
-+---------
-+The hardware PCM format. This describes the PCM formats supported by the DAI
-+mode e.g.
-+
-+ .pcmfmt = SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
-+      SNDRV_PCM_FORMAT_S24_3LE
-+
-+pcmrate:
-+----------
-+The PCM sample rates supported by the DAI mode. e.g.
-+
-+ .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000
-+
-+
-+pcmdir:
-+---------
-+The stream directions supported by this mode. e.g. playback and capture
-+
-+
-+flags:
-+--------
-+The DAI hardware flags supported by the mode.
-+
-+/* use bfs mclk divider mode (BCLK = MCLK / x) */
-+#define SND_SOC_DAI_BFS_DIV           0x1
-+/* use bfs rate mulitplier  (BCLK = RATE * x)*/
-+#define SND_SOC_DAI_BFS_RATE  0x2
-+/* use bfs rcw multiplier (BCLK = RATE * CHN * WORD SIZE) */
-+#define SND_SOC_DAI_BFS_RCW           0x4
-+/* capture and playback can use different clocks */
-+#define SND_SOC_DAI_ASYNC             0x8
-+
-+NOTE: Bitclock division and mulitiplication modes can be safely matched by the
-+core logic.
-+
-+
-+fs:
-+-----
-+The FS supported by this DAI mode FS is the ratio between the system clock and
-+the sample rate. See above
-+
-+bfs:
-+------
-+BFS is the ratio of BCLK to MCLK or the ratio of BCLK to sample rate (this
-+depends on the codec or CPU DAI).
-+
-+The BFS supported by the DAI mode. This can either be the ratio between the
-+bitclock (BCLK) and the sample rate OR the ratio between the system clock and
-+the sample rate. Depends on the flags above.
-+
-+priv:
-+-----
-+private codec mode data.
-+
-+
-+
-+Examples
-+========
-+
-+Note that Codec DAI and CPU DAI examples are interchangeable in these examples
-+as long as the bus master is reversed. i.e.
-+
-+  SND_SOC_DAIFMT_CBM_CFM would become SND_SOC_DAIFMT_CBS_CFS
-+  and vice versa.
-+
-+This applies to all SND_SOC_DAIFMT_CB*_CF*.
-+
-+Example 1
-+---------
-+
-+Simple codec that only runs at 8k & 48k @ 256FS in master mode, can generate a
-+BCLK of either MCLK/2 or MCLK/4.
-+
-+      /* codec master */
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(2) | SND_SOC_FSBD(4),
-+      }
-+
-+
-+Example 2
-+---------
-+Simple codec that only runs at 8k & 48k @ 256FS in master mode, can generate a
-+BCLK of either Rate * 32 or Rate * 64.
-+
-+      /* codec master */
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 32,
-+      },
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+
-+
-+Example 3
-+---------
-+Codec that runs at 8k & 48k @ 256FS in master mode, can generate a BCLK that
-+is a multiple of Rate * channels * word size. (RCW) i.e.
-+
-+      BCLK = 8000 * 2 * 16 (8k, stereo, 16bit)
-+           = 256kHz
-+
-+This codecs supports a RCW multiple of 1,2
-+
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBW(1) | SND_SOC_FSBW(2),
-+      }
-+
-+
-+Example 4
-+---------
-+Codec that only runs at 8k & 48k @ 256FS in master mode, can generate a
-+BCLK of either Rate * 32 or Rate * 64. Codec can also run in slave mode as long
-+as BCLK is rate * 32 or rate * 64.
-+
-+      /* codec master */
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 32,
-+      },
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+
-+      /* codec slave */
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmdir = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = 32,
-+      },
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmdir = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = 64,
-+      },
-+
-+
-+Example 5
-+---------
-+Codec that only runs at 8k, 16k, 32k, 48k, 96k @ 128FS, 192FS & 256FS in master
-+mode and can generate a BCLK of MCLK / (1,2,4,8,16). Codec can also run in slave
-+mode as and does not care about FS or BCLK (as long as there is enough bandwidth).
-+
-+      #define CODEC_FSB \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | \
-+      SND_SOC_FSBD(8) | SND_SOC_FSBD(16))
-+
-+      #define CODEC_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_32000 |\
-+       SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
-+
-+      /* codec master @ 128, 192 & 256 FS */
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = CODEC_RATES,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 128,
-+              .bfs = CODEC_FSB,
-+      },
-+
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = CODEC_RATES,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 192,
-+              .bfs = CODEC_FSB
-+      },
-+
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = CODEC_RATES,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = CODEC_FSB,
-+      },
-+
-+      /* codec slave */
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = CODEC_RATES,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+
-+
-+Example 6
-+---------
-+Codec that only runs at 8k, 44.1k, 48k @ different FS in master mode (for use
-+with a fixed MCLK) and can generate a BCLK of MCLK / (1,2,4,8,16).
-+Codec can also run in slave mode as and does not care about FS or BCLK (as long
-+as there is enough bandwidth). Codec can support 16, 24 and 32 bit PCM sample
-+sizes.
-+
-+      #define CODEC_FSB \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | \
-+      SND_SOC_FSBD(8) | SND_SOC_FSBD(16))
-+
-+      #define CODEC_PCM_FORMATS \
-+      (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
-+      SNDRV_PCM_FORMAT_S24_3LE | SNDRV_PCM_FORMAT_S24_LE | SNDRV_PCM_FORMAT_S32_LE)
-+
-+      /* codec master */
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1536,
-+              .bfs = CODEC_FSB,
-+      },
-+
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 272,
-+              .bfs = CODEC_FSB,
-+      },
-+
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = CODEC_FSB,
-+      },
-+
-+      /* codec slave */
-+      {
-+              .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FORMAT_S16_LE,
-+              .pcmrate = CODEC_RATES,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+
-+
-+Example 7
-+---------
-+AC97 Codec that does not support VRA (i.e only runs at 48k).
-+
-+      #define AC97_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+      #define AC97_PCM_FORMATS \
-+      (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S18_3LE | \
-+      SNDRV_PCM_FORMAT_S20_3LE)
-+
-+      /* AC97 with no VRA */
-+      {
-+              .pcmfmt = AC97_PCM_FORMATS,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+      }
-+
-+
-+Example 8
-+---------
-+
-+CPU DAI that supports 8k - 48k @ 256FS and BCLK = MCLK / 4 in master mode.
-+Slave mode (CPU DAI is FRAME master) supports 8k - 96k at any FS as long as
-+BCLK = 64 * rate. (Intel XScale I2S controller).
-+
-+      #define PXA_I2S_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF)
-+
-+      #define PXA_I2S_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+      #define PXA_I2S_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
-+
-+      /* priv is divider */
-+      static struct snd_soc_dai_mode pxa2xx_i2s_modes[] = {
-+      /* pxa2xx I2S frame and clock master modes */
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0x48,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0x34,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0x24,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0x1a,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0xd,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0xc,
-+      },
-+
-+      /* pxa2xx I2S frame master and clock slave mode */
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = PXA_I2S_RATES,
-+              .pcmdir = PXA_I2S_DIR,
-+              .fs = SND_SOC_FS_ALL,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .bfs = 64,
-+              .priv = 0x48,
-+      },
-+};
-Index: linux-2.6-pxa-new/Documentation/sound/alsa/soc/clocking.txt
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/Documentation/sound/alsa/soc/clocking.txt
-@@ -0,0 +1,314 @@
-+Audio Clocking
-+==============
-+
-+This text describes the audio clocking terms in ASoC and digital audio in
-+general. Note: Audio clocking can be complex !
-+
-+
-+Master Clock
-+------------
-+
-+Every audio subsystem is driven by a master clock (sometimes refered to as MCLK
-+or SYSCLK). This audio master clock can be derived from a number of sources
-+(e.g. crystal, PLL, CPU clock) and is responsible for producing the correct
-+audio playback and capture sample rates.
-+
-+Some master clocks (e.g. PLL's and CPU based clocks) are configuarble in that
-+their speed can be altered by software (depending on the system use and to save
-+power). Other master clocks are fixed at at set frequency (i.e. crystals).
-+
-+
-+DAI Clocks
-+----------
-+The Digital Audio Interface is usually driven by a Bit Clock (often referred to
-+as BCLK). This clock is used to drive the digital audio data across the link
-+between the codec and CPU.
-+
-+The DAI also has a frame clock to signal the start of each audio frame. This
-+clock is sometimes referred to as LRC (left right clock) or FRAME. This clock
-+runs at exactly the sample rate (LRC = Rate).
-+
-+Bit Clock can be generated as follows:-
-+
-+BCLK = MCLK / x
-+
-+ or
-+
-+BCLK = LRC * x
-+
-+ or
-+
-+BCLK = LRC * Channels * Word Size
-+
-+This relationship depends on the codec or SoC CPU in particular. ASoC can quite
-+easily match BCLK generated by division (SND_SOC_DAI_BFS_DIV) with BCLK by
-+multiplication (SND_SOC_DAI_BFS_RATE) or BCLK generated  by
-+Rate * Channels * Word size (RCW or SND_SOC_DAI_BFS_RCW).
-+
-+
-+ASoC Clocking
-+-------------
-+
-+The ASoC core determines the clocking for each particular configuration at
-+runtime. This is to allow for dynamic audio clocking wereby the audio clock is
-+variable and depends on the system state or device usage scenario. i.e. a voice
-+call requires slower clocks (and hence less power) than MP3 playback.
-+
-+ASoC will call the config_sysclock() function for the target machine during the
-+audio parameters configuration. The function is responsible for then clocking
-+the machine audio subsytem and returning the audio clock speed to the core.
-+This function should also call the codec and cpu DAI clock_config() functions
-+to configure their respective internal clocking if required.
-+
-+
-+ASoC Clocking Control Flow
-+--------------------------
-+
-+The ASoC core will call the machine drivers config_sysclock() when most of the
-+DAI capabilities are known. The machine driver is then responsible for calling
-+the codec and/or CPU DAI drivers with the selected capabilities and the current
-+MCLK. Note that the machine driver is also resonsible for setting the MCLK (and
-+enabling it).
-+
-+   (1) Match Codec and CPU DAI capabilities. At this point we have
-+       matched the majority of the DAI fields and now need to make sure this
-+       mode is currently clockable.
-+
-+   (2) machine->config_sysclk() is now called with the matched DAI FS, sample
-+       rate and BCLK master. This function then gets/sets the current audio
-+       clock (depening on usage) and calls the codec and CPUI DAI drivers with
-+       the FS, rate, BCLK master and MCLK.
-+
-+   (3) Codec/CPU DAI config_sysclock(). This function checks that the FS, rate,
-+       BCLK master and MCLK are acceptable for the codec or CPU DAI. It also
-+       sets the DAI internal state to work with said clocks.
-+
-+The config_sysclk() functions for CPU, codec and machine should return the MCLK
-+on success and 0 on failure.
-+
-+
-+Examples (b = BCLK, l = LRC)
-+============================
-+
-+Example 1
-+---------
-+
-+Simple codec that only runs at 48k @ 256FS in master mode.
-+
-+CPU only runs as slave DAI, however it generates a variable MCLK.
-+
-+             --------                 ---------
-+            |        | <----mclk---  |         |
-+            | Codec  |b -----------> |  CPU    |
-+            |        |l -----------> |         |
-+            |        |               |         |
-+             --------                 ---------
-+
-+The codec driver has the following config_sysclock()
-+
-+      static unsigned int config_sysclk(struct snd_soc_codec_dai *dai,
-+              struct snd_soc_clock_info *info, unsigned int clk)
-+      {
-+              /* make sure clock is 256 * rate */
-+              if(info->rate << 8 == clk) {
-+                      dai->mclk = clk;
-+                      return clk;
-+              }
-+
-+              return 0;
-+      }
-+
-+The CPU I2S DAI driver has the following config_sysclk()
-+
-+      static unsigned int config_sysclk(struct snd_soc_codec_dai *dai,
-+              struct snd_soc_clock_info *info, unsigned int clk)
-+      {
-+              /* can we support this clk */
-+              if(set_audio_clk(clk) < 0)
-+                      return -EINVAL;
-+
-+              dai->mclk = clk;
-+              return dai->clk;
-+      }
-+
-+The machine driver config_sysclk() in this example is as follows:-
-+
-+      unsigned int machine_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+              struct snd_soc_clock_info *info)
-+      {
-+              int clk = info->rate * info->fs;
-+
-+              /* check that CPU can deliver clock */
-+              if(rtd->cpu_dai->config_sysclk(rtd->cpu_dai, info, clk) < 0)
-+                      return -EINVAL;
-+
-+              /* can codec work with this clock */
-+              return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, clk);
-+      }
-+
-+
-+Example 2
-+---------
-+
-+Codec that can master at 8k and 48k at various FS (and hence supports a fixed
-+set of input MCLK's) and can also be slave at various FS .
-+
-+The CPU can master at 8k and 48k @256 FS and can be slave at any FS.
-+
-+MCLK is a 12.288MHz crystal on this machine.
-+
-+             --------                 ---------
-+            |        |  <---xtal---> |         |
-+            | Codec  |b <----------> |  CPU    |
-+            |        |l <----------> |         |
-+            |        |               |         |
-+             --------                 ---------
-+
-+
-+The codec driver has the following config_sysclock()
-+
-+      /* supported input clocks */
-+      const static int hifi_clks[] = {11289600, 12000000, 12288000,
-+              16934400, 18432000};
-+
-+      static unsigned int config_hsysclk(struct snd_soc_codec_dai *dai,
-+              struct snd_soc_clock_info *info, unsigned int clk)
-+      {
-+              int i;
-+
-+              /* is clk supported  */
-+              for(i = 0; i < ARRAY_SIZE(hifi_clks); i++) {
-+                      if(clk == hifi_clks[i]) {
-+                              dai->mclk = clk;
-+                              return clk;
-+                      }
-+              }
-+
-+              /* this clk is not supported */
-+              return 0;
-+      }
-+
-+The CPU I2S DAI driver has the following config_sysclk()
-+
-+      static unsigned int config_sysclk(struct snd_soc_codec_dai *dai,
-+              struct snd_soc_clock_info *info, unsigned int clk)
-+      {
-+              /* are we master or slave */
-+              if (info->bclk_master &
-+                      (SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS)) {
-+
-+                      /* we can only master @ 256FS */
-+                      if(info->rate << 8 == clk) {
-+                              dai->mclk = clk;
-+                              return dai->mclk;
-+                      }
-+              } else {
-+                      /* slave we can run at any FS */
-+                      dai->mclk = clk;
-+                      return dai->mclk;
-+              }
-+
-+              /* not supported */
-+              return dai->clk;
-+      }
-+
-+The machine driver config_sysclk() in this example is as follows:-
-+
-+      unsigned int machine_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+              struct snd_soc_clock_info *info)
-+      {
-+              int clk = 12288000; /* 12.288MHz */
-+
-+              /* who's driving the link */
-+              if (info->bclk_master &
-+                      (SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS)) {
-+                      /* codec master */
-+
-+                      /* check that CPU can work with clock */
-+                      if(rtd->cpu_dai->config_sysclk(rtd->cpu_dai, info, clk) < 0)
-+                              return -EINVAL;
-+
-+                      /* can codec work with this clock */
-+                      return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, clk);
-+              } else {
-+                      /* cpu master */
-+
-+                      /* check that codec can work with clock */
-+                      if(rtd->codec_dai->config_sysclk(rtd->codec_dai, info, clk) < 0)
-+                              return -EINVAL;
-+
-+                      /* can CPU work with this clock */
-+                      return rtd->cpu_dai->config_sysclk(rtd->cpu_dai, info, clk);
-+              }
-+      }
-+
-+
-+
-+Example 3
-+---------
-+
-+Codec that masters at 8k ... 48k @256 FS. Codec can also be slave and
-+doesn't care about FS. The codec has an internal PLL and dividers to generate
-+the necessary internal clocks (for 256FS).
-+
-+CPU can only be slave and doesn't care about FS.
-+
-+MCLK is a non controllable 13MHz clock from the CPU.
-+
-+
-+             --------                 ---------
-+            |        | <----mclk---  |         |
-+            | Codec  |b <----------> |  CPU    |
-+            |        |l <----------> |         |
-+            |        |               |         |
-+             --------                 ---------
-+
-+The codec driver has the following config_sysclock()
-+
-+      /* valid PCM clock dividers * 2 */
-+      static int pcm_divs[] = {2, 6, 11, 4, 8, 12, 16};
-+
-+      static unsigned int config_vsysclk(struct snd_soc_codec_dai *dai,
-+              struct snd_soc_clock_info *info, unsigned int clk)
-+      {
-+              int i, j, best_clk = info->fs * info->rate;
-+
-+              /* can we run at this clk without the PLL ? */
-+              for (i = 0; i < ARRAY_SIZE(pcm_divs); i++) {
-+                      if ((best_clk >> 1) * pcm_divs[i] == clk) {
-+                              dai->pll_in = 0;
-+                              dai->clk_div = pcm_divs[i];
-+                              dai->mclk = best_clk;
-+                              return dai->mclk;
-+                      }
-+              }
-+
-+              /* now check for PLL support */
-+              for (i = 0; i < ARRAY_SIZE(pll_div); i++) {
-+                      if (pll_div[i].pll_in == clk) {
-+                              for (j = 0; j < ARRAY_SIZE(pcm_divs); j++) {
-+                                      if (pll_div[i].pll_out == pcm_divs[j] * (best_clk >> 1)) {
-+                                              dai->pll_in = clk;
-+                                              dai->pll_out = pll_div[i].pll_out;
-+                                              dai->clk_div = pcm_divs[j];
-+                                              dai->mclk = best_clk;
-+                                              return dai->mclk;
-+                                      }
-+                              }
-+                      }
-+              }
-+
-+              /* this clk is not supported */
-+              return 0;
-+      }
-+
-+
-+The CPU I2S DAI driver has the does not need a config_sysclk() as it can slave
-+at any FS.
-+
-+      unsigned int config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+              struct snd_soc_clock_info *info)
-+      {
-+              /* codec has pll that generates mclk from 13MHz xtal */
-+              return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, 13000000);
-+      }
-Index: linux-2.6-pxa-new/Documentation/sound/alsa/soc/codec.txt
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/Documentation/sound/alsa/soc/codec.txt
-@@ -0,0 +1,232 @@
-+ASoC Codec Driver
-+=================
-+
-+The codec driver is generic and hardware independent code that configures the
-+codec to provide audio capture and playback. It should contain no code that is
-+specific to the target platform or machine. All platform and machine specific
-+code should be added to the platform and machine drivers respectively.
-+
-+Each codec driver must provide the following features:-
-+
-+ 1) Digital audio interface (DAI) description
-+ 2) Digital audio interface configuration
-+ 3) PCM's description
-+ 4) Codec control IO - using I2C, 3 Wire(SPI) or both API's
-+ 5) Mixers and audio controls
-+ 6) Sysclk configuration
-+ 7) Codec audio operations
-+
-+Optionally, codec drivers can also provide:-
-+
-+ 8) DAPM description.
-+ 9) DAPM event handler.
-+10) DAC Digital mute control.
-+
-+It's probably best to use this guide in conjuction with the existing codec
-+driver code in sound/soc/codecs/
-+
-+ASoC Codec driver breakdown
-+===========================
-+
-+1 - Digital Audio Interface (DAI) description
-+---------------------------------------------
-+The DAI is a digital audio data transfer link between the codec and host SoC
-+CPU. It typically has data transfer capabilities in both directions
-+(playback and capture) and can run at a variety of different speeds.
-+Supported interfaces currently include AC97, I2S and generic PCM style links.
-+Please read DAI.txt for implementation information.
-+
-+
-+2 - Digital Audio Interface (DAI) configuration
-+-----------------------------------------------
-+DAI configuration is handled by the codec_pcm_prepare function and is
-+responsible for configuring and starting the DAI on the codec. This can be
-+called multiple times and is atomic. It can access the runtime parameters.
-+
-+This usually consists of a large function with numerous switch statements to
-+set up each configuration option. These options are set by the core at runtime.
-+
-+
-+3 - Codec PCM's
-+---------------
-+Each codec must have it's PCM's defined. This defines the number of channels,
-+stream names, callbacks and codec name. It is also used to register the DAI
-+with the ASoC core. The PCM structure also associates the DAI capabilities with
-+the ALSA PCM.
-+
-+e.g.
-+
-+static struct snd_soc_pcm_codec wm8731_pcm_client = {
-+      .name = "WM8731",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .config_sysclk = wm8731_config_sysclk,
-+      .ops = {
-+              .prepare = wm8731_pcm_prepare,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8731_hwfmt),
-+              .modes = &wm8731_hwfmt[0],
-+      },
-+};
-+
-+
-+4 - Codec control IO
-+--------------------
-+The codec can ususally be controlled via an I2C or SPI style interface (AC97
-+combines control with data in the DAI). The codec drivers will have to provide
-+functions to read and write the codec registers along with supplying a register
-+cache:-
-+
-+      /* IO control data and register cache */
-+    void *control_data; /* codec control (i2c/3wire) data */
-+    void *reg_cache;
-+
-+Codec read/write should do any data formatting and call the hardware read write
-+below to perform the IO. These functions are called by the core and alsa when
-+performing DAPM or changing the mixer:-
-+
-+    unsigned int (*read)(struct snd_soc_codec *, unsigned int);
-+    int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
-+
-+Codec hardware IO functions - usually points to either the I2C, SPI or AC97
-+read/write:-
-+
-+      hw_write_t hw_write;
-+      hw_read_t hw_read;
-+
-+
-+5 - Mixers and audio controls
-+-----------------------------
-+All the codec mixers and audio controls can be defined using the convenience
-+macros defined in soc.h.
-+
-+    #define SOC_SINGLE(xname, reg, shift, mask, invert)
-+
-+Defines a single control as follows:-
-+
-+  xname = Control name e.g. "Playback Volume"
-+  reg = codec register
-+  shift = control bit(s) offset in register
-+  mask = control bit size(s) e.g. mask of 7 = 3 bits
-+  invert = the control is inverted
-+
-+Other macros include:-
-+
-+    #define SOC_DOUBLE(xname, reg, shift_left, shift_right, mask, invert)
-+
-+A stereo control
-+
-+    #define SOC_DOUBLE_R(xname, reg_left, reg_right, shift, mask, invert)
-+
-+A stereo control spanning 2 registers
-+
-+    #define SOC_ENUM_SINGLE(xreg, xshift, xmask, xtexts)
-+
-+Defines an single enumerated control as follows:-
-+
-+   xreg = register
-+   xshift = control bit(s) offset in register
-+   xmask = control bit(s) size
-+   xtexts = pointer to array of strings that describe each setting
-+
-+   #define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xtexts)
-+
-+Defines a stereo enumerated control
-+
-+
-+6 - System clock configuration.
-+-------------------------------
-+The system clock that drives the audio subsystem can change depending on sample
-+rate and the system power state. i.e.
-+
-+o Higher sample rates sometimes need a higher system clock.
-+o Low system power states can sometimes limit the available clocks.
-+
-+This function is a callback that the machine driver can call to set and
-+determine if the clock and sample rate combination is supported by the codec at
-+the present time (and system state).
-+
-+NOTE: If the codec has a PLL then it has a lot more flexability wrt clock and
-+sample rate combinations.
-+
-+Your config_sysclock function should return the MCLK if it's a valid
-+combination for your codec else 0;
-+
-+Please read clocking.txt now.
-+
-+
-+7 - Codec Audio Operations
-+--------------------------
-+The codec driver also supports the following alsa operations:-
-+
-+/* SoC audio ops */
-+struct snd_soc_ops {
-+      int (*startup)(snd_pcm_substream_t *);
-+      void (*shutdown)(snd_pcm_substream_t *);
-+      int (*hw_params)(snd_pcm_substream_t *, snd_pcm_hw_params_t *);
-+      int (*hw_free)(snd_pcm_substream_t *);
-+      int (*prepare)(snd_pcm_substream_t *);
-+};
-+
-+Please refer to the alsa driver PCM documentation for details.
-+http://www.alsa-project.org/~iwai/writing-an-alsa-driver/c436.htm
-+
-+
-+8 - DAPM description.
-+---------------------
-+The Dynamic Audio Power Management description describes the codec's power
-+components, their relationships and registers to the ASoC core. Please read
-+dapm.txt for details of building the description.
-+
-+Please also see the examples in other codec drivers.
-+
-+
-+9 - DAPM event handler
-+----------------------
-+This function is a callback that handles codec domain PM calls and system
-+domain PM calls (e.g. suspend and resume). It's used to put the codec to sleep
-+when not in use.
-+
-+Power states:-
-+
-+      SNDRV_CTL_POWER_D0: /* full On */
-+      /* vref/mid, clk and osc on, active */
-+
-+      SNDRV_CTL_POWER_D1: /* partial On */
-+      SNDRV_CTL_POWER_D2: /* partial On */
-+
-+      SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+      /* everything off except vref/vmid, inactive */
-+
-+      SNDRV_CTL_POWER_D3cold: /* Everything Off, without power */
-+
-+
-+10 - Codec DAC digital mute control.
-+------------------------------------
-+Most codecs have a digital mute before the DAC's that can be used to minimise
-+any system noise.  The mute stops any digital data from entering the DAC.
-+
-+A callback can be created that is called by the core for each codec DAI when the
-+mute is applied or freed.
-+
-+i.e.
-+
-+static int wm8974_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = wm8974_read_reg_cache(codec, WM8974_DAC) & 0xffbf;
-+      if(mute)
-+              wm8974_write(codec, WM8974_DAC, mute_reg | 0x40);
-+      else
-+              wm8974_write(codec, WM8974_DAC, mute_reg);
-+      return 0;
-+}
-Index: linux-2.6-pxa-new/Documentation/sound/alsa/soc/dapm.txt
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/Documentation/sound/alsa/soc/dapm.txt
-@@ -0,0 +1,297 @@
-+Dynamic Audio Power Management for Portable Devices
-+===================================================
-+
-+1. Description
-+==============
-+
-+Dynamic Audio Power Management (DAPM) is designed to allow portable Linux devices
-+to use the minimum amount of power within the audio subsystem at all times. It
-+is independent of other kernel PM and as such, can easily co-exist with the
-+other PM systems.
-+
-+DAPM is also completely transparent to all user space applications as all power
-+switching is done within the ASoC core. No code changes or recompiling are
-+required for user space applications. DAPM makes power switching descisions based
-+upon any audio stream (capture/playback) activity and audio mixer settings
-+within the device.
-+
-+DAPM spans the whole machine. It covers power control within the entire audio
-+subsystem, this includes internal codec power blocks and machine level power
-+systems.
-+
-+There are 4 power domains within DAPM
-+
-+   1. Codec domain - VREF, VMID (core codec and audio power)
-+      Usually controlled at codec probe/remove and suspend/resume, although
-+      can be set at stream time if power is not needed for sidetone, etc.
-+
-+   2. Platform/Machine domain - physically connected inputs and outputs
-+      Is platform/machine and user action specific, is configured by the
-+      machine driver and responds to asynchronous events e.g when HP
-+      are inserted
-+
-+   3. Path domain - audio susbsystem signal paths
-+      Automatically set when mixer and mux settings are changed by the user.
-+      e.g. alsamixer, amixer.
-+
-+   4. Stream domain - DAC's and ADC's.
-+      Enabled and disabled when stream playback/capture is started and
-+      stopped respectively. e.g. aplay, arecord.
-+
-+All DAPM power switching descisons are made automatically by consulting an audio
-+routing map of the whole machine. This map is specific to each machine and
-+consists of the interconnections between every audio component (including
-+internal codec components). All audio components that effect power are called
-+widgets hereafter.
-+
-+
-+2. DAPM Widgets
-+===============
-+
-+Audio DAPM widgets fall into a number of types:-
-+
-+ o Mixer      - Mixes several analog signals into a single analog signal.
-+ o Mux        - An analog switch that outputs only 1 of it's inputs.
-+ o PGA        - A programmable gain amplifier or attenuation widget.
-+ o ADC        - Analog to Digital Converter
-+ o DAC        - Digital to Analog Converter
-+ o Switch     - An analog switch
-+ o Input      - A codec input pin
-+ o Output     - A codec output pin
-+ o Headphone  - Headphone (and optional Jack)
-+ o Mic        - Mic (and optional Jack)
-+ o Line       - Line Input/Output (and optional Jack)
-+ o Speaker    - Speaker
-+ o Pre        - Special PRE widget (exec before all others)
-+ o Post       - Special POST widget (exec after all others)
-+
-+(Widgets are defined in include/sound/soc-dapm.h)
-+
-+Widgets are usually added in the codec driver and the machine driver. There are
-+convience macros defined in soc-dapm.h that can be used to quickly build a
-+list of widgets of the codecs and machines DAPM widgets.
-+
-+Most widgets have a name, register, shift and invert. Some widgets have extra
-+parameters for stream name and kcontrols.
-+
-+
-+2.1 Stream Domain Widgets
-+-------------------------
-+
-+Stream Widgets relate to the stream power domain and only consist of ADC's
-+(analog to digital converters) and DAC's (digital to analog converters).
-+
-+Stream widgets have the following format:-
-+
-+SND_SOC_DAPM_DAC(name, stream name, reg, shift, invert),
-+
-+NOTE: the stream name must match the corresponding stream name in your codecs
-+snd_soc_codec_dai.
-+
-+e.g. stream widgets for HiFi playback and capture
-+
-+SND_SOC_DAPM_DAC("HiFi DAC", "HiFi Playback", REG, 3, 1),
-+SND_SOC_DAPM_ADC("HiFi ADC", "HiFi Capture", REG, 2, 1),
-+
-+
-+2.2 Path Domain Widgets
-+-----------------------
-+
-+Path domain widgets have a ability to control or effect the audio signal or
-+audio paths within the audio subsystem. They have the following form:-
-+
-+SND_SOC_DAPM_PGA(name, reg, shift, invert, controls, num_controls)
-+
-+Any widget kcontrols can be set using the controls and num_controls members.
-+
-+e.g. Mixer widget (the kcontrols are declared first)
-+
-+/* Output Mixer */
-+static const snd_kcontrol_new_t wm8731_output_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8731_APANA, 3, 1, 0),
-+SOC_DAPM_SINGLE("Mic Sidetone Switch", WM8731_APANA, 5, 1, 0),
-+SOC_DAPM_SINGLE("HiFi Playback Switch", WM8731_APANA, 4, 1, 0),
-+};
-+
-+SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1, wm8731_output_mixer_controls,
-+      ARRAY_SIZE(wm8731_output_mixer_controls)),
-+
-+
-+2.3 Platform/Machine domain Widgets
-+-----------------------------------
-+
-+Machine widgets are different from codec widgets in that they don't have a
-+codec register bit associated with them. A machine widget is assigned to each
-+machine audio component (non codec) that can be independently powered. e.g.
-+
-+ o Speaker Amp
-+ o Microphone Bias
-+ o Jack connectors
-+
-+A machine widget can have an optional call back.
-+
-+e.g. Jack connector widget for an external Mic that enables Mic Bias
-+when the Mic is inserted:-
-+
-+static int spitz_mic_bias(struct snd_soc_dapm_widget* w, int event)
-+{
-+      if(SND_SOC_DAPM_EVENT_ON(event))
-+              set_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_MIC_BIAS);
-+      else
-+              reset_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_MIC_BIAS);
-+
-+      return 0;
-+}
-+
-+SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias),
-+
-+
-+2.4 Codec Domain
-+----------------
-+
-+The Codec power domain has no widgets and is handled by the codecs DAPM event
-+handler. This handler is called when the codec powerstate is changed wrt to any
-+stream event or by kernel PM events.
-+
-+
-+2.5 Virtual Widgets
-+-------------------
-+
-+Sometimes widgets exist in the codec or machine audio map that don't have any
-+corresponding register bit for power control. In this case it's necessary to
-+create a virtual widget - a widget with no control bits e.g.
-+
-+SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_DAPM_NOPM, 0, 0, NULL, 0),
-+
-+This can be used to merge to signal paths together in software.
-+
-+After all the widgets have been defined, they can then be added to the DAPM
-+subsystem individually with a call to snd_soc_dapm_new_control().
-+
-+
-+3. Codec Widget Interconnections
-+================================
-+
-+Widgets are connected to each other within the codec and machine by audio
-+paths (called interconnections). Each interconnection must be defined in order
-+to create a map of all audio paths between widgets.
-+This is easiest with a diagram of the codec (and schematic of the machine audio
-+system), as it requires joining widgets together via their audio signal paths.
-+
-+i.e. from the WM8731 codec's output mixer (wm8731.c)
-+
-+The WM8731 output mixer has 3 inputs (sources)
-+
-+ 1. Line Bypass Input
-+ 2. DAC (HiFi playback)
-+ 3. Mic Sidetone Input
-+
-+Each input in this example has a kcontrol associated with it (defined in example
-+above) and is connected to the output mixer via it's kcontrol name. We can now
-+connect the destination widget (wrt audio signal) with it's source widgets.
-+
-+      /* output mixer */
-+      {"Output Mixer", "Line Bypass Switch", "Line Input"},
-+      {"Output Mixer", "HiFi Playback Switch", "DAC"},
-+      {"Output Mixer", "Mic Sidetone Switch", "Mic Bias"},
-+
-+So we have :-
-+
-+      Destination Widget  <=== Path Name <=== Source Widget
-+
-+Or:-
-+
-+      Sink, Path, Source
-+
-+Or :-
-+
-+      "Output Mixer" is connected to the "DAC" via the "HiFi Playback Switch".
-+
-+When there is no path name connecting widgets (e.g. a direct connection) we
-+pass NULL for the path name.
-+
-+Interconnections are created with a call to:-
-+
-+snd_soc_dapm_connect_input(codec, sink, path, source);
-+
-+Finally, snd_soc_dapm_new_widgets(codec) must be called after all widgets and
-+interconnections have been registered with the core. This causes the core to
-+scan the codec and machine so that the internal DAPM state matches the
-+physical state of the machine.
-+
-+
-+3.1 Machine Widget Interconnections
-+-----------------------------------
-+Machine widget interconnections are created in the same way as codec ones and
-+directly connect the codec pins to machine level widgets.
-+
-+e.g. connects the speaker out codec pins to the internal speaker.
-+
-+      /* ext speaker connected to codec pins LOUT2, ROUT2  */
-+      {"Ext Spk", NULL , "ROUT2"},
-+      {"Ext Spk", NULL , "LOUT2"},
-+
-+This allows the DAPM to power on and off pins that are connected (and in use)
-+and pins that are NC respectively.
-+
-+
-+4 Endpoint Widgets
-+===================
-+An endpoint is a start or end point (widget) of an audio signal within the
-+machine and includes the codec. e.g.
-+
-+ o Headphone Jack
-+ o Internal Speaker
-+ o Internal Mic
-+ o Mic Jack
-+ o Codec Pins
-+
-+When a codec pin is NC it can be marked as not used with a call to
-+
-+snd_soc_dapm_set_endpoint(codec, "Widget Name", 0);
-+
-+The last argument is 0 for inactive and 1 for active. This way the pin and its
-+input widget will never be powered up and consume power.
-+
-+This also applies to machine widgets. e.g. if a headphone is connected to a
-+jack then the jack can be marked active. If the headphone is removed, then
-+the headphone jack can be marked inactive.
-+
-+
-+5 DAPM Widget Events
-+====================
-+
-+Some widgets can register their interest with the DAPM core in PM events.
-+e.g. A Speaker with an amplifier registers a widget so the amplifier can be
-+powered only when the spk is in use.
-+
-+/* turn speaker amplifier on/off depending on use */
-+static int corgi_amp_event(struct snd_soc_dapm_widget *w, int event)
-+{
-+      if (SND_SOC_DAPM_EVENT_ON(event))
-+              set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_APM_ON);
-+      else
-+              reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_APM_ON);
-+
-+      return 0;
-+}
-+
-+/* corgi machine dapm widgets */
-+static const struct snd_soc_dapm_widget wm8731_dapm_widgets =
-+      SND_SOC_DAPM_SPK("Ext Spk", corgi_amp_event);
-+
-+Please see soc-dapm.h for all other widgets that support events.
-+
-+
-+5.1 Event types
-+---------------
-+
-+The following event types are supported by event widgets.
-+
-+/* dapm event types */
-+#define SND_SOC_DAPM_PRE_PMU  0x1     /* before widget power up */
-+#define SND_SOC_DAPM_POST_PMU 0x2             /* after widget power up */
-+#define SND_SOC_DAPM_PRE_PMD  0x4     /* before widget power down */
-+#define SND_SOC_DAPM_POST_PMD 0x8             /* after widget power down */
-+#define SND_SOC_DAPM_PRE_REG  0x10    /* before audio path setup */
-+#define SND_SOC_DAPM_POST_REG 0x20    /* after audio path setup */
-Index: linux-2.6-pxa-new/Documentation/sound/alsa/soc/machine.txt
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/Documentation/sound/alsa/soc/machine.txt
-@@ -0,0 +1,114 @@
-+ASoC Machine Driver
-+===================
-+
-+The ASoC machine (or board) driver is the code that glues together the platform
-+and codec drivers.
-+
-+The machine driver can contain codec and platform specific code. It registers
-+the audio subsystem with the kernel as a platform device and is represented by
-+the following struct:-
-+
-+/* SoC machine */
-+struct snd_soc_machine {
-+      char *name;
-+
-+      int (*probe)(struct platform_device *pdev);
-+      int (*remove)(struct platform_device *pdev);
-+
-+      /* the pre and post PM functions are used to do any PM work before and
-+       * after the codec and DAI's do any PM work. */
-+      int (*suspend_pre)(struct platform_device *pdev, pm_message_t state);
-+      int (*suspend_post)(struct platform_device *pdev, pm_message_t state);
-+      int (*resume_pre)(struct platform_device *pdev);
-+      int (*resume_post)(struct platform_device *pdev);
-+
-+      /* machine stream operations */
-+      struct snd_soc_ops *ops;
-+
-+      /* CPU <--> Codec DAI links  */
-+      struct snd_soc_dai_link *dai_link;
-+      int num_links;
-+};
-+
-+probe()/remove()
-+----------------
-+probe/remove are optional. Do any machine specific probe here.
-+
-+
-+suspend()/resume()
-+------------------
-+The machine driver has pre and post versions of suspend and resume to take care
-+of any machine audio tasks that have to be done before or after the codec, DAI's
-+and DMA is suspended and resumed. Optional.
-+
-+
-+Machine operations
-+------------------
-+The machine specific audio operations can be set here. Again this is optional.
-+
-+
-+Machine DAI Configuration
-+-------------------------
-+The machine DAI configuration glues all the codec and CPU DAI's together. It can
-+also be used to set up the DAI system clock and for any machine related DAI
-+initialisation e.g. the machine audio map can be connected to the codec audio
-+map, unconnnected codec pins can be set as such. Please see corgi.c, spitz.c
-+for examples.
-+
-+struct snd_soc_dai_link is used to set up each DAI in your machine. e.g.
-+
-+/* corgi digital audio interface glue - connects codec <--> CPU */
-+static struct snd_soc_dai_link corgi_dai = {
-+      .name = "WM8731",
-+      .stream_name = "WM8731",
-+      .cpu_dai = &pxa_i2s_dai,
-+      .codec_dai = &wm8731_dai,
-+      .init = corgi_wm8731_init,
-+      .config_sysclk = corgi_config_sysclk,
-+};
-+
-+struct snd_soc_machine then sets up the machine with it's DAI's. e.g.
-+
-+/* corgi audio machine driver */
-+static struct snd_soc_machine snd_soc_machine_corgi = {
-+      .name = "Corgi",
-+      .dai_link = &corgi_dai,
-+      .num_links = 1,
-+      .ops = &corgi_ops,
-+};
-+
-+
-+Machine Audio Subsystem
-+-----------------------
-+
-+The machine soc device glues the platform, machine and codec driver together.
-+Private data can also be set here. e.g.
-+
-+/* corgi audio private data */
-+static struct wm8731_setup_data corgi_wm8731_setup = {
-+      .i2c_address = 0x1b,
-+};
-+
-+/* corgi audio subsystem */
-+static struct snd_soc_device corgi_snd_devdata = {
-+      .machine = &snd_soc_machine_corgi,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm8731,
-+      .codec_data = &corgi_wm8731_setup,
-+};
-+
-+
-+Machine Power Map
-+-----------------
-+
-+The machine driver can optionally extend the codec power map and to become an
-+audio power map of the audio subsystem. This allows for automatic power up/down
-+of speaker/HP amplifiers, etc. Codec pins can be connected to the machines jack
-+sockets in the machine init function. See soc/pxa/spitz.c and dapm.txt for
-+details.
-+
-+
-+Machine Controls
-+----------------
-+
-+Machine specific audio mixer controls can be added in the dai init function.
-\ No newline at end of file
-Index: linux-2.6-pxa-new/Documentation/sound/alsa/soc/overview.txt
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/Documentation/sound/alsa/soc/overview.txt
-@@ -0,0 +1,83 @@
-+ALSA SoC Layer
-+==============
-+
-+The overall project goal of the ALSA System on Chip (ASoC) layer is to provide
-+better ALSA support for embedded system on chip procesors (e.g. pxa2xx, au1x00,
-+iMX, etc) and portable audio codecs. Currently there is some support in the
-+kernel for SoC audio, however it has some limitations:-
-+
-+  * Currently, codec drivers are often tightly coupled to the underlying SoC
-+    cpu. This is not ideal and leads to code duplication i.e. Linux now has 4
-+    different wm8731 drivers for 4 different SoC platforms.
-+
-+  * There is no standard method to signal user initiated audio events.
-+    e.g. Headphone/Mic insertion, Headphone/Mic detection after an insertion
-+    event. These are quite common events on portable devices and ofter require
-+    machine specific code to re route audio, enable amps etc after such an event.
-+
-+  * Current drivers tend to power up the entire codec when playing
-+    (or recording) audio. This is fine for a PC, but tends to waste a lot of
-+    power on portable devices. There is also no support for saving power via
-+    changing codec oversampling rates, bias currents, etc.
-+
-+
-+ASoC Design
-+===========
-+
-+The ASoC layer is designed to address these issues and provide the following
-+features :-
-+
-+  * Codec independence. Allows reuse of codec drivers on other platforms
-+    and machines.
-+
-+  * Easy I2S/PCM audio interface setup between codec and SoC. Each SoC interface
-+    and codec registers it's audio interface capabilities with the core and are
-+    subsequently matched and configured when the application hw params are known.
-+
-+  * Dynamic Audio Power Management (DAPM). DAPM automatically sets the codec to
-+    it's minimum power state at all times. This includes powering up/down
-+    internal power blocks depending on the internal codec audio routing and any
-+    active streams.
-+
-+  * Pop and click reduction. Pops and clicks can be reduced by powering the
-+    codec up/down in the correct sequence (including using digital mute). ASoC
-+    signals the codec when to change power states.
-+
-+  * Machine specific controls: Allow machines to add controls to the sound card
-+    e.g. volume control for speaker amp.
-+
-+To achieve all this, ASoC basically splits an embedded audio system into 3
-+components :-
-+
-+  * Codec driver: The codec driver is platform independent and contains audio
-+    controls, audio interface capabilities, codec dapm definition and codec IO
-+    functions.
-+
-+  * Platform driver: The platform driver contains the audio dma engine and audio
-+    interface drivers (e.g. I2S, AC97, PCM) for that platform.
-+
-+  * Machine driver: The machine driver handles any machine specific controls and
-+    audio events. i.e. turing on an amp at start of playback.
-+
-+
-+Documentation
-+=============
-+
-+The documentation is spilt into the following sections:-
-+
-+overview.txt: This file.
-+
-+codec.txt: Codec driver internals.
-+
-+DAI.txt: Description of Digital Audio Interface standards and how to configure
-+a DAI within your codec and CPU DAI drivers.
-+
-+dapm.txt: Dynamic Audio Power Management
-+
-+platform.txt: Platform audio DMA and DAI.
-+
-+machine.txt: Machine driver internals.
-+
-+pop_clicks.txt: How to minimise audio artifacts.
-+
-+clocking.txt: ASoC clocking for best power performance.
-\ No newline at end of file
-Index: linux-2.6-pxa-new/Documentation/sound/alsa/soc/platform.txt
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/Documentation/sound/alsa/soc/platform.txt
-@@ -0,0 +1,58 @@
-+ASoC Platform Driver
-+====================
-+
-+An ASoC platform driver can be divided into audio DMA and SoC DAI configuration
-+and control. The platform drivers only target the SoC CPU and must have no board
-+specific code.
-+
-+Audio DMA
-+=========
-+
-+The platform DMA driver optionally supports the following alsa operations:-
-+
-+/* SoC audio ops */
-+struct snd_soc_ops {
-+      int (*startup)(snd_pcm_substream_t *);
-+      void (*shutdown)(snd_pcm_substream_t *);
-+      int (*hw_params)(snd_pcm_substream_t *, snd_pcm_hw_params_t *);
-+      int (*hw_free)(snd_pcm_substream_t *);
-+      int (*prepare)(snd_pcm_substream_t *);
-+      int (*trigger)(snd_pcm_substream_t *, int);
-+};
-+
-+The platform driver exports it's DMA functionailty via struct snd_soc_platform:-
-+
-+struct snd_soc_platform {
-+      char *name;
-+
-+      int (*probe)(struct platform_device *pdev);
-+      int (*remove)(struct platform_device *pdev);
-+      int (*suspend)(struct platform_device *pdev, struct snd_soc_cpu_dai *cpu_dai);
-+      int (*resume)(struct platform_device *pdev, struct snd_soc_cpu_dai *cpu_dai);
-+
-+      /* pcm creation and destruction */
-+      int (*pcm_new)(snd_card_t *, struct snd_soc_codec_dai *, snd_pcm_t *);
-+      void (*pcm_free)(snd_pcm_t *);
-+
-+      /* platform stream ops */
-+      snd_pcm_ops_t *pcm_ops;
-+};
-+
-+Please refer to the alsa driver documentation for details of audio DMA.
-+http://www.alsa-project.org/~iwai/writing-an-alsa-driver/c436.htm
-+
-+An example DMA driver is soc/pxa/pxa2xx-pcm.c
-+
-+
-+SoC DAI Drivers
-+===============
-+
-+Each SoC DAI driver must provide the following features:-
-+
-+ 1) Digital audio interface (DAI) description
-+ 2) Digital audio interface configuration
-+ 3) PCM's description
-+ 4) Sysclk configuration
-+ 5) Suspend and resume (optional)
-+
-+Please see codec.txt for a description of items 1 - 4.
-Index: linux-2.6-pxa-new/Documentation/sound/alsa/soc/pops_clicks.txt
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/Documentation/sound/alsa/soc/pops_clicks.txt
-@@ -0,0 +1,52 @@
-+Audio Pops and Clicks
-+=====================
-+
-+Pops and clicks are unwanted audio artifacts caused by the powering up and down
-+of components within the audio subsystem. This is noticable on PC's when an audio
-+module is either loaded or unloaded (at module load time the sound card is
-+powered up and causes a popping noise on the speakers).
-+
-+Pops and clicks can be more frequent on portable systems with DAPM. This is because
-+the components within the subsystem are being dynamically powered depending on
-+the audio usage and this can subsequently cause a small pop or click every time a
-+component power state is changed.
-+
-+
-+Minimising Playback Pops and Clicks
-+===================================
-+
-+Playback pops in portable audio subsystems cannot be completely eliminated atm,
-+however future audio codec hardware will have better pop and click supression.
-+Pops can be reduced within playback by powering the audio components in a
-+specific order. This order is different for startup and shutdown and follows
-+some basic rules:-
-+
-+ Startup Order :- DAC --> Mixers --> Output PGA --> Digital Unmute
-+
-+ Shutdown Order :- Digital Mute --> Output PGA --> Mixers --> DAC
-+
-+This assumes that the codec PCM output path from the DAC is via a mixer and then
-+a PGA (programmable gain amplifier) before being output to the speakers.
-+
-+
-+Minimising Capture Pops and Clicks
-+==================================
-+
-+Capture artifacts are somewhat easier to get rid as we can delay activating the
-+ADC until all the pops have occured. This follows similar power rules to
-+playback in that components are powered in a sequence depending upon stream
-+startup or shutdown.
-+
-+ Startup Order - Input PGA --> Mixers --> ADC
-+
-+ Shutdown Order - ADC --> Mixers --> Input PGA
-+
-+
-+Zipper Noise
-+============
-+An unwanted zipper noise can occur within the audio playback or capture stream
-+when a volume control is changed near its maximum gain value. The zipper noise
-+is heard when the gain increase or decrease changes the mean audio signal
-+amplitude too quickly. It can be minimised by enabling the zero cross setting
-+for each volume control. The ZC forces the gain change to occur when the signal
-+crosses the zero amplitude line.
-Index: linux-2.6-pxa-new/include/sound/ac97_codec.h
-===================================================================
---- linux-2.6-pxa-new.orig/include/sound/ac97_codec.h
-+++ linux-2.6-pxa-new/include/sound/ac97_codec.h
-@@ -425,6 +425,7 @@ struct snd_ac97_build_ops {
- struct snd_ac97_bus_ops {
-       void (*reset) (struct snd_ac97 *ac97);
-+      void (*warm_reset)(struct snd_ac97 *ac97);
-       void (*write) (struct snd_ac97 *ac97, unsigned short reg, unsigned short val);
-       unsigned short (*read) (struct snd_ac97 *ac97, unsigned short reg);
-       void (*wait) (struct snd_ac97 *ac97);
-Index: linux-2.6-pxa-new/include/sound/soc-dapm.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/include/sound/soc-dapm.h
-@@ -0,0 +1,286 @@
-+/*
-+ * linux/sound/soc-dapm.h -- ALSA SoC Dynamic Audio Power Management
-+ *
-+ * Author:            Liam Girdwood
-+ * Created:           Aug 11th 2005
-+ * Copyright: Wolfson Microelectronics. PLC.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef __LINUX_SND_SOC_DAPM_H
-+#define __LINUX_SND_SOC_DAPM_H
-+
-+#include <linux/device.h>
-+#include <linux/types.h>
-+#include <sound/control.h>
-+#include <sound/soc.h>
-+
-+/* widget has no PM register bit */
-+#define SND_SOC_NOPM  -1
-+
-+/*
-+ * SoC dynamic audio power managment
-+ *
-+ * We can have upto 4 power domains
-+ *    1. Codec domain - VREF, VMID
-+ *     Usually controlled at codec probe/remove, although can be set
-+ *     at stream time if power is not needed for sidetone, etc.
-+ *  2. Platform/Machine domain - physically connected inputs and outputs
-+ *     Is platform/machine and user action specific, is set in the machine
-+ *     driver and by userspace e.g when HP are inserted
-+ *  3. Path domain - Internal codec path mixers
-+ *     Are automatically set when mixer and mux settings are
-+ *     changed by the user.
-+ *  4. Stream domain - DAC's and ADC's.
-+ *     Enabled when stream playback/capture is started.
-+ */
-+
-+/* codec domain */
-+#define SND_SOC_DAPM_VMID(wname) \
-+{     .id = snd_soc_dapm_vmid, .name = wname, .kcontrols = NULL, \
-+      .num_kcontrols = 0}
-+
-+/* platform domain */
-+#define SND_SOC_DAPM_INPUT(wname) \
-+{     .id = snd_soc_dapm_input, .name = wname, .kcontrols = NULL, \
-+      .num_kcontrols = 0}
-+#define SND_SOC_DAPM_OUTPUT(wname) \
-+{     .id = snd_soc_dapm_output, .name = wname, .kcontrols = NULL, \
-+      .num_kcontrols = 0}
-+#define SND_SOC_DAPM_MIC(wname, wevent) \
-+{     .id = snd_soc_dapm_mic, .name = wname, .kcontrols = NULL, \
-+      .num_kcontrols = 0, .event = wevent, \
-+      .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
-+#define SND_SOC_DAPM_HP(wname, wevent) \
-+{     .id = snd_soc_dapm_hp, .name = wname, .kcontrols = NULL, \
-+      .num_kcontrols = 0, .event = wevent, \
-+      .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
-+#define SND_SOC_DAPM_SPK(wname, wevent) \
-+{     .id = snd_soc_dapm_spk, .name = wname, .kcontrols = NULL, \
-+      .num_kcontrols = 0, .event = wevent, \
-+      .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
-+#define SND_SOC_DAPM_LINE(wname, wevent) \
-+{     .id = snd_soc_dapm_line, .name = wname, .kcontrols = NULL, \
-+      .num_kcontrols = 0, .event = wevent, \
-+      .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
-+
-+/* path domain */
-+#define SND_SOC_DAPM_PGA(wname, wreg, wshift, winvert,\
-+       wcontrols, wncontrols) \
-+{     .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
-+#define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, \
-+       wcontrols, wncontrols)\
-+{     .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
-+#define SND_SOC_DAPM_MICBIAS(wname, wreg, wshift, winvert) \
-+{     .id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = NULL, .num_kcontrols = 0}
-+#define SND_SOC_DAPM_SWITCH(wname, wreg, wshift, winvert, wcontrols) \
-+{     .id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
-+#define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \
-+{     .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
-+
-+/* path domain with event - event handler must return 0 for success */
-+#define SND_SOC_DAPM_PGA_E(wname, wreg, wshift, winvert, wcontrols, \
-+      wncontrols, wevent, wflags) \
-+{     .id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
-+      .event = wevent, .event_flags = wflags}
-+#define SND_SOC_DAPM_MIXER_E(wname, wreg, wshift, winvert, wcontrols, \
-+      wncontrols, wevent, wflags) \
-+{     .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
-+      .event = wevent, .event_flags = wflags}
-+#define SND_SOC_DAPM_MICBIAS_E(wname, wreg, wshift, winvert, wevent, wflags) \
-+{     .id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = NULL, .num_kcontrols = 0, \
-+      .event = wevent, .event_flags = wflags}
-+#define SND_SOC_DAPM_SWITCH_E(wname, wreg, wshift, winvert, wcontrols, \
-+      wevent, wflags) \
-+{     .id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1 \
-+      .event = wevent, .event_flags = wflags}
-+#define SND_SOC_DAPM_MUX_E(wname, wreg, wshift, winvert, wcontrols, \
-+      wevent, wflags) \
-+{     .id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
-+      .invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \
-+      .event = wevent, .event_flags = wflags}
-+
-+/* events that are pre and post DAPM */
-+#define SND_SOC_DAPM_PRE(wname, wevent) \
-+{     .id = snd_soc_dapm_pre, .name = wname, .kcontrols = NULL, \
-+      .num_kcontrols = 0, .event = wevent, \
-+      .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD}
-+#define SND_SOC_DAPM_POST(wname, wevent) \
-+{     .id = snd_soc_dapm_post, .name = wname, .kcontrols = NULL, \
-+      .num_kcontrols = 0, .event = wevent, \
-+      .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD}
-+
-+/* stream domain */
-+#define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) \
-+{     .id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \
-+      .shift = wshift, .invert = winvert}
-+#define SND_SOC_DAPM_ADC(wname, stname, wreg, wshift, winvert) \
-+{     .id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \
-+      .shift = wshift, .invert = winvert}
-+
-+/* dapm kcontrol types */
-+#define SOC_DAPM_SINGLE(xname, reg, shift, mask, invert) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
-+      .info = snd_soc_info_volsw, \
-+      .get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
-+      .private_value =  SOC_SINGLE_VALUE(reg, shift, mask, invert) }
-+#define SOC_DAPM_DOUBLE(xname, reg, shift_left, shift_right, mask, invert, \
-+      power) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
-+      .info = snd_soc_info_volsw, \
-+      .get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
-+      .private_value = (reg) | ((shift_left) << 8) | ((shift_right) << 12) |\
-+               ((mask) << 16) | ((invert) << 24) }
-+#define SOC_DAPM_ENUM(xname, xenum) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
-+      .info = snd_soc_info_enum_double, \
-+      .get = snd_soc_dapm_get_enum_double, \
-+      .put = snd_soc_dapm_put_enum_double, \
-+      .private_value = (unsigned long)&xenum }
-+
-+/* dapm stream operations */
-+#define SND_SOC_DAPM_STREAM_NOP                       0x0
-+#define SND_SOC_DAPM_STREAM_START             0x1
-+#define SND_SOC_DAPM_STREAM_STOP              0x2
-+#define SND_SOC_DAPM_STREAM_SUSPEND           0x4
-+#define SND_SOC_DAPM_STREAM_RESUME            0x8
-+#define SND_SOC_DAPM_STREAM_PAUSE_PUSH        0x10
-+#define SND_SOC_DAPM_STREAM_PAUSE_RELEASE     0x20
-+
-+/* dapm event types */
-+#define SND_SOC_DAPM_PRE_PMU  0x1     /* before widget power up */
-+#define SND_SOC_DAPM_POST_PMU 0x2             /* after widget power up */
-+#define SND_SOC_DAPM_PRE_PMD  0x4     /* before widget power down */
-+#define SND_SOC_DAPM_POST_PMD 0x8             /* after widget power down */
-+#define SND_SOC_DAPM_PRE_REG  0x10    /* before audio path setup */
-+#define SND_SOC_DAPM_POST_REG 0x20    /* after audio path setup */
-+
-+/* convenience event type detection */
-+#define SND_SOC_DAPM_EVENT_ON(e)      \
-+      (e & (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU))
-+#define SND_SOC_DAPM_EVENT_OFF(e)     \
-+      (e & (SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD))
-+
-+struct snd_soc_dapm_widget;
-+enum snd_soc_dapm_type;
-+struct snd_soc_dapm_path;
-+struct snd_soc_dapm_pin;
-+
-+/* dapm controls */
-+int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+int snd_soc_dapm_new_control(struct snd_soc_codec *codec,
-+      const struct snd_soc_dapm_widget *widget);
-+
-+/* dapm path setup */
-+int snd_soc_dapm_connect_input(struct snd_soc_codec *codec,
-+      const char *sink_name, const char *control_name, const char *src_name);
-+int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec);
-+void snd_soc_dapm_free(struct snd_soc_device *socdev);
-+
-+/* dapm events */
-+int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, char *stream,
-+      int event);
-+
-+/* dapm sys fs - used by the core */
-+int snd_soc_dapm_sys_add(struct device *dev);
-+
-+/* dapm audio endpoint control */
-+int snd_soc_dapm_set_endpoint(struct snd_soc_codec *codec,
-+      char *pin, int status);
-+int snd_soc_dapm_sync_endpoints(struct snd_soc_codec *codec);
-+
-+/* dapm widget types */
-+enum snd_soc_dapm_type {
-+      snd_soc_dapm_input = 0,         /* input pin */
-+      snd_soc_dapm_output,            /* output pin */
-+      snd_soc_dapm_mux,                       /* selects 1 analog signal from many inputs */
-+      snd_soc_dapm_mixer,                     /* mixes several analog signals together */
-+      snd_soc_dapm_pga,                       /* programmable gain/attenuation (volume) */
-+      snd_soc_dapm_adc,                       /* analog to digital converter */
-+      snd_soc_dapm_dac,                       /* digital to analog converter */
-+      snd_soc_dapm_micbias,           /* microphone bias (power) */
-+      snd_soc_dapm_mic,                       /* microphone */
-+      snd_soc_dapm_hp,                        /* headphones */
-+      snd_soc_dapm_spk,                       /* speaker */
-+      snd_soc_dapm_line,                      /* line input/output */
-+      snd_soc_dapm_switch,            /* analog switch */
-+      snd_soc_dapm_vmid,                      /* codec bias/vmid - to minimise pops */
-+      snd_soc_dapm_pre,                       /* machine specific pre widget - exec first */
-+      snd_soc_dapm_post,                      /* machine specific post widget - exec last */
-+};
-+
-+/* dapm audio path between two widgets */
-+struct snd_soc_dapm_path {
-+      char *name;
-+      char *long_name;
-+
-+      /* source (input) and sink (output) widgets */
-+      struct snd_soc_dapm_widget *source;
-+      struct snd_soc_dapm_widget *sink;
-+      struct snd_kcontrol *kcontrol;
-+
-+      /* status */
-+      u32 connect:1;  /* source and sink widgets are connected */
-+      u32 walked:1;   /* path has been walked */
-+
-+      struct list_head list_source;
-+      struct list_head list_sink;
-+      struct list_head list;
-+};
-+
-+/* dapm widget */
-+struct snd_soc_dapm_widget {
-+      enum snd_soc_dapm_type id;
-+      char *name;             /* widget name */
-+      char *sname;    /* stream name */
-+      struct snd_soc_codec *codec;
-+      struct list_head list;
-+
-+      /* dapm control */
-+      short reg;                                              /* negative reg = no direct dapm */
-+      unsigned char shift;                    /* bits to shift */
-+      unsigned int saved_value;               /* widget saved value */
-+      unsigned int value;                             /* widget current value */
-+      unsigned char power:1;                  /* block power status */
-+      unsigned char invert:1;                 /* invert the power bit */
-+      unsigned char active:1;                 /* active stream on DAC, ADC's */
-+      unsigned char connected:1;              /* connected codec pin */
-+      unsigned char new:1;                    /* cnew complete */
-+      unsigned char ext:1;                    /* has external widgets */
-+      unsigned char muted:1;                  /* muted for pop reduction */
-+      unsigned char suspend:1;                /* was active before suspend */
-+      unsigned char pmdown:1;                 /* waiting for timeout */
-+
-+      /* external events */
-+      unsigned short event_flags;             /* flags to specify event types */
-+      int (*event)(struct snd_soc_dapm_widget*, int);
-+
-+      /* kcontrols that relate to this widget */
-+      int num_kcontrols;
-+      const struct snd_kcontrol_new *kcontrols;
-+
-+      /* widget input and outputs */
-+      struct list_head sources;
-+      struct list_head sinks;
-+};
-+
-+#endif
-Index: linux-2.6-pxa-new/include/sound/soc.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/include/sound/soc.h
-@@ -0,0 +1,487 @@
-+/*
-+ * linux/sound/soc.h -- ALSA SoC Layer
-+ *
-+ * Author:            Liam Girdwood
-+ * Created:           Aug 11th 2005
-+ * Copyright: Wolfson Microelectronics. PLC.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef __LINUX_SND_SOC_H
-+#define __LINUX_SND_SOC_H
-+
-+#include <linux/platform_device.h>
-+#include <linux/types.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/control.h>
-+#include <sound/ac97_codec.h>
-+
-+#define SND_SOC_VERSION "0.12.4"
-+
-+/*
-+ * Convenience kcontrol builders
-+ */
-+#define SOC_SINGLE_VALUE(reg,shift,mask,invert) ((reg) | ((shift) << 8) |\
-+      ((shift) << 12) | ((mask) << 16) | ((invert) << 24))
-+#define SOC_SINGLE_VALUE_EXT(reg,mask,invert) ((reg) | ((mask) << 16) |\
-+      ((invert) << 31))
-+#define SOC_SINGLE(xname, reg, shift, mask, invert) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
-+      .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
-+      .put = snd_soc_put_volsw, \
-+      .private_value =  SOC_SINGLE_VALUE(reg, shift, mask, invert) }
-+#define SOC_DOUBLE(xname, reg, shift_left, shift_right, mask, invert) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
-+      .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
-+      .put = snd_soc_put_volsw, \
-+      .private_value = (reg) | ((shift_left) << 8) | \
-+              ((shift_right) << 12) | ((mask) << 16) | ((invert) << 24) }
-+#define SOC_DOUBLE_R(xname, reg_left, reg_right, shift, mask, invert) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
-+      .info = snd_soc_info_volsw_2r, \
-+      .get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \
-+      .private_value = (reg_left) | ((shift) << 8)  | \
-+              ((mask) << 12) | ((invert) << 20) | ((reg_right) << 24) }
-+#define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xtexts) \
-+{     .reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
-+      .mask = xmask, .texts = xtexts }
-+#define SOC_ENUM_SINGLE(xreg, xshift, xmask, xtexts) \
-+      SOC_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xtexts)
-+#define SOC_ENUM_SINGLE_EXT(xmask, xtexts) \
-+{     .mask = xmask, .texts = xtexts }
-+#define SOC_ENUM(xname, xenum) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
-+      .info = snd_soc_info_enum_double, \
-+      .get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \
-+      .private_value = (unsigned long)&xenum }
-+#define SOC_SINGLE_EXT(xname, xreg, xmask, xinvert,\
-+       xhandler_get, xhandler_put) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
-+      .info = snd_soc_info_volsw_ext, \
-+      .get = xhandler_get, .put = xhandler_put, \
-+      .private_value =  SOC_SINGLE_VALUE_EXT(xreg, xmask, xinvert) }
-+#define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
-+      .info = snd_soc_info_bool_ext, \
-+      .get = xhandler_get, .put = xhandler_put, \
-+      .private_value = xdata }
-+#define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
-+{     .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
-+      .info = snd_soc_info_enum_ext, \
-+      .get = xhandler_get, .put = xhandler_put, \
-+      .private_value = (unsigned long)&xenum }
-+
-+/*
-+ * Digital Audio Interface (DAI) types
-+ */
-+#define SND_SOC_DAI_AC97      0x1
-+#define SND_SOC_DAI_I2S               0x2
-+#define SND_SOC_DAI_PCM               0x4
-+
-+/*
-+ * DAI hardware audio formats
-+ */
-+#define SND_SOC_DAIFMT_I2S            (1 << 0)        /* I2S mode */
-+#define SND_SOC_DAIFMT_RIGHT_J        (1 << 1)        /* Right justified mode */
-+#define SND_SOC_DAIFMT_LEFT_J (1 << 2)        /* Left Justified mode */
-+#define SND_SOC_DAIFMT_DSP_A  (1 << 3)        /* L data msb after FRM or LRC */
-+#define SND_SOC_DAIFMT_DSP_B  (1 << 4)        /* L data msb during FRM or LRC */
-+#define SND_SOC_DAIFMT_AC97           (1 << 5)        /* AC97 */
-+
-+/*
-+ * DAI hardware signal inversions
-+ */
-+#define SND_SOC_DAIFMT_NB_NF          (1 << 8)        /* normal bit clock + frame */
-+#define SND_SOC_DAIFMT_NB_IF          (1 << 9)        /* normal bclk + inv frm */
-+#define SND_SOC_DAIFMT_IB_NF          (1 << 10)       /* invert bclk + nor frm */
-+#define SND_SOC_DAIFMT_IB_IF          (1 << 11)       /* invert bclk + frm */
-+
-+/*
-+ * DAI hardware clock masters
-+ * This is wrt the codec, the inverse is true for the interface
-+ * i.e. if the codec is clk and frm master then the interface is
-+ * clk and frame slave.
-+ */
-+#define SND_SOC_DAIFMT_CBM_CFM        (1 << 12) /* codec clk & frm master */
-+#define SND_SOC_DAIFMT_CBS_CFM        (1 << 13) /* codec clk slave & frm master */
-+#define SND_SOC_DAIFMT_CBM_CFS        (1 << 14) /* codec clk master & frame slave */
-+#define SND_SOC_DAIFMT_CBS_CFS        (1 << 15) /* codec clk & frm slave */
-+
-+#define SND_SOC_DAIFMT_FORMAT_MASK            0x00ff
-+#define SND_SOC_DAIFMT_INV_MASK                       0x0f00
-+#define SND_SOC_DAIFMT_CLOCK_MASK             0xf000
-+
-+/*
-+ * DAI hardware audio direction
-+ */
-+#define SND_SOC_DAIDIR_PLAYBACK               0x1
-+#define SND_SOC_DAIDIR_CAPTURE                0x2
-+
-+/*
-+ * DAI hardware Time Division Multiplexing (TDM) Slots
-+ * Left and Right data word positions
-+ * This is measured in words (sample size) and not bits.
-+ */
-+#define SND_SOC_DAITDM_LRDW(l,r)      ((l << 8) | r)
-+
-+/*
-+ * DAI hardware clock ratios
-+ * bit clock can either be a generated by dividing mclk or
-+ * by multiplying sample rate, hence there are 2 definitions below
-+ * depending on codec type.
-+ */
-+/* ratio of sample rate to mclk/sysclk */
-+#define SND_SOC_FS_ALL                        0xffff  /* all mclk supported */
-+
-+/* bit clock dividers */
-+#define SND_SOC_FSBD(x)                       (1 << (x - 1))  /* ratio mclk:bclk */
-+#define SND_SOC_FSBD_REAL(x)  (ffs(x))
-+
-+/* bit clock ratio to (sample rate * channels * word size) */
-+#define SND_SOC_FSBW(x)                       (1 << (x - 1))
-+#define SND_SOC_FSBW_REAL(x)          (ffs(x))
-+/* all bclk ratios supported */
-+#define SND_SOC_FSB_ALL                       ~0ULL
-+
-+/*
-+ * DAI hardware flags
-+ */
-+/* use bfs mclk divider mode (BCLK = MCLK / x) */
-+#define SND_SOC_DAI_BFS_DIV           0x1
-+/* use bfs rate mulitplier  (BCLK = RATE * x)*/
-+#define SND_SOC_DAI_BFS_RATE  0x2
-+/* use bfs rcw multiplier (BCLK = RATE * CHN * WORD SIZE) */
-+#define SND_SOC_DAI_BFS_RCW           0x4
-+/* capture and playback can use different clocks */
-+#define SND_SOC_DAI_ASYNC             0x8
-+/* can use gated BCLK */
-+#define SND_SOC_DAI_GATED             0x10
-+
-+/*
-+ * AC97 codec ID's bitmask
-+ */
-+#define SND_SOC_DAI_AC97_ID0  (1 << 0)
-+#define SND_SOC_DAI_AC97_ID1  (1 << 1)
-+#define SND_SOC_DAI_AC97_ID2  (1 << 2)
-+#define SND_SOC_DAI_AC97_ID3  (1 << 3)
-+
-+struct snd_soc_device;
-+struct snd_soc_pcm_stream;
-+struct snd_soc_ops;
-+struct snd_soc_dai_mode;
-+struct snd_soc_pcm_runtime;
-+struct snd_soc_codec_dai;
-+struct snd_soc_cpu_dai;
-+struct snd_soc_codec;
-+struct snd_soc_machine_config;
-+struct soc_enum;
-+struct snd_soc_ac97_ops;
-+struct snd_soc_clock_info;
-+
-+typedef int (*hw_write_t)(void *,const char* ,int);
-+typedef int (*hw_read_t)(void *,char* ,int);
-+
-+extern struct snd_ac97_bus_ops soc_ac97_ops;
-+
-+/* pcm <-> DAI connect */
-+void snd_soc_free_pcms(struct snd_soc_device *socdev);
-+int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char *xid);
-+int snd_soc_register_card(struct snd_soc_device *socdev);
-+
-+/* set runtime hw params */
-+int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
-+      const struct snd_pcm_hardware *hw);
-+int snd_soc_get_rate(int rate);
-+
-+/* codec IO */
-+#define snd_soc_read(codec, reg) codec->read(codec, reg)
-+#define snd_soc_write(codec, reg, value) codec->write(codec, reg, value)
-+
-+/* codec register bit access */
-+int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
-+                              unsigned short mask, unsigned short value);
-+int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
-+                              unsigned short mask, unsigned short value);
-+
-+int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
-+      struct snd_ac97_bus_ops *ops, int num);
-+void snd_soc_free_ac97_codec(struct snd_soc_codec *codec);
-+
-+/*
-+ *Controls
-+ */
-+struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
-+      void *data, char *long_name);
-+int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo);
-+int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo);
-+int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo);
-+int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo);
-+int snd_soc_info_bool_ext(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo);
-+int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+int snd_soc_info_volsw_2r(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo);
-+int snd_soc_get_volsw_2r(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol);
-+
-+/* SoC PCM stream information */
-+struct snd_soc_pcm_stream {
-+      char *stream_name;
-+      unsigned int rate_min;          /* min rate */
-+      unsigned int rate_max;          /* max rate */
-+      unsigned int channels_min;      /* min channels */
-+      unsigned int channels_max;      /* max channels */
-+      unsigned int active:1;          /* stream is in use */
-+};
-+
-+/* SoC audio ops */
-+struct snd_soc_ops {
-+      int (*startup)(struct snd_pcm_substream *);
-+      void (*shutdown)(struct snd_pcm_substream *);
-+      int (*hw_params)(struct snd_pcm_substream *, struct snd_pcm_hw_params *);
-+      int (*hw_free)(struct snd_pcm_substream *);
-+      int (*prepare)(struct snd_pcm_substream *);
-+      int (*trigger)(struct snd_pcm_substream *, int);
-+};
-+
-+/* SoC DAI hardware mode */
-+struct snd_soc_dai_mode {
-+      u16 fmt;                /* SND_SOC_DAIFMT_* */
-+      u16 tdm;                /* SND_SOC_HWTDM_* */
-+      u64 pcmfmt;     /* SNDRV_PCM_FMTBIT_* */
-+      u16 pcmrate;    /* SND_SOC_HWRATE_* */
-+      u16 pcmdir:2;   /* SND_SOC_HWDIR_* */
-+      u16 flags:8;    /* hw flags */
-+      u16 fs;                 /* mclk to rate divider */
-+      u64 bfs;                /* mclk to bclk dividers */
-+      unsigned long priv;             /* private mode data */
-+};
-+
-+/* DAI capabilities */
-+struct snd_soc_dai_cap {
-+      int num_modes;                          /* number of DAI modes */
-+      struct snd_soc_dai_mode *mode;  /* array of supported DAI modes */
-+};
-+
-+/* SoC Codec DAI */
-+struct snd_soc_codec_dai {
-+      char *name;
-+      int id;
-+
-+      /* DAI capabilities */
-+      struct snd_soc_pcm_stream playback;
-+      struct snd_soc_pcm_stream capture;
-+      struct snd_soc_dai_cap caps;
-+
-+      /* DAI runtime info */
-+      struct snd_soc_dai_mode dai_runtime;
-+      struct snd_soc_ops ops;
-+      unsigned int (*config_sysclk)(struct snd_soc_codec_dai*,
-+              struct snd_soc_clock_info *info, unsigned int clk);
-+      int (*digital_mute)(struct snd_soc_codec *,
-+              struct snd_soc_codec_dai*, int);
-+      unsigned int mclk;              /* the audio master clock */
-+      unsigned int pll_in;    /* the PLL input clock */
-+      unsigned int pll_out;   /* the PLL output clock */
-+      unsigned int clk_div;   /* internal clock divider << 1 (for fractions) */
-+      unsigned int active;
-+      unsigned char pop_wait:1;
-+
-+      /* DAI private data */
-+      void *private_data;
-+};
-+
-+/* SoC CPU DAI */
-+struct snd_soc_cpu_dai {
-+
-+      /* DAI description */
-+      char *name;
-+      unsigned int id;
-+      unsigned char type;
-+
-+      /* DAI callbacks */
-+      int (*probe)(struct platform_device *pdev);
-+      void (*remove)(struct platform_device *pdev);
-+      int (*suspend)(struct platform_device *pdev,
-+              struct snd_soc_cpu_dai *cpu_dai);
-+      int (*resume)(struct platform_device *pdev,
-+              struct snd_soc_cpu_dai *cpu_dai);
-+      unsigned int (*config_sysclk)(struct snd_soc_cpu_dai *cpu_dai,
-+              struct snd_soc_clock_info *info, unsigned int clk);
-+
-+      /* DAI capabilities */
-+      struct snd_soc_pcm_stream capture;
-+      struct snd_soc_pcm_stream playback;
-+      struct snd_soc_dai_cap caps;
-+
-+      /* DAI runtime info */
-+      struct snd_soc_dai_mode dai_runtime;
-+      struct snd_soc_ops ops;
-+      struct snd_pcm_runtime *runtime;
-+      unsigned char active:1;
-+      unsigned int mclk;
-+      void *dma_data;
-+
-+      /* DAI private data */
-+      void *private_data;
-+};
-+
-+/* SoC Audio Codec */
-+struct snd_soc_codec {
-+      char *name;
-+      struct module *owner;
-+      struct mutex mutex;
-+
-+      /* callbacks */
-+      int (*dapm_event)(struct snd_soc_codec *codec, int event);
-+
-+      /* runtime */
-+      struct snd_card *card;
-+      struct snd_ac97 *ac97;  /* for ad-hoc ac97 devices */
-+      unsigned int active;
-+      unsigned int pcm_devs;
-+      void *private_data;
-+
-+      /* codec IO */
-+      void *control_data; /* codec control (i2c/3wire) data */
-+      unsigned int (*read)(struct snd_soc_codec *, unsigned int);
-+      int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
-+      hw_write_t hw_write;
-+      hw_read_t hw_read;
-+      void *reg_cache;
-+      short reg_cache_size;
-+      short reg_cache_step;
-+
-+      /* dapm */
-+      struct list_head dapm_widgets;
-+      struct list_head dapm_paths;
-+      unsigned int dapm_state;
-+      unsigned int suspend_dapm_state;
-+
-+      /* codec DAI's */
-+      struct snd_soc_codec_dai *dai;
-+      unsigned int num_dai;
-+};
-+
-+/* codec device */
-+struct snd_soc_codec_device {
-+      int (*probe)(struct platform_device *pdev);
-+      int (*remove)(struct platform_device *pdev);
-+      int (*suspend)(struct platform_device *pdev, pm_message_t state);
-+      int (*resume)(struct platform_device *pdev);
-+};
-+
-+/* SoC platform interface */
-+struct snd_soc_platform {
-+      char *name;
-+
-+      int (*probe)(struct platform_device *pdev);
-+      int (*remove)(struct platform_device *pdev);
-+      int (*suspend)(struct platform_device *pdev,
-+              struct snd_soc_cpu_dai *cpu_dai);
-+      int (*resume)(struct platform_device *pdev,
-+              struct snd_soc_cpu_dai *cpu_dai);
-+
-+      /* pcm creation and destruction */
-+      int (*pcm_new)(struct snd_card *, struct snd_soc_codec_dai *,
-+              struct snd_pcm *);
-+      void (*pcm_free)(struct snd_pcm *);
-+
-+      /* platform stream ops */
-+      struct snd_pcm_ops *pcm_ops;
-+};
-+
-+/* SoC machine DAI configuration, glues a codec and cpu DAI together */
-+struct snd_soc_dai_link  {
-+      char *name;                     /* Codec name */
-+      char *stream_name;              /* Stream name */
-+
-+      /* DAI */
-+      struct snd_soc_codec_dai *codec_dai;
-+      struct snd_soc_cpu_dai *cpu_dai;
-+      u32 flags;                      /* DAI config preference flags */
-+
-+      /* codec/machine specific init - e.g. add machine controls */
-+      int (*init)(struct snd_soc_codec *codec);
-+
-+      /* audio sysclock configuration */
-+      unsigned int (*config_sysclk)(struct snd_soc_pcm_runtime *rtd,
-+              struct snd_soc_clock_info *info);
-+};
-+
-+/* SoC machine */
-+struct snd_soc_machine {
-+      char *name;
-+
-+      int (*probe)(struct platform_device *pdev);
-+      int (*remove)(struct platform_device *pdev);
-+
-+      /* the pre and post PM functions are used to do any PM work before and
-+       * after the codec and DAI's do any PM work. */
-+      int (*suspend_pre)(struct platform_device *pdev, pm_message_t state);
-+      int (*suspend_post)(struct platform_device *pdev, pm_message_t state);
-+      int (*resume_pre)(struct platform_device *pdev);
-+      int (*resume_post)(struct platform_device *pdev);
-+
-+      /* machine stream operations */
-+      struct snd_soc_ops *ops;
-+
-+      /* CPU <--> Codec DAI links  */
-+      struct snd_soc_dai_link *dai_link;
-+      int num_links;
-+};
-+
-+/* SoC Device - the audio subsystem */
-+struct snd_soc_device {
-+      struct device *dev;
-+      struct snd_soc_machine *machine;
-+      struct snd_soc_platform *platform;
-+      struct snd_soc_codec *codec;
-+      struct snd_soc_codec_device *codec_dev;
-+      void *codec_data;
-+};
-+
-+/* runtime channel data */
-+struct snd_soc_pcm_runtime {
-+      struct snd_soc_codec_dai *codec_dai;
-+      struct snd_soc_cpu_dai *cpu_dai;
-+      struct snd_soc_device *socdev;
-+};
-+
-+/* enumerated kcontrol */
-+struct soc_enum {
-+      unsigned short reg;
-+      unsigned short reg2;
-+      unsigned char shift_l;
-+      unsigned char shift_r;
-+      unsigned int mask;
-+      const char **texts;
-+      void *dapm;
-+};
-+
-+/* clocking configuration data */
-+struct snd_soc_clock_info {
-+      unsigned int rate;
-+      unsigned int fs;
-+      unsigned int bclk_master;
-+};
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/Kconfig
-===================================================================
---- linux-2.6-pxa-new.orig/sound/Kconfig
-+++ linux-2.6-pxa-new/sound/Kconfig
-@@ -76,6 +76,8 @@ source "sound/sparc/Kconfig"
- source "sound/parisc/Kconfig"
-+source "sound/soc/Kconfig"
-+
- endmenu
- menu "Open Sound System"
-Index: linux-2.6-pxa-new/sound/soc/Kconfig
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/Kconfig
-@@ -0,0 +1,37 @@
-+#
-+# SoC audio configuration
-+#
-+
-+menu "SoC audio support"
-+      depends on SND!=n
-+
-+config SND_SOC_AC97_BUS
-+      bool
-+
-+config SND_SOC
-+      tristate "SoC audio support"
-+      ---help---
-+
-+        If you want SoC support, you should say Y here and also to the
-+        specific driver for your SoC below. You will also need to select the
-+        specific codec(s) attached to the SoC
-+
-+        This SoC audio support can also be built as a module.  If so, the module
-+        will be called snd-soc-core.
-+
-+# All the supported Soc's
-+menu "Soc Platforms"
-+depends on SND_SOC
-+source "sound/soc/pxa/Kconfig"
-+source "sound/soc/at91/Kconfig"
-+source "sound/soc/imx/Kconfig"
-+source "sound/soc/s3c24xx/Kconfig"
-+endmenu
-+
-+# Supported codecs
-+menu "Soc Codecs"
-+depends on SND_SOC
-+source "sound/soc/codecs/Kconfig"
-+endmenu
-+
-+endmenu
-Index: linux-2.6-pxa-new/sound/soc/Makefile
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/Makefile
-@@ -0,0 +1,4 @@
-+snd-soc-core-objs := soc-core.o soc-dapm.o
-+
-+obj-$(CONFIG_SND_SOC) += snd-soc-core.o
-+obj-$(CONFIG_SND_SOC) += pxa/ at91/ imx/ s3c24xx/ codecs/
-Index: linux-2.6-pxa-new/sound/soc/codecs/Kconfig
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/Kconfig
-@@ -0,0 +1,90 @@
-+config SND_SOC_AC97_CODEC
-+      tristate "SoC generic AC97 support"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want generic AC97 support. This is not required
-+        for the AC97 codecs listed below.
-+
-+config SND_SOC_WM8711
-+      tristate "SoC driver for the WM8711 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8711 codec.
-+
-+config SND_SOC_WM8510
-+      tristate "SoC driver for the WM8510 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8711 codec.
-+
-+config SND_SOC_WM8731
-+      tristate "SoC driver for the WM8731 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8731 codec.
-+
-+config SND_SOC_WM8750
-+      tristate "SoC driver for the WM8750 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8750 codec.
-+
-+config SND_SOC_WM8753
-+      tristate "SoC driver for the WM8753 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8753 codec.
-+
-+config SND_SOC_WM8772
-+      tristate "SoC driver for the WM8772 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8772 codec.
-+
-+config SND_SOC_WM8971
-+      tristate "SoC driver for the WM8971 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8971 codec.
-+
-+config SND_SOC_WM8976
-+      tristate "SoC driver for the WM8976 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8976 codec.
-+
-+config SND_SOC_WM8974
-+      tristate "SoC driver for the WM8974 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8974 codec.
-+
-+config SND_SOC_WM8980
-+      tristate "SoC driver for the WM8980 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM8980 codec.
-+
-+config SND_SOC_WM9713
-+      tristate "SoC driver for the WM9713 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM9713 codec.
-+
-+config SND_SOC_WM9712
-+      tristate "SoC driver for the WM9712 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the WM9712 codec.
-+
-+config SND_SOC_UDA1380
-+      tristate "SoC driver for the UDA1380 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the UDA1380 codec.
-+
-+config SND_SOC_AK4535
-+      tristate "SoC driver for the AK4535 codec"
-+      depends SND_SOC
-+      help
-+        Say Y or M if you want to support the AK4535 codec.
-Index: linux-2.6-pxa-new/sound/soc/codecs/Makefile
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/Makefile
-@@ -0,0 +1,31 @@
-+snd-soc-ac97-objs := ac97.o
-+snd-soc-wm8711-objs := wm8711.o
-+snd-soc-wm8510-objs := wm8510.o
-+snd-soc-wm8731-objs := wm8731.o
-+snd-soc-wm8750-objs := wm8750.o
-+snd-soc-wm8753-objs := wm8753.o
-+snd-soc-wm8772-objs := wm8772.o
-+snd-soc-wm8971-objs := wm8971.o
-+snd-soc-wm8974-objs := wm8974.o
-+snd-soc-wm8976-objs := wm8976.o
-+snd-soc-wm8980-objs := wm8980.o
-+snd-soc-uda1380-objs := uda1380.o
-+snd-soc-ak4535-objs := ak4535.o
-+snd-soc-wm9713-objs := wm9713.o
-+snd-soc-wm9712-objs := wm9712.o
-+
-+obj-$(CONFIG_SND_SOC_AC97_CODEC)      += snd-soc-ac97.o
-+obj-$(CONFIG_SND_SOC_WM8711)  += snd-soc-wm8711.o
-+obj-$(CONFIG_SND_SOC_WM8510)  += snd-soc-wm8510.o
-+obj-$(CONFIG_SND_SOC_WM8731)  += snd-soc-wm8731.o
-+obj-$(CONFIG_SND_SOC_WM8750)  += snd-soc-wm8750.o
-+obj-$(CONFIG_SND_SOC_WM8753)  += snd-soc-wm8753.o
-+obj-$(CONFIG_SND_SOC_WM8772)  += snd-soc-wm8772.o
-+obj-$(CONFIG_SND_SOC_WM8971)  += snd-soc-wm8971.o
-+obj-$(CONFIG_SND_SOC_WM8974)  += snd-soc-wm8974.o
-+obj-$(CONFIG_SND_SOC_WM8976)  += snd-soc-wm8976.o
-+obj-$(CONFIG_SND_SOC_WM8980)  += snd-soc-wm8980.o
-+obj-$(CONFIG_SND_SOC_UDA1380) += snd-soc-uda1380.o
-+obj-$(CONFIG_SND_SOC_AK4535)  += snd-soc-ak4535.o
-+obj-$(CONFIG_SND_SOC_WM9713)  += snd-soc-wm9713.o
-+obj-$(CONFIG_SND_SOC_WM9712)  += snd-soc-wm9712.o
-Index: linux-2.6-pxa-new/sound/soc/codecs/ac97.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/ac97.c
-@@ -0,0 +1,167 @@
-+/*
-+ * ac97.c  --  ALSA Soc AC97 codec support
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    17th Oct 2005   Initial version.
-+ *
-+ * Generic AC97 support.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/ac97_codec.h>
-+#include <sound/initval.h>
-+#include <sound/soc.h>
-+
-+#define AC97_VERSION "0.5"
-+
-+#define AC97_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define AC97_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+/* may need to expand this */
-+static struct snd_soc_dai_mode soc_ac97[] = {
-+      {0, 0,  SNDRV_PCM_FMTBIT_S16_LE,        AC97_RATES},
-+      {0, 0,  SNDRV_PCM_FMTBIT_S18_3LE,       AC97_RATES},
-+      {0, 0,  SNDRV_PCM_FMTBIT_S20_3LE,       AC97_RATES},
-+};
-+
-+static int ac97_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      int reg = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
-+                AC97_PCM_FRONT_DAC_RATE : AC97_PCM_LR_ADC_RATE;
-+      return snd_ac97_set_rate(codec->ac97, reg, runtime->rate);
-+}
-+
-+static struct snd_soc_codec_dai ac97_dai = {
-+      .name = "AC97 HiFi",
-+      .playback = {
-+              .stream_name = "AC97 Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = {
-+              .stream_name = "AC97 Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .ops = {
-+              .prepare = ac97_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(soc_ac97),
-+              .mode = soc_ac97,},
-+};
-+
-+static unsigned int ac97_read(struct snd_soc_codec *codec,
-+      unsigned int reg)
-+{
-+      return soc_ac97_ops.read(codec->ac97, reg);
-+}
-+
-+static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int val)
-+{
-+      soc_ac97_ops.write(codec->ac97, reg, val);
-+      return 0;
-+}
-+
-+static int ac97_soc_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec;
-+      struct snd_ac97_bus *ac97_bus;
-+      struct snd_ac97_template ac97_template;
-+      int ret = 0;
-+
-+      printk(KERN_INFO "AC97 SoC Audio Codec %s\n", AC97_VERSION);
-+
-+      socdev->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (socdev->codec == NULL)
-+              return -ENOMEM;
-+      codec = socdev->codec;
-+      mutex_init(&codec->mutex);
-+
-+      codec->name = "AC97";
-+      codec->owner = THIS_MODULE;
-+      codec->dai = &ac97_dai;
-+      codec->num_dai = 1;
-+      codec->write = ac97_write;
-+      codec->read = ac97_read;
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if(ret < 0)
-+              goto err;
-+
-+      /* add codec as bus device for standard ac97 */
-+      ret = snd_ac97_bus(codec->card, 0, &soc_ac97_ops, NULL, &ac97_bus);
-+      if(ret < 0)
-+              goto bus_err;
-+
-+      memset(&ac97_template, 0, sizeof(struct snd_ac97_template));
-+      ret = snd_ac97_mixer(ac97_bus, &ac97_template, &codec->ac97);
-+      if(ret < 0)
-+              goto bus_err;
-+
-+      ret = snd_soc_register_card(socdev);
-+      if (ret < 0)
-+              goto bus_err;
-+      return 0;
-+
-+bus_err:
-+      snd_soc_free_pcms(socdev);
-+
-+err:
-+      kfree(socdev->codec->reg_cache);
-+      kfree(socdev->codec);
-+      socdev->codec = NULL;
-+      return ret;
-+}
-+
-+static int ac97_soc_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if(codec == NULL)
-+              return 0;
-+
-+      snd_soc_free_pcms(socdev);
-+      kfree(socdev->codec->reg_cache);
-+      kfree(socdev->codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_ac97= {
-+      .probe =        ac97_soc_probe,
-+      .remove =       ac97_soc_remove,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_ac97);
-+
-+MODULE_DESCRIPTION("Soc Generic AC97 driver");
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/ac97.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/ac97.h
-@@ -0,0 +1,18 @@
-+/*
-+ * linux/sound/codecs/ac97.h -- ALSA SoC Layer
-+ *
-+ * Author:            Liam Girdwood
-+ * Created:           Dec 1st 2005
-+ * Copyright: Wolfson Microelectronics. PLC.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef __LINUX_SND_SOC_AC97_H
-+#define __LINUX_SND_SOC_AC97_H
-+
-+extern struct snd_soc_codec_device soc_codec_dev_ac97;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/ak4535.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/ak4535.c
-@@ -0,0 +1,701 @@
-+/*
-+ * ak4535.c  --  AK4535 ALSA Soc Audio driver
-+ *
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Author: Richard Purdie <richard@openedhand.com>
-+ *
-+ * Based on wm8753.c by Liam Girdwood
-+ *
-+ * 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/moduleparam.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "ak4535.h"
-+
-+#define AUDIO_NAME "ak4535"
-+#define AK4535_VERSION "0.3"
-+
-+struct snd_soc_codec_device soc_codec_dev_ak4535;
-+
-+/*
-+ * ak4535 register cache
-+ */
-+static const u16 ak4535_reg[AK4535_CACHEREGNUM] = {
-+    0x0000, 0x0080, 0x0000, 0x0003,
-+    0x0002, 0x0000, 0x0011, 0x0001,
-+    0x0000, 0x0040, 0x0036, 0x0010,
-+    0x0000, 0x0000, 0x0057, 0x0000,
-+};
-+
-+#define AK4535_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBS_CFS | \
-+      SND_SOC_DAIFMT_NB_NF)
-+
-+#define AK4535_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define AK4535_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+static struct snd_soc_dai_mode ak4535_modes[] = {
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = AK4535_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = AK4535_RATES,
-+              .pcmdir = AK4535_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = AK4535_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = AK4535_RATES,
-+              .pcmdir = AK4535_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 32,
-+      },
-+};
-+
-+/*
-+ * read ak4535 register cache
-+ */
-+static inline unsigned int ak4535_read_reg_cache(struct snd_soc_codec *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg >= AK4535_CACHEREGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write ak4535 register cache
-+ */
-+static inline void ak4535_write_reg_cache(struct snd_soc_codec *codec,
-+      u16 reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg >= AK4535_CACHEREGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+/*
-+ * write to the AK4535 register space
-+ */
-+static int ak4535_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D8 AK4535 register offset
-+       *   D7...D0 register data
-+       */
-+      data[0] = reg & 0xff;
-+      data[1] = value & 0xff;
-+
-+      ak4535_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -EIO;
-+}
-+
-+static const char *ak4535_mono_gain[] = {"+6dB", "-17dB"};
-+static const char *ak4535_mono_out[] = {"(L + R)/2", "Hi-Z"};
-+static const char *ak4535_hp_out[] = {"Stereo", "Mono"};
-+static const char *ak4535_deemp[] = {"44.1kHz", "Off", "48kHz", "32kHz"};
-+static const char *ak4535_mic_select[] = {"Internal", "External"};
-+
-+static const struct soc_enum ak4535_enum[] = {
-+      SOC_ENUM_SINGLE(AK4535_SIG1, 7, 2, ak4535_mono_gain),
-+      SOC_ENUM_SINGLE(AK4535_SIG1, 6, 2, ak4535_mono_out),
-+      SOC_ENUM_SINGLE(AK4535_MODE2, 2, 2, ak4535_hp_out),
-+      SOC_ENUM_SINGLE(AK4535_DAC, 0, 4, ak4535_deemp),
-+      SOC_ENUM_SINGLE(AK4535_MIC, 1, 2, ak4535_mic_select),
-+};
-+
-+static const struct snd_kcontrol_new ak4535_snd_controls[] = {
-+      SOC_SINGLE("ALC2 Switch", AK4535_SIG1, 1, 1, 0),
-+      SOC_ENUM("Mono 1 Output", ak4535_enum[1]),
-+      SOC_ENUM("Mono 1 Gain", ak4535_enum[0]),
-+      SOC_ENUM("Headphone Output", ak4535_enum[2]),
-+      SOC_ENUM("Playback Deemphasis", ak4535_enum[3]),
-+      SOC_SINGLE("Bass Volume", AK4535_DAC, 2, 3, 0),
-+      SOC_SINGLE("Mic Boost (+20dB) Switch", AK4535_MIC, 0, 1, 0),
-+      SOC_ENUM("Mic Select", ak4535_enum[4]),
-+      SOC_SINGLE("ALC Operation Time", AK4535_TIMER, 0, 3, 0),
-+      SOC_SINGLE("ALC Recovery Time", AK4535_TIMER, 2, 3, 0),
-+      SOC_SINGLE("ALC ZC Time", AK4535_TIMER, 4, 3, 0),
-+      SOC_SINGLE("ALC 1 Switch", AK4535_ALC1, 5, 1, 0),
-+      SOC_SINGLE("ALC 2 Switch", AK4535_ALC1, 6, 1, 0),
-+      SOC_SINGLE("ALC Volume", AK4535_ALC2, 0, 127, 0),
-+      SOC_SINGLE("Capture Volume", AK4535_PGA, 0, 127, 0),
-+      SOC_SINGLE("Left Playback Volume", AK4535_LATT, 0, 127, 1),
-+      SOC_SINGLE("Right Playback Volume", AK4535_RATT, 0, 127, 1),
-+      SOC_SINGLE("AUX Bypass Volume", AK4535_VOL, 0, 15, 0),
-+      SOC_SINGLE("Mic Sidetone Volume", AK4535_VOL, 4, 7, 0),
-+};
-+
-+/* add non dapm controls */
-+static int ak4535_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(ak4535_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                      snd_soc_cnew(&ak4535_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      return 0;
-+}
-+
-+/* Mono 1 Mixer */
-+static const struct snd_kcontrol_new ak4535_mono1_mixer_controls[] = {
-+      SOC_DAPM_SINGLE("Mic Sidetone Switch", AK4535_SIG1, 4, 1, 0),
-+      SOC_DAPM_SINGLE("Mono Playback Switch", AK4535_SIG1, 5, 1, 0),
-+};
-+
-+/* Stereo Mixer */
-+static const struct snd_kcontrol_new ak4535_stereo_mixer_controls[] = {
-+      SOC_DAPM_SINGLE("Mic Sidetone Switch", AK4535_SIG2, 4, 1, 0),
-+      SOC_DAPM_SINGLE("Playback Switch", AK4535_SIG2, 7, 1, 0),
-+      SOC_DAPM_SINGLE("Aux Bypass Switch", AK4535_SIG2, 5, 1, 0),
-+};
-+
-+/* Input Mixer */
-+static const struct snd_kcontrol_new ak4535_input_mixer_controls[] = {
-+      SOC_DAPM_SINGLE("Mic Capture Switch", AK4535_MIC, 2, 1, 0),
-+      SOC_DAPM_SINGLE("Aux Capture Switch", AK4535_MIC, 5, 1, 0),
-+};
-+
-+/* Input mux */
-+static const struct snd_kcontrol_new ak4535_input_mux_control =
-+      SOC_DAPM_ENUM("Input Select", ak4535_enum[0]);
-+
-+/* HP L switch */
-+static const struct snd_kcontrol_new ak4535_hpl_control =
-+      SOC_DAPM_SINGLE("Switch", AK4535_SIG2, 1, 1, 1);
-+
-+/* HP R switch */
-+static const struct snd_kcontrol_new ak4535_hpr_control =
-+      SOC_DAPM_SINGLE("Switch", AK4535_SIG2, 0, 1, 1);
-+
-+/* Speaker switch */
-+static const struct snd_kcontrol_new ak4535_spk_control =
-+      SOC_DAPM_SINGLE("Switch", AK4535_MODE2, 0, 0, 0);
-+
-+/* mono 2 switch */
-+static const struct snd_kcontrol_new ak4535_mono2_control =
-+      SOC_DAPM_SINGLE("Switch", AK4535_SIG1, 0, 1, 0);
-+
-+/* Line out switch */
-+static const struct snd_kcontrol_new ak4535_line_control =
-+      SOC_DAPM_SINGLE("Switch", AK4535_SIG2, 6, 1, 0);
-+
-+/* ak4535 dapm widgets */
-+static const struct snd_soc_dapm_widget ak4535_dapm_widgets[] = {
-+      SND_SOC_DAPM_MIXER("Stereo Mixer", SND_SOC_NOPM, 0, 0,
-+              &ak4535_stereo_mixer_controls[0],
-+              ARRAY_SIZE(ak4535_stereo_mixer_controls)),
-+      SND_SOC_DAPM_MIXER("Mono1 Mixer", SND_SOC_NOPM, 0, 0,
-+              &ak4535_mono1_mixer_controls[0],
-+              ARRAY_SIZE(ak4535_mono1_mixer_controls)),
-+      SND_SOC_DAPM_MIXER("Input Mixer", SND_SOC_NOPM, 0, 0,
-+              &ak4535_input_mixer_controls[0],
-+              ARRAY_SIZE(ak4535_mono1_mixer_controls)),
-+      SND_SOC_DAPM_MUX("Input Mux", SND_SOC_NOPM, 0, 0,
-+              &ak4535_input_mux_control),
-+      SND_SOC_DAPM_DAC("DAC", "Playback", AK4535_PM2, 0, 0),
-+      SND_SOC_DAPM_SWITCH("Mono 2 Enable", SND_SOC_NOPM, 0, 0,
-+              &ak4535_mono2_control),
-+      SND_SOC_DAPM_SWITCH("Speaker Enable", SND_SOC_NOPM, 0, 0,
-+              &ak4535_spk_control),
-+      SND_SOC_DAPM_SWITCH("Line Out Enable", SND_SOC_NOPM, 0, 0,
-+              &ak4535_line_control),
-+      SND_SOC_DAPM_SWITCH("Left HP Enable", SND_SOC_NOPM, 0, 0,
-+              &ak4535_hpl_control),
-+      SND_SOC_DAPM_SWITCH("Right HP Enable", SND_SOC_NOPM, 0, 0,
-+              &ak4535_hpr_control),
-+      SND_SOC_DAPM_OUTPUT("LOUT"),
-+      SND_SOC_DAPM_OUTPUT("HPL"),
-+      SND_SOC_DAPM_OUTPUT("ROUT"),
-+      SND_SOC_DAPM_OUTPUT("HPR"),
-+      SND_SOC_DAPM_OUTPUT("SPP"),
-+      SND_SOC_DAPM_OUTPUT("SPN"),
-+      SND_SOC_DAPM_OUTPUT("MOUT1"),
-+      SND_SOC_DAPM_OUTPUT("MOUT2"),
-+      SND_SOC_DAPM_OUTPUT("MICOUT"),
-+      SND_SOC_DAPM_ADC("ADC", "Capture", AK4535_PM1, 0, 1),
-+      SND_SOC_DAPM_PGA("Spk Amp", AK4535_PM2, 3, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("HP R Amp", AK4535_PM2, 1, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("HP L Amp", AK4535_PM2, 2, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Mic", AK4535_PM1, 1, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Line Out", AK4535_PM1, 4, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Mono Out", AK4535_PM1, 3, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("AUX In", AK4535_PM1, 2, 0, NULL, 0),
-+
-+      SND_SOC_DAPM_MICBIAS("Mic Int Bias", AK4535_MIC, 3, 0),
-+      SND_SOC_DAPM_MICBIAS("Mic Ext Bias", AK4535_MIC, 4, 0),
-+      SND_SOC_DAPM_INPUT("MICIN"),
-+      SND_SOC_DAPM_INPUT("MICEXT"),
-+      SND_SOC_DAPM_INPUT("AUX"),
-+      SND_SOC_DAPM_INPUT("MIN"),
-+      SND_SOC_DAPM_INPUT("AIN"),
-+};
-+
-+static const char *audio_map[][3] = {
-+      /*stereo mixer */
-+      {"Stereo Mixer", "Playback Switch", "DAC"},
-+      {"Stereo Mixer", "Mic Sidetone Switch", "Mic"},
-+      {"Stereo Mixer", "Aux Bypass Switch", "AUX In"},
-+
-+      /* mono1 mixer */
-+      {"Mono1 Mixer", "Mic Sidetone Switch", "Mic"},
-+      {"Mono1 Mixer", "Mono Playback Switch", "DAC"},
-+
-+      /* mono2 mixer */
-+      {"Mono2 Mixer", "Mono Playback Switch", "Stereo Mixer"},
-+
-+      /* Mic */
-+      {"AIN", NULL, "Mic"},
-+      {"Input Mux", "Internal", "Mic Int Bias"},
-+      {"Input Mux", "External", "Mic Ext Bias"},
-+      {"Mic Int Bias", NULL, "MICIN"},
-+      {"Mic Ext Bias", NULL, "MICEXT"},
-+      {"MICOUT", NULL, "Input Mux"},
-+
-+      /* line out */
-+      {"LOUT", "Switch", "Line"},
-+      {"ROUT", "Switch", "Line Out Enable"},
-+      {"Line Out Enable", NULL, "Line Out"},
-+      {"Line Out", NULL, "Stereo Mixer"},
-+
-+      /* mono1 out */
-+      {"MOUT1", NULL, "Mono Out"},
-+      {"Mono Out", NULL, "Mono Mixer"},
-+
-+      /* left HP */
-+      {"HPL", "Switch", "Left HP Enable"},
-+      {"Left HP Enable", NULL, "HP L Amp"},
-+      {"HP L Amp", NULL, "Stereo Mixer"},
-+
-+      /* right HP */
-+      {"HPR", "Switch", "Right HP Enable"},
-+      {"Right HP Enable", NULL, "HP R Amp"},
-+      {"HP R Amp", NULL, "Stereo Mixer"},
-+
-+      /* speaker */
-+      {"SPP", "Switch", "Speaker Enable"},
-+      {"SPN", "Switch", "Speaker Enable"},
-+      {"Speaker Enable", NULL, "Spk Amp"},
-+      {"Spk Amp", NULL, "MIN"},
-+
-+      /* mono 2 */
-+      {"MOUT2", "Switch", "Mono 2 Enable"},
-+      {"Mono 2 Enable", NULL, "Stereo Mixer"},
-+
-+      /* Aux In */
-+      {"Aux In", NULL, "AUX"},
-+
-+      /* ADC */
-+      {"ADC", NULL, "Input Mixer"},
-+      {"Input Mixer", "Mic Capture Switch", "Mic"},
-+      {"Input Mixer", "Aux Capture Switch", "Aux In"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int ak4535_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(ak4535_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &ak4535_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+static int ak4535_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u8 mode = 0, mode2;
-+      int bfs;
-+
-+      mode2 = ak4535_read_reg_cache(codec, AK4535_MODE2);
-+      bfs = SND_SOC_FSBW_REAL(rtd->codec_dai->dai_runtime.bfs);
-+      snd_assert(bfs, return -ENODEV);
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              mode = 0x0002;
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              mode = 0x0001;
-+              break;
-+      }
-+
-+      /* set fs */
-+      switch (rtd->codec_dai->dai_runtime.fs) {
-+      case 1024:
-+              mode2 |= (0x3 << 5);
-+              break;
-+      case 512:
-+              mode2 |= (0x2 << 5);
-+              break;
-+      case 256:
-+              mode2 |= (0x1 << 5);
-+              break;
-+      }
-+
-+      /* bfs */
-+      if (bfs == 64)
-+              mode |= 0x4;
-+
-+      /* set rate */
-+      ak4535_write(codec, AK4535_MODE1, mode);
-+      ak4535_write(codec, AK4535_MODE2, mode2);
-+
-+      return 0;
-+}
-+
-+static unsigned int ak4535_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      if (info->fs != 256)
-+              return 0;
-+
-+      /* we only support 256 FS atm */
-+      if (info->rate * info->fs == clk) {
-+              dai->mclk = clk;
-+              return clk;
-+      }
-+
-+      return 0;
-+}
-+
-+static int ak4535_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = ak4535_read_reg_cache(codec, AK4535_DAC) & 0xffdf;
-+      if (mute)
-+              ak4535_write(codec, AK4535_DAC, mute_reg);
-+      else
-+              ak4535_write(codec, AK4535_DAC, mute_reg | 0x20);
-+      return 0;
-+}
-+
-+static int ak4535_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+      /* vref/mid, clk and osc on, dac unmute, active */
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* everything off except vref/vmid, dac mute, inactive */
-+              ak4535_write(codec, AK4535_PM1, 0x80);
-+              ak4535_write(codec, AK4535_PM2, 0x0);
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              /* everything off, inactive */
-+              ak4535_write(codec, AK4535_PM1, 0x0);
-+              ak4535_write(codec, AK4535_PM2, 0x80);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai ak4535_dai = {
-+      .name = "AK4535",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .config_sysclk = ak4535_config_sysclk,
-+      .digital_mute = ak4535_mute,
-+      .ops = {
-+              .prepare = ak4535_pcm_prepare,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(ak4535_modes),
-+              .mode = ak4535_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(ak4535_dai);
-+
-+static int ak4535_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      ak4535_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int ak4535_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(ak4535_reg); i++) {
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+      ak4535_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      ak4535_dapm_event(codec, codec->suspend_dapm_state);
-+      return 0;
-+}
-+
-+/*
-+ * initialise the AK4535 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int ak4535_init(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int ret = 0;
-+
-+      codec->name = "AK4535";
-+      codec->owner = THIS_MODULE;
-+      codec->read = ak4535_read_reg_cache;
-+      codec->write = ak4535_write;
-+      codec->dapm_event = ak4535_dapm_event;
-+      codec->dai = &ak4535_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(ak4535_reg);
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(ak4535_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, ak4535_reg,
-+              sizeof(u16) * ARRAY_SIZE(ak4535_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(ak4535_reg);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if (ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* power on device */
-+      ak4535_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      ak4535_add_controls(codec);
-+      ak4535_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if (ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+static struct snd_soc_device *ak4535_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+#define I2C_DRIVERID_AK4535 0xfefe /* liam -  need a proper id */
-+
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver ak4535_i2c_driver;
-+static struct i2c_client client_template;
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+static int ak4535_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = ak4535_socdev;
-+      struct ak4535_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL){
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+      i2c_set_clientdata(i2c, codec);
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if (ret < 0) {
-+              printk(KERN_ERR "failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = ak4535_init(socdev);
-+      if (ret < 0) {
-+              printk(KERN_ERR "failed to initialise AK4535\n");
-+              goto err;
-+      }
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+}
-+
-+static int ak4535_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec* codec = i2c_get_clientdata(client);
-+      i2c_detach_client(client);
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+
-+      return 0;
-+}
-+
-+static int ak4535_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, ak4535_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver ak4535_i2c_driver = {
-+      .driver = {
-+              .name = "AK4535 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_AK4535,
-+      .attach_adapter = ak4535_i2c_attach,
-+      .detach_client =  ak4535_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "AK4535",
-+      .driver = &ak4535_i2c_driver,
-+};
-+#endif
-+
-+static int ak4535_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct ak4535_setup_data *setup;
-+      struct snd_soc_codec* codec;
-+      int ret = 0;
-+
-+      printk(KERN_INFO "AK4535 Audio Codec %s", AK4535_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      ak4535_socdev = socdev;
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&ak4535_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+      /* Add other interfaces here */
-+#endif
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int ak4535_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec* codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              ak4535_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&ak4535_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_ak4535 = {
-+      .probe =        ak4535_probe,
-+      .remove =       ak4535_remove,
-+      .suspend =      ak4535_suspend,
-+      .resume =       ak4535_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_ak4535);
-+
-+MODULE_DESCRIPTION("Soc AK4535 driver");
-+MODULE_AUTHOR("Richard Purdie");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/ak4535.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/ak4535.h
-@@ -0,0 +1,46 @@
-+/*
-+ * ak4535.h  --  AK4535 Soc Audio driver
-+ *
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Author: Richard Purdie <richard@openedhand.com>
-+ *
-+ * Based on wm8753.h
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _AK4535_H
-+#define _AK4535_H
-+
-+/* AK4535 register space */
-+
-+#define AK4535_PM1            0x0
-+#define AK4535_PM2            0x1
-+#define AK4535_SIG1           0x2
-+#define AK4535_SIG2           0x3
-+#define AK4535_MODE1  0x4
-+#define AK4535_MODE2  0x5
-+#define AK4535_DAC            0x6
-+#define AK4535_MIC            0x7
-+#define AK4535_TIMER  0x8
-+#define AK4535_ALC1           0x9
-+#define AK4535_ALC2           0xa
-+#define AK4535_PGA            0xb
-+#define AK4535_LATT           0xc
-+#define AK4535_RATT           0xd
-+#define AK4535_VOL            0xe
-+#define AK4535_STATUS 0xf
-+
-+#define AK4535_CACHEREGNUM    0x10
-+
-+struct ak4535_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+extern struct snd_soc_codec_dai ak4535_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_ak4535;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/uda1380.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/uda1380.c
-@@ -0,0 +1,582 @@
-+/*
-+ * uda1380.c - Philips UDA1380 ALSA SoC audio driver
-+ *
-+ * 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.
-+ *
-+ * Modified by Richard Purdie <richard@openedhand.com> to fit into SoC
-+ * codec model.
-+ *
-+ * Copyright (c) 2005 Giorgio Padrin <giorgio@mandarinlogiq.org>
-+ * Copyright 2005 Openedhand Ltd.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/types.h>
-+#include <linux/string.h>
-+#include <linux/slab.h>
-+#include <linux/errno.h>
-+#include <linux/ioctl.h>
-+#include <linux/delay.h>
-+#include <linux/i2c.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/control.h>
-+#include <sound/initval.h>
-+#include <sound/info.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include "uda1380.h"
-+
-+#define UDA1380_VERSION "0.4"
-+
-+/*
-+ * uda1380 register cache
-+ */
-+static const u16 uda1380_reg[UDA1380_CACHEREGNUM] = {
-+    0x0502, 0x0000, 0x0000, 0x3f3f,
-+    0x0202, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0xff00, 0x0000, 0x4800,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0x8000, 0x0002, 0x0000,
-+};
-+
-+#define UDA1380_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_CBS_CFS | \
-+       SND_SOC_DAIFMT_NB_NF)
-+
-+#define UDA1380_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define UDA1380_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+static struct snd_soc_dai_mode uda1380_modes[] = {
-+      /* slave rates capture & playback */
-+      {
-+              .fmt = UDA1380_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = UDA1380_RATES,
-+              .pcmdir = UDA1380_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+
-+      /* slave rates playback */
-+      {
-+              .fmt = UDA1380_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+};
-+
-+/*
-+ * read uda1380 register cache
-+ */
-+static inline unsigned int uda1380_read_reg_cache(struct snd_soc_codec *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg == UDA1380_RESET)
-+              return 0;
-+      if (reg >= UDA1380_CACHEREGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write uda1380 register cache
-+ */
-+static inline void uda1380_write_reg_cache(struct snd_soc_codec *codec,
-+      u16 reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg >= UDA1380_CACHEREGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+/*
-+ * write to the UDA1380 register space
-+ */
-+static int uda1380_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[3];
-+
-+      /* data is
-+       *   data[0] is register offset
-+       *   data[1] is MS byte
-+       *   data[2] is LS byte
-+       */
-+      data[0] = reg;
-+      data[1] = (value & 0xff00) >> 8;
-+      data[2] = value & 0x00ff;
-+
-+      uda1380_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 3) == 3)
-+              return 0;
-+      else
-+              return -EIO;
-+}
-+
-+#define uda1380_reset(c)      uda1380_write(c, UDA1380_RESET, 0)
-+
-+/* declarations of ALSA reg_elem_REAL controls */
-+static const char *uda1380_deemp[] = {"None", "32kHz", "44.1kHz", "48kHz",
-+      "96kHz"};
-+static const char *uda1380_input_sel[] = {"Line", "Mic"};
-+
-+static const struct soc_enum uda1380_enum[] = {
-+      SOC_ENUM_DOUBLE(UDA1380_DEEMP, 0, 8, 5, uda1380_deemp),
-+      SOC_ENUM_SINGLE(UDA1380_ADC, 3, 2, uda1380_input_sel),
-+};
-+
-+static const struct snd_kcontrol_new uda1380_snd_controls[] = {
-+      SOC_DOUBLE("Playback Volume", UDA1380_MVOL, 0, 8, 127, 0),
-+      SOC_DOUBLE("Treble Volume", UDA1380_MODE, 4, 12, 3, 0),
-+      SOC_DOUBLE("Bass Volume", UDA1380_MODE, 0, 8, 15, 0),
-+      SOC_ENUM("Playback De-emphasis", uda1380_enum[0]),
-+      SOC_DOUBLE("Capture Volume", UDA1380_DEC, 0, 8, 127, 0),
-+      SOC_DOUBLE("Line Capture Volume", UDA1380_PGA, 0, 8, 15, 0),
-+      SOC_SINGLE("Mic Capture Volume", UDA1380_PGA, 8, 11, 0),
-+      SOC_DOUBLE("Playback Switch", UDA1380_DEEMP, 3, 11, 1, 0),
-+      SOC_SINGLE("Capture Switch", UDA1380_PGA, 15, 1, 0),
-+      SOC_SINGLE("AGC Timing", UDA1380_AGC, 8, 7, 0),
-+      SOC_SINGLE("AGC Target level", UDA1380_AGC, 2, 3, 1),
-+      SOC_SINGLE("AGC Switch", UDA1380_AGC, 0, 1, 0),
-+};
-+
-+/* add non dapm controls */
-+static int uda1380_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(uda1380_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                      snd_soc_cnew(&uda1380_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      return 0;
-+}
-+
-+/* Input mux */
-+static const struct snd_kcontrol_new uda1380_input_mux_control =
-+      SOC_DAPM_ENUM("Input Select", uda1380_enum[1]);
-+
-+static const struct snd_soc_dapm_widget uda1380_dapm_widgets[] = {
-+      SND_SOC_DAPM_MUX("Input Mux", SND_SOC_NOPM, 0, 0,
-+              &uda1380_input_mux_control),
-+      SND_SOC_DAPM_PGA("Left PGA", UDA1380_PM, 3, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Right PGA", UDA1380_PM, 1, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Mic LNA", UDA1380_PM, 4, 0, NULL, 0),
-+      SND_SOC_DAPM_ADC("Left ADC", "Left Capture", UDA1380_PM, 2, 0),
-+      SND_SOC_DAPM_ADC("Right ADC", "Right Capture", UDA1380_PM, 0, 0),
-+      SND_SOC_DAPM_INPUT("VINM"),
-+      SND_SOC_DAPM_INPUT("VINL"),
-+      SND_SOC_DAPM_INPUT("VINR"),
-+      SND_SOC_DAPM_MIXER("Analog Mixer", UDA1380_PM, 6, 0, NULL, 0),
-+      SND_SOC_DAPM_OUTPUT("VOUTLHP"),
-+      SND_SOC_DAPM_OUTPUT("VOUTRHP"),
-+      SND_SOC_DAPM_OUTPUT("VOUTL"),
-+      SND_SOC_DAPM_OUTPUT("VOUTR"),
-+      SND_SOC_DAPM_DAC("DAC", "Playback", UDA1380_PM, 10, 0),
-+      SND_SOC_DAPM_PGA("HeadPhone Driver", UDA1380_PM, 13, 0, NULL, 0),
-+};
-+
-+static const char *audio_map[][3] = {
-+
-+      /* analog mixer setup is different from diagram for dapm */
-+      {"HeadPhone Driver", NULL, "Analog Mixer"},
-+      {"VOUTR", NULL, "Analog Mixer"},
-+      {"VOUTL", NULL, "Analog Mixer"},
-+      {"Analog Mixer", NULL, "VINR"},
-+      {"Analog Mixer", NULL, "VINL"},
-+      {"Analog Mixer", NULL, "DAC"},
-+
-+      /* headphone driver */
-+      {"VOUTLHP", NULL, "HeadPhone Driver"},
-+      {"VOUTRHP", NULL, "HeadPhone Driver"},
-+
-+      /* input mux */
-+      {"Left ADC", NULL, "Input Mux"},
-+      {"Input Mux", "Mic", "Mic LNA"},
-+      {"Input Mux", "Line", "Left PGA"},
-+
-+      /* right input */
-+      {"Right ADC", NULL, "Right PGA"},
-+
-+      /* inputs */
-+      {"Mic LNA", NULL, "VINM"},
-+      {"Left PGA", NULL, "VINL"},
-+      {"Right PGA", NULL, "VINR"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int uda1380_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(uda1380_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &uda1380_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+static int uda1380_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 clk = uda1380_read_reg_cache(codec, UDA1380_CLK);
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              uda1380_write(codec, UDA1380_CLK, R00_EN_DAC | R00_EN_INT | clk);
-+      else
-+              uda1380_write(codec, UDA1380_CLK, R00_EN_ADC | R00_EN_DEC | clk);
-+
-+      return 0;
-+}
-+
-+static void uda1380_pcm_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 clk = uda1380_read_reg_cache(codec, UDA1380_CLK);
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              uda1380_write(codec, UDA1380_CLK, ~(R00_EN_DAC | R00_EN_INT) & clk);
-+      else
-+              uda1380_write(codec, UDA1380_CLK, ~(R00_EN_ADC | R00_EN_DEC) & clk);
-+}
-+
-+static unsigned int uda1380_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      if(info->fs != 256)
-+              return 0;
-+
-+      /* we only support 256 FS atm */
-+      if(info->rate * info->fs == clk) {
-+              dai->mclk = clk;
-+              return clk;
-+      }
-+
-+      return 0;
-+}
-+
-+static int uda1380_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = uda1380_read_reg_cache(codec, UDA1380_DEEMP) & 0xbfff;
-+      if(mute)
-+              uda1380_write(codec, UDA1380_DEEMP, mute_reg | 0x4000);
-+      else
-+              uda1380_write(codec, UDA1380_DEEMP, mute_reg);
-+      return 0;
-+}
-+
-+static int uda1380_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      switch (event) {
-+              case SNDRV_CTL_POWER_D0: /* full On */
-+              case SNDRV_CTL_POWER_D1: /* partial On */
-+              case SNDRV_CTL_POWER_D2: /* partial On */
-+              case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+                      /* everything off except internal bias */
-+                      uda1380_write(codec, UDA1380_PM, R02_PON_BIAS);
-+                      break;
-+              case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+                      /* everything off, inactive */
-+                      uda1380_write(codec, UDA1380_PM, 0x0);
-+                      break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai uda1380_dai = {
-+      .name = "UDA1380",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .config_sysclk = uda1380_config_sysclk,
-+      .digital_mute = uda1380_mute,
-+      .ops = {
-+              .prepare = uda1380_pcm_prepare,
-+              .shutdown = uda1380_pcm_shutdown,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(uda1380_modes),
-+              .mode = uda1380_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(uda1380_dai);
-+
-+static int uda1380_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      uda1380_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int uda1380_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(uda1380_reg); i++) {
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+      uda1380_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      uda1380_dapm_event(codec, codec->suspend_dapm_state);
-+      return 0;
-+}
-+
-+/*
-+ * initialise the UDA1380 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int uda1380_init(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int ret = 0;
-+
-+      codec->name = "UDA1380";
-+      codec->owner = THIS_MODULE;
-+      codec->read = uda1380_read_reg_cache;
-+      codec->write = uda1380_write;
-+      codec->dapm_event = uda1380_dapm_event;
-+      codec->dai = &uda1380_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(uda1380_reg);
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(uda1380_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, uda1380_reg,
-+              sizeof(u16) * ARRAY_SIZE(uda1380_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(uda1380_reg);
-+      uda1380_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if(ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* power on device */
-+      uda1380_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      uda1380_write(codec, UDA1380_CLK, 0);
-+
-+      /* uda1380 init */
-+      uda1380_add_controls(codec);
-+      uda1380_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if(ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+static struct snd_soc_device *uda1380_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+#define I2C_DRIVERID_UDA1380 0xfefe /* liam -  need a proper id */
-+
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver uda1380_i2c_driver;
-+static struct i2c_client client_template;
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+
-+static int uda1380_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = uda1380_socdev;
-+      struct uda1380_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL){
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+      i2c_set_clientdata(i2c, codec);
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if(ret < 0) {
-+              printk(KERN_ERR "failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = uda1380_init(socdev);
-+      if(ret < 0) {
-+              printk(KERN_ERR "failed to initialise UDA1380\n");
-+              goto err;
-+      }
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+}
-+
-+static int uda1380_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec* codec = i2c_get_clientdata(client);
-+      i2c_detach_client(client);
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+      return 0;
-+}
-+
-+static int uda1380_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, uda1380_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver uda1380_i2c_driver = {
-+      .driver = {
-+              .name =  "UDA1380 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_UDA1380,
-+      .attach_adapter = uda1380_i2c_attach,
-+      .detach_client =  uda1380_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "UDA1380",
-+      .driver = &uda1380_i2c_driver,
-+};
-+#endif
-+
-+static int uda1380_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct uda1380_setup_data *setup;
-+      struct snd_soc_codec* codec;
-+      int ret = 0;
-+
-+      printk(KERN_INFO "UDA1380 Audio Codec %s", UDA1380_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      uda1380_socdev = socdev;
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&uda1380_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+      /* Add other interfaces here */
-+#endif
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int uda1380_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec* codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              uda1380_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&uda1380_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_uda1380 = {
-+      .probe =        uda1380_probe,
-+      .remove =       uda1380_remove,
-+      .suspend =      uda1380_suspend,
-+      .resume =       uda1380_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_uda1380);
-+
-+MODULE_AUTHOR("Giorgio Padrin");
-+MODULE_DESCRIPTION("Audio support for codec Philips UDA1380");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/uda1380.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/uda1380.h
-@@ -0,0 +1,56 @@
-+/*
-+ * Audio support for Philips UDA1380
-+ *
-+ * 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.
-+ *
-+ * Copyright (c) 2005 Giorgio Padrin <giorgio@mandarinlogiq.org>
-+ */
-+
-+#define UDA1380_CLK           0x00
-+#define UDA1380_IFACE 0x01
-+#define UDA1380_PM            0x02
-+#define UDA1380_AMIX  0x03
-+#define UDA1380_HP            0x04
-+#define UDA1380_MVOL  0x10
-+#define UDA1380_MIXVOL        0x11
-+#define UDA1380_MODE  0x12
-+#define UDA1380_DEEMP 0x13
-+#define UDA1380_MIXER 0x14
-+#define UDA1380_INTSTAT       0x18
-+#define UDA1380_DEC           0x20
-+#define UDA1380_PGA           0x21
-+#define UDA1380_ADC           0x22
-+#define UDA1380_AGC           0x23
-+#define UDA1380_DECSTAT       0x28
-+#define UDA1380_RESET 0x7f
-+
-+#define UDA1380_CACHEREGNUM 0x24
-+
-+/* Register flags */
-+#define R00_EN_ADC    0x0800
-+#define R00_EN_DEC    0x0400
-+#define R00_EN_DAC    0x0200
-+#define R00_EN_INT    0x0100
-+#define R02_PON_HP    0x2000
-+#define R02_PON_DAC   0x0400
-+#define R02_PON_BIAS  0x0100
-+#define R02_PON_LNA   0x0010
-+#define R02_PON_PGAL  0x0008
-+#define R02_PON_ADCL  0x0004
-+#define R02_PON_PGAR  0x0002
-+#define R02_PON_ADCR  0x0001
-+#define R13_MTM               0x4000
-+#define R21_MT_ADC    0x8000
-+#define R22_SEL_LNA   0x0008
-+#define R22_SEL_MIC   0x0004
-+#define R22_SKIP_DCFIL        0x0002
-+#define R23_AGC_EN    0x0001
-+
-+struct uda1380_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+extern struct snd_soc_codec_dai uda1380_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_uda1380;
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8731.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8731.c
-@@ -0,0 +1,886 @@
-+/*
-+ * wm8731.c  --  WM8731 ALSA SoC Audio driver
-+ *
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Author: Richard Purdie <richard@openedhand.com>
-+ *
-+ * Based on wm8753.c by Liam Girdwood
-+ *
-+ * 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/moduleparam.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8731.h"
-+
-+#define AUDIO_NAME "wm8731"
-+#define WM8731_VERSION "0.12"
-+
-+/*
-+ * Debug
-+ */
-+
-+#define WM8731_DEBUG 0
-+
-+#ifdef WM8731_DEBUG
-+#define dbg(format, arg...) \
-+      printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
-+#else
-+#define dbg(format, arg...) do {} while (0)
-+#endif
-+#define err(format, arg...) \
-+      printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-+#define info(format, arg...) \
-+      printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-+#define warn(format, arg...) \
-+      printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8731;
-+
-+/*
-+ * wm8731 register cache
-+ * We can't read the WM8731 register space when we are
-+ * using 2 wire for device control, so we cache them instead.
-+ * There is no point in caching the reset register
-+ */
-+static const u16 wm8731_reg[WM8731_CACHEREGNUM] = {
-+    0x0097, 0x0097, 0x0079, 0x0079,
-+    0x000a, 0x0008, 0x009f, 0x000a,
-+    0x0000, 0x0000
-+};
-+
-+#define WM8731_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+      SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \
-+      SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM8731_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM8731_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
-+
-+#define WM8731_HIFI_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
-+
-+static struct snd_soc_dai_mode wm8731_modes[] = {
-+      /* codec frame and clock master modes */
-+      /* 8k */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 1536,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 2304,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 1408,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 2112,
-+              .bfs = 64,
-+      },
-+
-+      /* 32k */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 384,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 576,
-+              .bfs = 64,
-+      },
-+
-+      /* 44.1k & 48k */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 384,
-+              .bfs = 64,
-+      },
-+
-+      /* 88.2 & 96k */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 128,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 192,
-+              .bfs = 64,
-+      },
-+
-+      /* USB codec frame and clock master modes */
-+      /* 8k */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1500,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* 44.1k */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 272,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* 48k */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 250,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* 88.2k */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 136,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* 96k */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 125,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = WM8731_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM8731_HIFI_BITS,
-+              .pcmrate = WM8731_RATES,
-+              .pcmdir = WM8731_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * read wm8731 register cache
-+ */
-+static inline unsigned int wm8731_read_reg_cache(struct snd_soc_codec *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg == WM8731_RESET)
-+              return 0;
-+      if (reg >= WM8731_CACHEREGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write wm8731 register cache
-+ */
-+static inline void wm8731_write_reg_cache(struct snd_soc_codec *codec,
-+      u16 reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg >= WM8731_CACHEREGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+/*
-+ * write to the WM8731 register space
-+ */
-+static int wm8731_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8731 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8731_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -EIO;
-+}
-+
-+#define wm8731_reset(c)       wm8731_write(c, WM8731_RESET, 0)
-+
-+static const char *wm8731_input_select[] = {"Line In", "Mic"};
-+static const char *wm8731_deemph[] = {"None", "32Khz", "44.1Khz", "48Khz"};
-+
-+static const struct soc_enum wm8731_enum[] = {
-+      SOC_ENUM_SINGLE(WM8731_APANA, 2, 2, wm8731_input_select),
-+      SOC_ENUM_SINGLE(WM8731_APDIGI, 1, 4, wm8731_deemph),
-+};
-+
-+static const struct snd_kcontrol_new wm8731_snd_controls[] = {
-+
-+SOC_DOUBLE_R("Master Playback Volume", WM8731_LOUT1V, WM8731_ROUT1V,
-+      0, 127, 0),
-+SOC_DOUBLE_R("Master Playback ZC Switch", WM8731_LOUT1V, WM8731_ROUT1V,
-+      7, 1, 0),
-+
-+SOC_DOUBLE_R("Capture Volume", WM8731_LINVOL, WM8731_RINVOL, 0, 31, 0),
-+SOC_DOUBLE_R("Line Capture Switch", WM8731_LINVOL, WM8731_RINVOL, 7, 1, 1),
-+
-+SOC_SINGLE("Mic Boost (+20dB)", WM8731_APANA, 0, 1, 0),
-+SOC_SINGLE("Capture Mic Switch", WM8731_APANA, 1, 1, 1),
-+
-+SOC_SINGLE("Sidetone Playback Volume", WM8731_APANA, 6, 3, 1),
-+
-+SOC_SINGLE("ADC High Pass Filter Switch", WM8731_APDIGI, 0, 1, 1),
-+SOC_SINGLE("Store DC Offset Switch", WM8731_APDIGI, 4, 1, 0),
-+
-+SOC_ENUM("Playback De-emphasis", wm8731_enum[1]),
-+};
-+
-+/* add non dapm controls */
-+static int wm8731_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8731_snd_controls); i++) {
-+              if ((err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8731_snd_controls[i],codec, NULL))) < 0)
-+                      return err;
-+      }
-+
-+      return 0;
-+}
-+
-+/* Output Mixer */
-+static const struct snd_kcontrol_new wm8731_output_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8731_APANA, 3, 1, 0),
-+SOC_DAPM_SINGLE("Mic Sidetone Switch", WM8731_APANA, 5, 1, 0),
-+SOC_DAPM_SINGLE("HiFi Playback Switch", WM8731_APANA, 4, 1, 0),
-+};
-+
-+/* Input mux */
-+static const struct snd_kcontrol_new wm8731_input_mux_controls =
-+SOC_DAPM_ENUM("Input Select", wm8731_enum[0]);
-+
-+static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = {
-+SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1,
-+      &wm8731_output_mixer_controls[0],
-+      ARRAY_SIZE(wm8731_output_mixer_controls)),
-+SND_SOC_DAPM_DAC("DAC", "HiFi Playback", WM8731_PWR, 3, 1),
-+SND_SOC_DAPM_OUTPUT("LOUT"),
-+SND_SOC_DAPM_OUTPUT("LHPOUT"),
-+SND_SOC_DAPM_OUTPUT("ROUT"),
-+SND_SOC_DAPM_OUTPUT("RHPOUT"),
-+SND_SOC_DAPM_ADC("ADC", "HiFi Capture", WM8731_PWR, 2, 1),
-+SND_SOC_DAPM_MUX("Input Mux", SND_SOC_NOPM, 0, 0, &wm8731_input_mux_controls),
-+SND_SOC_DAPM_PGA("Line Input", WM8731_PWR, 0, 1, NULL, 0),
-+SND_SOC_DAPM_MICBIAS("Mic Bias", WM8731_PWR, 1, 1),
-+SND_SOC_DAPM_INPUT("MICIN"),
-+SND_SOC_DAPM_INPUT("RLINEIN"),
-+SND_SOC_DAPM_INPUT("LLINEIN"),
-+};
-+
-+static const char *intercon[][3] = {
-+      /* output mixer */
-+      {"Output Mixer", "Line Bypass Switch", "Line Input"},
-+      {"Output Mixer", "HiFi Playback Switch", "DAC"},
-+      {"Output Mixer", "Mic Sidetone Switch", "Mic Bias"},
-+
-+      /* outputs */
-+      {"RHPOUT", NULL, "Output Mixer"},
-+      {"ROUT", NULL, "Output Mixer"},
-+      {"LHPOUT", NULL, "Output Mixer"},
-+      {"LOUT", NULL, "Output Mixer"},
-+
-+      /* input mux */
-+      {"Input Mux", "Line In", "Line Input"},
-+      {"Input Mux", "Mic", "Mic Bias"},
-+      {"ADC", NULL, "Input Mux"},
-+
-+      /* inputs */
-+      {"Line Input", NULL, "LLINEIN"},
-+      {"Line Input", NULL, "RLINEIN"},
-+      {"Mic Bias", NULL, "MICIN"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm8731_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm8731_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8731_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path interconnects */
-+      for(i = 0; intercon[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, intercon[i][0],
-+                      intercon[i][1], intercon[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+struct _coeff_div {
-+      u32 mclk;
-+      u32 rate;
-+      u16 fs;
-+      u8 sr:4;
-+      u8 bosr:1;
-+      u8 usb:1;
-+};
-+
-+/* codec mclk clock divider coefficients */
-+static const struct _coeff_div coeff_div[] = {
-+      /* 48k */
-+      {12288000, 48000, 256, 0x0, 0x0, 0x0},
-+      {18432000, 48000, 384, 0x0, 0x1, 0x0},
-+      {12000000, 48000, 250, 0x0, 0x0, 0x1},
-+
-+      /* 32k */
-+      {12288000, 32000, 384, 0x6, 0x0, 0x0},
-+      {18432000, 32000, 576, 0x6, 0x1, 0x0},
-+
-+      /* 8k */
-+      {12288000, 8000, 1536, 0x3, 0x0, 0x0},
-+      {18432000, 8000, 2304, 0x3, 0x1, 0x0},
-+      {11289600, 8000, 1408, 0xb, 0x0, 0x0},
-+      {16934400, 8000, 2112, 0xb, 0x1, 0x0},
-+      {12000000, 8000, 1500, 0x3, 0x0, 0x1},
-+
-+      /* 96k */
-+      {12288000, 96000, 128, 0x7, 0x0, 0x0},
-+      {18432000, 96000, 192, 0x7, 0x1, 0x0},
-+      {12000000, 96000, 125, 0x7, 0x0, 0x1},
-+
-+      /* 44.1k */
-+      {11289600, 44100, 256, 0x8, 0x0, 0x0},
-+      {16934400, 44100, 384, 0x8, 0x1, 0x0},
-+      {12000000, 44100, 272, 0x8, 0x1, 0x1},
-+
-+      /* 88.2k */
-+      {11289600, 88200, 128, 0xf, 0x0, 0x0},
-+      {16934400, 88200, 192, 0xf, 0x1, 0x0},
-+      {12000000, 88200, 136, 0xf, 0x1, 0x1},
-+};
-+
-+static inline int get_coeff(int mclk, int rate)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
-+              if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)
-+                      return i;
-+      }
-+      return 0;
-+}
-+
-+/* WM8731 supports numerous clocks per sample rate */
-+static unsigned int wm8731_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      dai->mclk = 0;
-+
-+      /* check that the calculated FS and rate actually match a clock from
-+       * the machine driver */
-+      if (info->fs * info->rate == clk)
-+              dai->mclk = clk;
-+
-+      return dai->mclk;
-+}
-+
-+static int wm8731_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 iface = 0, srate;
-+      int i = get_coeff(rtd->codec_dai->mclk,
-+              snd_soc_get_rate(rtd->codec_dai->dai_runtime.pcmrate));
-+
-+      /* set master/slave audio interface */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              iface |= 0x0040;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              break;
-+      }
-+      srate = (coeff_div[i].sr << 2) |
-+              (coeff_div[i].bosr << 1) | coeff_div[i].usb;
-+      wm8731_write(codec, WM8731_SRATE, srate);
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              iface |= 0x0002;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              iface |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              iface |= 0x0003;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_B:
-+              iface |= 0x0013;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              iface |= 0x0004;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              iface |= 0x0008;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              iface |= 0x000c;
-+              break;
-+      }
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_NB_NF:
-+              break;
-+      case SND_SOC_DAIFMT_IB_IF:
-+              iface |= 0x0090;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              iface |= 0x0080;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              iface |= 0x0010;
-+              break;
-+      }
-+
-+      /* set iface */
-+      wm8731_write(codec, WM8731_IFACE, iface);
-+
-+      /* set active */
-+      wm8731_write(codec, WM8731_ACTIVE, 0x0001);
-+      return 0;
-+}
-+
-+static void wm8731_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      /* deactivate */
-+      if (!codec->active) {
-+              udelay(50);
-+              wm8731_write(codec, WM8731_ACTIVE, 0x0);
-+      }
-+}
-+
-+static int wm8731_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = wm8731_read_reg_cache(codec, WM8731_APDIGI) & 0xfff7;
-+      if (mute)
-+              wm8731_write(codec, WM8731_APDIGI, mute_reg | 0x8);
-+      else
-+              wm8731_write(codec, WM8731_APDIGI, mute_reg);
-+      return 0;
-+}
-+
-+static int wm8731_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      u16 reg = wm8731_read_reg_cache(codec, WM8731_PWR) & 0xff7f;
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* vref/mid, osc on, dac unmute */
-+              wm8731_write(codec, WM8731_PWR, reg);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* everything off except vref/vmid, */
-+              wm8731_write(codec, WM8731_PWR, reg | 0x0040);
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              /* everything off, dac mute, inactive */
-+              wm8731_write(codec, WM8731_ACTIVE, 0x0);
-+              wm8731_write(codec, WM8731_PWR, 0xffff);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai wm8731_dai = {
-+      .name = "WM8731",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .config_sysclk = wm8731_config_sysclk,
-+      .digital_mute = wm8731_mute,
-+      .ops = {
-+              .prepare = wm8731_pcm_prepare,
-+              .shutdown = wm8731_shutdown,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8731_modes),
-+              .mode = wm8731_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm8731_dai);
-+
-+static int wm8731_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8731_write(codec, WM8731_ACTIVE, 0x0);
-+      wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8731_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8731_reg); i++) {
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+      wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8731_dapm_event(codec, codec->suspend_dapm_state);
-+      return 0;
-+}
-+
-+/*
-+ * initialise the WM8731 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int wm8731_init(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int reg, ret = 0;
-+
-+      codec->name = "WM8731";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8731_read_reg_cache;
-+      codec->write = wm8731_write;
-+      codec->dapm_event = wm8731_dapm_event;
-+      codec->dai = &wm8731_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8731_reg);
-+
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8731_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache,
-+              wm8731_reg, sizeof(u16) * ARRAY_SIZE(wm8731_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8731_reg);
-+
-+      wm8731_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if (ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* power on device */
-+      wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      /* set the update bits */
-+      reg = wm8731_read_reg_cache(codec, WM8731_LOUT1V);
-+      wm8731_write(codec, WM8731_LOUT1V, reg | 0x0100);
-+      reg = wm8731_read_reg_cache(codec, WM8731_ROUT1V);
-+      wm8731_write(codec, WM8731_ROUT1V, reg | 0x0100);
-+      reg = wm8731_read_reg_cache(codec, WM8731_LINVOL);
-+      wm8731_write(codec, WM8731_LINVOL, reg | 0x0100);
-+      reg = wm8731_read_reg_cache(codec, WM8731_RINVOL);
-+      wm8731_write(codec, WM8731_RINVOL, reg | 0x0100);
-+
-+      wm8731_add_controls(codec);
-+      wm8731_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if (ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+static struct snd_soc_device *wm8731_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+/*
-+ * WM8731 2 wire address is determined by GPIO5
-+ * state during powerup.
-+ *    low  = 0x1a
-+ *    high = 0x1b
-+ */
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver wm8731_i2c_driver;
-+static struct i2c_client client_template;
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+
-+static int wm8731_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = wm8731_socdev;
-+      struct wm8731_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL) {
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+      i2c_set_clientdata(i2c, codec);
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if (ret < 0) {
-+              err("failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = wm8731_init(socdev);
-+      if (ret < 0) {
-+              err("failed to initialise WM8731\n");
-+              goto err;
-+      }
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+}
-+
-+static int wm8731_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec* codec = i2c_get_clientdata(client);
-+      i2c_detach_client(client);
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+      return 0;
-+}
-+
-+static int wm8731_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, wm8731_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver wm8731_i2c_driver = {
-+      .driver = {
-+              .name = "WM8731 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_WM8731,
-+      .attach_adapter = wm8731_i2c_attach,
-+      .detach_client =  wm8731_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "WM8731",
-+      .driver = &wm8731_i2c_driver,
-+};
-+#endif
-+
-+static int wm8731_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8731_setup_data *setup;
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      info("WM8731 Audio Codec %s", WM8731_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      wm8731_socdev = socdev;
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&wm8731_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+      /* Add other interfaces here */
-+#endif
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8731_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8731_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&wm8731_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8731 = {
-+      .probe =        wm8731_probe,
-+      .remove =       wm8731_remove,
-+      .suspend =      wm8731_suspend,
-+      .resume =       wm8731_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8731);
-+
-+MODULE_DESCRIPTION("ASoC WM8731 driver");
-+MODULE_AUTHOR("Richard Purdie");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8731.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8731.h
-@@ -0,0 +1,41 @@
-+/*
-+ * wm8731.h  --  WM8731 Soc Audio driver
-+ *
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Author: Richard Purdie <richard@openedhand.com>
-+ *
-+ * Based on wm8753.h
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _WM8731_H
-+#define _WM8731_H
-+
-+/* WM8731 register space */
-+
-+#define WM8731_LINVOL   0x00
-+#define WM8731_RINVOL   0x01
-+#define WM8731_LOUT1V   0x02
-+#define WM8731_ROUT1V   0x03
-+#define WM8731_APANA    0x04
-+#define WM8731_APDIGI   0x05
-+#define WM8731_PWR      0x06
-+#define WM8731_IFACE    0x07
-+#define WM8731_SRATE    0x08
-+#define WM8731_ACTIVE   0x09
-+#define WM8731_RESET  0x0f
-+
-+#define WM8731_CACHEREGNUM    10
-+
-+struct wm8731_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+extern struct snd_soc_codec_dai wm8731_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_wm8731;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8750.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8750.c
-@@ -0,0 +1,1282 @@
-+/*
-+ * wm8750.c -- WM8750 ALSA SoC audio driver
-+ *
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Author: Richard Purdie <richard@openedhand.com>
-+ *
-+ * Based on WM8753.c
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8750.h"
-+
-+#define AUDIO_NAME "WM8750"
-+#define WM8750_VERSION "0.11"
-+
-+/*
-+ * Debug
-+ */
-+
-+#define WM8750_DEBUG 0
-+
-+#ifdef WM8750_DEBUG
-+#define dbg(format, arg...) \
-+      printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
-+#else
-+#define dbg(format, arg...) do {} while (0)
-+#endif
-+#define err(format, arg...) \
-+      printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-+#define info(format, arg...) \
-+      printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-+#define warn(format, arg...) \
-+      printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
-+
-+static struct workqueue_struct *wm8750_workq = NULL;
-+static struct work_struct wm8750_dapm_work;
-+
-+/*
-+ * wm8750 register cache
-+ * We can't read the WM8750 register space when we
-+ * are using 2 wire for device control, so we cache them instead.
-+ */
-+static const u16 wm8750_reg[] = {
-+      0x0097, 0x0097, 0x0079, 0x0079,  /*  0 */
-+      0x0000, 0x0008, 0x0000, 0x000a,  /*  4 */
-+      0x0000, 0x0000, 0x00ff, 0x00ff,  /*  8 */
-+      0x000f, 0x000f, 0x0000, 0x0000,  /* 12 */
-+      0x0000, 0x007b, 0x0000, 0x0032,  /* 16 */
-+      0x0000, 0x00c3, 0x00c3, 0x00c0,  /* 20 */
-+      0x0000, 0x0000, 0x0000, 0x0000,  /* 24 */
-+      0x0000, 0x0000, 0x0000, 0x0000,  /* 28 */
-+      0x0000, 0x0000, 0x0050, 0x0050,  /* 32 */
-+      0x0050, 0x0050, 0x0050, 0x0050,  /* 36 */
-+      0x0079, 0x0079, 0x0079,          /* 40 */
-+};
-+
-+#define WM8750_HIFI_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+      SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \
-+      SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM8750_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM8750_HIFI_FSB \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | \
-+      SND_SOC_FSBD(8) | SND_SOC_FSBD(16))
-+
-+#define WM8750_HIFI_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
-+
-+#define WM8750_HIFI_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
-+
-+static struct snd_soc_dai_mode wm8750_modes[] = {
-+      /* common codec frame and clock master modes */
-+      /* 8k */
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1536,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1408,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 2304,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 2112,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1500,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+
-+      /* 11.025k */
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1024,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1536,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1088,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+
-+      /* 16k */
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 768,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1152,
-+              .bfs = WM8750_HIFI_FSB
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 750,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+
-+      /* 22.05k */
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 512,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 768,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 544,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+
-+      /* 32k */
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 384,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 576,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 375,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+
-+      /* 44.1k & 48k */
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 384,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 272,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 250,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+
-+      /* 88.2k & 96k */
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 128,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 192,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 136,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 125,
-+              .bfs = WM8750_HIFI_FSB,
-+      },
-+
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = WM8750_HIFI_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM8750_HIFI_BITS,
-+              .pcmrate = WM8750_HIFI_RATES,
-+              .pcmdir = WM8750_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * read wm8750 register cache
-+ */
-+static inline unsigned int wm8750_read_reg_cache(struct snd_soc_codec *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg > WM8750_CACHE_REGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write wm8750 register cache
-+ */
-+static inline void wm8750_write_reg_cache(struct snd_soc_codec *codec,
-+      unsigned int reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg > WM8750_CACHE_REGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+static int wm8750_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8753 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8750_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -EIO;
-+}
-+
-+#define wm8750_reset(c)       wm8750_write(c, WM8750_RESET, 0)
-+
-+/*
-+ * WM8750 Controls
-+ */
-+static const char *wm8750_bass[] = {"Linear Control", "Adaptive Boost"};
-+static const char *wm8750_bass_filter[] = { "130Hz @ 48kHz", "200Hz @ 48kHz" };
-+static const char *wm8750_treble[] = {"8kHz", "4kHz"};
-+static const char *wm8750_3d_lc[] = {"200Hz", "500Hz"};
-+static const char *wm8750_3d_uc[] = {"2.2kHz", "1.5kHz"};
-+static const char *wm8750_3d_func[] = {"Capture", "Playback"};
-+static const char *wm8750_alc_func[] = {"Off", "Right", "Left", "Stereo"};
-+static const char *wm8750_ng_type[] = {"Constant PGA Gain",
-+      "Mute ADC Output"};
-+static const char *wm8750_line_mux[] = {"Line 1", "Line 2", "Line 3", "PGA",
-+      "Differential"};
-+static const char *wm8750_pga_sel[] = {"Line 1", "Line 2", "Line 3",
-+      "Differential"};
-+static const char *wm8750_out3[] = {"VREF", "ROUT1 + Vol", "MonoOut",
-+      "ROUT1"};
-+static const char *wm8750_diff_sel[] = {"Line 1", "Line 2"};
-+static const char *wm8750_adcpol[] = {"Normal", "L Invert", "R Invert",
-+      "L + R Invert"};
-+static const char *wm8750_deemph[] = {"None", "32Khz", "44.1Khz", "48Khz"};
-+static const char *wm8750_mono_mux[] = {"Stereo", "Mono (Left)",
-+      "Mono (Right)", "Digital Mono"};
-+
-+static const struct soc_enum wm8750_enum[] = {
-+SOC_ENUM_SINGLE(WM8750_BASS, 7, 2, wm8750_bass),
-+SOC_ENUM_SINGLE(WM8750_BASS, 6, 2, wm8750_bass_filter),
-+SOC_ENUM_SINGLE(WM8750_TREBLE, 6, 2, wm8750_treble),
-+SOC_ENUM_SINGLE(WM8750_3D, 5, 2, wm8750_3d_lc),
-+SOC_ENUM_SINGLE(WM8750_3D, 6, 2, wm8750_3d_uc),
-+SOC_ENUM_SINGLE(WM8750_3D, 7, 2, wm8750_3d_func),
-+SOC_ENUM_SINGLE(WM8750_ALC1, 7, 4, wm8750_alc_func),
-+SOC_ENUM_SINGLE(WM8750_NGATE, 1, 2, wm8750_ng_type),
-+SOC_ENUM_SINGLE(WM8750_LOUTM1, 0, 5, wm8750_line_mux),
-+SOC_ENUM_SINGLE(WM8750_ROUTM1, 0, 5, wm8750_line_mux),
-+SOC_ENUM_SINGLE(WM8750_LADCIN, 6, 4, wm8750_pga_sel), /* 10 */
-+SOC_ENUM_SINGLE(WM8750_RADCIN, 6, 4, wm8750_pga_sel),
-+SOC_ENUM_SINGLE(WM8750_ADCTL2, 7, 4, wm8750_out3),
-+SOC_ENUM_SINGLE(WM8750_ADCIN, 8, 2, wm8750_diff_sel),
-+SOC_ENUM_SINGLE(WM8750_ADCDAC, 5, 4, wm8750_adcpol),
-+SOC_ENUM_SINGLE(WM8750_ADCDAC, 1, 4, wm8750_deemph),
-+SOC_ENUM_SINGLE(WM8750_ADCIN, 6, 4, wm8750_mono_mux), /* 16 */
-+
-+};
-+
-+static const struct snd_kcontrol_new wm8750_snd_controls[] = {
-+
-+SOC_DOUBLE_R("Capture Volume", WM8750_LINVOL, WM8750_RINVOL, 0, 63, 0),
-+SOC_DOUBLE_R("Capture ZC Switch", WM8750_LINVOL, WM8750_RINVOL, 6, 1, 0),
-+SOC_DOUBLE_R("Capture Switch", WM8750_LINVOL, WM8750_RINVOL, 7, 1, 1),
-+
-+SOC_DOUBLE_R("Headphone Playback ZC Switch", WM8750_LOUT1V,
-+      WM8750_ROUT1V, 7, 1, 0),
-+SOC_DOUBLE_R("Speaker Playback ZC Switch", WM8750_LOUT2V,
-+      WM8750_ROUT2V, 7, 1, 0),
-+
-+SOC_ENUM("Playback De-emphasis", wm8750_enum[15]),
-+
-+SOC_ENUM("Capture Polarity", wm8750_enum[14]),
-+SOC_SINGLE("Playback 6dB Attenuate", WM8750_ADCDAC, 7, 1, 0),
-+SOC_SINGLE("Capture 6dB Attenuate", WM8750_ADCDAC, 8, 1, 0),
-+
-+SOC_DOUBLE_R("PCM Volume", WM8750_LDAC, WM8750_RDAC, 0, 255, 0),
-+
-+SOC_ENUM("Bass Boost", wm8750_enum[0]),
-+SOC_ENUM("Bass Filter", wm8750_enum[1]),
-+SOC_SINGLE("Bass Volume", WM8750_BASS, 0, 15, 1),
-+
-+SOC_SINGLE("Treble Volume", WM8750_TREBLE, 0, 15, 0),
-+SOC_ENUM("Treble Cut-off", wm8750_enum[2]),
-+
-+SOC_SINGLE("3D Switch", WM8750_3D, 0, 1, 0),
-+SOC_SINGLE("3D Volume", WM8750_3D, 1, 15, 0),
-+SOC_ENUM("3D Lower Cut-off", wm8750_enum[3]),
-+SOC_ENUM("3D Upper Cut-off", wm8750_enum[4]),
-+SOC_ENUM("3D Mode", wm8750_enum[5]),
-+
-+SOC_SINGLE("ALC Capture Target Volume", WM8750_ALC1, 0, 7, 0),
-+SOC_SINGLE("ALC Capture Max Volume", WM8750_ALC1, 4, 7, 0),
-+SOC_ENUM("ALC Capture Function", wm8750_enum[6]),
-+SOC_SINGLE("ALC Capture ZC Switch", WM8750_ALC2, 7, 1, 0),
-+SOC_SINGLE("ALC Capture Hold Time", WM8750_ALC2, 0, 15, 0),
-+SOC_SINGLE("ALC Capture Decay Time", WM8750_ALC3, 4, 15, 0),
-+SOC_SINGLE("ALC Capture Attack Time", WM8750_ALC3, 0, 15, 0),
-+SOC_SINGLE("ALC Capture NG Threshold", WM8750_NGATE, 3, 31, 0),
-+SOC_ENUM("ALC Capture NG Type", wm8750_enum[4]),
-+SOC_SINGLE("ALC Capture NG Switch", WM8750_NGATE, 0, 1, 0),
-+
-+SOC_SINGLE("Left ADC Capture Volume", WM8750_LADC, 0, 255, 0),
-+SOC_SINGLE("Right ADC Capture Volume", WM8750_RADC, 0, 255, 0),
-+
-+SOC_SINGLE("ZC Timeout Switch", WM8750_ADCTL1, 0, 1, 0),
-+SOC_SINGLE("Playback Invert Switch", WM8750_ADCTL1, 1, 1, 0),
-+
-+SOC_SINGLE("Right Speaker Playback Invert Switch", WM8750_ADCTL2, 4, 1, 0),
-+
-+/* Unimplemented */
-+/* ADCDAC Bit 0 - ADCHPD */
-+/* ADCDAC Bit 4 - HPOR */
-+/* ADCTL1 Bit 2,3 - DATSEL */
-+/* ADCTL1 Bit 4,5 - DMONOMIX */
-+/* ADCTL1 Bit 6,7 - VSEL */
-+/* ADCTL2 Bit 2 - LRCM */
-+/* ADCTL2 Bit 3 - TRI */
-+/* ADCTL3 Bit 5 - HPFLREN */
-+/* ADCTL3 Bit 6 - VROI */
-+/* ADCTL3 Bit 7,8 - ADCLRM */
-+/* ADCIN Bit 4 - LDCM */
-+/* ADCIN Bit 5 - RDCM */
-+
-+SOC_DOUBLE_R("Mic Boost", WM8750_LADCIN, WM8750_RADCIN, 4, 3, 0),
-+
-+SOC_DOUBLE_R("Bypass Left Playback Volume", WM8750_LOUTM1,
-+      WM8750_LOUTM2, 4, 7, 1),
-+SOC_DOUBLE_R("Bypass Right Playback Volume", WM8750_ROUTM1,
-+      WM8750_ROUTM2, 4, 7, 1),
-+SOC_DOUBLE_R("Bypass Mono Playback Volume", WM8750_MOUTM1,
-+      WM8750_MOUTM2, 4, 7, 1),
-+
-+SOC_SINGLE("Mono Playback ZC Switch", WM8750_MOUTV, 7, 1, 0),
-+
-+SOC_DOUBLE_R("Headphone Playback Volume", WM8750_LOUT1V, WM8750_ROUT1V,
-+      0, 127, 0),
-+SOC_DOUBLE_R("Speaker Playback Volume", WM8750_LOUT2V, WM8750_ROUT2V,
-+      0, 127, 0),
-+
-+SOC_SINGLE("Mono Playback Volume", WM8750_MOUTV, 0, 127, 0),
-+
-+};
-+
-+/* add non dapm controls */
-+static int wm8750_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8750_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8750_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+      return 0;
-+}
-+
-+/*
-+ * DAPM Controls
-+ */
-+
-+/* Left Mixer */
-+static const struct snd_kcontrol_new wm8750_left_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Playback Switch", WM8750_LOUTM1, 8, 1, 0),
-+SOC_DAPM_SINGLE("Left Bypass Switch", WM8750_LOUTM1, 7, 1, 0),
-+SOC_DAPM_SINGLE("Right Playback Switch", WM8750_LOUTM2, 8, 1, 0),
-+SOC_DAPM_SINGLE("Right Bypass Switch", WM8750_LOUTM2, 7, 1, 0),
-+};
-+
-+/* Right Mixer */
-+static const struct snd_kcontrol_new wm8750_right_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Left Playback Switch", WM8750_ROUTM1, 8, 1, 0),
-+SOC_DAPM_SINGLE("Left Bypass Switch", WM8750_ROUTM1, 7, 1, 0),
-+SOC_DAPM_SINGLE("Playback Switch", WM8750_ROUTM2, 8, 1, 0),
-+SOC_DAPM_SINGLE("Right Bypass Switch", WM8750_ROUTM2, 7, 1, 0),
-+};
-+
-+/* Mono Mixer */
-+static const struct snd_kcontrol_new wm8750_mono_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Left Playback Switch", WM8750_MOUTM1, 8, 1, 0),
-+SOC_DAPM_SINGLE("Left Bypass Switch", WM8750_MOUTM1, 7, 1, 0),
-+SOC_DAPM_SINGLE("Right Playback Switch", WM8750_MOUTM2, 8, 1, 0),
-+SOC_DAPM_SINGLE("Right Bypass Switch", WM8750_MOUTM2, 7, 1, 0),
-+};
-+
-+/* Left Line Mux */
-+static const struct snd_kcontrol_new wm8750_left_line_controls =
-+SOC_DAPM_ENUM("Route", wm8750_enum[8]);
-+
-+/* Right Line Mux */
-+static const struct snd_kcontrol_new wm8750_right_line_controls =
-+SOC_DAPM_ENUM("Route", wm8750_enum[9]);
-+
-+/* Left PGA Mux */
-+static const struct snd_kcontrol_new wm8750_left_pga_controls =
-+SOC_DAPM_ENUM("Route", wm8750_enum[10]);
-+
-+/* Right PGA Mux */
-+static const struct snd_kcontrol_new wm8750_right_pga_controls =
-+SOC_DAPM_ENUM("Route", wm8750_enum[11]);
-+
-+/* Out 3 Mux */
-+static const struct snd_kcontrol_new wm8750_out3_controls =
-+SOC_DAPM_ENUM("Route", wm8750_enum[12]);
-+
-+/* Differential Mux */
-+static const struct snd_kcontrol_new wm8750_diffmux_controls =
-+SOC_DAPM_ENUM("Route", wm8750_enum[13]);
-+
-+/* Mono ADC Mux */
-+static const struct snd_kcontrol_new wm8750_monomux_controls =
-+SOC_DAPM_ENUM("Route", wm8750_enum[16]);
-+
-+static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = {
-+      SND_SOC_DAPM_MIXER("Left Mixer", SND_SOC_NOPM, 0, 0,
-+              &wm8750_left_mixer_controls[0],
-+              ARRAY_SIZE(wm8750_left_mixer_controls)),
-+      SND_SOC_DAPM_MIXER("Right Mixer", SND_SOC_NOPM, 0, 0,
-+              &wm8750_right_mixer_controls[0],
-+              ARRAY_SIZE(wm8750_right_mixer_controls)),
-+      SND_SOC_DAPM_MIXER("Mono Mixer", WM8750_PWR2, 2, 0,
-+              &wm8750_mono_mixer_controls[0],
-+              ARRAY_SIZE(wm8750_mono_mixer_controls)),
-+
-+      SND_SOC_DAPM_PGA("Right Out 2", WM8750_PWR2, 3, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Left Out 2", WM8750_PWR2, 4, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Right Out 1", WM8750_PWR2, 5, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Left Out 1", WM8750_PWR2, 6, 0, NULL, 0),
-+      SND_SOC_DAPM_DAC("Right DAC", "Right Playback", WM8750_PWR2, 7, 0),
-+      SND_SOC_DAPM_DAC("Left DAC", "Left Playback", WM8750_PWR2, 8, 0),
-+
-+      SND_SOC_DAPM_MICBIAS("Mic Bias", WM8750_PWR1, 1, 0),
-+      SND_SOC_DAPM_ADC("Right ADC", "Right Capture", WM8750_PWR1, 2, 0),
-+      SND_SOC_DAPM_ADC("Left ADC", "Left Capture", WM8750_PWR1, 3, 0),
-+
-+      SND_SOC_DAPM_MUX("Left PGA Mux", WM8750_PWR1, 5, 0,
-+              &wm8750_left_pga_controls),
-+      SND_SOC_DAPM_MUX("Right PGA Mux", WM8750_PWR1, 4, 0,
-+              &wm8750_right_pga_controls),
-+      SND_SOC_DAPM_MUX("Left Line Mux", SND_SOC_NOPM, 0, 0,
-+              &wm8750_left_line_controls),
-+      SND_SOC_DAPM_MUX("Right Line Mux", SND_SOC_NOPM, 0, 0,
-+              &wm8750_right_line_controls),
-+
-+      SND_SOC_DAPM_MUX("Out3 Mux", SND_SOC_NOPM, 0, 0, &wm8750_out3_controls),
-+      SND_SOC_DAPM_PGA("Out 3", WM8750_PWR2, 1, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Mono Out 1", WM8750_PWR2, 2, 0, NULL, 0),
-+
-+      SND_SOC_DAPM_MUX("Differential Mux", SND_SOC_NOPM, 0, 0,
-+              &wm8750_diffmux_controls),
-+      SND_SOC_DAPM_MUX("Left ADC Mux", SND_SOC_NOPM, 0, 0,
-+              &wm8750_monomux_controls),
-+      SND_SOC_DAPM_MUX("Right ADC Mux", SND_SOC_NOPM, 0, 0,
-+              &wm8750_monomux_controls),
-+
-+      SND_SOC_DAPM_OUTPUT("LOUT1"),
-+      SND_SOC_DAPM_OUTPUT("ROUT1"),
-+      SND_SOC_DAPM_OUTPUT("LOUT2"),
-+      SND_SOC_DAPM_OUTPUT("ROUT2"),
-+      SND_SOC_DAPM_OUTPUT("MONO"),
-+      SND_SOC_DAPM_OUTPUT("OUT3"),
-+
-+      SND_SOC_DAPM_INPUT("LINPUT1"),
-+      SND_SOC_DAPM_INPUT("LINPUT2"),
-+      SND_SOC_DAPM_INPUT("LINPUT3"),
-+      SND_SOC_DAPM_INPUT("RINPUT1"),
-+      SND_SOC_DAPM_INPUT("RINPUT2"),
-+      SND_SOC_DAPM_INPUT("RINPUT3"),
-+};
-+
-+static const char *audio_map[][3] = {
-+      /* left mixer */
-+      {"Left Mixer", "Playback Switch", "Left DAC"},
-+      {"Left Mixer", "Left Bypass Switch", "Left Line Mux"},
-+      {"Left Mixer", "Right Playback Switch", "Right DAC"},
-+      {"Left Mixer", "Right Bypass Switch", "Right Line Mux"},
-+
-+      /* right mixer */
-+      {"Right Mixer", "Left Playback Switch", "Left DAC"},
-+      {"Right Mixer", "Left Bypass Switch", "Left Line Mux"},
-+      {"Right Mixer", "Playback Switch", "Right DAC"},
-+      {"Right Mixer", "Right Bypass Switch", "Right Line Mux"},
-+
-+      /* left out 1 */
-+      {"Left Out 1", NULL, "Left Mixer"},
-+      {"LOUT1", NULL, "Left Out 1"},
-+
-+      /* left out 2 */
-+      {"Left Out 2", NULL, "Left Mixer"},
-+      {"LOUT2", NULL, "Left Out 2"},
-+
-+      /* right out 1 */
-+      {"Right Out 1", NULL, "Right Mixer"},
-+      {"ROUT1", NULL, "Right Out 1"},
-+
-+      /* right out 2 */
-+      {"Right Out 2", NULL, "Right Mixer"},
-+      {"ROUT2", NULL, "Right Out 2"},
-+
-+      /* mono mixer */
-+      {"Mono Mixer", "Left Playback Switch", "Left DAC"},
-+      {"Mono Mixer", "Left Bypass Switch", "Left Line Mux"},
-+      {"Mono Mixer", "Right Playback Switch", "Right DAC"},
-+      {"Mono Mixer", "Right Bypass Switch", "Right Line Mux"},
-+
-+      /* mono out */
-+      {"Mono Out 1", NULL, "Mono Mixer"},
-+      {"MONO1", NULL, "Mono Out 1"},
-+
-+      /* out 3 */
-+      {"Out3 Mux", "VREF", "VREF"},
-+      {"Out3 Mux", "ROUT1 + Vol", "ROUT1"},
-+      {"Out3 Mux", "ROUT1", "Right Mixer"},
-+      {"Out3 Mux", "MonoOut", "MONO1"},
-+      {"Out 3", NULL, "Out3 Mux"},
-+      {"OUT3", NULL, "Out 3"},
-+
-+      /* Left Line Mux */
-+      {"Left Line Mux", "Line 1", "LINPUT1"},
-+      {"Left Line Mux", "Line 2", "LINPUT2"},
-+      {"Left Line Mux", "Line 3", "LINPUT3"},
-+      {"Left Line Mux", "PGA", "Left PGA Mux"},
-+      {"Left Line Mux", "Differential", "Differential Mux"},
-+
-+      /* Right Line Mux */
-+      {"Right Line Mux", "Line 1", "RINPUT1"},
-+      {"Right Line Mux", "Line 2", "RINPUT2"},
-+      {"Right Line Mux", "Line 3", "RINPUT3"},
-+      {"Right Line Mux", "PGA", "Right PGA Mux"},
-+      {"Right Line Mux", "Differential", "Differential Mux"},
-+
-+      /* Left PGA Mux */
-+      {"Left PGA Mux", "Line 1", "LINPUT1"},
-+      {"Left PGA Mux", "Line 2", "LINPUT2"},
-+      {"Left PGA Mux", "Line 3", "LINPUT3"},
-+      {"Left PGA Mux", "Differential", "Differential Mux"},
-+
-+      /* Right PGA Mux */
-+      {"Right PGA Mux", "Line 1", "RINPUT1"},
-+      {"Right PGA Mux", "Line 2", "RINPUT2"},
-+      {"Right PGA Mux", "Line 3", "RINPUT3"},
-+      {"Right PGA Mux", "Differential", "Differential Mux"},
-+
-+      /* Differential Mux */
-+      {"Differential Mux", "Line 1", "LINPUT1"},
-+      {"Differential Mux", "Line 1", "RINPUT1"},
-+      {"Differential Mux", "Line 2", "LINPUT2"},
-+      {"Differential Mux", "Line 2", "RINPUT2"},
-+
-+      /* Left ADC Mux */
-+      {"Left ADC Mux", "Stereo", "Left PGA Mux"},
-+      {"Left ADC Mux", "Mono (Left)", "Left PGA Mux"},
-+      {"Left ADC Mux", "Digital Mono", "Left PGA Mux"},
-+
-+      /* Right ADC Mux */
-+      {"Right ADC Mux", "Stereo", "Right PGA Mux"},
-+      {"Right ADC Mux", "Mono (Right)", "Right PGA Mux"},
-+      {"Right ADC Mux", "Digital Mono", "Right PGA Mux"},
-+
-+      /* ADC */
-+      {"Left ADC", NULL, "Left ADC Mux"},
-+      {"Right ADC", NULL, "Right ADC Mux"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm8750_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm8750_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8750_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+struct _coeff_div {
-+      u32 mclk;
-+      u32 rate;
-+      u16 fs;
-+      u8 sr:5;
-+      u8 usb:1;
-+};
-+
-+/* codec hifi mclk clock divider coefficients */
-+static const struct _coeff_div coeff_div[] = {
-+      /* 8k */
-+      {12288000, 8000, 1536, 0x6, 0x0},
-+      {11289600, 8000, 1408, 0x16, 0x0},
-+      {18432000, 8000, 2304, 0x7, 0x0},
-+      {16934400, 8000, 2112, 0x17, 0x0},
-+      {12000000, 8000, 1500, 0x6, 0x1},
-+
-+      /* 11.025k */
-+      {11289600, 11025, 1024, 0x18, 0x0},
-+      {16934400, 11025, 1536, 0x19, 0x0},
-+      {12000000, 11025, 1088, 0x19, 0x1},
-+
-+      /* 16k */
-+      {12288000, 16000, 768, 0xa, 0x0},
-+      {18432000, 16000, 1152, 0xb, 0x0},
-+      {12000000, 16000, 750, 0xa, 0x1},
-+
-+      /* 22.05k */
-+      {11289600, 22050, 512, 0x1a, 0x0},
-+      {16934400, 22050, 768, 0x1b, 0x0},
-+      {12000000, 22050, 544, 0x1b, 0x1},
-+
-+      /* 32k */
-+      {12288000, 32000, 384, 0xc, 0x0},
-+      {18432000, 32000, 576, 0xd, 0x0},
-+      {12000000, 32000, 375, 0xa, 0x1},
-+
-+      /* 44.1k */
-+      {11289600, 44100, 256, 0x10, 0x0},
-+      {16934400, 44100, 384, 0x11, 0x0},
-+      {12000000, 44100, 272, 0x11, 0x1},
-+
-+      /* 48k */
-+      {12288000, 48000, 256, 0x0, 0x0},
-+      {18432000, 48000, 384, 0x1, 0x0},
-+      {12000000, 48000, 250, 0x0, 0x1},
-+
-+      /* 88.2k */
-+      {11289600, 88200, 128, 0x1e, 0x0},
-+      {16934400, 88200, 192, 0x1f, 0x0},
-+      {12000000, 88200, 136, 0x1f, 0x1},
-+
-+      /* 96k */
-+      {12288000, 96000, 128, 0xe, 0x0},
-+      {18432000, 96000, 192, 0xf, 0x0},
-+      {12000000, 96000, 125, 0xe, 0x1},
-+};
-+
-+static inline int get_coeff(int mclk, int rate)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
-+              if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)
-+                      return i;
-+      }
-+
-+      printk(KERN_ERR "wm8750: could not get coeff for mclk %d @ rate %d\n",
-+              mclk, rate);
-+      return -EINVAL;
-+}
-+
-+/* WM8750 supports numerous input clocks per sample rate */
-+static unsigned int wm8750_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      dai->mclk = clk;
-+      return dai->mclk;
-+}
-+
-+static int wm8750_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 iface = 0, bfs, srate = 0;
-+      int i = get_coeff(rtd->codec_dai->mclk,
-+              snd_soc_get_rate(rtd->codec_dai->dai_runtime.pcmrate));
-+
-+      /* is coefficient valid ? */
-+      if (i < 0)
-+              return i;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+
-+      /* set master/slave audio interface */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              iface = 0x0040;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              break;
-+      }
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              iface |= 0x0002;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              iface |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              iface |= 0x0003;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_B:
-+              iface |= 0x0013;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              iface |= 0x0004;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              iface |= 0x0008;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              iface |= 0x000c;
-+              break;
-+      }
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_NB_NF:
-+              break;
-+      case SND_SOC_DAIFMT_IB_IF:
-+              iface |= 0x0090;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              iface |= 0x0080;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              iface |= 0x0010;
-+              break;
-+      }
-+
-+      /* set bclk divisor rate */
-+      switch (bfs) {
-+      case 1:
-+              break;
-+      case 4:
-+              srate |= (0x1 << 7);
-+              break;
-+      case 8:
-+              srate |= (0x2 << 7);
-+              break;
-+      case 16:
-+              srate |= (0x3 << 7);
-+              break;
-+      }
-+
-+      /* set iface & srate */
-+      wm8750_write(codec, WM8750_IFACE, iface);
-+      wm8750_write(codec, WM8750_SRATE, srate |
-+              (coeff_div[i].sr << 1) | coeff_div[i].usb);
-+
-+      return 0;
-+}
-+
-+static int wm8750_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = wm8750_read_reg_cache(codec, WM8750_ADCDAC) & 0xfff7;
-+      if (mute)
-+              wm8750_write(codec, WM8750_ADCDAC, mute_reg | 0x8);
-+      else
-+              wm8750_write(codec, WM8750_ADCDAC, mute_reg);
-+      return 0;
-+}
-+
-+static int wm8750_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      u16 pwr_reg = wm8750_read_reg_cache(codec, WM8750_PWR1) & 0xfe3e;
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* set vmid to 50k and unmute dac */
-+              wm8750_write(codec, WM8750_PWR1, pwr_reg | 0x00c0);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              /* set vmid to 5k for quick power up */
-+              wm8750_write(codec, WM8750_PWR1, pwr_reg | 0x01c1);
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* mute dac and set vmid to 500k, enable VREF */
-+              wm8750_write(codec, WM8750_PWR1, pwr_reg | 0x0141);
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              wm8750_write(codec, WM8750_PWR1, 0x0001);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai wm8750_dai = {
-+      .name = "WM8750",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .config_sysclk = wm8750_config_sysclk,
-+      .digital_mute = wm8750_mute,
-+      .ops = {
-+              .prepare = wm8750_pcm_prepare,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8750_modes),
-+              .mode = wm8750_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm8750_dai);
-+
-+static void wm8750_work(void *data)
-+{
-+      struct snd_soc_codec *codec = (struct snd_soc_codec *)data;
-+      wm8750_dapm_event(codec, codec->dapm_state);
-+}
-+
-+static int wm8750_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8750_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8750_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8750_reg); i++) {
-+              if (i == WM8750_RESET)
-+                      continue;
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+
-+      wm8750_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      /* charge wm8750 caps */
-+      if (codec->suspend_dapm_state == SNDRV_CTL_POWER_D0) {
-+              wm8750_dapm_event(codec, SNDRV_CTL_POWER_D2);
-+              codec->dapm_state = SNDRV_CTL_POWER_D0;
-+              queue_delayed_work(wm8750_workq, &wm8750_dapm_work,
-+                       msecs_to_jiffies(1000));
-+      }
-+
-+      return 0;
-+}
-+
-+/*
-+ * initialise the WM8750 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int wm8750_init(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int reg, ret = 0;
-+
-+      codec->name = "WM8750";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8750_read_reg_cache;
-+      codec->write = wm8750_write;
-+      codec->dapm_event = wm8750_dapm_event;
-+      codec->dai = &wm8750_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8750_reg);
-+
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8750_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, wm8750_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm8750_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8750_reg);
-+
-+      wm8750_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if (ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* charge output caps */
-+      wm8750_dapm_event(codec, SNDRV_CTL_POWER_D2);
-+      codec->dapm_state = SNDRV_CTL_POWER_D3hot;
-+      queue_delayed_work(wm8750_workq, &wm8750_dapm_work,
-+              msecs_to_jiffies(1000));
-+
-+      /* set the update bits */
-+      reg = wm8750_read_reg_cache(codec, WM8750_LDAC);
-+      wm8750_write(codec, WM8750_LDAC, reg | 0x0100);
-+      reg = wm8750_read_reg_cache(codec, WM8750_RDAC);
-+      wm8750_write(codec, WM8750_RDAC, reg | 0x0100);
-+      reg = wm8750_read_reg_cache(codec, WM8750_LOUT1V);
-+      wm8750_write(codec, WM8750_LOUT1V, reg | 0x0100);
-+      reg = wm8750_read_reg_cache(codec, WM8750_ROUT1V);
-+      wm8750_write(codec, WM8750_ROUT1V, reg | 0x0100);
-+      reg = wm8750_read_reg_cache(codec, WM8750_LOUT2V);
-+      wm8750_write(codec, WM8750_LOUT2V, reg | 0x0100);
-+      reg = wm8750_read_reg_cache(codec, WM8750_ROUT2V);
-+      wm8750_write(codec, WM8750_ROUT2V, reg | 0x0100);
-+      reg = wm8750_read_reg_cache(codec, WM8750_LINVOL);
-+      wm8750_write(codec, WM8750_LINVOL, reg | 0x0100);
-+      reg = wm8750_read_reg_cache(codec, WM8750_RINVOL);
-+      wm8750_write(codec, WM8750_RINVOL, reg | 0x0100);
-+
-+      wm8750_add_controls(codec);
-+      wm8750_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if (ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+static struct snd_soc_device *wm8750_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+/*
-+ * WM8731 2 wire address is determined by GPIO5
-+ * state during powerup.
-+ *    low  = 0x1a
-+ *    high = 0x1b
-+ */
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver wm8750_i2c_driver;
-+static struct i2c_client client_template;
-+
-+static int wm8750_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = wm8750_socdev;
-+      struct wm8750_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL) {
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+      i2c_set_clientdata(i2c, codec);
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if (ret < 0) {
-+              err("failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = wm8750_init(socdev);
-+      if (ret < 0) {
-+      err("failed to initialise WM8750\n");
-+              goto err;
-+      }
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+}
-+
-+static int wm8750_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec *codec = i2c_get_clientdata(client);
-+      i2c_detach_client(client);
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+      return 0;
-+}
-+
-+static int wm8750_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, wm8750_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver wm8750_i2c_driver = {
-+      .driver = {
-+              .name = "WM8750 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_WM8750,
-+      .attach_adapter = wm8750_i2c_attach,
-+      .detach_client =  wm8750_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "WM8750",
-+      .driver = &wm8750_i2c_driver,
-+};
-+#endif
-+
-+static int wm8750_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8750_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      info("WM8750 Audio Codec %s", WM8750_VERSION);
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+      wm8750_socdev = socdev;
-+      INIT_WORK(&wm8750_dapm_work, wm8750_work, codec);
-+      wm8750_workq = create_workqueue("wm8750");
-+      if (wm8750_workq == NULL) {
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&wm8750_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+              /* Add other interfaces here */
-+#endif
-+
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8750_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8750_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      if (wm8750_workq)
-+              destroy_workqueue(wm8750_workq);
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&wm8750_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8750 = {
-+      .probe =        wm8750_probe,
-+      .remove =       wm8750_remove,
-+      .suspend =      wm8750_suspend,
-+      .resume =       wm8750_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8750);
-+
-+MODULE_DESCRIPTION("ASoC WM8750 driver");
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8750.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8750.h
-@@ -0,0 +1,66 @@
-+/*
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Author: Richard Purdie <richard@openedhand.com>
-+ *
-+ * Based on WM8753.h
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ */
-+
-+#ifndef _WM8750_H
-+#define _WM8750_H
-+
-+/* WM8750 register space */
-+
-+#define WM8750_LINVOL    0x00
-+#define WM8750_RINVOL    0x01
-+#define WM8750_LOUT1V    0x02
-+#define WM8750_ROUT1V    0x03
-+#define WM8750_ADCDAC    0x05
-+#define WM8750_IFACE     0x07
-+#define WM8750_SRATE     0x08
-+#define WM8750_LDAC      0x0a
-+#define WM8750_RDAC      0x0b
-+#define WM8750_BASS      0x0c
-+#define WM8750_TREBLE    0x0d
-+#define WM8750_RESET     0x0f
-+#define WM8750_3D        0x10
-+#define WM8750_ALC1      0x11
-+#define WM8750_ALC2      0x12
-+#define WM8750_ALC3      0x13
-+#define WM8750_NGATE     0x14
-+#define WM8750_LADC      0x15
-+#define WM8750_RADC      0x16
-+#define WM8750_ADCTL1    0x17
-+#define WM8750_ADCTL2    0x18
-+#define WM8750_PWR1      0x19
-+#define WM8750_PWR2      0x1a
-+#define WM8750_ADCTL3    0x1b
-+#define WM8750_ADCIN     0x1f
-+#define WM8750_LADCIN    0x20
-+#define WM8750_RADCIN    0x21
-+#define WM8750_LOUTM1    0x22
-+#define WM8750_LOUTM2    0x23
-+#define WM8750_ROUTM1    0x24
-+#define WM8750_ROUTM2    0x25
-+#define WM8750_MOUTM1    0x26
-+#define WM8750_MOUTM2    0x27
-+#define WM8750_LOUT2V    0x28
-+#define WM8750_ROUT2V    0x29
-+#define WM8750_MOUTV     0x2a
-+
-+#define WM8750_CACHE_REGNUM 0x2a
-+
-+struct wm8750_setup_data {
-+      unsigned short i2c_address;
-+      unsigned int mclk;
-+};
-+
-+extern struct snd_soc_codec_dai wm8750_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_wm8750;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8753.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8753.c
-@@ -0,0 +1,2128 @@
-+/*
-+ * wm8753.c  --  WM8753 ALSA Soc Audio driver
-+ *
-+ * Copyright 2003 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ * Notes:
-+ *  The WM8753 is a low power, high quality stereo codec with integrated PCM
-+ *  codec designed for portable digital telephony applications.
-+ *
-+ * Dual DAI:-
-+ *
-+ * This driver support 2 DAI PCM's. This makes the default PCM available for
-+ * HiFi audio (e.g. MP3, ogg) playback/capture and the other PCM available for
-+ * voice.
-+ *
-+ * Please note that the voice PCM can be connected directly to a Bluetooth
-+ * codec or GSM modem and thus cannot be read or written to, although it is
-+ * available to be configured with snd_hw_params(), etc and kcontrols in the
-+ * normal alsa manner.
-+ *
-+ * Fast DAI switching:-
-+ *
-+ * The driver can now fast switch between the DAI configurations via a
-+ * an alsa kcontrol. This allows the PCM to remain open.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8753.h"
-+
-+#define AUDIO_NAME "wm8753"
-+#define WM8753_VERSION "0.16"
-+
-+/*
-+ * Debug
-+ */
-+
-+#define WM8753_DEBUG 0
-+
-+#ifdef WM8753_DEBUG
-+#define dbg(format, arg...) \
-+      printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
-+#else
-+#define dbg(format, arg...) do {} while (0)
-+#endif
-+#define err(format, arg...) \
-+      printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-+#define info(format, arg...) \
-+      printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-+#define warn(format, arg...) \
-+      printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
-+
-+static int caps_charge = 2000;
-+module_param(caps_charge, int, 0);
-+MODULE_PARM_DESC(caps_charge, "WM8753 cap charge time (msecs)");
-+
-+static struct workqueue_struct *wm8753_workq = NULL;
-+static struct work_struct wm8753_dapm_work;
-+static void wm8753_set_dai_mode(struct snd_soc_codec *codec,
-+      unsigned int mode);
-+
-+/*
-+ * wm8753 register cache
-+ * We can't read the WM8753 register space when we
-+ * are using 2 wire for device control, so we cache them instead.
-+ */
-+static const u16 wm8753_reg[] = {
-+      0x0008, 0x0000, 0x000a, 0x000a,
-+      0x0033, 0x0000, 0x0007, 0x00ff,
-+      0x00ff, 0x000f, 0x000f, 0x007b,
-+      0x0000, 0x0032, 0x0000, 0x00c3,
-+      0x00c3, 0x00c0, 0x0000, 0x0000,
-+      0x0000, 0x0000, 0x0000, 0x0000,
-+      0x0000, 0x0000, 0x0000, 0x0000,
-+      0x0000, 0x0000, 0x0000, 0x0055,
-+      0x0005, 0x0050, 0x0055, 0x0050,
-+      0x0055, 0x0050, 0x0055, 0x0079,
-+      0x0079, 0x0079, 0x0079, 0x0079,
-+      0x0000, 0x0000, 0x0000, 0x0000,
-+      0x0097, 0x0097, 0x0000, 0x0004,
-+      0x0000, 0x0083, 0x0024, 0x01ba,
-+      0x0000, 0x0083, 0x0024, 0x01ba,
-+      0x0000, 0x0000
-+};
-+
-+#define WM8753_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+      SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_DSP_B |  SND_SOC_DAIFMT_NB_NF | \
-+      SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM8753_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM8753_HIFI_FSB \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | \
-+      SND_SOC_FSBD(8) | SND_SOC_FSBD(16))
-+
-+#define WM8753_HIFI_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
-+
-+#define WM8753_HIFI_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
-+
-+/*
-+ * HiFi modes
-+ */
-+static struct snd_soc_dai_mode wm8753_hifi_modes[] = {
-+      /* codec frame and clock master modes */
-+      /* 8k */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1536,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1408,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 2304,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 2112,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1500,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+
-+      /* 11.025k */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1024,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1536,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1088,
-+              .bfs = WM8753_HIFI_FSB,
-+              },
-+
-+      /* 16k */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 768,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt= WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1152,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 750,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+
-+      /* 22.05k */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 512,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 768,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 544,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+
-+      /* 32k */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 384,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 576,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 375,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+
-+      /* 44.1k & 48k */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 384,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 250,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 272,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+
-+      /* 88.2k & 96k */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 128,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 192,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 136,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 125,
-+              .bfs = WM8753_HIFI_FSB,
-+      },
-+
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = WM8753_HIFI_RATES,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+#define WM8753_VOICE_FSB \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | \
-+      SND_SOC_FSBD(8) | SND_SOC_FSBD(16))
-+
-+#define WM8753_VOICE_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+#define WM8753_VOICE_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
-+
-+/*
-+ * Voice modes
-+ */
-+static struct snd_soc_dai_mode wm8753_voice_modes[] = {
-+
-+      /* master modes */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_VOICE_BITS,
-+              .pcmrate = WM8753_VOICE_RATES,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = WM8753_VOICE_FSB,
-+      },
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = WM8753_VOICE_BITS,
-+              .pcmrate = WM8753_VOICE_RATES,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 384,
-+              .bfs = WM8753_VOICE_FSB,
-+      },
-+
-+      /* slave modes */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM8753_VOICE_BITS,
-+              .pcmrate = WM8753_VOICE_RATES,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+
-+/*
-+ * Mode 4
-+ */
-+static struct snd_soc_dai_mode wm8753_mixed_modes[] = {
-+      /* slave modes */
-+      {
-+              .fmt = WM8753_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM8753_HIFI_BITS,
-+              .pcmrate = WM8753_HIFI_RATES,
-+              .pcmdir = WM8753_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * read wm8753 register cache
-+ */
-+static inline unsigned int wm8753_read_reg_cache(struct snd_soc_codec *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg < 1 || reg > (ARRAY_SIZE(wm8753_reg) + 1))
-+              return -1;
-+      return cache[reg - 1];
-+}
-+
-+/*
-+ * write wm8753 register cache
-+ */
-+static inline void wm8753_write_reg_cache(struct snd_soc_codec *codec,
-+      unsigned int reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg < 1 || reg > 0x3f)
-+              return;
-+      cache[reg - 1] = value;
-+}
-+
-+/*
-+ * write to the WM8753 register space
-+ */
-+static int wm8753_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8753 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8753_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -EIO;
-+}
-+
-+#define wm8753_reset(c) wm8753_write(c, WM8753_RESET, 0)
-+
-+/*
-+ * WM8753 Controls
-+ */
-+static const char *wm8753_base[] = {"Linear Control", "Adaptive Boost"};
-+static const char *wm8753_base_filter[] =
-+      {"130Hz @ 48kHz", "200Hz @ 48kHz", "100Hz @ 16kHz", "400Hz @ 48kHz",
-+      "100Hz @ 8kHz", "200Hz @ 8kHz"};
-+static const char *wm8753_treble[] = {"8kHz", "4kHz"};
-+static const char *wm8753_alc_func[] = {"Off", "Right", "Left", "Stereo"};
-+static const char *wm8753_ng_type[] = {"Constant PGA Gain", "Mute ADC Output"};
-+static const char *wm8753_3d_func[] = {"Capture", "Playback"};
-+static const char *wm8753_3d_uc[] = {"2.2kHz", "1.5kHz"};
-+static const char *wm8753_3d_lc[] = {"200Hz", "500Hz"};
-+static const char *wm8753_deemp[] = {"None", "32kHz", "44.1kHz", "48kHz"};
-+static const char *wm8753_mono_mix[] = {"Stereo", "Left", "Right", "Mono"};
-+static const char *wm8753_dac_phase[] = {"Non Inverted", "Inverted"};
-+static const char *wm8753_line_mix[] = {"Line 1 + 2", "Line 1 - 2",
-+      "Line 1", "Line 2"};
-+static const char *wm8753_mono_mux[] = {"Line Mix", "Rx Mix"};
-+static const char *wm8753_right_mux[] = {"Line 2", "Rx Mix"};
-+static const char *wm8753_left_mux[] = {"Line 1", "Rx Mix"};
-+static const char *wm8753_rxmsel[] = {"RXP - RXN", "RXP + RXN", "RXP", "RXN"};
-+static const char *wm8753_sidetone_mux[] = {"Left PGA", "Mic 1", "Mic 2",
-+      "Right PGA"};
-+static const char *wm8753_mono2_src[] = {"Inverted Mono 1", "Left", "Right",
-+      "Left + Right"};
-+static const char *wm8753_out3[] = {"VREF", "ROUT2", "Left + Right"};
-+static const char *wm8753_out4[] = {"VREF", "Capture ST", "LOUT2"};
-+static const char *wm8753_radcsel[] = {"PGA", "Line or RXP-RXN", "Sidetone"};
-+static const char *wm8753_ladcsel[] = {"PGA", "Line or RXP-RXN", "Line"};
-+static const char *wm8753_mono_adc[] = {"Stereo", "Analogue Mix Left",
-+      "Analogue Mix Right", "Digital Mono Mix"};
-+static const char *wm8753_adc_hp[] = {"3.4Hz @ 48kHz", "82Hz @ 16k",
-+      "82Hz @ 8kHz", "170Hz @ 8kHz"};
-+static const char *wm8753_adc_filter[] = {"HiFi", "Voice"};
-+static const char *wm8753_mic_sel[] = {"Mic 1", "Mic 2", "Mic 3"};
-+static const char *wm8753_dai_mode[] = {"DAI 0", "DAI 1", "DAI 2", "DAI 3"};
-+
-+static const struct soc_enum wm8753_enum[] = {
-+SOC_ENUM_SINGLE(WM8753_BASS, 7, 2, wm8753_base),              // 0
-+SOC_ENUM_SINGLE(WM8753_BASS, 4, 6, wm8753_base_filter),       // 1
-+SOC_ENUM_SINGLE(WM8753_TREBLE, 6, 2, wm8753_treble),  // 2
-+SOC_ENUM_SINGLE(WM8753_ALC1, 7, 4, wm8753_alc_func),  // 3
-+SOC_ENUM_SINGLE(WM8753_NGATE, 1, 2, wm8753_ng_type),  // 4
-+SOC_ENUM_SINGLE(WM8753_3D, 7, 2, wm8753_3d_func),             // 5
-+SOC_ENUM_SINGLE(WM8753_3D, 6, 2, wm8753_3d_uc),                       // 6
-+SOC_ENUM_SINGLE(WM8753_3D, 5, 2, wm8753_3d_lc),                       // 7
-+SOC_ENUM_SINGLE(WM8753_DAC, 1, 4, wm8753_deemp),              // 8
-+SOC_ENUM_SINGLE(WM8753_DAC, 4, 4, wm8753_mono_mix),           // 9
-+SOC_ENUM_SINGLE(WM8753_DAC, 6, 2, wm8753_dac_phase),  // 10
-+SOC_ENUM_SINGLE(WM8753_INCTL1, 3, 4, wm8753_line_mix),        // 11
-+SOC_ENUM_SINGLE(WM8753_INCTL1, 2, 2, wm8753_mono_mux),        // 12
-+SOC_ENUM_SINGLE(WM8753_INCTL1, 1, 2, wm8753_right_mux),       // 13
-+SOC_ENUM_SINGLE(WM8753_INCTL1, 0, 2, wm8753_left_mux),        // 14
-+SOC_ENUM_SINGLE(WM8753_INCTL2, 6, 4, wm8753_rxmsel),  // 15
-+SOC_ENUM_SINGLE(WM8753_INCTL2, 4, 4, wm8753_sidetone_mux),// 16
-+SOC_ENUM_SINGLE(WM8753_OUTCTL, 7, 4, wm8753_mono2_src),       // 17
-+SOC_ENUM_SINGLE(WM8753_OUTCTL, 0, 3, wm8753_out3),            // 18
-+SOC_ENUM_SINGLE(WM8753_ADCTL2, 7, 3, wm8753_out4),            // 19
-+SOC_ENUM_SINGLE(WM8753_ADCIN, 2, 3, wm8753_radcsel),  // 20
-+SOC_ENUM_SINGLE(WM8753_ADCIN, 0, 3, wm8753_ladcsel),  // 21
-+SOC_ENUM_SINGLE(WM8753_ADCIN, 4, 4, wm8753_mono_adc), // 22
-+SOC_ENUM_SINGLE(WM8753_ADC, 2, 4, wm8753_adc_hp),             // 23
-+SOC_ENUM_SINGLE(WM8753_ADC, 4, 2, wm8753_adc_filter), // 24
-+SOC_ENUM_SINGLE(WM8753_MICBIAS, 6, 3, wm8753_mic_sel),        // 25
-+SOC_ENUM_SINGLE(WM8753_IOCTL, 2, 4, wm8753_dai_mode), // 26
-+};
-+
-+
-+static int wm8753_get_dai(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+      int mode = wm8753_read_reg_cache(codec, WM8753_IOCTL);
-+
-+      ucontrol->value.integer.value[0] = (mode & 0xc) >> 2;
-+      return 0;
-+}
-+
-+static int wm8753_set_dai(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+      int mode = wm8753_read_reg_cache(codec, WM8753_IOCTL);
-+
-+      if (((mode &0xc) >> 2) == ucontrol->value.integer.value[0])
-+              return 0;
-+
-+      mode &= 0xfff3;
-+      mode |= (ucontrol->value.integer.value[0] << 2);
-+
-+      wm8753_write(codec, WM8753_IOCTL, mode);
-+      wm8753_set_dai_mode(codec, ucontrol->value.integer.value[0]);
-+      return 1;
-+}
-+
-+static const struct snd_kcontrol_new wm8753_snd_controls[] = {
-+SOC_DOUBLE_R("PCM Volume", WM8753_LDAC, WM8753_RDAC, 0, 255, 0),
-+
-+SOC_DOUBLE_R("ADC Capture Volume", WM8753_LADC, WM8753_RADC, 0, 63, 0),
-+SOC_DOUBLE_R("ADC Capture Switch", WM8753_LINVOL, WM8753_RINVOL, 7, 1, 0),
-+SOC_DOUBLE_R("ADC Capture ZC Switch", WM8753_LINVOL, WM8753_RINVOL, 6, 1, 0),
-+
-+SOC_DOUBLE_R("Headphone Playback Volume", WM8753_LOUT1V, WM8753_ROUT1V, 0, 127, 0),
-+SOC_DOUBLE_R("Speaker Playback Volume", WM8753_LOUT2V, WM8753_ROUT2V, 0, 127, 0),
-+
-+SOC_SINGLE("Mono Playback Volume", WM8753_MOUTV, 0, 127, 0),
-+
-+SOC_DOUBLE_R("Bypass Playback Volume", WM8753_LOUTM1, WM8753_ROUTM1, 4, 7, 1),
-+SOC_DOUBLE_R("Sidetone Playback Volume", WM8753_LOUTM2, WM8753_ROUTM2, 4, 7, 1),
-+SOC_DOUBLE_R("Voice Playback Volume", WM8753_LOUTM2, WM8753_ROUTM2, 0, 7, 1),
-+
-+SOC_DOUBLE_R("Headphone Playback ZC Switch", WM8753_LOUT1V, WM8753_ROUT1V, 7, 1, 0),
-+SOC_DOUBLE_R("Speaker Playback ZC Switch", WM8753_LOUT2V, WM8753_ROUT2V, 7, 1, 0),
-+
-+SOC_SINGLE("Mono Bypass Playback Volume", WM8753_MOUTM1, 4, 7, 1),
-+SOC_SINGLE("Mono Sidetone Playback Volume", WM8753_MOUTM2, 4, 7, 1),
-+SOC_SINGLE("Mono Voice Playback Volume", WM8753_MOUTM2, 4, 7, 1),
-+SOC_SINGLE("Mono Playback ZC Switch", WM8753_MOUTV, 7, 1, 0),
-+
-+SOC_ENUM("Bass Boost", wm8753_enum[0]),
-+SOC_ENUM("Bass Filter", wm8753_enum[1]),
-+SOC_SINGLE("Bass Volume", WM8753_BASS, 0, 7, 1),
-+
-+SOC_SINGLE("Treble Volume", WM8753_TREBLE, 0, 7, 0),
-+SOC_ENUM("Treble Cut-off", wm8753_enum[2]),
-+
-+SOC_DOUBLE("Sidetone Capture Volume", WM8753_RECMIX1, 0, 4, 7, 1),
-+SOC_SINGLE("Voice Sidetone Capture Volume", WM8753_RECMIX2, 0, 7, 1),
-+
-+SOC_DOUBLE_R("Capture Volume", WM8753_LINVOL, WM8753_RINVOL, 0, 63, 0),
-+SOC_DOUBLE_R("Capture ZC Switch", WM8753_LINVOL, WM8753_RINVOL, 6, 1, 0),
-+SOC_DOUBLE_R("Capture Switch", WM8753_LINVOL, WM8753_RINVOL, 7, 1, 0),
-+
-+SOC_ENUM("Capture Filter Select", wm8753_enum[23]),
-+SOC_ENUM("Capture Filter Cut-off", wm8753_enum[24]),
-+SOC_SINGLE("Capture Filter Switch", WM8753_ADC, 0, 1, 1),
-+
-+SOC_SINGLE("ALC Capture Target Volume", WM8753_ALC1, 0, 7, 0),
-+SOC_SINGLE("ALC Capture Max Volume", WM8753_ALC1, 4, 7, 0),
-+SOC_ENUM("ALC Capture Function", wm8753_enum[3]),
-+SOC_SINGLE("ALC Capture ZC Switch", WM8753_ALC2, 8, 1, 0),
-+SOC_SINGLE("ALC Capture Hold Time", WM8753_ALC2, 0, 15, 1),
-+SOC_SINGLE("ALC Capture Decay Time", WM8753_ALC3, 4, 15, 1),
-+SOC_SINGLE("ALC Capture Attack Time", WM8753_ALC3, 0, 15, 0),
-+SOC_SINGLE("ALC Capture NG Threshold", WM8753_NGATE, 3, 31, 0),
-+SOC_ENUM("ALC Capture NG Type", wm8753_enum[4]),
-+SOC_SINGLE("ALC Capture NG Switch", WM8753_NGATE, 0, 1, 0),
-+
-+SOC_ENUM("3D Function", wm8753_enum[5]),
-+SOC_ENUM("3D Upper Cut-off", wm8753_enum[6]),
-+SOC_ENUM("3D Lower Cut-off", wm8753_enum[7]),
-+SOC_SINGLE("3D Volume", WM8753_3D, 1, 15, 0),
-+SOC_SINGLE("3D Switch", WM8753_3D, 0, 1, 0),
-+
-+SOC_SINGLE("Capture 6dB Attenuate", WM8753_ADCTL1, 2, 1, 0),
-+SOC_SINGLE("Playback 6dB Attenuate", WM8753_ADCTL1, 1, 1, 0),
-+
-+SOC_ENUM("De-emphasis", wm8753_enum[8]),
-+SOC_ENUM("Playback Mono Mix", wm8753_enum[9]),
-+SOC_ENUM("Playback Phase", wm8753_enum[10]),
-+
-+SOC_SINGLE("Mic2 Capture Volume", WM8753_INCTL1, 7, 3, 0),
-+SOC_SINGLE("Mic1 Capture Volume", WM8753_INCTL1, 5, 3, 0),
-+
-+SOC_ENUM_EXT("DAI Mode", wm8753_enum[26], wm8753_get_dai, wm8753_set_dai),
-+};
-+
-+/* add non dapm controls */
-+static int wm8753_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8753_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8753_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+      return 0;
-+}
-+
-+/*
-+ * _DAPM_ Controls
-+ */
-+
-+/* Left Mixer */
-+static const struct snd_kcontrol_new wm8753_left_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Voice Playback Switch", WM8753_LOUTM2, 8, 1, 0),
-+SOC_DAPM_SINGLE("Sidetone Playback Switch", WM8753_LOUTM2, 7, 1, 0),
-+SOC_DAPM_SINGLE("Left Playback Switch", WM8753_LOUTM1, 8, 1, 0),
-+SOC_DAPM_SINGLE("Bypass Playback Switch", WM8753_LOUTM1, 7, 1, 0),
-+};
-+
-+/* Right mixer */
-+static const struct snd_kcontrol_new wm8753_right_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Voice Playback Switch", WM8753_ROUTM2, 8, 1, 0),
-+SOC_DAPM_SINGLE("Sidetone Playback Switch", WM8753_ROUTM2, 7, 1, 0),
-+SOC_DAPM_SINGLE("Right Playback Switch", WM8753_ROUTM1, 8, 1, 0),
-+SOC_DAPM_SINGLE("Bypass Playback Switch", WM8753_ROUTM1, 7, 1, 0),
-+};
-+
-+/* Mono mixer */
-+static const struct snd_kcontrol_new wm8753_mono_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Left Playback Switch", WM8753_MOUTM1, 8, 1, 0),
-+SOC_DAPM_SINGLE("Right Playback Switch", WM8753_MOUTM2, 8, 1, 0),
-+SOC_DAPM_SINGLE("Voice Playback Switch", WM8753_MOUTM2, 3, 1, 0),
-+SOC_DAPM_SINGLE("Sidetone Playback Switch", WM8753_MOUTM2, 7, 1, 0),
-+SOC_DAPM_SINGLE("Bypass Playback Switch", WM8753_MOUTM1, 7, 1, 0),
-+};
-+
-+/* Mono 2 Mux */
-+static const struct snd_kcontrol_new wm8753_mono2_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[17]);
-+
-+/* Out 3 Mux */
-+static const struct snd_kcontrol_new wm8753_out3_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[18]);
-+
-+/* Out 4 Mux */
-+static const struct snd_kcontrol_new wm8753_out4_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[19]);
-+
-+/* ADC Mono Mix */
-+static const struct snd_kcontrol_new wm8753_adc_mono_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[22]);
-+
-+/* Record mixer */
-+static const struct snd_kcontrol_new wm8753_record_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Voice Capture Switch", WM8753_RECMIX2, 3, 1, 0),
-+SOC_DAPM_SINGLE("Left Capture Switch", WM8753_RECMIX1, 3, 1, 0),
-+SOC_DAPM_SINGLE("Right Capture Switch", WM8753_RECMIX1, 7, 1, 0),
-+};
-+
-+/* Left ADC mux */
-+static const struct snd_kcontrol_new wm8753_adc_left_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[21]);
-+
-+/* Right ADC mux */
-+static const struct snd_kcontrol_new wm8753_adc_right_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[20]);
-+
-+/* MIC mux */
-+static const struct snd_kcontrol_new wm8753_mic_mux_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[16]);
-+
-+/* ALC mixer */
-+static const struct snd_kcontrol_new wm8753_alc_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Line Capture Switch", WM8753_INCTL2, 3, 1, 0),
-+SOC_DAPM_SINGLE("Mic2 Capture Switch", WM8753_INCTL2, 2, 1, 0),
-+SOC_DAPM_SINGLE("Mic1 Capture Switch", WM8753_INCTL2, 1, 1, 0),
-+SOC_DAPM_SINGLE("Rx Capture Switch", WM8753_INCTL2, 0, 1, 0),
-+};
-+
-+/* Left Line mux */
-+static const struct snd_kcontrol_new wm8753_line_left_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[14]);
-+
-+/* Right Line mux */
-+static const struct snd_kcontrol_new wm8753_line_right_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[13]);
-+
-+/* Mono Line mux */
-+static const struct snd_kcontrol_new wm8753_line_mono_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[12]);
-+
-+/* Line mux and mixer */
-+static const struct snd_kcontrol_new wm8753_line_mux_mix_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[11]);
-+
-+/* Rx mux and mixer */
-+static const struct snd_kcontrol_new wm8753_rx_mux_mix_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[15]);
-+
-+/* Mic Selector Mux */
-+static const struct snd_kcontrol_new wm8753_mic_sel_mux_controls =
-+SOC_DAPM_ENUM("Route", wm8753_enum[25]);
-+
-+static const struct snd_soc_dapm_widget wm8753_dapm_widgets[] = {
-+SND_SOC_DAPM_MICBIAS("Mic Bias", WM8753_PWR1, 5, 0),
-+SND_SOC_DAPM_MIXER("Left Mixer", WM8753_PWR4, 0, 0,
-+      &wm8753_left_mixer_controls[0], ARRAY_SIZE(wm8753_left_mixer_controls)),
-+SND_SOC_DAPM_PGA("Left Out 1", WM8753_PWR3, 8, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Left Out 2", WM8753_PWR3, 6, 0, NULL, 0),
-+SND_SOC_DAPM_DAC("Left DAC", "Left HiFi Playback", WM8753_PWR1, 3, 0),
-+SND_SOC_DAPM_OUTPUT("LOUT1"),
-+SND_SOC_DAPM_OUTPUT("LOUT2"),
-+SND_SOC_DAPM_MIXER("Right Mixer", WM8753_PWR4, 1, 0,
-+      &wm8753_right_mixer_controls[0], ARRAY_SIZE(wm8753_right_mixer_controls)),
-+SND_SOC_DAPM_PGA("Right Out 1", WM8753_PWR3, 7, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Right Out 2", WM8753_PWR3, 5, 0, NULL, 0),
-+SND_SOC_DAPM_DAC("Right DAC", "Right HiFi Playback", WM8753_PWR1, 2, 0),
-+SND_SOC_DAPM_OUTPUT("ROUT1"),
-+SND_SOC_DAPM_OUTPUT("ROUT2"),
-+SND_SOC_DAPM_MIXER("Mono Mixer", WM8753_PWR4, 2, 0,
-+      &wm8753_mono_mixer_controls[0], ARRAY_SIZE(wm8753_mono_mixer_controls)),
-+SND_SOC_DAPM_PGA("Mono Out 1", WM8753_PWR3, 2, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mono Out 2", WM8753_PWR3, 1, 0, NULL, 0),
-+SND_SOC_DAPM_DAC("Voice DAC", "Voice Playback", WM8753_PWR1, 4, 0),
-+SND_SOC_DAPM_OUTPUT("MONO1"),
-+SND_SOC_DAPM_MUX("Mono 2 Mux", SND_SOC_NOPM, 0, 0, &wm8753_mono2_controls),
-+SND_SOC_DAPM_OUTPUT("MONO2"),
-+SND_SOC_DAPM_MIXER("Out3 Left + Right", -1, 0, 0, NULL, 0),
-+SND_SOC_DAPM_MUX("Out3 Mux", SND_SOC_NOPM, 0, 0, &wm8753_out3_controls),
-+SND_SOC_DAPM_PGA("Out 3", WM8753_PWR3, 4, 0, NULL, 0),
-+SND_SOC_DAPM_OUTPUT("OUT3"),
-+SND_SOC_DAPM_MUX("Out4 Mux", SND_SOC_NOPM, 0, 0, &wm8753_out4_controls),
-+SND_SOC_DAPM_PGA("Out 4", WM8753_PWR3, 3, 0, NULL, 0),
-+SND_SOC_DAPM_OUTPUT("OUT4"),
-+SND_SOC_DAPM_MIXER("Playback Mixer", WM8753_PWR4, 3, 0,
-+      &wm8753_record_mixer_controls[0],
-+      ARRAY_SIZE(wm8753_record_mixer_controls)),
-+SND_SOC_DAPM_ADC("Left ADC", "Left Voice Capture", WM8753_PWR2, 3, 0),
-+SND_SOC_DAPM_ADC("Right ADC", "Right Voice Capture", WM8753_PWR2, 2, 0),
-+SND_SOC_DAPM_MUX("Capture Left Mixer", SND_SOC_NOPM, 0, 0,
-+      &wm8753_adc_mono_controls),
-+SND_SOC_DAPM_MUX("Capture Right Mixer", SND_SOC_NOPM, 0, 0,
-+      &wm8753_adc_mono_controls),
-+SND_SOC_DAPM_MUX("Capture Left Mux", SND_SOC_NOPM, 0, 0,
-+      &wm8753_adc_left_controls),
-+SND_SOC_DAPM_MUX("Capture Right Mux", SND_SOC_NOPM, 0, 0,
-+      &wm8753_adc_right_controls),
-+SND_SOC_DAPM_MUX("Mic Sidetone Mux", SND_SOC_NOPM, 0, 0,
-+      &wm8753_mic_mux_controls),
-+SND_SOC_DAPM_PGA("Left Capture Volume", WM8753_PWR2, 5, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Right Capture Volume", WM8753_PWR2, 4, 0, NULL, 0),
-+SND_SOC_DAPM_MIXER("ALC Mixer", WM8753_PWR2, 6, 0,
-+      &wm8753_alc_mixer_controls[0], ARRAY_SIZE(wm8753_alc_mixer_controls)),
-+SND_SOC_DAPM_MUX("Line Left Mux", SND_SOC_NOPM, 0, 0,
-+      &wm8753_line_left_controls),
-+SND_SOC_DAPM_MUX("Line Right Mux", SND_SOC_NOPM, 0, 0,
-+      &wm8753_line_right_controls),
-+SND_SOC_DAPM_MUX("Line Mono Mux", SND_SOC_NOPM, 0, 0,
-+      &wm8753_line_mono_controls),
-+SND_SOC_DAPM_MUX("Line Mixer", SND_SOC_NOPM, 0, 0,
-+      &wm8753_line_mux_mix_controls),
-+SND_SOC_DAPM_MUX("Rx Mixer", SND_SOC_NOPM, 0, 0,
-+      &wm8753_rx_mux_mix_controls),
-+SND_SOC_DAPM_PGA("Mic 1 Volume", WM8753_PWR2, 8, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic 2 Volume", WM8753_PWR2, 7, 0, NULL, 0),
-+SND_SOC_DAPM_MUX("Mic Selection Mux", SND_SOC_NOPM, 0, 0,
-+      &wm8753_mic_sel_mux_controls),
-+SND_SOC_DAPM_INPUT("LINE1"),
-+SND_SOC_DAPM_INPUT("LINE2"),
-+SND_SOC_DAPM_INPUT("RXP"),
-+SND_SOC_DAPM_INPUT("RXN"),
-+SND_SOC_DAPM_INPUT("ACIN"),
-+SND_SOC_DAPM_INPUT("ACOP"),
-+SND_SOC_DAPM_INPUT("MIC1N"),
-+SND_SOC_DAPM_INPUT("MIC1"),
-+SND_SOC_DAPM_INPUT("MIC2N"),
-+SND_SOC_DAPM_INPUT("MIC2"),
-+SND_SOC_DAPM_VMID("VREF"),
-+};
-+
-+static const char *audio_map[][3] = {
-+      /* left mixer */
-+      {"Left Mixer", "Left Playback Switch", "Left DAC"},
-+      {"Left Mixer", "Voice Playback Switch", "Voice DAC"},
-+      {"Left Mixer", "Sidetone Playback Switch", "Mic Sidetone Mux"},
-+      {"Left Mixer", "Bypass Playback Switch", "Line Left Mux"},
-+
-+      /* right mixer */
-+      {"Right Mixer", "Right Playback Switch", "Right DAC"},
-+      {"Right Mixer", "Voice Playback Switch", "Voice DAC"},
-+      {"Right Mixer", "Sidetone Playback Switch", "Mic Sidetone Mux"},
-+      {"Right Mixer", "Bypass Playback Switch", "Line Right Mux"},
-+
-+      /* mono mixer */
-+      {"Mono Mixer", "Voice Playback Switch", "Voice DAC"},
-+      {"Mono Mixer", "Left Playback Switch", "Left DAC"},
-+      {"Mono Mixer", "Right Playback Switch", "Right DAC"},
-+      {"Mono Mixer", "Sidetone Playback Switch", "Mic Sidetone Mux"},
-+      {"Mono Mixer", "Bypass Playback Switch", "Line Mono Mux"},
-+
-+      /* left out */
-+      {"Left Out 1", NULL, "Left Mixer"},
-+      {"Left Out 2", NULL, "Left Mixer"},
-+      {"LOUT1", NULL, "Left Out 1"},
-+      {"LOUT2", NULL, "Left Out 2"},
-+
-+      /* right out */
-+      {"Right Out 1", NULL, "Right Mixer"},
-+      {"Right Out 2", NULL, "Right Mixer"},
-+      {"ROUT1", NULL, "Right Out 1"},
-+      {"ROUT2", NULL, "Right Out 2"},
-+
-+      /* mono 1 out */
-+      {"Mono Out 1", NULL, "Mono Mixer"},
-+      {"MONO1", NULL, "Mono Out 1"},
-+
-+      /* mono 2 out */
-+      {"Mono 2 Mux", "Left + Right", "Out3 Left + Right"},
-+      {"Mono 2 Mux", "Inverted Mono 1", "MONO1"},
-+      {"Mono 2 Mux", "Left", "Left Mixer"},
-+      {"Mono 2 Mux", "Right", "Right Mixer"},
-+      {"Mono Out 2", NULL, "Mono 2 Mux"},
-+      {"MONO2", NULL, "Mono Out 2"},
-+
-+      /* out 3 */
-+      {"Out3 Left + Right", NULL, "Left Mixer"},
-+      {"Out3 Left + Right", NULL, "Right Mixer"},
-+      {"Out3 Mux", "VREF", "VREF"},
-+      {"Out3 Mux", "Left + Right", "Out3 Left + Right"},
-+      {"Out3 Mux", "ROUT2", "ROUT2"},
-+      {"Out 3", NULL, "Out3 Mux"},
-+      {"OUT3", NULL, "Out 3"},
-+
-+      /* out 4 */
-+      {"Out4 Mux", "VREF", "VREF"},
-+      {"Out4 Mux", "Capture ST", "Capture ST Mixer"},
-+      {"Out4 Mux", "LOUT2", "LOUT2"},
-+      {"Out 4", NULL, "Out4 Mux"},
-+      {"OUT4", NULL, "Out 4"},
-+
-+      /* record mixer  */
-+      {"Playback Mixer", "Left Capture Switch", "Left Mixer"},
-+      {"Playback Mixer", "Voice Capture Switch", "Mono Mixer"},
-+      {"Playback Mixer", "Right Capture Switch", "Right Mixer"},
-+
-+      /* Mic/SideTone Mux */
-+      {"Mic Sidetone Mux", "Left PGA", "Left Capture Volume"},
-+      {"Mic Sidetone Mux", "Right PGA", "Right Capture Volume"},
-+      {"Mic Sidetone Mux", "Mic 1", "Mic 1 Volume"},
-+      {"Mic Sidetone Mux", "Mic 2", "Mic 2 Volume"},
-+
-+      /* Capture Left Mux */
-+      {"Capture Left Mux", "PGA", "Left Capture Volume"},
-+      {"Capture Left Mux", "Line or RXP-RXN", "Line Left Mux"},
-+      {"Capture Left Mux", "Line", "LINE1"},
-+
-+      /* Capture Right Mux */
-+      {"Capture Right Mux", "PGA", "Right Capture Volume"},
-+      {"Capture Right Mux", "Line or RXP-RXN", "Line Right Mux"},
-+      {"Capture Right Mux", "Sidetone", "Capture ST Mixer"},
-+
-+      /* Mono Capture mixer-mux */
-+      {"Capture Right Mixer", "Stereo", "Capture Right Mux"},
-+      {"Capture Left Mixer", "Analogue Mix Left", "Capture Left Mux"},
-+      {"Capture Left Mixer", "Analogue Mix Left", "Capture Right Mux"},
-+      {"Capture Right Mixer", "Analogue Mix Right", "Capture Left Mux"},
-+      {"Capture Right Mixer", "Analogue Mix Right", "Capture Right Mux"},
-+      {"Capture Left Mixer", "Digital Mono Mix", "Capture Left Mux"},
-+      {"Capture Left Mixer", "Digital Mono Mix", "Capture Right Mux"},
-+      {"Capture Right Mixer", "Digital Mono Mix", "Capture Left Mux"},
-+      {"Capture Right Mixer", "Digital Mono Mix", "Capture Right Mux"},
-+
-+      /* ADC */
-+      {"Left ADC", NULL, "Capture Left Mixer"},
-+      {"Right ADC", NULL, "Capture Right Mixer"},
-+
-+      /* Left Capture Volume */
-+      {"Left Capture Volume", NULL, "ACIN"},
-+
-+      /* Right Capture Volume */
-+      {"Right Capture Volume", NULL, "Mic 2 Volume"},
-+
-+      /* ALC Mixer */
-+      {"ALC Mixer", "Line Capture Switch", "Line Mixer"},
-+      {"ALC Mixer", "Mic2 Capture Switch", "Mic 2 Volume"},
-+      {"ALC Mixer", "Mic1 Capture Switch", "Mic 1 Volume"},
-+      {"ALC Mixer", "Rx Capture Switch", "Rx Mixer"},
-+
-+      /* Line Left Mux */
-+      {"Line Left Mux", "Line 1", "LINE1"},
-+      {"Line Left Mux", "Rx Mix", "Rx Mixer"},
-+
-+      /* Line Right Mux */
-+      {"Line Right Mux", "Line 2", "LINE2"},
-+      {"Line Right Mux", "Rx Mix", "Rx Mixer"},
-+
-+      /* Line Mono Mux */
-+      {"Line Mono Mux", "Line Mix", "Line Mixer"},
-+      {"Line Mono Mux", "Rx Mix", "Rx Mixer"},
-+
-+      /* Line Mixer/Mux */
-+      {"Line Mixer", "Line 1 + 2", "LINE1"},
-+      {"Line Mixer", "Line 1 - 2", "LINE1"},
-+      {"Line Mixer", "Line 1 + 2", "LINE2"},
-+      {"Line Mixer", "Line 1 - 2", "LINE2"},
-+      {"Line Mixer", "Line 1", "LINE1"},
-+      {"Line Mixer", "Line 2", "LINE2"},
-+
-+      /* Rx Mixer/Mux */
-+      {"Rx Mixer", "RXP - RXN", "RXP"},
-+      {"Rx Mixer", "RXP + RXN", "RXP"},
-+      {"Rx Mixer", "RXP - RXN", "RXN"},
-+      {"Rx Mixer", "RXP + RXN", "RXN"},
-+      {"Rx Mixer", "RXP", "RXP"},
-+      {"Rx Mixer", "RXN", "RXN"},
-+
-+      /* Mic 1 Volume */
-+      {"Mic 1 Volume", NULL, "MIC1N"},
-+      {"Mic 1 Volume", NULL, "Mic Selection Mux"},
-+
-+      /* Mic 2 Volume */
-+      {"Mic 2 Volume", NULL, "MIC2N"},
-+      {"Mic 2 Volume", NULL, "MIC2"},
-+
-+      /* Mic Selector Mux */
-+      {"Mic Selection Mux", "Mic 1", "MIC1"},
-+      {"Mic Selection Mux", "Mic 2", "MIC2N"},
-+      {"Mic Selection Mux", "Mic 3", "MIC2"},
-+
-+      /* ACOP */
-+      {"ACOP", NULL, "ALC Mixer"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm8753_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm8753_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8753_dapm_widgets[i]);
-+      }
-+
-+      /* set up the WM8753 audio map */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+/* PLL divisors */
-+struct _pll_div {
-+      u32 pll_in;             /* ext clock input */
-+      u32 pll_out;    /* pll out freq */
-+      u32 div2:1;
-+      u32 n:4;
-+      u32 k:24;
-+};
-+
-+/*
-+ * PLL divisors -
-+ */
-+static const struct _pll_div pll_div[] = {
-+   {13000000, 12288000,       0,      0x7,    0x23F54A},
-+   {13000000, 11289600,       0,      0x6,    0x3CA2F5},
-+   {12000000, 12288000,       0,      0x8,    0x0C49BA},
-+   {12000000, 11289600,       0,      0x7,    0x21B08A},
-+   {24000000, 12288000,       1,      0x8,    0x0C49BA},
-+   {24000000, 11289600,       1,      0x7,    0x21B08A},
-+   {12288000, 11289600,       0,      0x7,    0x166667},
-+   {26000000, 11289600,       1,      0x6,    0x3CA2F5},
-+   {26000000, 12288000,       1,      0x7,    0x23F54A},
-+};
-+
-+static u32 wm8753_config_pll(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int pll)
-+{
-+      u16 reg;
-+      int found = 0;
-+
-+    if (pll == 1) {
-+              reg = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xffef;
-+        if (!dai->pll_in || !dai->mclk) {
-+            /* disable PLL1  */
-+            wm8753_write(codec, WM8753_PLL1CTL1, 0x0026);
-+                      wm8753_write(codec, WM8753_CLOCK, reg);
-+                      return 0;
-+        } else {
-+            u16 value = 0;
-+            int i = 0;
-+
-+            /* if we cant match, then use good values for N and K */
-+            for (;i < ARRAY_SIZE(pll_div); i++) {
-+                if (pll_div[i].pll_out == dai->pll_out &&
-+                      pll_div[i].pll_in == dai->pll_in) {
-+                      found = 1;
-+                    break;
-+                }
-+            }
-+
-+                      if (!found)
-+                              goto err;
-+
-+            /* set up N and K PLL divisor ratios */
-+            /* bits 8:5 = PLL_N, bits 3:0 = PLL_K[21:18] */
-+            value = (pll_div[i].n << 5) + ((pll_div[i].k & 0x3c0000) >> 18);
-+            wm8753_write(codec, WM8753_PLL1CTL2, value);
-+
-+            /* bits 8:0 = PLL_K[17:9] */
-+            value = (pll_div[i].k & 0x03fe00) >> 9;
-+            wm8753_write(codec, WM8753_PLL1CTL3, value);
-+
-+            /* bits 8:0 = PLL_K[8:0] */
-+            value = pll_div[i].k & 0x0001ff;
-+            wm8753_write(codec, WM8753_PLL1CTL4, value);
-+
-+            /* set PLL1 as input and enable */
-+            wm8753_write(codec, WM8753_PLL1CTL1, 0x0027 |
-+              (pll_div[i].div2 << 3));
-+                      wm8753_write(codec, WM8753_CLOCK, reg | 0x0010);
-+        }
-+    } else {
-+              reg = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xfff7;
-+        if (!dai->pll_in || !dai->mclk) {
-+            /* disable PLL2  */
-+            wm8753_write(codec, WM8753_PLL2CTL1, 0x0026);
-+                      wm8753_write(codec, WM8753_CLOCK, reg);
-+                      return 0;
-+        } else {
-+            u16 value = 0;
-+            int i = 0;
-+
-+            /* if we cant match, then use good values for N and K */
-+            for (;i < ARRAY_SIZE(pll_div); i++) {
-+                if (pll_div[i].pll_out == dai->pll_out &&
-+                      pll_div[i].pll_in == dai->pll_in) {
-+                              found = 1;
-+                              break;
-+                }
-+            }
-+
-+                      if (!found)
-+                              goto err;
-+
-+            /* set up N and K PLL divisor ratios */
-+            /* bits 8:5 = PLL_N, bits 3:0 = PLL_K[21:18] */
-+            value = (pll_div[i].n << 5) + ((pll_div[i].k & 0x3c0000) >> 18);
-+            wm8753_write(codec, WM8753_PLL2CTL2, value);
-+
-+            /* bits 8:0 = PLL_K[17:9] */
-+            value = (pll_div[i].k & 0x03fe00) >> 9;
-+            wm8753_write(codec, WM8753_PLL2CTL3, value);
-+
-+            /* bits 8:0 = PLL_K[8:0] */
-+            value = pll_div[i].k & 0x0001ff;
-+            wm8753_write(codec, WM8753_PLL2CTL4, value);
-+
-+            /* set PLL1 as input and enable */
-+            wm8753_write(codec, WM8753_PLL2CTL1, 0x0027 |
-+              (pll_div[i].div2 << 3));
-+                      wm8753_write(codec, WM8753_CLOCK, reg | 0x0008);
-+        }
-+    }
-+
-+    return dai->pll_in;
-+err:
-+      return 0;
-+}
-+
-+struct _coeff_div {
-+      u32 mclk;
-+      u32 rate;
-+      u16 fs;
-+      u8 sr:5;
-+      u8 usb:1;
-+};
-+
-+/* codec hifi mclk (after PLL) clock divider coefficients */
-+static const struct _coeff_div coeff_div[] = {
-+      /* 8k */
-+      {12288000, 8000, 1536, 0x6, 0x0},
-+      {11289600, 8000, 1408, 0x16, 0x0},
-+      {18432000, 8000, 2304, 0x7, 0x0},
-+      {16934400, 8000, 2112, 0x17, 0x0},
-+      {12000000, 8000, 1500, 0x6, 0x1},
-+
-+      /* 11.025k */
-+      {11289600, 11025, 1024, 0x18, 0x0},
-+      {16934400, 11025, 1536, 0x19, 0x0},
-+      {12000000, 11025, 1088, 0x19, 0x1},
-+
-+      /* 16k */
-+      {12288000, 16000, 768, 0xa, 0x0},
-+      {18432000, 16000, 1152, 0xb, 0x0},
-+      {12000000, 16000, 750, 0xa, 0x1},
-+
-+      /* 22.05k */
-+      {11289600, 22050, 512, 0x1a, 0x0},
-+      {16934400, 22050, 768, 0x1b, 0x0},
-+      {12000000, 22050, 544, 0x1b, 0x1},
-+
-+      /* 32k */
-+      {12288000, 32000, 384, 0xc, 0x0},
-+      {18432000, 32000, 576, 0xd, 0x0},
-+      {12000000, 32000, 375, 0xa, 0x1},
-+
-+      /* 44.1k */
-+      {11289600, 44100, 256, 0x10, 0x0},
-+      {16934400, 44100, 384, 0x11, 0x0},
-+      {12000000, 44100, 272, 0x11, 0x1},
-+
-+      /* 48k */
-+      {12288000, 48000, 256, 0x0, 0x0},
-+      {18432000, 48000, 384, 0x1, 0x0},
-+      {12000000, 48000, 250, 0x0, 0x1},
-+
-+      /* 88.2k */
-+      {11289600, 88200, 128, 0x1e, 0x0},
-+      {16934400, 88200, 192, 0x1f, 0x0},
-+      {12000000, 88200, 136, 0x1f, 0x1},
-+
-+      /* 96k */
-+      {12288000, 96000, 128, 0xe, 0x0},
-+      {18432000, 96000, 192, 0xf, 0x0},
-+      {12000000, 96000, 125, 0xe, 0x1},
-+};
-+
-+static int get_coeff(int mclk, int rate)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
-+              if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)
-+                      return i;
-+      }
-+      return -EINVAL;
-+}
-+
-+/* supported HiFi input clocks (that don't use PLL) */
-+const static int hifi_clks[] = {11289600, 12000000, 12288000,
-+      16934400, 18432000};
-+
-+/* The HiFi interface can be clocked in one of two ways:-
-+ *  o No PLL - MCLK is used directly.
-+ *  o PLL    - PLL is used to generate audio MCLK from input clock.
-+ *
-+ * We use the direct method if we can as it saves power.
-+ */
-+static unsigned int wm8753_config_i2s_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      int i, pll_out;
-+
-+      /* is clk supported without the PLL */
-+      for(i = 0; i < ARRAY_SIZE(hifi_clks); i++) {
-+              if (clk == hifi_clks[i]) {
-+                      dai->mclk = clk;
-+                      dai->pll_in = dai->pll_out = 0;
-+                      dai->clk_div = 1;
-+                      return clk;
-+              }
-+      }
-+
-+      /* determine best PLL output speed */
-+      if (info->bclk_master &
-+              (SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS)) {
-+              pll_out = info->fs * info->rate;
-+      } else {
-+              /* calc slave clock */
-+              switch (info->rate){
-+                      case 11025:
-+                      case 22050:
-+                      case 44100:
-+                      case 88200:
-+                              pll_out = 11289600;
-+                              break;
-+                      default:
-+                              pll_out = 12288000;
-+                              break;
-+              }
-+      }
-+
-+      /* are input & output clocks supported by PLL */
-+      for (i = 0;i < ARRAY_SIZE(pll_div); i++) {
-+              if (pll_div[i].pll_in == clk && pll_div[i].pll_out == pll_out) {
-+                      dai->pll_in = clk;
-+                      dai->pll_out = dai->mclk = pll_out;
-+                      return pll_out;
-+              }
-+      }
-+
-+      /* this clk is not supported */
-+      return 0;
-+}
-+
-+/* valid PCM clock dividers * 2 */
-+static int pcm_divs[] = {2, 6, 11, 4, 8, 12, 16};
-+
-+/* The Voice interface can be clocked in one of four ways:-
-+ *  o No PLL - MCLK is used directly.
-+ *  o Div    - MCLK is directly divided.
-+ *  o PLL    - PLL is used to generate audio MCLK from input clock.
-+ *  o PLL & Div - PLL and post divider are used.
-+ *
-+ * We use the non PLL methods if we can, as it saves power.
-+ */
-+
-+static unsigned int wm8753_config_pcm_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      int i, j, best_clk = info->fs * info->rate;
-+
-+      /* can we run at this clk without the PLL ? */
-+      for (i = 0; i < ARRAY_SIZE(pcm_divs); i++) {
-+              if ((best_clk >> 1) * pcm_divs[i] == clk) {
-+                      dai->pll_in = 0;
-+                      dai->clk_div = pcm_divs[i];
-+                      dai->mclk = best_clk;
-+                      return dai->mclk;
-+              }
-+      }
-+
-+      /* now check for PLL support */
-+      for (i = 0; i < ARRAY_SIZE(pll_div); i++) {
-+              if (pll_div[i].pll_in == clk) {
-+                      for (j = 0; j < ARRAY_SIZE(pcm_divs); j++) {
-+                              if (pll_div[i].pll_out == pcm_divs[j] * (best_clk >> 1)) {
-+                                      dai->pll_in = clk;
-+                                      dai->pll_out = pll_div[i].pll_out;
-+                                      dai->clk_div = pcm_divs[j];
-+                                      dai->mclk = best_clk;
-+                                      return dai->mclk;
-+                              }
-+                      }
-+              }
-+      }
-+
-+      /* this clk is not supported */
-+      return 0;
-+}
-+
-+/* set the format and bit size for ADC and Voice DAC */
-+static void wm8753_adc_vdac_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 voice = wm8753_read_reg_cache(codec, WM8753_PCM) & 0x01e0;
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              voice |= 0x0002;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              voice |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              voice |= 0x0003;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_B:
-+              voice |= 0x0013;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              voice |= 0x0004;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              voice |= 0x0008;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              voice |= 0x000c;
-+              break;
-+      }
-+
-+      wm8753_write(codec, WM8753_PCM, voice);
-+}
-+
-+/* configure PCM DAI */
-+static int wm8753_pcm_dai_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 voice, ioctl, srate, srate2, fs, bfs, clock;
-+      unsigned int rate;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+      fs = rtd->codec_dai->dai_runtime.fs;
-+      rate = snd_soc_get_rate(rtd->codec_dai->dai_runtime.pcmrate);
-+      voice = wm8753_read_reg_cache(codec, WM8753_PCM) & 0x001f;
-+
-+      /* set master/slave audio interface */
-+      ioctl = wm8753_read_reg_cache(codec, WM8753_IOCTL) & 0x01fd;
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              ioctl |= 0x0002;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              voice |= 0x0040;
-+              break;
-+      }
-+
-+      /* do we need to enable the PLL */
-+      if (rtd->codec_dai->pll_in) {
-+              if (wm8753_config_pll(codec, rtd->codec_dai, 2) !=
-+                      rtd->codec_dai->pll_in) {
-+                      err("could not set pll to %d --> %d",
-+                              rtd->codec_dai->pll_in, rtd->codec_dai->pll_out);
-+                      return -ENODEV;
-+              }
-+      }
-+
-+      /* set up PCM divider */
-+      clock = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0x003f;
-+      switch (rtd->codec_dai->clk_div) {
-+      case 2: /* 1 */
-+              break;
-+      case 6: /* 3 */
-+              clock |= (0x2 << 6);
-+              break;
-+      case 11: /* 5.5 */
-+              clock |= (0x3 << 6);
-+              break;
-+      case 4: /* 2 */
-+              clock |= (0x4 << 6);
-+              break;
-+      case 8: /* 4 */
-+              clock |= (0x5 << 6);
-+              break;
-+      case 12: /* 6 */
-+              clock |= (0x6 << 6);
-+              break;
-+      case 16: /* 8 */
-+              clock |= (0x7 << 6);
-+              break;
-+      default:
-+              printk(KERN_ERR "wm8753: invalid PCM clk divider %d\n",
-+                      rtd->codec_dai->clk_div);
-+              break;
-+      }
-+      wm8753_write(codec, WM8753_CLOCK, clock);
-+
-+      /* set bclk divisor rate */
-+      srate2 = wm8753_read_reg_cache(codec, WM8753_SRATE2) & 0x003f;
-+      switch (bfs) {
-+      case 1:
-+              break;
-+      case 2:
-+              srate2 |= (0x1 << 6);
-+              break;
-+      case 4:
-+              srate2 |= (0x2 << 6);
-+              break;
-+      case 8:
-+              srate2 |= (0x3 << 6);
-+              break;
-+      case 16:
-+              srate2 |= (0x4 << 6);
-+              break;
-+      }
-+      wm8753_write(codec, WM8753_SRATE2, srate2);
-+
-+      srate = wm8753_read_reg_cache(codec, WM8753_SRATE1) & 0x017f;
-+      if (rtd->codec_dai->dai_runtime.fs == 384)
-+              srate |= 0x80;
-+      wm8753_write(codec, WM8753_SRATE1, srate);
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_IB_IF:
-+              voice |= 0x0090;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              voice |= 0x0080;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              voice |= 0x0010;
-+              break;
-+      }
-+      //printk("voice %x %x ioctl %x %x srate2 %x %x srate1 %x %x\n",
-+      //WM8753_PCM, voice, WM8753_IOCTL, ioctl, WM8753_SRATE2,
-+      //srate2, WM8753_SRATE1, srate);
-+
-+      wm8753_write(codec, WM8753_IOCTL, ioctl);
-+      wm8753_write(codec, WM8753_PCM, voice);
-+      return 0;
-+}
-+
-+/* configure hifi DAC wordlength and format */
-+static void wm8753_hdac_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 hifi = wm8753_read_reg_cache(codec, WM8753_HIFI) & 0x01e0;
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              hifi |= 0x0002;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              hifi |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              hifi |= 0x0003;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_B:
-+              hifi |= 0x0013;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              hifi |= 0x0004;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              hifi |= 0x0008;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              hifi |= 0x000c;
-+              break;
-+      }
-+
-+      wm8753_write(codec, WM8753_HIFI, hifi);
-+}
-+
-+/* configure i2s (hifi) DAI clocking */
-+static int wm8753_i2s_dai_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 srate, bfs, hifi, ioctl;
-+      unsigned int rate;
-+      int i = 0;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+      rate = snd_soc_get_rate(rtd->codec_dai->dai_runtime.pcmrate);
-+      hifi = wm8753_read_reg_cache(codec, WM8753_HIFI) & 0x001f;
-+
-+      /* is coefficient valid ? */
-+      if ((i = get_coeff(rtd->codec_dai->mclk, rate)) < 0)
-+              return i;
-+
-+      srate = wm8753_read_reg_cache(codec, WM8753_SRATE1) & 0x01c0;
-+      wm8753_write(codec, WM8753_SRATE1, srate | (coeff_div[i].sr << 1) |
-+              coeff_div[i].usb);
-+
-+      /* do we need to enable the PLL */
-+      if (rtd->codec_dai->pll_in) {
-+              if (wm8753_config_pll(codec, rtd->codec_dai, 1) !=
-+                      rtd->codec_dai->pll_in) {
-+                      err("could not set pll to %d --> %d",
-+                              rtd->codec_dai->pll_in, rtd->codec_dai->pll_out);
-+                      return -ENODEV;
-+              }
-+      }
-+
-+      /* set bclk divisor rate */
-+      srate = wm8753_read_reg_cache(codec, WM8753_SRATE2) & 0x01c7;
-+      switch (bfs) {
-+      case 1:
-+              break;
-+      case 2:
-+              srate |= (0x1 << 3);
-+              break;
-+      case 4:
-+              srate |= (0x2 << 3);
-+              break;
-+      case 8:
-+              srate |= (0x3 << 3);
-+              break;
-+      case 16:
-+              srate |= (0x4 << 3);
-+              break;
-+      }
-+      wm8753_write(codec, WM8753_SRATE2, srate);
-+
-+      /* set master/slave audio interface */
-+      ioctl = wm8753_read_reg_cache(codec, WM8753_IOCTL) & 0x00fe;
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              ioctl |= 0x0001;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              hifi |= 0x0040;
-+              break;
-+      }
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_IB_IF:
-+              hifi |= 0x0090;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              hifi |= 0x0080;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              hifi |= 0x0010;
-+              break;
-+      }
-+      wm8753_write(codec, WM8753_IOCTL, ioctl);
-+      wm8753_write(codec, WM8753_HIFI, hifi);
-+      return 0;
-+}
-+
-+static int wm8753_mode1v_prepare (struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 clock;
-+
-+      /* set clk source as pcmclk */
-+      clock = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xfffb;
-+      wm8753_write(codec, WM8753_CLOCK, clock);
-+
-+      wm8753_adc_vdac_prepare(substream);
-+      return wm8753_pcm_dai_prepare(substream);
-+}
-+
-+static int wm8753_mode1h_prepare (struct snd_pcm_substream *substream)
-+{
-+      wm8753_hdac_prepare(substream);
-+      return wm8753_i2s_dai_prepare(substream);
-+}
-+
-+static int wm8753_mode2_prepare (struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 clock;
-+
-+      /* set clk source as pcmclk */
-+      clock = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xfffb;
-+      wm8753_write(codec, WM8753_CLOCK, clock);
-+
-+      wm8753_adc_vdac_prepare(substream);
-+      return wm8753_i2s_dai_prepare(substream);
-+}
-+
-+static int wm8753_mode3_prepare (struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 clock;
-+
-+      /* set clk source as mclk */
-+      clock = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xfffb;
-+      wm8753_write(codec, WM8753_CLOCK, clock | 0x4);
-+
-+      wm8753_hdac_prepare(substream);
-+      wm8753_adc_vdac_prepare(substream);
-+      return wm8753_i2s_dai_prepare(substream);
-+}
-+
-+static int wm8753_mode4_prepare (struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 clock;
-+
-+      /* set clk source as mclk */
-+      clock = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xfffb;
-+      wm8753_write(codec, WM8753_CLOCK, clock | 0x4);
-+
-+      wm8753_hdac_prepare(substream);
-+      wm8753_adc_vdac_prepare(substream);
-+      return wm8753_i2s_dai_prepare(substream);
-+}
-+
-+static int wm8753_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = wm8753_read_reg_cache(codec, WM8753_DAC) & 0xfff7;
-+
-+      /* the digital mute covers the HiFi and Voice DAC's on the WM8753.
-+       * make sure we check if they are not both active when we mute */
-+      if (mute && dai->id == 1) {
-+              if (!wm8753_dai[WM8753_DAI_VOICE].playback.active ||
-+                      !wm8753_dai[WM8753_DAI_HIFI].playback.active)
-+                      wm8753_write(codec, WM8753_DAC, mute_reg | 0x8);
-+      } else {
-+              if (mute)
-+                      wm8753_write(codec, WM8753_DAC, mute_reg | 0x8);
-+              else
-+                      wm8753_write(codec, WM8753_DAC, mute_reg);
-+      }
-+
-+      return 0;
-+}
-+
-+static int wm8753_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      u16 pwr_reg = wm8753_read_reg_cache(codec, WM8753_PWR1) & 0xfe3e;
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* set vmid to 50k and unmute dac */
-+              wm8753_write(codec, WM8753_PWR1, pwr_reg | 0x00c0);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              /* set vmid to 5k for quick power up */
-+              wm8753_write(codec, WM8753_PWR1, pwr_reg | 0x01c1);
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* mute dac and set vmid to 500k, enable VREF */
-+              wm8753_write(codec, WM8753_PWR1, pwr_reg | 0x0141);
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              wm8753_write(codec, WM8753_PWR1, 0x0001);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+/*
-+ * The WM8753 supports upto 4 different and mutually exclusive DAI
-+ * configurations. This gives 2 PCM's available for use, hifi and voice.
-+ * NOTE: The Voice PCM cannot play or caputure audio to the CPU as it's DAI
-+ * is connected between the wm8753 and a BT codec or GSM modem.
-+ *
-+ * 1. Voice over PCM DAI - HIFI DAC over HIFI DAI
-+ * 2. Voice over HIFI DAI - HIFI disabled
-+ * 3. Voice disabled - HIFI over HIFI
-+ * 4. Voice disabled - HIFI over HIFI, uses voice DAI LRC for capture
-+ */
-+static const struct snd_soc_codec_dai wm8753_all_dai[] = {
-+/* DAI HiFi mode 1 */
-+{     .name = "WM8753 HiFi",
-+      .id = 1,
-+      .playback = {
-+              .stream_name = "HiFi Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = { /* dummy for fast DAI switching */
-+              .stream_name = "HiFi Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .config_sysclk = wm8753_config_i2s_sysclk,
-+      .digital_mute = wm8753_mute,
-+      .ops = {
-+              .prepare = wm8753_mode1h_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8753_hifi_modes),
-+              .mode = wm8753_hifi_modes,},
-+},
-+/* DAI Voice mode 1 */
-+{     .name = "WM8753 Voice",
-+      .id = 1,
-+      .playback = {
-+              .stream_name = "Voice Playback",
-+              .channels_min = 1,
-+              .channels_max = 1,},
-+      .capture = {
-+              .stream_name = "Voice Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .config_sysclk = wm8753_config_pcm_sysclk,
-+      .digital_mute = wm8753_mute,
-+      .ops = {
-+              .prepare = wm8753_mode1v_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8753_voice_modes),
-+              .mode = wm8753_voice_modes,},
-+},
-+/* DAI HiFi mode 2 - dummy */
-+{     .name = "WM8753 HiFi",
-+      .id = 2,
-+},
-+/* DAI Voice mode 2 */
-+{     .name = "WM8753 Voice",
-+      .id = 2,
-+      .playback = {
-+              .stream_name = "Voice Playback",
-+              .channels_min = 1,
-+              .channels_max = 1,},
-+      .capture = {
-+              .stream_name = "Voice Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .config_sysclk = wm8753_config_i2s_sysclk,
-+      .digital_mute = wm8753_mute,
-+      .ops = {
-+              .prepare = wm8753_mode2_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8753_voice_modes),
-+              .mode = wm8753_voice_modes,},
-+},
-+/* DAI HiFi mode 3 */
-+{     .name = "WM8753 HiFi",
-+      .id = 3,
-+      .playback = {
-+              .stream_name = "HiFi Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = {
-+              .stream_name = "HiFi Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .config_sysclk = wm8753_config_i2s_sysclk,
-+      .digital_mute = wm8753_mute,
-+      .ops = {
-+              .prepare = wm8753_mode3_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8753_hifi_modes),
-+              .mode = wm8753_hifi_modes,},
-+},
-+/* DAI Voice mode 3 - dummy */
-+{     .name = "WM8753 Voice",
-+      .id = 3,
-+},
-+/* DAI HiFi mode 4 */
-+{     .name = "WM8753 HiFi",
-+      .id = 4,
-+      .playback = {
-+              .stream_name = "HiFi Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = {
-+              .stream_name = "HiFi Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .config_sysclk = wm8753_config_i2s_sysclk,
-+      .digital_mute = wm8753_mute,
-+      .ops = {
-+              .prepare = wm8753_mode4_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8753_mixed_modes),
-+              .mode = wm8753_mixed_modes,},
-+},
-+/* DAI Voice mode 4 - dummy */
-+{     .name = "WM8753 Voice",
-+      .id = 4,
-+},
-+};
-+
-+struct snd_soc_codec_dai wm8753_dai[2];
-+EXPORT_SYMBOL_GPL(wm8753_dai);
-+
-+static void wm8753_set_dai_mode(struct snd_soc_codec *codec, unsigned int mode)
-+{
-+      if (mode < 4) {
-+              wm8753_dai[0] = wm8753_all_dai[mode << 1];
-+              wm8753_dai[1] = wm8753_all_dai[(mode << 1) + 1];
-+      }
-+}
-+
-+static void wm8753_work(void *data)
-+{
-+      struct snd_soc_codec *codec = (struct snd_soc_codec *)data;
-+      wm8753_dapm_event(codec, codec->dapm_state);
-+}
-+
-+static int wm8753_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8753_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8753_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8753_reg); i++) {
-+              if (i + 1 == WM8753_RESET)
-+                      continue;
-+              data[0] = ((i + 1) << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+
-+      wm8753_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      /* charge wm8753 caps */
-+      if (codec->suspend_dapm_state == SNDRV_CTL_POWER_D0) {
-+              wm8753_dapm_event(codec, SNDRV_CTL_POWER_D2);
-+              codec->dapm_state = SNDRV_CTL_POWER_D0;
-+              queue_delayed_work(wm8753_workq, &wm8753_dapm_work,
-+                      msecs_to_jiffies(caps_charge));
-+      }
-+
-+      return 0;
-+}
-+
-+/*
-+ * initialise the WM8753 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int wm8753_init(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int reg, ret = 0;
-+
-+      codec->name = "WM8753";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8753_read_reg_cache;
-+      codec->write = wm8753_write;
-+      codec->dapm_event = wm8753_dapm_event;
-+      codec->dai = wm8753_dai;
-+      codec->num_dai = 2;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8753_reg);
-+
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8753_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, wm8753_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm8753_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8753_reg);
-+      wm8753_set_dai_mode(codec, 0);
-+
-+      wm8753_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if (ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* charge output caps */
-+      wm8753_dapm_event(codec, SNDRV_CTL_POWER_D2);
-+      codec->dapm_state = SNDRV_CTL_POWER_D3hot;
-+      queue_delayed_work(wm8753_workq,
-+              &wm8753_dapm_work, msecs_to_jiffies(caps_charge));
-+
-+      /* set the update bits */
-+      reg = wm8753_read_reg_cache(codec, WM8753_LDAC);
-+      wm8753_write(codec, WM8753_LDAC, reg | 0x0100);
-+      reg = wm8753_read_reg_cache(codec, WM8753_RDAC);
-+      wm8753_write(codec, WM8753_RDAC, reg | 0x0100);
-+      reg = wm8753_read_reg_cache(codec, WM8753_LOUT1V);
-+      wm8753_write(codec, WM8753_LOUT1V, reg | 0x0100);
-+      reg = wm8753_read_reg_cache(codec, WM8753_ROUT1V);
-+      wm8753_write(codec, WM8753_ROUT1V, reg | 0x0100);
-+      reg = wm8753_read_reg_cache(codec, WM8753_LOUT2V);
-+      wm8753_write(codec, WM8753_LOUT2V, reg | 0x0100);
-+      reg = wm8753_read_reg_cache(codec, WM8753_ROUT2V);
-+      wm8753_write(codec, WM8753_ROUT2V, reg | 0x0100);
-+      reg = wm8753_read_reg_cache(codec, WM8753_LINVOL);
-+      wm8753_write(codec, WM8753_LINVOL, reg | 0x0100);
-+      reg = wm8753_read_reg_cache(codec, WM8753_RINVOL);
-+      wm8753_write(codec, WM8753_RINVOL, reg | 0x0100);
-+
-+      wm8753_add_controls(codec);
-+      wm8753_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if (ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+static struct snd_soc_device *wm8753_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+/*
-+ * WM8753 2 wire address is determined by GPIO5
-+ * state during powerup.
-+ *    low  = 0x1a
-+ *    high = 0x1b
-+ */
-+#define I2C_DRIVERID_WM8753 0xfefe /* liam -  need a proper id */
-+
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver wm8753_i2c_driver;
-+static struct i2c_client client_template;
-+
-+static int wm8753_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = wm8753_socdev;
-+      struct wm8753_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL){
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+      i2c_set_clientdata(i2c, codec);
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if (ret < 0) {
-+              err("failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = wm8753_init(socdev);
-+      if (ret < 0) {
-+              err("failed to initialise WM8753\n");
-+              goto err;
-+      }
-+
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+}
-+
-+static int wm8753_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec *codec = i2c_get_clientdata(client);
-+      i2c_detach_client(client);
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+      return 0;
-+}
-+
-+static int wm8753_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, wm8753_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver wm8753_i2c_driver = {
-+      .driver = {
-+              .name = "WM8753 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_WM8753,
-+      .attach_adapter = wm8753_i2c_attach,
-+      .detach_client =  wm8753_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "WM8753",
-+      .driver = &wm8753_i2c_driver,
-+};
-+#endif
-+
-+static int wm8753_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8753_setup_data *setup;
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      info("WM8753 Audio Codec %s", WM8753_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+      wm8753_socdev = socdev;
-+      INIT_WORK(&wm8753_dapm_work, wm8753_work, codec);
-+      wm8753_workq = create_workqueue("wm8753");
-+      if (wm8753_workq == NULL) {
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&wm8753_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+              /* Add other interfaces here */
-+#endif
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8753_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8753_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      if (wm8753_workq)
-+              destroy_workqueue(wm8753_workq);
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&wm8753_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8753 = {
-+      .probe =        wm8753_probe,
-+      .remove =       wm8753_remove,
-+      .suspend =      wm8753_suspend,
-+      .resume =       wm8753_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8753);
-+
-+MODULE_DESCRIPTION("ASoC WM8753 driver");
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8753.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8753.h
-@@ -0,0 +1,91 @@
-+/*
-+ * wm8753.h  --  audio driver for WM8753
-+ *
-+ * Copyright 2003 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ */
-+
-+#ifndef _WM8753_H
-+#define _WM8753_H
-+
-+/* WM8753 register space */
-+
-+#define WM8753_DAC            0x01
-+#define WM8753_ADC            0x02
-+#define WM8753_PCM            0x03
-+#define WM8753_HIFI           0x04
-+#define WM8753_IOCTL  0x05
-+#define WM8753_SRATE1 0x06
-+#define WM8753_SRATE2 0x07
-+#define WM8753_LDAC           0x08
-+#define WM8753_RDAC           0x09
-+#define WM8753_BASS           0x0a
-+#define WM8753_TREBLE 0x0b
-+#define WM8753_ALC1           0x0c
-+#define WM8753_ALC2           0x0d
-+#define WM8753_ALC3           0x0e
-+#define WM8753_NGATE  0x0f
-+#define WM8753_LADC           0x10
-+#define WM8753_RADC           0x11
-+#define WM8753_ADCTL1 0x12
-+#define WM8753_3D             0x13
-+#define WM8753_PWR1           0x14
-+#define WM8753_PWR2           0x15
-+#define WM8753_PWR3           0x16
-+#define WM8753_PWR4           0x17
-+#define WM8753_ID             0x18
-+#define WM8753_INTPOL 0x19
-+#define WM8753_INTEN  0x1a
-+#define WM8753_GPIO1  0x1b
-+#define WM8753_GPIO2  0x1c
-+#define WM8753_RESET  0x1f
-+#define WM8753_RECMIX1        0x20
-+#define WM8753_RECMIX2        0x21
-+#define WM8753_LOUTM1 0x22
-+#define WM8753_LOUTM2 0x23
-+#define WM8753_ROUTM1 0x24
-+#define WM8753_ROUTM2 0x25
-+#define WM8753_MOUTM1 0x26
-+#define WM8753_MOUTM2 0x27
-+#define WM8753_LOUT1V 0x28
-+#define WM8753_ROUT1V 0x29
-+#define WM8753_LOUT2V 0x2a
-+#define WM8753_ROUT2V 0x2b
-+#define WM8753_MOUTV  0x2c
-+#define WM8753_OUTCTL 0x2d
-+#define WM8753_ADCIN  0x2e
-+#define WM8753_INCTL1 0x2f
-+#define WM8753_INCTL2 0x30
-+#define WM8753_LINVOL 0x31
-+#define WM8753_RINVOL 0x32
-+#define WM8753_MICBIAS        0x33
-+#define WM8753_CLOCK  0x34
-+#define WM8753_PLL1CTL1       0x35
-+#define WM8753_PLL1CTL2       0x36
-+#define WM8753_PLL1CTL3       0x37
-+#define WM8753_PLL1CTL4       0x38
-+#define WM8753_PLL2CTL1       0x39
-+#define WM8753_PLL2CTL2       0x3a
-+#define WM8753_PLL2CTL3       0x3b
-+#define WM8753_PLL2CTL4       0x3c
-+#define WM8753_BIASCTL        0x3d
-+#define WM8753_ADCTL2 0x3f
-+
-+struct wm8753_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+#define WM8753_DAI_HIFI               0
-+#define WM8753_DAI_VOICE      1
-+
-+extern struct snd_soc_codec_dai wm8753_dai[2];
-+extern struct snd_soc_codec_device soc_codec_dev_wm8753;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8772.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8772.c
-@@ -0,0 +1,806 @@
-+/*
-+ * wm8772.c  --  WM8772 ALSA Soc Audio driver
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8772.h"
-+
-+#define AUDIO_NAME "WM8772"
-+#define WM8772_VERSION "0.3"
-+
-+/*
-+ * wm8772 register cache
-+ * We can't read the WM8772 register space when we
-+ * are using 2 wire for device control, so we cache them instead.
-+ */
-+static const u16 wm8772_reg[] = {
-+      0x00ff, 0x00ff, 0x0120, 0x0000,  /*  0 */
-+      0x00ff, 0x00ff, 0x00ff, 0x00ff,  /*  4 */
-+      0x00ff, 0x0000, 0x0080, 0x0040,  /*  8 */
-+      0x0000
-+};
-+
-+#define WM8772_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+       SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_IB_NF)
-+
-+#define WM8772_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM8772_PRATES \
-+      (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\
-+       SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
-+
-+#define WM8772_CRATES \
-+      (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\
-+       SNDRV_PCM_RATE_96000)
-+
-+static struct snd_soc_dai_mode wm8772_modes[] = {
-+      /* common codec frame and clock master modes */
-+      /* 32k */
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 768,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 512,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 384,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 192,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 128,
-+              .bfs = 64,
-+      },
-+
-+      /*      44.1k */
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 768,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 512,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 384,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 192,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 128,
-+              .bfs = 64,
-+      },
-+
-+      /* 48k */
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 768,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 512,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 384,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 192,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 128,
-+              .bfs = 64,
-+      },
-+
-+      /* 96k */
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 384,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8772_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 192,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8772_DIR,
-+              .pcmrate = SND_SOC_DAI_BFS_RATE,
-+              .fs = 128,
-+              .bfs = 64,
-+      },
-+
-+      /* 192k */
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_192000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 192,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_192000,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 128,
-+              .bfs = 64,
-+      },
-+
-+      /* slave mode */
-+      {
-+              .fmt = WM8772_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = WM8772_PRATES,
-+              .pcmdir = SND_SOC_DAIDIR_PLAYBACK,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+      {
-+              .fmt = WM8772_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = WM8772_CRATES,
-+              .pcmdir = SND_SOC_DAIDIR_CAPTURE,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * read wm8772 register cache
-+ */
-+static inline unsigned int wm8772_read_reg_cache(struct snd_soc_codec * codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg > WM8772_CACHE_REGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write wm8772 register cache
-+ */
-+static inline void wm8772_write_reg_cache(struct snd_soc_codec * codec,
-+      unsigned int reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg > WM8772_CACHE_REGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+static int wm8772_write(struct snd_soc_codec * codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8772 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8772_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -1;
-+}
-+
-+#define wm8772_reset(c)       wm8772_write(c, WM8772_RESET, 0)
-+
-+/*
-+ * WM8772 Controls
-+ */
-+static const char *wm8772_zero_flag[] = {"All Ch", "Ch 1", "Ch 2", "Ch3"};
-+
-+static const struct soc_enum wm8772_enum[] = {
-+SOC_ENUM_SINGLE(WM8772_DACCTRL, 0, 4, wm8772_zero_flag),
-+};
-+
-+static const struct snd_kcontrol_new wm8772_snd_controls[] = {
-+
-+SOC_SINGLE("Left1 Playback Volume", WM8772_LDAC1VOL, 0, 255, 0),
-+SOC_SINGLE("Left2 Playback Volume", WM8772_LDAC2VOL, 0, 255, 0),
-+SOC_SINGLE("Left3 Playback Volume", WM8772_LDAC3VOL, 0, 255, 0),
-+SOC_SINGLE("Right1 Playback Volume", WM8772_RDAC1VOL, 0, 255, 0),
-+SOC_SINGLE("Right1 Playback Volume", WM8772_RDAC2VOL, 0, 255, 0),
-+SOC_SINGLE("Right1 Playback Volume", WM8772_RDAC3VOL, 0, 255, 0),
-+SOC_SINGLE("Master Playback Volume", WM8772_MDACVOL, 0, 255, 0),
-+
-+SOC_SINGLE("Playback Switch", WM8772_DACCH, 0, 1, 0),
-+SOC_SINGLE("Capture Switch", WM8772_ADCCTRL, 2, 1, 0),
-+
-+SOC_SINGLE("Demp1 Playback Switch", WM8772_DACCTRL, 6, 1, 0),
-+SOC_SINGLE("Demp2 Playback Switch", WM8772_DACCTRL, 7, 1, 0),
-+SOC_SINGLE("Demp3 Playback Switch", WM8772_DACCTRL, 8, 1, 0),
-+
-+SOC_SINGLE("Phase Invert 1 Switch", WM8772_IFACE, 6, 1, 0),
-+SOC_SINGLE("Phase Invert 2 Switch", WM8772_IFACE, 7, 1, 0),
-+SOC_SINGLE("Phase Invert 3 Switch", WM8772_IFACE, 8, 1, 0),
-+
-+SOC_SINGLE("Playback ZC Switch", WM8772_DACCTRL, 0, 1, 0),
-+
-+SOC_SINGLE("Capture High Pass Switch", WM8772_ADCCTRL, 3, 1, 0),
-+};
-+
-+/* add non dapm controls */
-+static int wm8772_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8772_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8772_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+      return 0;
-+}
-+
-+/* valid wm8772 mclk frequencies */
-+static const int freq_table[5][6] = {
-+      {4096000, 6144000, 8192000, 12288000, 16384000, 24576000},
-+      {5644800, 8467000, 11289600, 16934000, 22579200, 33868800},
-+      {6144000, 9216000, 12288000, 18432000, 24576000, 36864000},
-+      {12288000, 18432000, 24576000, 36864000, 0, 0},
-+      {24576000, 36864000, 0, 0, 0},
-+};
-+
-+static unsigned int check_freq(int rate, unsigned int freq)
-+{
-+      int i;
-+
-+      for(i = 0; i < 6; i++) {
-+              if(freq == freq_table[i][rate])
-+                      return freq;
-+      }
-+      return 0;
-+}
-+
-+static unsigned int wm8772_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      switch (info->rate){
-+      case 32000:
-+              dai->mclk = check_freq(0, clk);
-+              break;
-+      case 44100:
-+              dai->mclk = check_freq(1, clk);
-+              break;
-+      case 48000:
-+              dai->mclk = check_freq(2, clk);
-+              break;
-+      case 96000:
-+              dai->mclk = check_freq(3, clk);
-+              break;
-+      case 192000:
-+              dai->mclk = check_freq(4, clk);
-+              break;
-+      default:
-+              dai->mclk = 0;
-+      }
-+      return dai->mclk;
-+}
-+
-+static int wm8772_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 diface = wm8772_read_reg_cache(codec, WM8772_IFACE) & 0xffc0;
-+      u16 diface_ctrl = wm8772_read_reg_cache(codec, WM8772_DACRATE) & 0xfe1f;
-+      u16 aiface = 0;
-+      u16 aiface_ctrl = wm8772_read_reg_cache(codec, WM8772_ADCCTRL) & 0xfcff;
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+
-+              /* set master/slave audio interface */
-+              switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+              case SND_SOC_DAIFMT_CBM_CFM:
-+                      diface_ctrl |= 0x0010;
-+                      break;
-+              case SND_SOC_DAIFMT_CBS_CFS:
-+                      break;
-+              }
-+
-+              /* interface format */
-+              switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+              case SND_SOC_DAIFMT_I2S:
-+                      diface |= 0x0002;
-+                      break;
-+              case SND_SOC_DAIFMT_RIGHT_J:
-+                      break;
-+              case SND_SOC_DAIFMT_LEFT_J:
-+                      diface |= 0x0001;
-+                      break;
-+              case SND_SOC_DAIFMT_DSP_A:
-+                      diface |= 0x0003;
-+                      break;
-+              case SND_SOC_DAIFMT_DSP_B:
-+                      diface |= 0x0007;
-+                      break;
-+              }
-+
-+              /* bit size */
-+              switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+              case SNDRV_PCM_FMTBIT_S16_LE:
-+                      break;
-+              case SNDRV_PCM_FORMAT_S20_3LE:
-+                      diface |= 0x0010;
-+                      break;
-+              case SNDRV_PCM_FORMAT_S24_3LE:
-+                      diface |= 0x0020;
-+                      break;
-+              case SNDRV_PCM_FORMAT_S32_LE:
-+                      diface |= 0x0030;
-+                      break;
-+              }
-+
-+              /* clock inversion */
-+              switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+              case SND_SOC_DAIFMT_NB_NF:
-+                      break;
-+              case SND_SOC_DAIFMT_IB_NF:
-+                      diface |= 0x0008;
-+                      break;
-+              }
-+
-+              /* set rate */
-+              switch (rtd->codec_dai->dai_runtime.fs) {
-+              case 768:
-+                      diface_ctrl |= (0x5 << 6);
-+                      break;
-+              case 512:
-+                      diface_ctrl |= (0x4 << 6);
-+                      break;
-+              case 384:
-+                      diface_ctrl |= (0x3 << 6);
-+                      break;
-+              case 256:
-+                      diface_ctrl |= (0x2 << 6);
-+                      break;
-+              case 192:
-+                      diface_ctrl |= (0x1 << 6);
-+                      break;
-+              }
-+
-+              wm8772_write(codec, WM8772_DACRATE, diface_ctrl);
-+              wm8772_write(codec, WM8772_IFACE, diface);
-+
-+      } else {
-+
-+              /* set master/slave audio interface */
-+              switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+              case SND_SOC_DAIFMT_CBM_CFM:
-+                      aiface |= 0x0010;
-+                      break;
-+              case SND_SOC_DAIFMT_CBS_CFS:
-+                      break;
-+              }
-+
-+              /* interface format */
-+              switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+              case SND_SOC_DAIFMT_I2S:
-+                      aiface |= 0x0002;
-+                      break;
-+              case SND_SOC_DAIFMT_RIGHT_J:
-+                      break;
-+              case SND_SOC_DAIFMT_LEFT_J:
-+                      aiface |= 0x0001;
-+                      break;
-+              case SND_SOC_DAIFMT_DSP_A:
-+                      aiface |= 0x0003;
-+                      break;
-+              case SND_SOC_DAIFMT_DSP_B:
-+                      aiface |= 0x0003;
-+                      aiface_ctrl |= 0x0010;
-+                      break;
-+              }
-+
-+              /* bit size */
-+              switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+              case SNDRV_PCM_FMTBIT_S16_LE:
-+                      break;
-+              case SNDRV_PCM_FMTBIT_S20_3LE:
-+                      aiface |= 0x0004;
-+                      break;
-+              case SNDRV_PCM_FMTBIT_S24_LE:
-+                      aiface |= 0x0008;
-+                      break;
-+              case SNDRV_PCM_FMTBIT_S32_LE:
-+                      aiface |= 0x000c;
-+                      break;
-+              }
-+
-+              /* clock inversion */
-+              switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+              case SND_SOC_DAIFMT_NB_NF:
-+                      break;
-+              case SND_SOC_DAIFMT_IB_NF:
-+                      aiface_ctrl |= 0x0020;
-+                      break;
-+              }
-+
-+              /* set rate */
-+              switch (rtd->codec_dai->dai_runtime.fs) {
-+              case 768:
-+                      aiface |= (0x5 << 5);
-+                      break;
-+              case 512:
-+                      aiface |= (0x4 << 5);
-+                      break;
-+              case 384:
-+                      aiface |= (0x3 << 5);
-+                      break;
-+              case 256:
-+                      aiface |= (0x2 << 5);
-+                      break;
-+              }
-+
-+              wm8772_write(codec, WM8772_ADCCTRL, aiface_ctrl);
-+              wm8772_write(codec, WM8772_ADCRATE, aiface);
-+      }
-+
-+      return 0;
-+}
-+
-+static int wm8772_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      u16 master = wm8772_read_reg_cache(codec, WM8772_DACRATE) & 0xffe0;
-+
-+      switch (event) {
-+              case SNDRV_CTL_POWER_D0: /* full On */
-+                      /* vref/mid, clk and osc on, dac unmute, active */
-+                      wm8772_write(codec, WM8772_DACRATE, master);
-+                      break;
-+              case SNDRV_CTL_POWER_D1: /* partial On */
-+              case SNDRV_CTL_POWER_D2: /* partial On */
-+                      break;
-+              case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+                      /* everything off except vref/vmid, dac mute, inactive */
-+                      wm8772_write(codec, WM8772_DACRATE, master | 0x0f);
-+                      break;
-+              case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+                      /* everything off, dac mute, inactive */
-+                      wm8772_write(codec, WM8772_DACRATE, master | 0x1f);
-+                      break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai wm8772_dai = {
-+      .name = "WM8772",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 6,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .config_sysclk = wm8772_config_sysclk,
-+      .ops = {
-+              .prepare = wm8772_pcm_prepare,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8772_modes),
-+              .mode = wm8772_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm8772_dai);
-+
-+static int wm8772_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8772_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8772_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8772_reg); i++) {
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+      wm8772_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8772_dapm_event(codec, codec->suspend_dapm_state);
-+      return 0;
-+}
-+
-+/*
-+ * initialise the WM8772 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int wm8772_init(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int reg, ret = 0;
-+
-+      codec->name = "WM8772";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8772_read_reg_cache;
-+      codec->write = wm8772_write;
-+      codec->dapm_event = wm8772_dapm_event;
-+      codec->dai = &wm8772_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8772_reg);
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8772_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, wm8772_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm8772_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8772_reg);
-+
-+      wm8772_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if(ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* power on device */
-+      wm8772_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      /* set the update bits */
-+      reg = wm8772_read_reg_cache(codec, WM8772_MDACVOL);
-+      wm8772_write(codec, WM8772_MDACVOL, reg | 0x0100);
-+      reg = wm8772_read_reg_cache(codec, WM8772_LDAC1VOL);
-+      wm8772_write(codec, WM8772_LDAC1VOL, reg | 0x0100);
-+      reg = wm8772_read_reg_cache(codec, WM8772_LDAC2VOL);
-+      wm8772_write(codec, WM8772_LDAC2VOL, reg | 0x0100);
-+      reg = wm8772_read_reg_cache(codec, WM8772_LDAC3VOL);
-+      wm8772_write(codec, WM8772_LDAC3VOL, reg | 0x0100);
-+      reg = wm8772_read_reg_cache(codec, WM8772_RDAC1VOL);
-+      wm8772_write(codec, WM8772_RDAC1VOL, reg | 0x0100);
-+      reg = wm8772_read_reg_cache(codec, WM8772_RDAC2VOL);
-+      wm8772_write(codec, WM8772_RDAC2VOL, reg | 0x0100);
-+      reg = wm8772_read_reg_cache(codec, WM8772_RDAC3VOL);
-+      wm8772_write(codec, WM8772_RDAC3VOL, reg | 0x0100);
-+
-+      wm8772_add_controls(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if (ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+static struct snd_soc_device *wm8772_socdev;
-+
-+static int wm8772_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8772_setup_data *setup;
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      printk(KERN_INFO "WM8772 Audio Codec %s", WM8772_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      wm8772_socdev = socdev;
-+
-+      /* Add other interfaces here */
-+#warning do SPI device probe here and then call wm8772_init()
-+
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8772_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8772_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+
-+      snd_soc_free_pcms(socdev);
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8772 = {
-+      .probe =        wm8772_probe,
-+      .remove =       wm8772_remove,
-+      .suspend =      wm8772_suspend,
-+      .resume =       wm8772_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8772);
-+
-+MODULE_DESCRIPTION("ASoC WM8772 driver");
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8772.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8772.h
-@@ -0,0 +1,40 @@
-+/*
-+ * wm8772.h  --  audio driver for WM8772
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ */
-+
-+#ifndef _WM8772_H
-+#define _WM8772_H
-+
-+/* WM8772 register space */
-+
-+#define WM8772_LDAC1VOL   0x00
-+#define WM8772_RDAC1VOL   0x01
-+#define WM8772_DACCH      0x02
-+#define WM8772_IFACE      0x03
-+#define WM8772_LDAC2VOL   0x04
-+#define WM8772_RDAC2VOL   0x05
-+#define WM8772_LDAC3VOL   0x06
-+#define WM8772_RDAC3VOL   0x07
-+#define WM8772_MDACVOL    0x08
-+#define WM8772_DACCTRL    0x09
-+#define WM8772_DACRATE    0x0a
-+#define WM8772_ADCRATE    0x0b
-+#define WM8772_ADCCTRL    0x0c
-+#define WM8772_RESET    0x1f
-+
-+#define WM8772_CACHE_REGNUM   10
-+
-+extern struct snd_soc_codec_dai wm8772_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_wm8772;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8971.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8971.c
-@@ -0,0 +1,1214 @@
-+/*
-+ * wm8971.c  --  WM8971 ALSA SoC Audio driver
-+ *
-+ * Copyright 2005 Lab126, Inc.
-+ *
-+ * Author: Kenneth Kiraly <kiraly@lab126.com>
-+ *
-+ * Based on wm8753.c by Liam Girdwood
-+ *
-+ *  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/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8971.h"
-+
-+#define AUDIO_NAME "wm8971"
-+#define WM8971_VERSION "0.8"
-+
-+#undef        WM8971_DEBUG
-+
-+#ifdef WM8971_DEBUG
-+#define dbg(format, arg...) \
-+      printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
-+#else
-+#define dbg(format, arg...) do {} while (0)
-+#endif
-+#define err(format, arg...) \
-+      printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-+#define info(format, arg...) \
-+      printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-+#define warn(format, arg...) \
-+      printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
-+
-+#define       WM8971_REG_COUNT                43
-+
-+static struct workqueue_struct *wm8971_workq = NULL;
-+static struct work_struct wm8971_dapm_work;
-+
-+/*
-+ * wm8971 register cache
-+ * We can't read the WM8971 register space when we
-+ * are using 2 wire for device control, so we cache them instead.
-+ */
-+static const u16 wm8971_reg[] = {
-+      0x0097, 0x0097, 0x0079, 0x0079,  /*  0 */
-+      0x0000, 0x0008, 0x0000, 0x000a,  /*  4 */
-+      0x0000, 0x0000, 0x00ff, 0x00ff,  /*  8 */
-+      0x000f, 0x000f, 0x0000, 0x0000,  /* 12 */
-+      0x0000, 0x007b, 0x0000, 0x0032,  /* 16 */
-+      0x0000, 0x00c3, 0x00c3, 0x00c0,  /* 20 */
-+      0x0000, 0x0000, 0x0000, 0x0000,  /* 24 */
-+      0x0000, 0x0000, 0x0000, 0x0000,  /* 28 */
-+      0x0000, 0x0000, 0x0050, 0x0050,  /* 32 */
-+      0x0050, 0x0050, 0x0050, 0x0050,  /* 36 */
-+      0x0079, 0x0079, 0x0079,          /* 40 */
-+};
-+
-+#define WM8971_HIFI_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+      SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \
-+      SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM8971_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM8971_HIFI_FSB \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | \
-+      SND_SOC_FSBD(8) | SND_SOC_FSBD(16))
-+
-+#define WM8971_HIFI_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
-+
-+#define WM8971_HIFI_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
-+
-+static struct snd_soc_dai_mode wm8971_modes[] = {
-+      /* common codec frame and clock master modes */
-+      /* 8k */
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1536,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1408,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 2304,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 2112,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1500,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+
-+      /* 11.025k */
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1024,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1536,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1088,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+
-+      /* 16k */
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 768,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1152,
-+              .bfs = WM8971_HIFI_FSB
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 750,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+
-+      /* 22.05k */
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 512,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 768,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 544,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+
-+      /* 32k */
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 384,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 576,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 375,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+
-+      /* 44.1k & 48k */
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 384,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 272,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 250,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+
-+      /* 88.2k & 96k */
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 128,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 192,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 136,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 125,
-+              .bfs = WM8971_HIFI_FSB,
-+      },
-+
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = WM8971_HIFI_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM8971_HIFI_BITS,
-+              .pcmrate = WM8971_HIFI_RATES,
-+              .pcmdir = WM8971_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+static inline unsigned int wm8971_read_reg_cache(struct snd_soc_codec *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg < WM8971_REG_COUNT)
-+              return cache[reg];
-+
-+      return -1;
-+}
-+
-+static inline void wm8971_write_reg_cache(struct snd_soc_codec *codec,
-+      unsigned int reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg < WM8971_REG_COUNT)
-+              cache[reg] = value;
-+}
-+
-+static int wm8971_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8753 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8971_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -EIO;
-+}
-+
-+#define wm8971_reset(c)       wm8971_write(c, WM8971_RESET, 0)
-+
-+/* WM8971 Controls */
-+static const char *wm8971_bass[] = { "Linear Control", "Adaptive Boost" };
-+static const char *wm8971_bass_filter[] = { "130Hz @ 48kHz",
-+      "200Hz @ 48kHz" };
-+static const char *wm8971_treble[] = { "8kHz", "4kHz" };
-+static const char *wm8971_alc_func[] = { "Off", "Right", "Left", "Stereo" };
-+static const char *wm8971_ng_type[] = { "Constant PGA Gain",
-+      "Mute ADC Output" };
-+static const char *wm8971_deemp[] = { "None", "32kHz", "44.1kHz", "48kHz" };
-+static const char *wm8971_mono_mux[] = {"Stereo", "Mono (Left)",
-+      "Mono (Right)", "Digital Mono"};
-+static const char *wm8971_dac_phase[] = { "Non Inverted", "Inverted" };
-+static const char *wm8971_lline_mux[] = {"Line", "NC", "NC", "PGA",
-+      "Differential"};
-+static const char *wm8971_rline_mux[] = {"Line", "Mic", "NC", "PGA",
-+      "Differential"};
-+static const char *wm8971_lpga_sel[] = {"Line", "NC", "NC", "Differential"};
-+static const char *wm8971_rpga_sel[] = {"Line", "Mic", "NC", "Differential"};
-+static const char *wm8971_adcpol[] = {"Normal", "L Invert", "R Invert",
-+      "L + R Invert"};
-+
-+static const struct soc_enum wm8971_enum[] = {
-+      SOC_ENUM_SINGLE(WM8971_BASS, 7, 2, wm8971_bass),                        /* 0 */
-+      SOC_ENUM_SINGLE(WM8971_BASS, 6, 2, wm8971_bass_filter),
-+      SOC_ENUM_SINGLE(WM8971_TREBLE, 6, 2, wm8971_treble),
-+      SOC_ENUM_SINGLE(WM8971_ALC1, 7, 4, wm8971_alc_func),
-+      SOC_ENUM_SINGLE(WM8971_NGATE, 1, 2, wm8971_ng_type),        /* 4 */
-+      SOC_ENUM_SINGLE(WM8971_ADCDAC, 1, 4, wm8971_deemp),
-+      SOC_ENUM_SINGLE(WM8971_ADCTL1, 4, 4, wm8971_mono_mux),
-+      SOC_ENUM_SINGLE(WM8971_ADCTL1, 1, 2, wm8971_dac_phase),
-+      SOC_ENUM_SINGLE(WM8971_LOUTM1, 0, 5, wm8971_lline_mux),     /* 8 */
-+      SOC_ENUM_SINGLE(WM8971_ROUTM1, 0, 5, wm8971_rline_mux),
-+      SOC_ENUM_SINGLE(WM8971_LADCIN, 6, 4, wm8971_lpga_sel),
-+      SOC_ENUM_SINGLE(WM8971_RADCIN, 6, 4, wm8971_rpga_sel),
-+      SOC_ENUM_SINGLE(WM8971_ADCDAC, 5, 4, wm8971_adcpol),        /* 12 */
-+      SOC_ENUM_SINGLE(WM8971_ADCIN, 6, 4, wm8971_mono_mux),
-+};
-+
-+static const struct snd_kcontrol_new wm8971_snd_controls[] = {
-+      SOC_DOUBLE_R("Capture Volume", WM8971_LINVOL, WM8971_RINVOL, 0, 63, 0),
-+      SOC_DOUBLE_R("Capture ZC Switch", WM8971_LINVOL, WM8971_RINVOL, 6, 1, 0),
-+      SOC_DOUBLE_R("Capture Switch", WM8971_LINVOL, WM8971_RINVOL, 7, 1, 1),
-+
-+      SOC_DOUBLE_R("Headphone Playback ZC Switch", WM8971_LOUT1V,
-+              WM8971_ROUT1V, 7, 1, 0),
-+      SOC_DOUBLE_R("Speaker Playback ZC Switch", WM8971_LOUT2V,
-+              WM8971_ROUT2V, 7, 1, 0),
-+      SOC_SINGLE("Mono Playback ZC Switch", WM8971_MOUTV, 7, 1, 0),
-+
-+      SOC_DOUBLE_R("PCM Volume", WM8971_LDAC, WM8971_RDAC, 0, 255, 0),
-+
-+      SOC_DOUBLE_R("Bypass Left Playback Volume", WM8971_LOUTM1,
-+              WM8971_LOUTM2, 4, 7, 1),
-+      SOC_DOUBLE_R("Bypass Right Playback Volume", WM8971_ROUTM1,
-+              WM8971_ROUTM2, 4, 7, 1),
-+      SOC_DOUBLE_R("Bypass Mono Playback Volume", WM8971_MOUTM1,
-+              WM8971_MOUTM2, 4, 7, 1),
-+
-+      SOC_DOUBLE_R("Headphone Playback Volume", WM8971_LOUT1V,
-+              WM8971_ROUT1V, 0, 127, 0),
-+      SOC_DOUBLE_R("Speaker Playback Volume", WM8971_LOUT2V,
-+              WM8971_ROUT2V, 0, 127, 0),
-+
-+      SOC_ENUM("Bass Boost", wm8971_enum[0]),
-+      SOC_ENUM("Bass Filter", wm8971_enum[1]),
-+      SOC_SINGLE("Bass Volume", WM8971_BASS, 0, 7, 1),
-+
-+      SOC_SINGLE("Treble Volume", WM8971_TREBLE, 0, 7, 0),
-+      SOC_ENUM("Treble Cut-off", wm8971_enum[2]),
-+
-+      SOC_SINGLE("Capture Filter Switch", WM8971_ADCDAC, 0, 1, 1),
-+
-+      SOC_SINGLE("ALC Target Volume", WM8971_ALC1, 0, 7, 0),
-+      SOC_SINGLE("ALC Max Volume", WM8971_ALC1, 4, 7, 0),
-+
-+      SOC_SINGLE("ALC Capture Target Volume", WM8971_ALC1, 0, 7, 0),
-+      SOC_SINGLE("ALC Capture Max Volume", WM8971_ALC1, 4, 7, 0),
-+      SOC_ENUM("ALC Capture Function", wm8971_enum[3]),
-+      SOC_SINGLE("ALC Capture ZC Switch", WM8971_ALC2, 7, 1, 0),
-+      SOC_SINGLE("ALC Capture Hold Time", WM8971_ALC2, 0, 15, 0),
-+      SOC_SINGLE("ALC Capture Decay Time", WM8971_ALC3, 4, 15, 0),
-+      SOC_SINGLE("ALC Capture Attack Time", WM8971_ALC3, 0, 15, 0),
-+      SOC_SINGLE("ALC Capture NG Threshold", WM8971_NGATE, 3, 31, 0),
-+      SOC_ENUM("ALC Capture NG Type", wm8971_enum[4]),
-+      SOC_SINGLE("ALC Capture NG Switch", WM8971_NGATE, 0, 1, 0),
-+
-+      SOC_SINGLE("Capture 6dB Attenuate", WM8971_ADCDAC, 8, 1, 0),
-+      SOC_SINGLE("Playback 6dB Attenuate", WM8971_ADCDAC, 7, 1, 0),
-+
-+    SOC_ENUM("Playback De-emphasis", wm8971_enum[5]),
-+      SOC_ENUM("Playback Function", wm8971_enum[6]),
-+      SOC_ENUM("Playback Phase", wm8971_enum[7]),
-+
-+      SOC_DOUBLE_R("Mic Boost", WM8971_LADCIN, WM8971_RADCIN, 4, 3, 0),
-+};
-+
-+/* add non-DAPM controls */
-+static int wm8971_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8971_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8971_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      return 0;
-+}
-+
-+/*
-+ * DAPM Controls
-+ */
-+
-+/* Left Mixer */
-+static const struct snd_kcontrol_new wm8971_left_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Playback Switch", WM8971_LOUTM1, 8, 1, 0),
-+SOC_DAPM_SINGLE("Left Bypass Switch", WM8971_LOUTM1, 7, 1, 0),
-+SOC_DAPM_SINGLE("Right Playback Switch", WM8971_LOUTM2, 8, 1, 0),
-+SOC_DAPM_SINGLE("Right Bypass Switch", WM8971_LOUTM2, 7, 1, 0),
-+};
-+
-+/* Right Mixer */
-+static const struct snd_kcontrol_new wm8971_right_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Left Playback Switch", WM8971_ROUTM1, 8, 1, 0),
-+SOC_DAPM_SINGLE("Left Bypass Switch", WM8971_ROUTM1, 7, 1, 0),
-+SOC_DAPM_SINGLE("Playback Switch", WM8971_ROUTM2, 8, 1, 0),
-+SOC_DAPM_SINGLE("Right Bypass Switch", WM8971_ROUTM2, 7, 1, 0),
-+};
-+
-+/* Mono Mixer */
-+static const struct snd_kcontrol_new wm8971_mono_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Left Playback Switch", WM8971_MOUTM1, 8, 1, 0),
-+SOC_DAPM_SINGLE("Left Bypass Switch", WM8971_MOUTM1, 7, 1, 0),
-+SOC_DAPM_SINGLE("Right Playback Switch", WM8971_MOUTM2, 8, 1, 0),
-+SOC_DAPM_SINGLE("Right Bypass Switch", WM8971_MOUTM2, 7, 1, 0),
-+};
-+
-+/* Left Line Mux */
-+static const struct snd_kcontrol_new wm8971_left_line_controls =
-+SOC_DAPM_ENUM("Route", wm8971_enum[8]);
-+
-+/* Right Line Mux */
-+static const struct snd_kcontrol_new wm8971_right_line_controls =
-+SOC_DAPM_ENUM("Route", wm8971_enum[9]);
-+
-+/* Left PGA Mux */
-+static const struct snd_kcontrol_new wm8971_left_pga_controls =
-+SOC_DAPM_ENUM("Route", wm8971_enum[10]);
-+
-+/* Right PGA Mux */
-+static const struct snd_kcontrol_new wm8971_right_pga_controls =
-+SOC_DAPM_ENUM("Route", wm8971_enum[11]);
-+
-+/* Mono ADC Mux */
-+static const struct snd_kcontrol_new wm8971_monomux_controls =
-+SOC_DAPM_ENUM("Route", wm8971_enum[13]);
-+
-+static const struct snd_soc_dapm_widget wm8971_dapm_widgets[] = {
-+      SND_SOC_DAPM_MIXER("Left Mixer", SND_SOC_NOPM, 0, 0,
-+              &wm8971_left_mixer_controls[0],
-+              ARRAY_SIZE(wm8971_left_mixer_controls)),
-+      SND_SOC_DAPM_MIXER("Right Mixer", SND_SOC_NOPM, 0, 0,
-+              &wm8971_right_mixer_controls[0],
-+              ARRAY_SIZE(wm8971_right_mixer_controls)),
-+      SND_SOC_DAPM_MIXER("Mono Mixer", WM8971_PWR2, 2, 0,
-+              &wm8971_mono_mixer_controls[0],
-+              ARRAY_SIZE(wm8971_mono_mixer_controls)),
-+
-+      SND_SOC_DAPM_PGA("Right Out 2", WM8971_PWR2, 3, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Left Out 2", WM8971_PWR2, 4, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Right Out 1", WM8971_PWR2, 5, 0, NULL, 0),
-+      SND_SOC_DAPM_PGA("Left Out 1", WM8971_PWR2, 6, 0, NULL, 0),
-+      SND_SOC_DAPM_DAC("Right DAC", "Right Playback", WM8971_PWR2, 7, 0),
-+      SND_SOC_DAPM_DAC("Left DAC", "Left Playback", WM8971_PWR2, 8, 0),
-+      SND_SOC_DAPM_PGA("Mono Out 1", WM8971_PWR2, 2, 0, NULL, 0),
-+
-+      SND_SOC_DAPM_MICBIAS("Mic Bias", WM8971_PWR1, 1, 0),
-+      SND_SOC_DAPM_ADC("Right ADC", "Right Capture", WM8971_PWR1, 2, 0),
-+      SND_SOC_DAPM_ADC("Left ADC", "Left Capture", WM8971_PWR1, 3, 0),
-+
-+      SND_SOC_DAPM_MUX("Left PGA Mux", WM8971_PWR1, 5, 0,
-+              &wm8971_left_pga_controls),
-+      SND_SOC_DAPM_MUX("Right PGA Mux", WM8971_PWR1, 4, 0,
-+              &wm8971_right_pga_controls),
-+      SND_SOC_DAPM_MUX("Left Line Mux", SND_SOC_NOPM, 0, 0,
-+              &wm8971_left_line_controls),
-+      SND_SOC_DAPM_MUX("Right Line Mux", SND_SOC_NOPM, 0, 0,
-+              &wm8971_right_line_controls),
-+
-+      SND_SOC_DAPM_MUX("Left ADC Mux", SND_SOC_NOPM, 0, 0,
-+              &wm8971_monomux_controls),
-+      SND_SOC_DAPM_MUX("Right ADC Mux", SND_SOC_NOPM, 0, 0,
-+              &wm8971_monomux_controls),
-+
-+      SND_SOC_DAPM_OUTPUT("LOUT1"),
-+      SND_SOC_DAPM_OUTPUT("ROUT1"),
-+      SND_SOC_DAPM_OUTPUT("LOUT2"),
-+      SND_SOC_DAPM_OUTPUT("ROUT2"),
-+      SND_SOC_DAPM_OUTPUT("MONO"),
-+
-+      SND_SOC_DAPM_INPUT("LINPUT1"),
-+      SND_SOC_DAPM_INPUT("RINPUT1"),
-+      SND_SOC_DAPM_INPUT("MIC"),
-+};
-+
-+static const char *audio_map[][3] = {
-+      /* left mixer */
-+      {"Left Mixer", "Playback Switch", "Left DAC"},
-+      {"Left Mixer", "Left Bypass Switch", "Left Line Mux"},
-+      {"Left Mixer", "Right Playback Switch", "Right DAC"},
-+      {"Left Mixer", "Right Bypass Switch", "Right Line Mux"},
-+
-+      /* right mixer */
-+      {"Right Mixer", "Left Playback Switch", "Left DAC"},
-+      {"Right Mixer", "Left Bypass Switch", "Left Line Mux"},
-+      {"Right Mixer", "Playback Switch", "Right DAC"},
-+      {"Right Mixer", "Right Bypass Switch", "Right Line Mux"},
-+
-+      /* left out 1 */
-+      {"Left Out 1", NULL, "Left Mixer"},
-+      {"LOUT1", NULL, "Left Out 1"},
-+
-+      /* left out 2 */
-+      {"Left Out 2", NULL, "Left Mixer"},
-+      {"LOUT2", NULL, "Left Out 2"},
-+
-+      /* right out 1 */
-+      {"Right Out 1", NULL, "Right Mixer"},
-+      {"ROUT1", NULL, "Right Out 1"},
-+
-+      /* right out 2 */
-+      {"Right Out 2", NULL, "Right Mixer"},
-+      {"ROUT2", NULL, "Right Out 2"},
-+
-+      /* mono mixer */
-+      {"Mono Mixer", "Left Playback Switch", "Left DAC"},
-+      {"Mono Mixer", "Left Bypass Switch", "Left Line Mux"},
-+      {"Mono Mixer", "Right Playback Switch", "Right DAC"},
-+      {"Mono Mixer", "Right Bypass Switch", "Right Line Mux"},
-+
-+      /* mono out */
-+      {"Mono Out", NULL, "Mono Mixer"},
-+      {"MONO1", NULL, "Mono Out"},
-+
-+      /* Left Line Mux */
-+      {"Left Line Mux", "Line", "LINPUT1"},
-+      {"Left Line Mux", "PGA", "Left PGA Mux"},
-+      {"Left Line Mux", "Differential", "Differential Mux"},
-+
-+      /* Right Line Mux */
-+      {"Right Line Mux", "Line", "RINPUT1"},
-+      {"Right Line Mux", "Mic", "MIC"},
-+      {"Right Line Mux", "PGA", "Right PGA Mux"},
-+      {"Right Line Mux", "Differential", "Differential Mux"},
-+
-+      /* Left PGA Mux */
-+      {"Left PGA Mux", "Line", "LINPUT1"},
-+      {"Left PGA Mux", "Differential", "Differential Mux"},
-+
-+      /* Right PGA Mux */
-+      {"Right PGA Mux", "Line", "RINPUT1"},
-+      {"Right PGA Mux", "Differential", "Differential Mux"},
-+
-+      /* Differential Mux */
-+      {"Differential Mux", "Line", "LINPUT1"},
-+      {"Differential Mux", "Line", "RINPUT1"},
-+
-+      /* Left ADC Mux */
-+      {"Left ADC Mux", "Stereo", "Left PGA Mux"},
-+      {"Left ADC Mux", "Mono (Left)", "Left PGA Mux"},
-+      {"Left ADC Mux", "Digital Mono", "Left PGA Mux"},
-+
-+      /* Right ADC Mux */
-+      {"Right ADC Mux", "Stereo", "Right PGA Mux"},
-+      {"Right ADC Mux", "Mono (Right)", "Right PGA Mux"},
-+      {"Right ADC Mux", "Digital Mono", "Right PGA Mux"},
-+
-+      /* ADC */
-+      {"Left ADC", NULL, "Left ADC Mux"},
-+      {"Right ADC", NULL, "Right ADC Mux"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm8971_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm8971_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8971_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+struct _coeff_div {
-+      u32 mclk;
-+      u32 rate;
-+      u16 fs;
-+      u8 sr:5;
-+      u8 usb:1;
-+};
-+
-+/* codec hifi mclk clock divider coefficients */
-+static const struct _coeff_div coeff_div[] = {
-+      /* 8k */
-+      {12288000, 8000, 1536, 0x6, 0x0},
-+      {11289600, 8000, 1408, 0x16, 0x0},
-+      {18432000, 8000, 2304, 0x7, 0x0},
-+      {16934400, 8000, 2112, 0x17, 0x0},
-+      {12000000, 8000, 1500, 0x6, 0x1},
-+
-+      /* 11.025k */
-+      {11289600, 11025, 1024, 0x18, 0x0},
-+      {16934400, 11025, 1536, 0x19, 0x0},
-+      {12000000, 11025, 1088, 0x19, 0x1},
-+
-+      /* 16k */
-+      {12288000, 16000, 768, 0xa, 0x0},
-+      {18432000, 16000, 1152, 0xb, 0x0},
-+      {12000000, 16000, 750, 0xa, 0x1},
-+
-+      /* 22.05k */
-+      {11289600, 22050, 512, 0x1a, 0x0},
-+      {16934400, 22050, 768, 0x1b, 0x0},
-+      {12000000, 22050, 544, 0x1b, 0x1},
-+
-+      /* 32k */
-+      {12288000, 32000, 384, 0xc, 0x0},
-+      {18432000, 32000, 576, 0xd, 0x0},
-+      {12000000, 32000, 375, 0xa, 0x1},
-+
-+      /* 44.1k */
-+      {11289600, 44100, 256, 0x10, 0x0},
-+      {16934400, 44100, 384, 0x11, 0x0},
-+      {12000000, 44100, 272, 0x11, 0x1},
-+
-+      /* 48k */
-+      {12288000, 48000, 256, 0x0, 0x0},
-+      {18432000, 48000, 384, 0x1, 0x0},
-+      {12000000, 48000, 250, 0x0, 0x1},
-+
-+      /* 88.2k */
-+      {11289600, 88200, 128, 0x1e, 0x0},
-+      {16934400, 88200, 192, 0x1f, 0x0},
-+      {12000000, 88200, 136, 0x1f, 0x1},
-+
-+      /* 96k */
-+      {12288000, 96000, 128, 0xe, 0x0},
-+      {18432000, 96000, 192, 0xf, 0x0},
-+      {12000000, 96000, 125, 0xe, 0x1},
-+};
-+
-+static int get_coeff(int mclk, int rate)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
-+              if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)
-+                      return i;
-+      }
-+      return -EINVAL;
-+}
-+
-+/* WM8971 supports numerous input clocks per sample rate */
-+static unsigned int wm8971_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      dai->mclk = 0;
-+
-+      /* check that the calculated FS and rate actually match a clock from
-+       * the machine driver */
-+      if (info->fs * info->rate == clk)
-+              dai->mclk = clk;
-+
-+      return dai->mclk;
-+}
-+
-+static int wm8971_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 iface = 0, bfs, srate = 0;
-+      int i = get_coeff(rtd->codec_dai->mclk,
-+              snd_soc_get_rate(rtd->codec_dai->dai_runtime.pcmrate));
-+
-+      /* is coefficient valid ? */
-+      if (i < 0)
-+              return i;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+
-+      /* set master/slave audio interface */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              iface |= 0x0040;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              break;
-+      }
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              iface |= 0x0002;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              iface |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              iface |= 0x0003;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_B:
-+              iface |= 0x0013;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              iface |= 0x0004;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              iface |= 0x0008;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              iface |= 0x000c;
-+              break;
-+      }
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_NB_NF:
-+              break;
-+      case SND_SOC_DAIFMT_IB_IF:
-+              iface |= 0x0090;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              iface |= 0x0080;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              iface |= 0x0010;
-+              break;
-+      }
-+
-+      /* set bclk divisor rate */
-+      switch (bfs) {
-+      case 1:
-+              break;
-+      case 4:
-+              srate |= (0x1 << 7);
-+              break;
-+      case 8:
-+              srate |= (0x2 << 7);
-+              break;
-+      case 16:
-+              srate |= (0x3 << 7);
-+              break;
-+      }
-+
-+      /* set iface & srate */
-+      wm8971_write(codec, WM8971_AUDIO, iface);
-+      wm8971_write(codec, WM8971_SRATE, srate |
-+              (coeff_div[i].sr << 1) | coeff_div[i].usb);
-+      return 0;
-+}
-+
-+static int wm8971_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = wm8971_read_reg_cache(codec, WM8971_ADCDAC) & 0xfff7;
-+      if (mute)
-+              wm8971_write(codec, WM8971_ADCDAC, mute_reg | 0x8);
-+      else
-+              wm8971_write(codec, WM8971_ADCDAC, mute_reg);
-+      return 0;
-+}
-+
-+static int wm8971_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      u16 pwr_reg = wm8971_read_reg_cache(codec, WM8971_PWR1) & 0xfe3e;
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* set vmid to 50k and unmute dac */
-+              wm8971_write(codec, WM8971_PWR1, pwr_reg | 0x00c1);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              /* set vmid to 5k for quick power up */
-+              wm8971_write(codec, WM8971_PWR1, pwr_reg | 0x01c0);
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* mute dac and set vmid to 500k, enable VREF */
-+              wm8971_write(codec, WM8971_PWR1, pwr_reg | 0x0140);
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              wm8971_write(codec, WM8971_PWR1, 0x0001);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai wm8971_dai = {
-+      .name = "WM8971",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .config_sysclk = wm8971_config_sysclk,
-+      .digital_mute = wm8971_mute,
-+      .ops = {
-+              .prepare = wm8971_pcm_prepare,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8971_modes),
-+              .mode = wm8971_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm8971_dai);
-+
-+static void wm8971_work(void *data)
-+{
-+      struct snd_soc_codec *codec = (struct snd_soc_codec *)data;
-+      wm8971_dapm_event(codec, codec->dapm_state);
-+}
-+
-+static int wm8971_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8971_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8971_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8971_reg); i++) {
-+              if (i + 1 == WM8971_RESET)
-+                      continue;
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+
-+      wm8971_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      /* charge wm8971 caps */
-+      if (codec->suspend_dapm_state == SNDRV_CTL_POWER_D0) {
-+              wm8971_dapm_event(codec, SNDRV_CTL_POWER_D2);
-+              codec->dapm_state = SNDRV_CTL_POWER_D0;
-+              queue_delayed_work(wm8971_workq, &wm8971_dapm_work,
-+                      msecs_to_jiffies(1000));
-+      }
-+
-+      return 0;
-+}
-+
-+static int wm8971_init(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int reg, ret = 0;
-+
-+      codec->name = "WM8971";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8971_read_reg_cache;
-+      codec->write = wm8971_write;
-+      codec->dapm_event = wm8971_dapm_event;
-+      codec->dai = &wm8971_dai;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8971_reg);
-+      codec->num_dai = 1;
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8971_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, wm8971_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm8971_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8971_reg);
-+
-+      wm8971_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if (ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* charge output caps */
-+      wm8971_dapm_event(codec, SNDRV_CTL_POWER_D2);
-+      codec->dapm_state = SNDRV_CTL_POWER_D3hot;
-+      queue_delayed_work(wm8971_workq, &wm8971_dapm_work,
-+              msecs_to_jiffies(1000));
-+
-+      /* set the update bits */
-+      reg = wm8971_read_reg_cache(codec, WM8971_LDAC);
-+      wm8971_write(codec, WM8971_LDAC, reg | 0x0100);
-+      reg = wm8971_read_reg_cache(codec, WM8971_RDAC);
-+      wm8971_write(codec, WM8971_RDAC, reg | 0x0100);
-+
-+      reg = wm8971_read_reg_cache(codec, WM8971_LOUT1V);
-+      wm8971_write(codec, WM8971_LOUT1V, reg | 0x0100);
-+      reg = wm8971_read_reg_cache(codec, WM8971_ROUT1V);
-+      wm8971_write(codec, WM8971_ROUT1V, reg | 0x0100);
-+
-+      reg = wm8971_read_reg_cache(codec, WM8971_LOUT2V);
-+      wm8971_write(codec, WM8971_LOUT2V, reg | 0x0100);
-+      reg = wm8971_read_reg_cache(codec, WM8971_ROUT2V);
-+      wm8971_write(codec, WM8971_ROUT2V, reg | 0x0100);
-+
-+      reg = wm8971_read_reg_cache(codec, WM8971_LINVOL);
-+      wm8971_write(codec, WM8971_LINVOL, reg | 0x0100);
-+      reg = wm8971_read_reg_cache(codec, WM8971_RINVOL);
-+      wm8971_write(codec, WM8971_RINVOL, reg | 0x0100);
-+
-+      wm8971_add_controls(codec);
-+      wm8971_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if (ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+static struct snd_soc_device *wm8971_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+/*
-+ * WM8731 2 wire address is determined by GPIO5
-+ * state during powerup.
-+ *    low  = 0x1a
-+ *    high = 0x1b
-+ */
-+#define I2C_DRIVERID_WM8971 0xfefe /* liam -  need a proper id */
-+
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver wm8971_i2c_driver;
-+static struct i2c_client client_template;
-+
-+static int wm8971_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = wm8971_socdev;
-+      struct wm8971_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL) {
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+
-+      i2c_set_clientdata(i2c, codec);
-+
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if (ret < 0) {
-+              err("failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = wm8971_init(socdev);
-+      if (ret < 0) {
-+              err("failed to initialise WM8971\n");
-+              goto err;
-+      }
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+}
-+
-+static int wm8971_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec* codec = i2c_get_clientdata(client);
-+      i2c_detach_client(client);
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+      return 0;
-+}
-+
-+static int wm8971_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, wm8971_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver wm8971_i2c_driver = {
-+      .driver = {
-+              .name = "WM8971 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_WM8971,
-+      .attach_adapter = wm8971_i2c_attach,
-+      .detach_client =  wm8971_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "WM8971",
-+      .driver = &wm8971_i2c_driver,
-+};
-+#endif
-+
-+static int wm8971_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8971_setup_data *setup;
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      info("WM8971 Audio Codec %s", WM8971_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+      wm8971_socdev = socdev;
-+
-+      INIT_WORK(&wm8971_dapm_work, wm8971_work, codec);
-+      wm8971_workq = create_workqueue("wm8971");
-+      if (wm8971_workq == NULL) {
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&wm8971_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+              /* Add other interfaces here */
-+#endif
-+
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8971_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8971_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      if (wm8971_workq)
-+              destroy_workqueue(wm8971_workq);
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&wm8971_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8971 = {
-+      .probe =        wm8971_probe,
-+      .remove =       wm8971_remove,
-+      .suspend =      wm8971_suspend,
-+      .resume =       wm8971_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8971);
-+
-+MODULE_DESCRIPTION("ASoC WM8971 driver");
-+MODULE_AUTHOR("Lab126");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8971.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8971.h
-@@ -0,0 +1,61 @@
-+/*
-+ * wm8971.h  --  audio driver for WM8971
-+ *
-+ * Copyright 2005 Lab126, Inc.
-+ *
-+ * Author: Kenneth Kiraly <kiraly@lab126.com>
-+ *
-+ * This program is free software; you can redistribute  it and/or modify it
-+ * under  the terms of  the GNU General  Public License as published by the
-+ * Free Software Foundation;  either version 2 of the  License, or (at your
-+ * option) any later version.
-+ *
-+ */
-+
-+#ifndef _WM8971_H
-+#define _WM8971_H
-+
-+#define WM8971_LINVOL 0x00
-+#define WM8971_RINVOL 0x01
-+#define WM8971_LOUT1V 0x02
-+#define WM8971_ROUT1V 0x03
-+#define WM8971_ADCDAC 0x05
-+#define WM8971_AUDIO  0x07
-+#define WM8971_SRATE  0x08
-+#define WM8971_LDAC           0x0a
-+#define WM8971_RDAC           0x0b
-+#define WM8971_BASS           0x0c
-+#define WM8971_TREBLE 0x0d
-+#define WM8971_RESET  0x0f
-+#define WM8971_ALC1           0x11
-+#define       WM8971_ALC2             0x12
-+#define       WM8971_ALC3             0x13
-+#define WM8971_NGATE  0x14
-+#define WM8971_LADC           0x15
-+#define WM8971_RADC           0x16
-+#define       WM8971_ADCTL1   0x17
-+#define       WM8971_ADCTL2   0x18
-+#define WM8971_PWR1           0x19
-+#define WM8971_PWR2           0x1a
-+#define       WM8971_ADCTL3   0x1b
-+#define WM8971_ADCIN  0x1f
-+#define       WM8971_LADCIN   0x20
-+#define       WM8971_RADCIN   0x21
-+#define WM8971_LOUTM1 0x22
-+#define WM8971_LOUTM2 0x23
-+#define WM8971_ROUTM1 0x24
-+#define WM8971_ROUTM2 0x25
-+#define WM8971_MOUTM1 0x26
-+#define WM8971_MOUTM2 0x27
-+#define WM8971_LOUT2V 0x28
-+#define WM8971_ROUT2V 0x29
-+#define WM8971_MOUTV  0x2A
-+
-+struct wm8971_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+extern struct snd_soc_codec_dai wm8971_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_wm8971;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8974.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8974.c
-@@ -0,0 +1,935 @@
-+/*
-+ * wm8974.c  --  WM8974 ALSA Soc Audio driver
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ *
-+ * Author: Liam Girdwood <liam.girdwood@wolfsonmicro.com>
-+ *
-+ * 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/moduleparam.h>
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8974.h"
-+
-+#define AUDIO_NAME "wm8974"
-+#define WM8974_VERSION "0.5"
-+
-+/*
-+ * Debug
-+ */
-+
-+#define WM8974_DEBUG 0
-+
-+#ifdef WM8974_DEBUG
-+#define dbg(format, arg...) \
-+      printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
-+#else
-+#define dbg(format, arg...) do {} while (0)
-+#endif
-+#define err(format, arg...) \
-+      printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-+#define info(format, arg...) \
-+      printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-+#define warn(format, arg...) \
-+      printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8974;
-+
-+/*
-+ * wm8974 register cache
-+ * We can't read the WM8974 register space when we are
-+ * using 2 wire for device control, so we cache them instead.
-+ */
-+static const u16 wm8974_reg[WM8974_CACHEREGNUM] = {
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0050, 0x0000, 0x0140, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x00ff,
-+    0x0000, 0x0000, 0x0100, 0x00ff,
-+    0x0000, 0x0000, 0x012c, 0x002c,
-+    0x002c, 0x002c, 0x002c, 0x0000,
-+    0x0032, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0038, 0x000b, 0x0032, 0x0000,
-+    0x0008, 0x000c, 0x0093, 0x00e9,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0003, 0x0010, 0x0000, 0x0000,
-+    0x0000, 0x0002, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0039, 0x0000,
-+    0x0000,
-+};
-+
-+#define WM8974_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+      SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \
-+      SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM8974_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM8974_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+#define WM8794_BCLK \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | SND_SOC_FSBD(8) |\
-+       SND_SOC_FSBD(16) | SND_SOC_FSBD(32))
-+
-+#define WM8794_HIFI_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
-+
-+static struct snd_soc_dai_mode wm8974_modes[] = {
-+      /* codec frame and clock master modes */
-+      {
-+              .fmt = WM8974_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8794_HIFI_BITS,
-+              .pcmrate = WM8974_RATES,
-+              .pcmdir = WM8974_DIR,
-+              .fs = 256,
-+              .bfs = WM8794_BCLK,
-+      },
-+
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = WM8974_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM8794_HIFI_BITS,
-+              .pcmrate = WM8974_RATES,
-+              .pcmdir = WM8974_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * read wm8974 register cache
-+ */
-+static inline unsigned int wm8974_read_reg_cache(struct snd_soc_codec * codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg == WM8974_RESET)
-+              return 0;
-+      if (reg >= WM8974_CACHEREGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write wm8974 register cache
-+ */
-+static inline void wm8974_write_reg_cache(struct snd_soc_codec *codec,
-+      u16 reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg >= WM8974_CACHEREGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+/*
-+ * write to the WM8974 register space
-+ */
-+static int wm8974_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8974 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8974_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -EIO;
-+}
-+
-+#define wm8974_reset(c)       wm8974_write(c, WM8974_RESET, 0)
-+
-+static const char *wm8974_companding[] = {"Off", "NC", "u-law", "A-law" };
-+static const char *wm8974_deemp[] = {"None", "32kHz", "44.1kHz", "48kHz" };
-+static const char *wm8974_eqmode[] = {"Capture", "Playback" };
-+static const char *wm8974_bw[] = {"Narrow", "Wide" };
-+static const char *wm8974_eq1[] = {"80Hz", "105Hz", "135Hz", "175Hz" };
-+static const char *wm8974_eq2[] = {"230Hz", "300Hz", "385Hz", "500Hz" };
-+static const char *wm8974_eq3[] = {"650Hz", "850Hz", "1.1kHz", "1.4kHz" };
-+static const char *wm8974_eq4[] = {"1.8kHz", "2.4kHz", "3.2kHz", "4.1kHz" };
-+static const char *wm8974_eq5[] = {"5.3kHz", "6.9kHz", "9kHz", "11.7kHz" };
-+static const char *wm8974_alc[] = {"ALC", "Limiter" };
-+
-+static const struct soc_enum wm8974_enum[] = {
-+      SOC_ENUM_SINGLE(WM8974_COMP, 1, 4, wm8974_companding), /* adc */
-+      SOC_ENUM_SINGLE(WM8974_COMP, 3, 4, wm8974_companding), /* dac */
-+      SOC_ENUM_SINGLE(WM8974_DAC,  4, 4, wm8974_deemp),
-+      SOC_ENUM_SINGLE(WM8974_EQ1,  8, 2, wm8974_eqmode),
-+
-+      SOC_ENUM_SINGLE(WM8974_EQ1,  5, 4, wm8974_eq1),
-+      SOC_ENUM_SINGLE(WM8974_EQ2,  8, 2, wm8974_bw),
-+      SOC_ENUM_SINGLE(WM8974_EQ2,  5, 4, wm8974_eq2),
-+      SOC_ENUM_SINGLE(WM8974_EQ3,  8, 2, wm8974_bw),
-+
-+      SOC_ENUM_SINGLE(WM8974_EQ3,  5, 4, wm8974_eq3),
-+      SOC_ENUM_SINGLE(WM8974_EQ4,  8, 2, wm8974_bw),
-+      SOC_ENUM_SINGLE(WM8974_EQ4,  5, 4, wm8974_eq4),
-+      SOC_ENUM_SINGLE(WM8974_EQ5,  8, 2, wm8974_bw),
-+
-+      SOC_ENUM_SINGLE(WM8974_EQ5,  5, 4, wm8974_eq5),
-+      SOC_ENUM_SINGLE(WM8974_ALC3,  8, 2, wm8974_alc),
-+};
-+
-+static const struct snd_kcontrol_new wm8974_snd_controls[] = {
-+
-+SOC_SINGLE("Digital Loopback Switch", WM8974_COMP, 0, 1, 0),
-+
-+SOC_ENUM("DAC Companding", wm8974_enum[1]),
-+SOC_ENUM("ADC Companding", wm8974_enum[0]),
-+
-+SOC_ENUM("Playback De-emphasis", wm8974_enum[2]),
-+SOC_SINGLE("DAC Inversion Switch", WM8974_DAC, 0, 1, 0),
-+
-+SOC_SINGLE("PCM Volume", WM8974_DACVOL, 0, 127, 0),
-+
-+SOC_SINGLE("High Pass Filter Switch", WM8974_ADC, 8, 1, 0),
-+SOC_SINGLE("High Pass Cut Off", WM8974_ADC, 4, 7, 0),
-+SOC_SINGLE("ADC Inversion Switch", WM8974_COMP, 0, 1, 0),
-+
-+SOC_SINGLE("Capture Volume", WM8974_ADCVOL,  0, 127, 0),
-+
-+SOC_ENUM("Equaliser Function", wm8974_enum[3]),
-+SOC_ENUM("EQ1 Cut Off", wm8974_enum[4]),
-+SOC_SINGLE("EQ1 Volume", WM8974_EQ1,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ2 Bandwith", wm8974_enum[5]),
-+SOC_ENUM("EQ2 Cut Off", wm8974_enum[6]),
-+SOC_SINGLE("EQ2 Volume", WM8974_EQ2,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ3 Bandwith", wm8974_enum[7]),
-+SOC_ENUM("EQ3 Cut Off", wm8974_enum[8]),
-+SOC_SINGLE("EQ3 Volume", WM8974_EQ3,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ4 Bandwith", wm8974_enum[9]),
-+SOC_ENUM("EQ4 Cut Off", wm8974_enum[10]),
-+SOC_SINGLE("EQ4 Volume", WM8974_EQ4,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ5 Bandwith", wm8974_enum[11]),
-+SOC_ENUM("EQ5 Cut Off", wm8974_enum[12]),
-+SOC_SINGLE("EQ5 Volume", WM8974_EQ5,  0, 31, 1),
-+
-+SOC_SINGLE("DAC Playback Limiter Switch", WM8974_DACLIM1,  8, 1, 0),
-+SOC_SINGLE("DAC Playback Limiter Decay", WM8974_DACLIM1,  4, 15, 0),
-+SOC_SINGLE("DAC Playback Limiter Attack", WM8974_DACLIM1,  0, 15, 0),
-+
-+SOC_SINGLE("DAC Playback Limiter Threshold", WM8974_DACLIM2,  4, 7, 0),
-+SOC_SINGLE("DAC Playback Limiter Boost", WM8974_DACLIM2,  0, 15, 0),
-+
-+SOC_SINGLE("ALC Enable Switch", WM8974_ALC1,  8, 1, 0),
-+SOC_SINGLE("ALC Capture Max Gain", WM8974_ALC1,  3, 7, 0),
-+SOC_SINGLE("ALC Capture Min Gain", WM8974_ALC1,  0, 7, 0),
-+
-+SOC_SINGLE("ALC Capture ZC Switch", WM8974_ALC2,  8, 1, 0),
-+SOC_SINGLE("ALC Capture Hold", WM8974_ALC2,  4, 7, 0),
-+SOC_SINGLE("ALC Capture Target", WM8974_ALC2,  0, 15, 0),
-+
-+SOC_ENUM("ALC Capture Mode", wm8974_enum[13]),
-+SOC_SINGLE("ALC Capture Decay", WM8974_ALC3,  4, 15, 0),
-+SOC_SINGLE("ALC Capture Attack", WM8974_ALC3,  0, 15, 0),
-+
-+SOC_SINGLE("ALC Capture Noise Gate Switch", WM8974_NGATE,  3, 1, 0),
-+SOC_SINGLE("ALC Capture Noise Gate Threshold", WM8974_NGATE,  0, 7, 0),
-+
-+SOC_SINGLE("Capture PGA ZC Switch", WM8974_INPPGA,  7, 1, 0),
-+SOC_SINGLE("Capture PGA Volume", WM8974_INPPGA,  0, 63, 0),
-+
-+SOC_SINGLE("Speaker Playback ZC Switch", WM8974_SPKVOL,  7, 1, 0),
-+SOC_SINGLE("Speaker Playback Switch", WM8974_SPKVOL,  6, 1, 1),
-+SOC_SINGLE("Speaker Playback Volume", WM8974_SPKVOL,  0, 63, 0),
-+
-+SOC_SINGLE("Capture Boost(+20dB)", WM8974_ADCBOOST,  8, 1, 0),
-+SOC_SINGLE("Mono Playback Switch", WM8974_MONOMIX, 6, 1, 0),
-+};
-+
-+/* add non dapm controls */
-+static int wm8974_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8974_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8974_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      return 0;
-+}
-+
-+/* Speaker Output Mixer */
-+static const struct snd_kcontrol_new wm8974_speaker_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8974_SPKMIX, 1, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", WM8974_SPKMIX, 5, 1, 0),
-+SOC_DAPM_SINGLE("PCM Playback Switch", WM8974_SPKMIX, 0, 1, 1),
-+};
-+
-+/* Mono Output Mixer */
-+static const struct snd_kcontrol_new wm8974_mono_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8974_MONOMIX, 1, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", WM8974_MONOMIX, 2, 1, 0),
-+SOC_DAPM_SINGLE("PCM Playback Switch", WM8974_MONOMIX, 0, 1, 1),
-+};
-+
-+/* AUX Input boost vol */
-+static const struct snd_kcontrol_new wm8974_aux_boost_controls =
-+SOC_DAPM_SINGLE("Aux Volume", WM8974_ADCBOOST, 0, 7, 0);
-+
-+/* Mic Input boost vol */
-+static const struct snd_kcontrol_new wm8974_mic_boost_controls =
-+SOC_DAPM_SINGLE("Mic Volume", WM8974_ADCBOOST, 4, 7, 0);
-+
-+/* Capture boost switch */
-+static const struct snd_kcontrol_new wm8974_capture_boost_controls =
-+SOC_DAPM_SINGLE("Capture Boost Switch", WM8974_INPPGA,  6, 1, 0);
-+
-+/* Aux In to PGA */
-+static const struct snd_kcontrol_new wm8974_aux_capture_boost_controls =
-+SOC_DAPM_SINGLE("Aux Capture Boost Switch", WM8974_INPPGA,  2, 1, 0);
-+
-+/* Mic P In to PGA */
-+static const struct snd_kcontrol_new wm8974_micp_capture_boost_controls =
-+SOC_DAPM_SINGLE("Mic P Capture Boost Switch", WM8974_INPPGA,  0, 1, 0);
-+
-+/* Mic N In to PGA */
-+static const struct snd_kcontrol_new wm8974_micn_capture_boost_controls =
-+SOC_DAPM_SINGLE("Mic N Capture Boost Switch", WM8974_INPPGA,  1, 1, 0);
-+
-+static const struct snd_soc_dapm_widget wm8974_dapm_widgets[] = {
-+SND_SOC_DAPM_MIXER("Speaker Mixer", WM8974_POWER3, 2, 0,
-+      &wm8974_speaker_mixer_controls[0],
-+      ARRAY_SIZE(wm8974_speaker_mixer_controls)),
-+SND_SOC_DAPM_MIXER("Mono Mixer", WM8974_POWER3, 3, 0,
-+      &wm8974_mono_mixer_controls[0],
-+      ARRAY_SIZE(wm8974_mono_mixer_controls)),
-+SND_SOC_DAPM_DAC("DAC", "HiFi Playback", WM8974_POWER3, 0, 0),
-+SND_SOC_DAPM_ADC("ADC", "HiFi Capture", WM8974_POWER3, 0, 0),
-+SND_SOC_DAPM_PGA("Aux Input", WM8974_POWER1, 6, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("SpkN Out", WM8974_POWER3, 5, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("SpkP Out", WM8974_POWER3, 6, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mono Out", WM8974_POWER3, 7, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic PGA", WM8974_POWER2, 2, 0, NULL, 0),
-+
-+SND_SOC_DAPM_PGA("Aux Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8974_aux_boost_controls, 1),
-+SND_SOC_DAPM_PGA("Mic Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8974_mic_boost_controls, 1),
-+SND_SOC_DAPM_SWITCH("Capture Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8974_capture_boost_controls),
-+
-+SND_SOC_DAPM_MIXER("Boost Mixer", WM8974_POWER2, 4, 0, NULL, 0),
-+
-+SND_SOC_DAPM_MICBIAS("Mic Bias", WM8974_POWER1, 4, 0),
-+
-+SND_SOC_DAPM_INPUT("MICN"),
-+SND_SOC_DAPM_INPUT("MICP"),
-+SND_SOC_DAPM_INPUT("AUX"),
-+SND_SOC_DAPM_OUTPUT("MONOOUT"),
-+SND_SOC_DAPM_OUTPUT("SPKOUTP"),
-+SND_SOC_DAPM_OUTPUT("SPKOUTN"),
-+};
-+
-+static const char *audio_map[][3] = {
-+      /* Mono output mixer */
-+      {"Mono Mixer", "PCM Playback Switch", "DAC"},
-+      {"Mono Mixer", "Aux Playback Switch", "Aux Input"},
-+      {"Mono Mixer", "Line Bypass Switch", "Boost Mixer"},
-+
-+      /* Speaker output mixer */
-+      {"Speaker Mixer", "PCM Playback Switch", "DAC"},
-+      {"Speaker Mixer", "Aux Playback Switch", "Aux Input"},
-+      {"Speaker Mixer", "Line Bypass Switch", "Boost Mixer"},
-+
-+      /* Outputs */
-+      {"Mono Out", NULL, "Mono Mixer"},
-+      {"MONOOUT", NULL, "Mono Out"},
-+      {"SpkN Out", NULL, "Speaker Mixer"},
-+      {"SpkP Out", NULL, "Speaker Mixer"},
-+      {"SPKOUTN", NULL, "SpkN Out"},
-+      {"SPKOUTP", NULL, "SpkP Out"},
-+
-+      /* Boost Mixer */
-+      {"Boost Mixer", NULL, "ADC"},
-+    {"Capture Boost Switch", "Aux Capture Boost Switch", "AUX"},
-+      {"Aux Boost", "Aux Volume", "Boost Mixer"},
-+    {"Capture Boost", "Capture Switch", "Boost Mixer"},
-+      {"Mic Boost", "Mic Volume", "Boost Mixer"},
-+
-+      /* Inputs */
-+      {"MICP", NULL, "Mic Boost"},
-+      {"MICN", NULL, "Mic PGA"},
-+      {"Mic PGA", NULL, "Capture Boost"},
-+      {"AUX", NULL, "Aux Input"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm8974_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm8974_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8974_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+struct pll_ {
-+      unsigned int in_hz, out_hz;
-+      unsigned int pre:4; /* prescale - 1 */
-+      unsigned int n:4;
-+      unsigned int k;
-+};
-+
-+struct pll_ pll[] = {
-+      {12000000, 11289600, 0, 7, 0x86c220},
-+      {12000000, 12288000, 0, 8, 0x3126e8},
-+      {13000000, 11289600, 0, 6, 0xf28bd4},
-+      {13000000, 12288000, 0, 7, 0x8fd525},
-+      {12288000, 11289600, 0, 7, 0x59999a},
-+      {11289600, 12288000, 0, 8, 0x80dee9},
-+      /* liam - add more entries */
-+};
-+
-+static int set_pll(struct snd_soc_codec *codec, unsigned int in,
-+      unsigned int out)
-+{
-+      int i;
-+      u16 reg;
-+
-+      if(out == 0) {
-+              reg = wm8974_read_reg_cache(codec, WM8974_POWER1);
-+              wm8974_write(codec, WM8974_POWER1, reg & 0x1df);
-+              return 0;
-+      }
-+
-+      for(i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (in == pll[i].in_hz && out == pll[i].out_hz) {
-+                      wm8974_write(codec, WM8974_PLLN, (pll[i].pre << 4) | pll[i].n);
-+                      wm8974_write(codec, WM8974_PLLK1, pll[i].k >> 18);
-+                      wm8974_write(codec, WM8974_PLLK1, (pll[i].k >> 9) && 0x1ff);
-+                      wm8974_write(codec, WM8974_PLLK1, pll[i].k && 0x1ff);
-+                      reg = wm8974_read_reg_cache(codec, WM8974_POWER1);
-+                      wm8974_write(codec, WM8974_POWER1, reg | 0x020);
-+                      return 0;
-+              }
-+      }
-+      return -EINVAL;
-+}
-+
-+/* mclk dividers * 2 */
-+static unsigned char mclk_div[] = {2, 3, 4, 6, 8, 12, 16, 24};
-+
-+/* we need 256FS to drive the DAC's and ADC's */
-+static unsigned int wm8974_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      int i, j, best_clk = info->fs * info->rate;
-+
-+      /* can we run at this clk without the PLL ? */
-+      for (i = 0; i < ARRAY_SIZE(mclk_div); i++) {
-+              if ((best_clk >> 1) * mclk_div[i] == clk) {
-+                      dai->pll_in = 0;
-+                      dai->clk_div = mclk_div[i];
-+                      dai->mclk = best_clk;
-+                      return dai->mclk;
-+              }
-+      }
-+
-+      /* now check for PLL support */
-+      for (i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (pll[i].in_hz == clk) {
-+                      for (j = 0; j < ARRAY_SIZE(mclk_div); j++) {
-+                              if (pll[i].out_hz == mclk_div[j] * (best_clk >> 1)) {
-+                                      dai->pll_in = clk;
-+                                      dai->pll_out = pll[i].out_hz;
-+                                      dai->clk_div = mclk_div[j];
-+                                      dai->mclk = best_clk;
-+                                      return dai->mclk;
-+                              }
-+                      }
-+              }
-+      }
-+
-+      /* this clk is not supported */
-+      return 0;
-+}
-+
-+static int wm8974_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct snd_soc_codec_dai *dai = rtd->codec_dai;
-+      u16 iface = 0, bfs, clk = 0, adn;
-+      int fs = 48000 << 7, i;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+      switch (bfs) {
-+      case 2:
-+              clk |= 0x1 << 2;
-+              break;
-+      case 4:
-+              clk |= 0x2 << 2;
-+              break;
-+      case 8:
-+              clk |= 0x3 << 2;
-+              break;
-+      case 16:
-+              clk |= 0x4 << 2;
-+              break;
-+      case 32:
-+              clk |= 0x5 << 2;
-+              break;
-+      }
-+
-+      /* set master/slave audio interface */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              clk |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              break;
-+      }
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              iface |= 0x0010;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              iface |= 0x0008;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              iface |= 0x00018;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              iface |= 0x0020;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              iface |= 0x0040;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              iface |= 0x0060;
-+              break;
-+      }
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_NB_NF:
-+              break;
-+      case SND_SOC_DAIFMT_IB_IF:
-+              iface |= 0x0180;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              iface |= 0x0100;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              iface |= 0x0080;
-+              break;
-+      }
-+
-+      /* filter coefficient */
-+      adn = wm8974_read_reg_cache(codec, WM8974_ADD) & 0x1f1;
-+      switch (rtd->codec_dai->dai_runtime.pcmrate) {
-+      case SNDRV_PCM_RATE_8000:
-+              adn |= 0x5 << 1;
-+              fs = 8000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_11025:
-+              adn |= 0x4 << 1;
-+              fs = 11025 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_16000:
-+              adn |= 0x3 << 1;
-+              fs = 16000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_22050:
-+              adn |= 0x2 << 1;
-+              fs = 22050 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_32000:
-+              adn |= 0x1 << 1;
-+              fs = 32000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_44100:
-+              fs = 44100 << 7;
-+              break;
-+      }
-+
-+      /* do we need to enable the PLL */
-+      if(dai->pll_in)
-+              set_pll(codec, dai->pll_in, dai->pll_out);
-+
-+      /* divide the clock to 256 fs */
-+      for(i = 0; i < ARRAY_SIZE(mclk_div); i++) {
-+              if (dai->clk_div == mclk_div[i]) {
-+                      clk |= i << 5;
-+                      clk &= 0xff;
-+                      goto set;
-+              }
-+      }
-+
-+set:
-+      /* set iface */
-+      wm8974_write(codec, WM8974_IFACE, iface);
-+      wm8974_write(codec, WM8974_CLOCK, clk);
-+
-+      return 0;
-+}
-+
-+static int wm8974_hw_free(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      set_pll(codec, 0, 0);
-+      return 0;
-+}
-+
-+static int wm8974_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = wm8974_read_reg_cache(codec, WM8974_DAC) & 0xffbf;
-+      if(mute)
-+              wm8974_write(codec, WM8974_DAC, mute_reg | 0x40);
-+      else
-+              wm8974_write(codec, WM8974_DAC, mute_reg);
-+      return 0;
-+}
-+
-+/* liam need to make this lower power with dapm */
-+static int wm8974_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* vref/mid, clk and osc on, dac unmute, active */
-+              wm8974_write(codec, WM8974_POWER1, 0x1ff);
-+              wm8974_write(codec, WM8974_POWER2, 0x1ff);
-+              wm8974_write(codec, WM8974_POWER3, 0x1ff);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* everything off except vref/vmid, dac mute, inactive */
-+
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              /* everything off, dac mute, inactive */
-+              wm8974_write(codec, WM8974_POWER1, 0x0);
-+              wm8974_write(codec, WM8974_POWER2, 0x0);
-+              wm8974_write(codec, WM8974_POWER3, 0x0);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai wm8974_dai = {
-+      .name = "WM8974 HiFi",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 1,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 1,
-+      },
-+      .config_sysclk = wm8974_config_sysclk,
-+      .digital_mute = wm8974_mute,
-+      .ops = {
-+              .prepare = wm8974_pcm_prepare,
-+              .hw_free = wm8974_hw_free,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8974_modes),
-+              .mode = wm8974_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm8974_dai);
-+
-+static int wm8974_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8974_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8974_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8974_reg); i++) {
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+      wm8974_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8974_dapm_event(codec, codec->suspend_dapm_state);
-+      return 0;
-+}
-+
-+/*
-+ * initialise the WM8974 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int wm8974_init(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int ret = 0;
-+
-+      codec->name = "WM8974";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8974_read_reg_cache;
-+      codec->write = wm8974_write;
-+      codec->dapm_event = wm8974_dapm_event;
-+      codec->dai = &wm8974_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8974_reg);
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8974_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, wm8974_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm8974_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8974_reg);
-+
-+      wm8974_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if(ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* power on device */
-+      wm8974_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8974_add_controls(codec);
-+      wm8974_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if(ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+static struct snd_soc_device *wm8974_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+/*
-+ * WM8974 2 wire address is 0x1a
-+ */
-+#define I2C_DRIVERID_WM8974 0xfefe /* liam -  need a proper id */
-+
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver wm8974_i2c_driver;
-+static struct i2c_client client_template;
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+
-+static int wm8974_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = wm8974_socdev;
-+      struct wm8974_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL) {
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+      i2c_set_clientdata(i2c, codec);
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if(ret < 0) {
-+              err("failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = wm8974_init(socdev);
-+      if(ret < 0) {
-+              err("failed to initialise WM8974\n");
-+              goto err;
-+      }
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+}
-+
-+static int wm8974_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec *codec = i2c_get_clientdata(client);
-+      i2c_detach_client(client);
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+      return 0;
-+}
-+
-+static int wm8974_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, wm8974_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver wm8974_i2c_driver = {
-+      .driver = {
-+              .name = "WM8974 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_WM8974,
-+      .attach_adapter = wm8974_i2c_attach,
-+      .detach_client =  wm8974_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "WM8974",
-+      .driver = &wm8974_i2c_driver,
-+};
-+#endif
-+
-+static int wm8974_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8974_setup_data *setup;
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      info("WM8974 Audio Codec %s", WM8974_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      wm8974_socdev = socdev;
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&wm8974_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+      /* Add other interfaces here */
-+#endif
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8974_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8974_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&wm8974_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8974 = {
-+      .probe =        wm8974_probe,
-+      .remove =       wm8974_remove,
-+      .suspend =      wm8974_suspend,
-+      .resume =       wm8974_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8974);
-+
-+MODULE_DESCRIPTION("ASoC WM8974 driver");
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8974.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8974.h
-@@ -0,0 +1,64 @@
-+/*
-+ * wm8974.h  --  WM8974 Soc Audio driver
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _WM8974_H
-+#define _WM8974_H
-+
-+/* WM8974 register space */
-+
-+#define WM8974_RESET          0x0
-+#define WM8974_POWER1         0x1
-+#define WM8974_POWER2         0x2
-+#define WM8974_POWER3         0x3
-+#define WM8974_IFACE          0x4
-+#define WM8974_COMP                   0x5
-+#define WM8974_CLOCK          0x6
-+#define WM8974_ADD                    0x7
-+#define WM8974_GPIO                   0x8
-+#define WM8974_DAC                    0xa
-+#define WM8974_DACVOL         0xb
-+#define WM8974_ADC                    0xe
-+#define WM8974_ADCVOL         0xf
-+#define WM8974_EQ1                    0x12
-+#define WM8974_EQ2                    0x13
-+#define WM8974_EQ3                    0x14
-+#define WM8974_EQ4                    0x15
-+#define WM8974_EQ5                    0x16
-+#define WM8974_DACLIM1                0x18
-+#define WM8974_DACLIM2                0x19
-+#define WM8974_NOTCH1         0x1b
-+#define WM8974_NOTCH2         0x1c
-+#define WM8974_NOTCH3         0x1d
-+#define WM8974_NOTCH4         0x1e
-+#define WM8974_ALC1                   0x20
-+#define WM8974_ALC2                   0x21
-+#define WM8974_ALC3                   0x22
-+#define WM8974_NGATE          0x23
-+#define WM8974_PLLN                   0x24
-+#define WM8974_PLLK1          0x25
-+#define WM8974_PLLK2          0x26
-+#define WM8974_PLLK3          0x27
-+#define WM8974_ATTEN          0x28
-+#define WM8974_INPUT          0x2c
-+#define WM8974_INPPGA         0x2d
-+#define WM8974_ADCBOOST               0x2f
-+#define WM8974_OUTPUT         0x31
-+#define WM8974_SPKMIX         0x32
-+#define WM8974_SPKVOL         0x36
-+#define WM8974_MONOMIX                0x38
-+
-+#define WM8974_CACHEREGNUM    57
-+
-+struct wm8974_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+extern struct snd_soc_codec_dai wm8974_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_wm8974;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm9712.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm9712.c
-@@ -0,0 +1,781 @@
-+/*
-+ * wm9712.c  --  ALSA Soc WM9712 codec support
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    4th Feb 2006   Initial version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/ac97_codec.h>
-+#include <sound/initval.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#define WM9712_VERSION "0.4"
-+
-+static unsigned int ac97_read(struct snd_soc_codec *codec,
-+      unsigned int reg);
-+static int ac97_write(struct snd_soc_codec *codec,
-+      unsigned int reg, unsigned int val);
-+
-+#define AC97_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define AC97_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+/* may need to expand this */
-+static struct snd_soc_dai_mode ac97_modes[] = {
-+      {
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S18_3LE,
-+              .pcmrate = AC97_RATES,
-+              .pcmdir = AC97_DIR,
-+      },
-+};
-+
-+/*
-+ * WM9712 register cache
-+ */
-+static const u16 wm9712_reg[] = {
-+      0x6174, 0x8000, 0x8000, 0x8000, // 6
-+      0xf0f0, 0xaaa0, 0xc008, 0x6808, // e
-+      0xe808, 0xaaa0, 0xad00, 0x8000, // 16
-+      0xe808, 0x3000, 0x8000, 0x0000, // 1e
-+      0x0000, 0x0000, 0x0000, 0x000f, // 26
-+      0x0405, 0x0410, 0xbb80, 0xbb80, // 2e
-+      0x0000, 0xbb80, 0x0000, 0x0000, // 36
-+      0x0000, 0x2000, 0x0000, 0x0000, // 3e
-+      0x0000, 0x0000, 0x0000, 0x0000, // 46
-+      0x0000, 0x0000, 0xf83e, 0xffff, // 4e
-+      0x0000, 0x0000, 0x0000, 0xf83e, // 56
-+      0x0008, 0x0000, 0x0000, 0x0000, // 5e
-+      0xb032, 0x3e00, 0x0000, 0x0000, // 66
-+      0x0000, 0x0000, 0x0000, 0x0000, // 6e
-+      0x0000, 0x0000, 0x0000, 0x0006, // 76
-+      0x0001, 0x0000, 0x574d, 0x4c12, // 7e
-+      0x0000, 0x0000 // virtual hp mixers
-+};
-+
-+/* virtual HP mixers regs */
-+#define HPL_MIXER     0x80
-+#define HPR_MIXER     0x82
-+
-+static const char *wm9712_alc_select[] = {"None", "Left", "Right", "Stereo"};
-+static const char *wm9712_alc_mux[] = {"Stereo", "Left", "Right", "None"};
-+static const char *wm9712_out3_src[] = {"Left", "VREF", "Left + Right",
-+      "Mono"};
-+static const char *wm9712_spk_src[] = {"Speaker Mix", "Headphone Mix"};
-+static const char *wm9712_rec_adc[] = {"Stereo", "Left", "Right", "Mute"};
-+static const char *wm9712_base[] = {"Linear Control", "Adaptive Boost"};
-+static const char *wm9712_rec_gain[] = {"+1.5dB Steps", "+0.75dB Steps"};
-+static const char *wm9712_mic[] = {"Mic 1", "Differential", "Mic 2",
-+      "Stereo"};
-+static const char *wm9712_rec_sel[] = {"Mic", "NC", "NC", "Speaker Mixer",
-+      "Line", "Headphone Mixer", "Phone Mixer", "Phone"};
-+static const char *wm9712_ng_type[] = {"Constant Gain", "Mute"};
-+static const char *wm9712_diff_sel[] = {"Mic", "Line"};
-+
-+static const struct soc_enum wm9712_enum[] = {
-+SOC_ENUM_SINGLE(AC97_PCI_SVID, 14, 4, wm9712_alc_select),
-+SOC_ENUM_SINGLE(AC97_VIDEO, 12, 4, wm9712_alc_mux),
-+SOC_ENUM_SINGLE(AC97_AUX, 9, 4, wm9712_out3_src),
-+SOC_ENUM_SINGLE(AC97_AUX, 8, 2, wm9712_spk_src),
-+SOC_ENUM_SINGLE(AC97_REC_SEL, 12, 4, wm9712_rec_adc),
-+SOC_ENUM_SINGLE(AC97_MASTER_TONE, 15, 2, wm9712_base),
-+SOC_ENUM_DOUBLE(AC97_REC_GAIN, 14, 6, 2, wm9712_rec_gain),
-+SOC_ENUM_SINGLE(AC97_MIC, 5, 4, wm9712_mic),
-+SOC_ENUM_SINGLE(AC97_REC_SEL, 8, 8, wm9712_rec_sel),
-+SOC_ENUM_SINGLE(AC97_REC_SEL, 0, 8, wm9712_rec_sel),
-+SOC_ENUM_SINGLE(AC97_PCI_SVID, 5, 2, wm9712_ng_type),
-+SOC_ENUM_SINGLE(0x5c, 8, 2, wm9712_diff_sel),
-+};
-+
-+static const struct snd_kcontrol_new wm9712_snd_ac97_controls[] = {
-+SOC_DOUBLE("Speaker Playback Volume", AC97_MASTER, 8, 0, 31, 1),
-+SOC_SINGLE("Speaker Playback Switch", AC97_MASTER, 15, 1, 1),
-+SOC_DOUBLE("Headphone Playback Volume", AC97_HEADPHONE, 8, 0, 31, 1),
-+SOC_SINGLE("Headphone Playback Switch", AC97_HEADPHONE,15, 1, 1),
-+
-+SOC_SINGLE("Speaker Playback ZC Switch", AC97_MASTER, 7, 1, 0),
-+SOC_SINGLE("Speaker Playback Invert Switch", AC97_MASTER, 6, 1, 0),
-+SOC_SINGLE("Headphone Playback ZC Switch", AC97_HEADPHONE, 7, 1, 0),
-+SOC_SINGLE("Mono Playback ZC Switch", AC97_MASTER_MONO, 7, 1, 0),
-+SOC_SINGLE("Mono Playback Volume", AC97_MASTER_MONO, 0, 31, 0),
-+
-+SOC_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0),
-+SOC_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0),
-+SOC_SINGLE("ALC Decay Time", AC97_CODEC_CLASS_REV, 4, 15, 0),
-+SOC_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0),
-+SOC_ENUM("ALC Function", wm9712_enum[0]),
-+SOC_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 0),
-+SOC_SINGLE("ALC ZC Timeout", AC97_PCI_SVID, 9, 3, 1),
-+SOC_SINGLE("ALC ZC Switch", AC97_PCI_SVID, 8, 1, 0),
-+SOC_SINGLE("ALC NG Switch", AC97_PCI_SVID, 7, 1, 0),
-+SOC_ENUM("ALC NG Type", wm9712_enum[10]),
-+SOC_SINGLE("ALC NG Threshold", AC97_PCI_SVID, 0, 31, 1),
-+
-+SOC_SINGLE("Mic Headphone  Volume", AC97_VIDEO, 12, 7, 1),
-+SOC_SINGLE("ALC Headphone Volume", AC97_VIDEO, 7, 7, 1),
-+
-+SOC_SINGLE("Out3 Switch", AC97_AUX, 15, 1, 1),
-+SOC_SINGLE("Out3 ZC Switch", AC97_AUX, 7, 1, 1),
-+SOC_SINGLE("Out3 Volume", AC97_AUX, 0, 31, 1),
-+
-+SOC_SINGLE("PCBeep Bypass Headphone Volume", AC97_PC_BEEP, 12, 7, 1),
-+SOC_SINGLE("PCBeep Bypass Speaker Volume", AC97_PC_BEEP, 8, 7, 1),
-+SOC_SINGLE("PCBeep Bypass Phone Volume", AC97_PC_BEEP, 4, 7, 1),
-+
-+SOC_SINGLE("Aux Playback Headphone Volume", AC97_CD, 12, 7, 1),
-+SOC_SINGLE("Aux Playback Speaker Volume", AC97_CD, 8, 7, 1),
-+SOC_SINGLE("Aux Playback Phone Volume", AC97_CD, 4, 7, 1),
-+
-+SOC_SINGLE("Phone Volume", AC97_PHONE, 0, 15, 0),
-+SOC_DOUBLE("Line Capture Volume", AC97_LINE, 8, 0, 31, 1),
-+
-+SOC_SINGLE("Capture 20dB Boost Switch", AC97_REC_SEL, 14, 1, 0),
-+SOC_SINGLE("Capture to Phone 20dB Boost Switch", AC97_REC_SEL, 11, 1, 1),
-+
-+SOC_SINGLE("3D Upper Cut-off Switch", AC97_3D_CONTROL, 5, 1, 1),
-+SOC_SINGLE("3D Lower Cut-off Switch", AC97_3D_CONTROL, 4, 1, 1),
-+SOC_SINGLE("3D Playback Volume", AC97_3D_CONTROL, 0, 15, 0),
-+
-+SOC_ENUM("Bass Control", wm9712_enum[5]),
-+SOC_SINGLE("Bass Cut-off Switch", AC97_MASTER_TONE, 12, 1, 1),
-+SOC_SINGLE("Tone Cut-off Switch", AC97_MASTER_TONE, 4, 1, 1),
-+SOC_SINGLE("Playback Attenuate (-6dB) Switch", AC97_MASTER_TONE, 6, 1, 0),
-+SOC_SINGLE("Bass Volume", AC97_MASTER_TONE, 8, 15, 0),
-+SOC_SINGLE("Treble Volume", AC97_MASTER_TONE, 0, 15, 0),
-+
-+SOC_SINGLE("Capture ADC Switch", AC97_REC_GAIN, 15, 1, 1),
-+SOC_ENUM("Capture Volume Steps", wm9712_enum[6]),
-+SOC_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 63, 1),
-+SOC_SINGLE("Capture ZC Switch", AC97_REC_GAIN, 7, 1, 0),
-+
-+SOC_SINGLE("Mic 1 Volume", AC97_MIC, 8, 31, 1),
-+SOC_SINGLE("Mic 2 Volume", AC97_MIC, 0, 31, 1),
-+SOC_SINGLE("Mic 20dB Boost Switch", AC97_MIC, 7, 1, 0),
-+};
-+
-+/* add non dapm controls */
-+static int wm9712_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm9712_snd_ac97_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm9712_snd_ac97_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+      return 0;
-+}
-+
-+/* We have to create a fake left and right HP mixers because
-+ * the codec only has a single control that is shared by both channels.
-+ * This makes it impossible to determine the audio path.
-+ */
-+static int mixer_event (struct snd_soc_dapm_widget *w, int event)
-+{
-+      u16 l, r, beep, line, phone, mic, pcm, aux;
-+
-+      l = ac97_read(w->codec, HPL_MIXER);
-+      r = ac97_read(w->codec, HPR_MIXER);
-+      beep = ac97_read(w->codec, AC97_PC_BEEP);
-+      mic = ac97_read(w->codec, AC97_VIDEO);
-+      phone = ac97_read(w->codec, AC97_PHONE);
-+      line = ac97_read(w->codec, AC97_LINE);
-+      pcm = ac97_read(w->codec, AC97_PCM);
-+      aux = ac97_read(w->codec, AC97_CD);
-+
-+      if (l & 0x1 || r & 0x1)
-+              ac97_write(w->codec, AC97_VIDEO, mic & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_VIDEO, mic | 0x8000);
-+
-+      if (l & 0x2 || r & 0x2)
-+              ac97_write(w->codec, AC97_PCM, pcm & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_PCM, pcm | 0x8000);
-+
-+      if (l & 0x4 || r & 0x4)
-+              ac97_write(w->codec, AC97_LINE, line & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_LINE, line | 0x8000);
-+
-+      if (l & 0x8 || r & 0x8)
-+              ac97_write(w->codec, AC97_PHONE, phone & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_PHONE, phone | 0x8000);
-+
-+      if (l & 0x10 || r & 0x10)
-+              ac97_write(w->codec, AC97_CD, aux & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_CD, aux | 0x8000);
-+
-+      if (l & 0x20 || r & 0x20)
-+              ac97_write(w->codec, AC97_PC_BEEP, beep & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_PC_BEEP, beep | 0x8000);
-+
-+      return 0;
-+}
-+
-+/* Left Headphone Mixers */
-+static const struct snd_kcontrol_new wm9712_hpl_mixer_controls[] = {
-+      SOC_DAPM_SINGLE("PCBeep Bypass Switch", HPL_MIXER, 5, 1, 0),
-+      SOC_DAPM_SINGLE("Aux Playback Switch", HPL_MIXER, 4, 1, 0),
-+      SOC_DAPM_SINGLE("Phone Bypass Switch", HPL_MIXER, 3, 1, 0),
-+      SOC_DAPM_SINGLE("Line Bypass Switch", HPL_MIXER, 2, 1, 0),
-+      SOC_DAPM_SINGLE("PCM Playback Switch", HPL_MIXER, 1, 1, 0),
-+      SOC_DAPM_SINGLE("Mic Sidetone Switch", HPL_MIXER, 0, 1, 0),
-+};
-+
-+/* Right Headphone Mixers */
-+static const struct snd_kcontrol_new wm9712_hpr_mixer_controls[] = {
-+      SOC_DAPM_SINGLE("PCBeep Bypass Switch", HPR_MIXER, 5, 1, 0),
-+      SOC_DAPM_SINGLE("Aux Playback Switch", HPR_MIXER, 4, 1, 0),
-+      SOC_DAPM_SINGLE("Phone Bypass Switch", HPR_MIXER, 3, 1, 0),
-+      SOC_DAPM_SINGLE("Line Bypass Switch", HPR_MIXER, 2, 1, 0),
-+      SOC_DAPM_SINGLE("PCM Playback Switch", HPR_MIXER, 1, 1, 0),
-+      SOC_DAPM_SINGLE("Mic Sidetone Switch", HPR_MIXER, 0, 1, 0),
-+};
-+
-+/* Speaker Mixer */
-+static const struct snd_kcontrol_new wm9712_speaker_mixer_controls[] = {
-+      SOC_DAPM_SINGLE("PCBeep Bypass Switch", AC97_PC_BEEP, 11, 1, 1),
-+      SOC_DAPM_SINGLE("Aux Playback Switch", AC97_CD, 11, 1, 1),
-+      SOC_DAPM_SINGLE("Phone Bypass Switch", AC97_PHONE, 14, 1, 1),
-+      SOC_DAPM_SINGLE("Line Bypass Switch", AC97_LINE, 14, 1, 1),
-+      SOC_DAPM_SINGLE("PCM Playback Switch", AC97_PCM, 14, 1, 1),
-+};
-+
-+/* Phone Mixer */
-+static const struct snd_kcontrol_new wm9712_phone_mixer_controls[] = {
-+      SOC_DAPM_SINGLE("PCBeep Bypass Switch", AC97_PC_BEEP, 7, 1, 1),
-+      SOC_DAPM_SINGLE("Aux Playback Switch", AC97_CD, 7, 1, 1),
-+      SOC_DAPM_SINGLE("Line Bypass Switch", AC97_LINE, 13, 1, 1),
-+      SOC_DAPM_SINGLE("PCM Playback Switch", AC97_PCM, 13, 1, 1),
-+      SOC_DAPM_SINGLE("Mic 1 Sidetone Switch", AC97_MIC, 14, 1, 1),
-+      SOC_DAPM_SINGLE("Mic 2 Sidetone Switch", AC97_MIC, 13, 1, 1),
-+};
-+
-+/* ALC headphone mux */
-+static const struct snd_kcontrol_new wm9712_alc_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9712_enum[1]);
-+
-+/* out 3 mux */
-+static const struct snd_kcontrol_new wm9712_out3_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9712_enum[2]);
-+
-+/* spk mux */
-+static const struct snd_kcontrol_new wm9712_spk_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9712_enum[3]);
-+
-+/* Capture to Phone mux */
-+static const struct snd_kcontrol_new wm9712_capture_phone_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9712_enum[4]);
-+
-+/* Capture left select */
-+static const struct snd_kcontrol_new wm9712_capture_selectl_controls =
-+SOC_DAPM_ENUM("Route", wm9712_enum[8]);
-+
-+/* Capture right select */
-+static const struct snd_kcontrol_new wm9712_capture_selectr_controls =
-+SOC_DAPM_ENUM("Route", wm9712_enum[9]);
-+
-+/* Mic select */
-+static const struct snd_kcontrol_new wm9712_mic_src_controls =
-+SOC_DAPM_ENUM("Route", wm9712_enum[7]);
-+
-+/* diff select */
-+static const struct snd_kcontrol_new wm9712_diff_sel_controls =
-+SOC_DAPM_ENUM("Route", wm9712_enum[11]);
-+
-+static const struct snd_soc_dapm_widget wm9712_dapm_widgets[] = {
-+SND_SOC_DAPM_MUX("ALC Sidetone Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9712_alc_mux_controls),
-+SND_SOC_DAPM_MUX("Out3 Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9712_out3_mux_controls),
-+SND_SOC_DAPM_MUX("Speaker Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9712_spk_mux_controls),
-+SND_SOC_DAPM_MUX("Capture Phone Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9712_capture_phone_mux_controls),
-+SND_SOC_DAPM_MUX("Left Capture Select", SND_SOC_NOPM, 0, 0,
-+      &wm9712_capture_selectl_controls),
-+SND_SOC_DAPM_MUX("Right Capture Select", SND_SOC_NOPM, 0, 0,
-+      &wm9712_capture_selectr_controls),
-+SND_SOC_DAPM_MUX("Mic Select Source", SND_SOC_NOPM, 0, 0,
-+      &wm9712_mic_src_controls),
-+SND_SOC_DAPM_MUX("Differential Source", SND_SOC_NOPM, 0, 0,
-+      &wm9712_diff_sel_controls),
-+SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
-+SND_SOC_DAPM_MIXER_E("Left HP Mixer", AC97_INT_PAGING, 9, 1,
-+      &wm9712_hpl_mixer_controls[0], ARRAY_SIZE(wm9712_hpl_mixer_controls),
-+      mixer_event, SND_SOC_DAPM_POST_REG),
-+SND_SOC_DAPM_MIXER_E("Right HP Mixer", AC97_INT_PAGING, 8, 1,
-+      &wm9712_hpr_mixer_controls[0], ARRAY_SIZE(wm9712_hpr_mixer_controls),
-+       mixer_event, SND_SOC_DAPM_POST_REG),
-+SND_SOC_DAPM_MIXER("Phone Mixer", AC97_INT_PAGING, 6, 1,
-+      &wm9712_phone_mixer_controls[0], ARRAY_SIZE(wm9712_phone_mixer_controls)),
-+SND_SOC_DAPM_MIXER("Speaker Mixer", AC97_INT_PAGING, 7, 1,
-+      &wm9712_speaker_mixer_controls[0],
-+      ARRAY_SIZE(wm9712_speaker_mixer_controls)),
-+SND_SOC_DAPM_MIXER("Mono Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
-+SND_SOC_DAPM_DAC("Left DAC", "Left HiFi Playback", AC97_INT_PAGING, 14, 1),
-+SND_SOC_DAPM_DAC("Right DAC", "Right HiFi Playback", AC97_INT_PAGING, 13, 1),
-+SND_SOC_DAPM_DAC("Aux DAC", "Aux Playback", SND_SOC_NOPM, 0, 0),
-+SND_SOC_DAPM_ADC("Left ADC", "Left HiFi Capture", AC97_INT_PAGING, 12, 1),
-+SND_SOC_DAPM_ADC("Right ADC", "Right HiFi Capture", AC97_INT_PAGING, 11, 1),
-+SND_SOC_DAPM_PGA("Headphone PGA", AC97_INT_PAGING, 4, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Speaker PGA", AC97_INT_PAGING, 3, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Out 3 PGA", AC97_INT_PAGING, 5, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Line PGA", AC97_INT_PAGING, 2, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Phone PGA", AC97_INT_PAGING, 1, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic PGA", AC97_INT_PAGING, 0, 1, NULL, 0),
-+SND_SOC_DAPM_MICBIAS("Mic Bias", AC97_INT_PAGING, 10, 1),
-+SND_SOC_DAPM_OUTPUT("MONOOUT"),
-+SND_SOC_DAPM_OUTPUT("HPOUTL"),
-+SND_SOC_DAPM_OUTPUT("HPOUTR"),
-+SND_SOC_DAPM_OUTPUT("LOUT2"),
-+SND_SOC_DAPM_OUTPUT("ROUT2"),
-+SND_SOC_DAPM_OUTPUT("OUT3"),
-+SND_SOC_DAPM_INPUT("LINEINL"),
-+SND_SOC_DAPM_INPUT("LINEINR"),
-+SND_SOC_DAPM_INPUT("PHONE"),
-+SND_SOC_DAPM_INPUT("PCBEEP"),
-+SND_SOC_DAPM_INPUT("MIC1"),
-+SND_SOC_DAPM_INPUT("MIC2"),
-+};
-+
-+static const char *audio_map[][3] = {
-+      /* virtual mixer - mixes left & right channels for spk and mono */
-+      {"AC97 Mixer", NULL, "Left DAC"},
-+      {"AC97 Mixer", NULL, "Right DAC"},
-+
-+      /* Left HP mixer */
-+      {"Left HP Mixer", "PCBeep Bypass Switch", "PCBEEP"},
-+      {"Left HP Mixer", "Aux Playback Switch",  "Aux DAC"},
-+      {"Left HP Mixer", "Phone Bypass Switch",  "Phone PGA"},
-+      {"Left HP Mixer", "Line Bypass Switch",   "Line PGA"},
-+      {"Left HP Mixer", "PCM Playback Switch",  "Left DAC"},
-+      {"Left HP Mixer", "Mic Sidetone Switch",  "Mic PGA"},
-+      {"Left HP Mixer", NULL,  "ALC Sidetone Mux"},
-+      //{"Right HP Mixer", NULL, "HP Mixer"},
-+
-+      /* Right HP mixer */
-+      {"Right HP Mixer", "PCBeep Bypass Switch", "PCBEEP"},
-+      {"Right HP Mixer", "Aux Playback Switch",  "Aux DAC"},
-+      {"Right HP Mixer", "Phone Bypass Switch",  "Phone PGA"},
-+      {"Right HP Mixer", "Line Bypass Switch",   "Line PGA"},
-+      {"Right HP Mixer", "PCM Playback Switch",  "Right DAC"},
-+      {"Right HP Mixer", "Mic Sidetone Switch",  "Mic PGA"},
-+      {"Right HP Mixer", NULL,  "ALC Sidetone Mux"},
-+
-+      /* speaker mixer */
-+      {"Speaker Mixer", "PCBeep Bypass Switch", "PCBEEP"},
-+      {"Speaker Mixer", "Line Bypass Switch",   "Line PGA"},
-+      {"Speaker Mixer", "PCM Playback Switch",  "AC97 Mixer"},
-+      {"Speaker Mixer", "Phone Bypass Switch",  "Phone PGA"},
-+      {"Speaker Mixer", "Aux Playback Switch",  "Aux DAC"},
-+
-+      /* Phone mixer */
-+      {"Phone Mixer", "PCBeep Bypass Switch",  "PCBEEP"},
-+      {"Phone Mixer", "Line Bypass Switch",    "Line PGA"},
-+      {"Phone Mixer", "Aux Playback Switch",   "Aux DAC"},
-+      {"Phone Mixer", "PCM Playback Switch",   "AC97 Mixer"},
-+      {"Phone Mixer", "Mic 1 Sidetone Switch", "Mic PGA"},
-+      {"Phone Mixer", "Mic 2 Sidetone Switch", "Mic PGA"},
-+
-+      /* inputs */
-+      {"Line PGA", NULL, "LINEINL"},
-+      {"Line PGA", NULL, "LINEINR"},
-+      {"Phone PGA", NULL, "PHONE"},
-+      {"Mic PGA", NULL, "MIC1"},
-+      {"Mic PGA", NULL, "MIC2"},
-+
-+      /* left capture selector */
-+      {"Left Capture Select", "Mic", "MIC1"},
-+      {"Left Capture Select", "Speaker Mixer", "Speaker Mixer"},
-+      {"Left Capture Select", "Line", "LINEINL"},
-+      {"Left Capture Select", "Headphone Mixer", "Left HP Mixer"},
-+      {"Left Capture Select", "Phone Mixer", "Phone Mixer"},
-+      {"Left Capture Select", "Phone", "PHONE"},
-+
-+      /* right capture selector */
-+      {"Right Capture Select", "Mic", "MIC2"},
-+      {"Right Capture Select", "Speaker Mixer", "Speaker Mixer"},
-+      {"Right Capture Select", "Line", "LINEINR"},
-+      {"Right Capture Select", "Headphone Mixer", "Right HP Mixer"},
-+      {"Right Capture Select", "Phone Mixer", "Phone Mixer"},
-+      {"Right Capture Select", "Phone", "PHONE"},
-+
-+      /* ALC Sidetone */
-+      {"ALC Sidetone Mux", "Stereo", "Left Capture Select"},
-+      {"ALC Sidetone Mux", "Stereo", "Right Capture Select"},
-+      {"ALC Sidetone Mux", "Left", "Left Capture Select"},
-+      {"ALC Sidetone Mux", "Right", "Right Capture Select"},
-+
-+      /* ADC's */
-+      {"Left ADC", NULL, "Left Capture Select"},
-+      {"Right ADC", NULL, "Right Capture Select"},
-+
-+      /* outputs */
-+      {"MONOOUT", NULL, "Phone Mixer"},
-+      {"HPOUTL", NULL, "Headphone PGA"},
-+      {"Headphone PGA", NULL, "Left HP Mixer"},
-+      {"HPOUTR", NULL, "Headphone PGA"},
-+      {"Headphone PGA", NULL, "Right HP Mixer"},
-+
-+      /* mono hp mixer */
-+      {"Mono HP Mixer", NULL, "Left HP Mixer"},
-+      {"Mono HP Mixer", NULL, "Right HP Mixer"},
-+
-+      /* Out3 Mux */
-+      {"Out3 Mux", "Left", "Left HP Mixer"},
-+      {"Out3 Mux", "Mono", "Phone Mixer"},
-+      {"Out3 Mux", "Left + Right", "Mono HP Mixer"},
-+      {"Out 3 PGA", NULL, "Out3 Mux"},
-+      {"OUT3", NULL, "Out 3 PGA"},
-+
-+      /* speaker Mux */
-+      {"Speaker Mux", "Speaker Mix", "Speaker Mixer"},
-+      {"Speaker Mux", "Headphone Mix", "Mono HP Mixer"},
-+      {"Speaker PGA", NULL, "Speaker Mux"},
-+      {"LOUT2", NULL, "Speaker PGA"},
-+      {"ROUT2", NULL, "Speaker PGA"},
-+
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm9712_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm9712_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm9712_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+static unsigned int ac97_read(struct snd_soc_codec *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+
-+      if (reg == AC97_RESET || reg == AC97_GPIO_STATUS ||
-+              reg == AC97_VENDOR_ID1 || reg == AC97_VENDOR_ID2 ||
-+              reg == AC97_REC_GAIN)
-+              return soc_ac97_ops.read(codec->ac97, reg);
-+      else {
-+              reg = reg >> 1;
-+
-+              if (reg > (ARRAY_SIZE(wm9712_reg)))
-+                      return -EIO;
-+
-+              return cache[reg];
-+      }
-+}
-+
-+static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int val)
-+{
-+      u16 *cache = codec->reg_cache;
-+
-+      soc_ac97_ops.write(codec->ac97, reg, val);
-+      reg = reg >> 1;
-+      if (reg <= (ARRAY_SIZE(wm9712_reg)))
-+              cache[reg] = val;
-+
-+      return 0;
-+}
-+
-+static int ac97_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int reg;
-+      u16 vra;
-+
-+      vra = ac97_read(codec, AC97_EXTENDED_STATUS);
-+      ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              reg = AC97_PCM_FRONT_DAC_RATE;
-+      else
-+              reg = AC97_PCM_LR_ADC_RATE;
-+
-+      return ac97_write(codec, reg, runtime->rate);
-+}
-+
-+static int ac97_aux_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 vra, xsle;
-+
-+      vra = ac97_read(codec, AC97_EXTENDED_STATUS);
-+      ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);
-+      xsle = ac97_read(codec, AC97_PCI_SID);
-+      ac97_write(codec, AC97_PCI_SID, xsle | 0x8000);
-+
-+      if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
-+              return -ENODEV;
-+
-+      return ac97_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate);
-+}
-+
-+struct snd_soc_codec_dai wm9712_dai[] = {
-+{
-+      .name = "AC97 HiFi",
-+      .playback = {
-+              .stream_name = "HiFi Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = {
-+              .stream_name = "HiFi Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .ops = {
-+              .prepare = ac97_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(ac97_modes),
-+              .mode = ac97_modes,},
-+      },
-+      {
-+      .name = "AC97 Aux",
-+      .playback = {
-+              .stream_name = "Aux Playback",
-+              .channels_min = 1,
-+              .channels_max = 1,},
-+      .ops = {
-+              .prepare = ac97_aux_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(ac97_modes),
-+              .mode = ac97_modes,},
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm9712_dai);
-+
-+static int wm9712_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      u16 reg;
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* liam - maybe enable thermal shutdown */
-+              reg = ac97_read(codec, AC97_EXTENDED_MID) & 0xdfff;
-+              ac97_write(codec, AC97_EXTENDED_MID, reg);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* enable master bias and vmid */
-+              reg = ac97_read(codec, AC97_EXTENDED_MID) & 0xbbff;
-+              ac97_write(codec, AC97_EXTENDED_MID, reg);
-+              ac97_write(codec, AC97_POWERDOWN, 0x0000);
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              /* disable everything including AC link */
-+              ac97_write(codec, AC97_EXTENDED_MID, 0xffff);
-+              ac97_write(codec, AC97_EXTENDED_MSTATUS, 0xffff);
-+              ac97_write(codec, AC97_POWERDOWN, 0xffff);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+static int wm9712_reset(struct snd_soc_codec *codec, int try_warm)
-+{
-+      if (try_warm && soc_ac97_ops.warm_reset) {
-+              soc_ac97_ops.warm_reset(codec->ac97);
-+              if (!(ac97_read(codec, 0) & 0x8000))
-+                      return 1;
-+      }
-+
-+      soc_ac97_ops.reset(codec->ac97);
-+      if (ac97_read(codec, 0) & 0x8000)
-+              goto err;
-+      return 0;
-+
-+err:
-+      printk(KERN_ERR "WM9712 AC97 reset failed\n");
-+      return -EIO;
-+}
-+
-+static int wm9712_soc_suspend(struct platform_device *pdev,
-+      pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm9712_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm9712_soc_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i, ret;
-+      u16 *cache = codec->reg_cache;
-+
-+      ret = wm9712_reset(codec, 1);
-+      if (ret < 0){
-+              printk(KERN_ERR "could not reset AC97 codec\n");
-+              return ret;
-+      }
-+
-+      wm9712_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      if (ret == 0) {
-+              /* Sync reg_cache with the hardware after cold reset */
-+              for (i = 2; i < ARRAY_SIZE(wm9712_reg) << 1; i+=2) {
-+                      if (i == AC97_INT_PAGING || i == AC97_POWERDOWN ||
-+                              (i > 0x58 && i != 0x5c))
-+                              continue;
-+                      soc_ac97_ops.write(codec->ac97, i, cache[i>>1]);
-+              }
-+      }
-+
-+      if (codec->suspend_dapm_state == SNDRV_CTL_POWER_D0)
-+              wm9712_dapm_event(codec, SNDRV_CTL_POWER_D0);
-+
-+      return ret;
-+}
-+
-+static int wm9712_soc_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      printk(KERN_INFO "WM9711/WM9712 SoC Audio Codec %s\n", WM9712_VERSION);
-+
-+      socdev->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (socdev->codec == NULL)
-+              return -ENOMEM;
-+      codec = socdev->codec;
-+      mutex_init(&codec->mutex);
-+
-+      codec->reg_cache =
-+              kzalloc(sizeof(u16) * ARRAY_SIZE(wm9712_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL) {
-+              kfree(codec->ac97);
-+              kfree(socdev->codec);
-+              socdev->codec = NULL;
-+              return -ENOMEM;
-+      }
-+      memcpy(codec->reg_cache, wm9712_reg, sizeof(u16) * ARRAY_SIZE(wm9712_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm9712_reg);
-+      codec->reg_cache_step = 2;
-+
-+      codec->name = "WM9712";
-+      codec->owner = THIS_MODULE;
-+      codec->dai = wm9712_dai;
-+      codec->num_dai = ARRAY_SIZE(wm9712_dai);
-+      codec->write = ac97_write;
-+      codec->read = ac97_read;
-+      codec->dapm_event = wm9712_dapm_event;
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
-+      if (ret < 0)
-+              goto err;
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if (ret < 0)
-+              goto pcm_err;
-+
-+      ret = wm9712_reset(codec, 0);
-+      if (ret < 0) {
-+              printk(KERN_ERR "AC97 link error\n");
-+              goto reset_err;
-+      }
-+
-+      /* set alc mux to none */
-+      ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000);
-+
-+      wm9712_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm9712_add_controls(codec);
-+      wm9712_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if (ret < 0)
-+              goto reset_err;
-+
-+      return 0;
-+
-+reset_err:
-+      snd_soc_free_pcms(socdev);
-+
-+pcm_err:
-+      snd_soc_free_ac97_codec(codec);
-+
-+err:
-+      kfree(socdev->codec->reg_cache);
-+      kfree(socdev->codec);
-+      socdev->codec = NULL;
-+      return ret;
-+}
-+
-+static int wm9712_soc_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec == NULL)
-+              return 0;
-+
-+      snd_soc_dapm_free(socdev);
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_free_ac97_codec(codec);
-+      kfree(codec->reg_cache);
-+      kfree(codec);
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm9712 = {
-+      .probe =        wm9712_soc_probe,
-+      .remove =       wm9712_soc_remove,
-+      .suspend =      wm9712_soc_suspend,
-+      .resume =       wm9712_soc_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm9712);
-+
-+MODULE_DESCRIPTION("ASoC WM9711/WM9712 driver");
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm9712.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm9712.h
-@@ -0,0 +1,14 @@
-+/*
-+ * wm9712.h  --  WM9712 Soc Audio driver
-+ */
-+
-+#ifndef _WM9712_H
-+#define _WM9712_H
-+
-+#define WM9712_DAI_AC97_HIFI  0
-+#define WM9712_DAI_AC97_AUX           1
-+
-+extern struct snd_soc_codec_dai wm9712_dai[2];
-+extern struct snd_soc_codec_device soc_codec_dev_wm9712;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm9713.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm9713.c
-@@ -0,0 +1,1313 @@
-+/*
-+ * wm9713.c  --  ALSA Soc WM9713 codec support
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    4th Feb 2006   Initial version.
-+ *
-+ *  Features:-
-+ *
-+ *   o Support for AC97 Codec, Voice DAC and Aux DAC
-+ *   o Support for DAPM
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/ac97_codec.h>
-+#include <sound/initval.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#define WM9713_VERSION "0.12"
-+
-+struct wm9713 {
-+      u32 pll; /* current PLL frequency */
-+      u32 pll_resume; /* PLL resume frequency */
-+};
-+
-+static unsigned int ac97_read(struct snd_soc_codec *codec,
-+      unsigned int reg);
-+static int ac97_write(struct snd_soc_codec *codec,
-+      unsigned int reg, unsigned int val);
-+
-+#define AC97_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define AC97_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | \
-+      SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
-+      SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+/* may need to expand this */
-+static struct snd_soc_dai_mode ac97_modes[] = {
-+      {
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S18_3LE,
-+              .pcmrate = AC97_RATES,
-+      },
-+};
-+
-+#define WM9713_VOICE_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | \
-+      SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_DSP_A | \
-+      SND_SOC_DAIFMT_DSP_B |  SND_SOC_DAIFMT_NB_NF | \
-+      SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \
-+      SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM9713_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM9713_VOICE_FSB \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | \
-+      SND_SOC_FSBD(8) | SND_SOC_FSBD(16))
-+
-+#define WM9713_VOICE_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 | \
-+      SNDRV_PCM_RATE_96000)
-+
-+#define WM9713_HIFI_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
-+
-+/*
-+ * Voice modes
-+ */
-+static struct snd_soc_dai_mode wm9713_voice_modes[] = {
-+      /* master modes */
-+      {
-+              .fmt = WM9713_VOICE_DAIFMT | SND_SOC_DAIFMT_CBM_CFM | \
-+                      SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt =  WM9713_HIFI_BITS,
-+              .pcmrate = WM9713_VOICE_RATES,
-+              .pcmdir = WM9713_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = WM9713_VOICE_FSB,
-+      },
-+
-+      /* slave modes */
-+      {
-+              .fmt = WM9713_VOICE_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM9713_HIFI_BITS,
-+              .pcmrate = WM9713_VOICE_RATES,
-+              .pcmdir = WM9713_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * WM9713 register cache
-+ * Reg 0x3c bit 15 is used by touch driver.
-+ */
-+static const u16 wm9713_reg[] = {
-+      0x6174, 0x8080, 0x8080, 0x8080, // 6
-+      0xc880, 0xe808, 0xe808, 0x0808, // e
-+      0x00da, 0x8000, 0xd600, 0xaaa0, // 16
-+      0xaaa0, 0xaaa0, 0x0000, 0x0000, // 1e
-+      0x0f0f, 0x0040, 0x0000, 0x7f00, // 26
-+      0x0405, 0x0410, 0xbb80, 0xbb80, // 2e
-+      0x0000, 0xbb80, 0x0000, 0x4523, // 36
-+      0x0000, 0x2000, 0x7eff, 0xffff, // 3e
-+      0x0000, 0x0000, 0x0080, 0x0000, // 46
-+      0x0000, 0x0000, 0xfffe, 0xffff, // 4e
-+      0x0000, 0x0000, 0x0000, 0xfffe, // 56
-+      0x4000, 0x0000, 0x0000, 0x0000, // 5e
-+      0xb032, 0x3e00, 0x0000, 0x0000, // 66
-+      0x0000, 0x0000, 0x0000, 0x0000, // 6e
-+      0x0000, 0x0000, 0x0000, 0x0006, // 76
-+      0x0001, 0x0000, 0x574d, 0x4c13, // 7e
-+      0x0000, 0x0000, 0x0000 // virtual hp & mic mixers
-+};
-+
-+/* virtual HP mixers regs */
-+#define HPL_MIXER     0x80
-+#define HPR_MIXER     0x82
-+#define MICB_MUX      0x82
-+
-+static const char *wm9713_mic_mixer[] = {"Stereo", "Mic 1", "Mic 2", "Mute"};
-+static const char *wm9713_rec_mux[] = {"Stereo", "Left", "Right", "Mute"};
-+static const char *wm9713_rec_src[] =
-+      {"Mic 1", "Mic 2", "Line", "Mono In", "Headphone", "Speaker",
-+      "Mono Out", "Zh"};
-+static const char *wm9713_rec_gain[] = {"+1.5dB Steps", "+0.75dB Steps"};
-+static const char *wm9713_alc_select[] = {"None", "Left", "Right", "Stereo"};
-+static const char *wm9713_mono_pga[] = {"Vmid", "Zh", "Mono", "Inv",
-+      "Mono Vmid", "Inv Vmid"};
-+static const char *wm9713_spk_pga[] =
-+      {"Vmid", "Zh", "Headphone", "Speaker", "Inv", "Headphone Vmid",
-+      "Speaker Vmid", "Inv Vmid"};
-+static const char *wm9713_hp_pga[] = {"Vmid", "Zh", "Headphone",
-+      "Headphone Vmid"};
-+static const char *wm9713_out3_pga[] = {"Vmid", "Zh", "Inv 1", "Inv 1 Vmid"};
-+static const char *wm9713_out4_pga[] = {"Vmid", "Zh", "Inv 2", "Inv 2 Vmid"};
-+static const char *wm9713_dac_inv[] =
-+      {"Off", "Mono", "Speaker", "Left Headphone", "Right Headphone",
-+      "Headphone Mono", "NC", "Vmid"};
-+static const char *wm9713_bass[] = {"Linear Control", "Adaptive Boost"};
-+static const char *wm9713_ng_type[] = {"Constant Gain", "Mute"};
-+static const char *wm9713_mic_select[] = {"Mic 1", "Mic 2 A", "Mic 2 B"};
-+static const char *wm9713_micb_select[] = {"MPB", "MPA"};
-+
-+static const struct soc_enum wm9713_enum[] = {
-+SOC_ENUM_SINGLE(AC97_LINE, 3, 4, wm9713_mic_mixer), /* record mic mixer 0 */
-+SOC_ENUM_SINGLE(AC97_VIDEO, 14, 4, wm9713_rec_mux), /* record mux hp 1 */
-+SOC_ENUM_SINGLE(AC97_VIDEO, 9, 4, wm9713_rec_mux),  /* record mux mono 2 */
-+SOC_ENUM_SINGLE(AC97_VIDEO, 3, 8, wm9713_rec_src),  /* record mux left 3 */
-+SOC_ENUM_SINGLE(AC97_VIDEO, 0, 8, wm9713_rec_src),  /* record mux right 4*/
-+SOC_ENUM_DOUBLE(AC97_CD, 14, 6, 2, wm9713_rec_gain), /* record step size 5 */
-+SOC_ENUM_SINGLE(AC97_PCI_SVID, 14, 4, wm9713_alc_select), /* alc source select 6*/
-+SOC_ENUM_SINGLE(AC97_REC_GAIN, 14, 4, wm9713_mono_pga), /* mono input select 7 */
-+SOC_ENUM_SINGLE(AC97_REC_GAIN, 11, 8, wm9713_spk_pga), /* speaker left input select 8 */
-+SOC_ENUM_SINGLE(AC97_REC_GAIN, 8, 8, wm9713_spk_pga), /* speaker right input select 9 */
-+SOC_ENUM_SINGLE(AC97_REC_GAIN, 6, 3, wm9713_hp_pga), /* headphone left input 10 */
-+SOC_ENUM_SINGLE(AC97_REC_GAIN, 4, 3, wm9713_hp_pga), /* headphone right input 11 */
-+SOC_ENUM_SINGLE(AC97_REC_GAIN, 2, 4, wm9713_out3_pga), /* out 3 source 12 */
-+SOC_ENUM_SINGLE(AC97_REC_GAIN, 0, 4, wm9713_out4_pga), /* out 4 source 13 */
-+SOC_ENUM_SINGLE(AC97_REC_GAIN_MIC, 13, 8, wm9713_dac_inv), /* dac invert 1 14 */
-+SOC_ENUM_SINGLE(AC97_REC_GAIN_MIC, 10, 8, wm9713_dac_inv), /* dac invert 2 15 */
-+SOC_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 15, 2, wm9713_bass), /* bass control 16 */
-+SOC_ENUM_SINGLE(AC97_PCI_SVID, 5, 2, wm9713_ng_type), /* noise gate type 17 */
-+SOC_ENUM_SINGLE(AC97_3D_CONTROL, 12, 3, wm9713_mic_select), /* mic selection 18 */
-+SOC_ENUM_SINGLE(MICB_MUX, 0, 2, wm9713_micb_select), /* mic selection 19 */
-+};
-+
-+static const struct snd_kcontrol_new wm9713_snd_ac97_controls[] = {
-+SOC_DOUBLE("Speaker Playback Volume", AC97_MASTER, 8, 0, 31, 1),
-+SOC_DOUBLE("Speaker Playback Switch", AC97_MASTER, 15, 7, 1, 1),
-+SOC_DOUBLE("Headphone Playback Volume", AC97_HEADPHONE, 8, 0, 31, 1),
-+SOC_DOUBLE("Headphone Playback Switch", AC97_HEADPHONE,15, 7, 1, 1),
-+SOC_DOUBLE("Line In Volume", AC97_PC_BEEP, 8, 0, 31, 1),
-+SOC_DOUBLE("PCM Playback Volume", AC97_PHONE, 8, 0, 31, 1),
-+SOC_SINGLE("Mic 1 Volume", AC97_MIC, 8, 31, 1),
-+SOC_SINGLE("Mic 2 Volume", AC97_MIC, 0, 31, 1),
-+
-+SOC_SINGLE("Mic Boost (+20dB) Switch", AC97_LINE, 5, 1, 0),
-+SOC_SINGLE("Mic Headphone Mixer Volume", AC97_LINE, 0, 7, 1),
-+
-+SOC_SINGLE("Capture Switch", AC97_CD, 15, 1, 1),
-+SOC_ENUM("Capture Volume Steps", wm9713_enum[5]),
-+SOC_DOUBLE("Capture Volume", AC97_CD, 8, 0, 63, 0),
-+SOC_SINGLE("Capture ZC Switch", AC97_CD, 7, 1, 0),
-+
-+SOC_SINGLE("Capture to Headphone Volume", AC97_VIDEO, 11, 7, 1),
-+SOC_SINGLE("Capture to Mono Boost (+20dB) Switch", AC97_VIDEO, 8, 1, 0),
-+SOC_SINGLE("Capture ADC Boost (+20dB) Switch", AC97_VIDEO, 6, 1, 0),
-+
-+SOC_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0),
-+SOC_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0),
-+SOC_SINGLE("ALC Decay Time ", AC97_CODEC_CLASS_REV, 4, 15, 0),
-+SOC_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0),
-+SOC_ENUM("ALC Function", wm9713_enum[6]),
-+SOC_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 0),
-+SOC_SINGLE("ALC ZC Timeout", AC97_PCI_SVID, 9, 3, 0),
-+SOC_SINGLE("ALC ZC Switch", AC97_PCI_SVID, 8, 1, 0),
-+SOC_SINGLE("ALC NG Switch", AC97_PCI_SVID, 7, 1, 0),
-+SOC_ENUM("ALC NG Type", wm9713_enum[17]),
-+SOC_SINGLE("ALC NG Threshold", AC97_PCI_SVID, 0, 31, 0),
-+
-+SOC_DOUBLE("Speaker Playback ZC Switch", AC97_MASTER, 14, 6, 1, 0),
-+SOC_DOUBLE("Headphone Playback ZC Switch", AC97_HEADPHONE, 14, 6, 1, 0),
-+
-+SOC_SINGLE("Out4 Playback Switch", AC97_MASTER_MONO, 15, 1, 1),
-+SOC_SINGLE("Out4 Playback ZC Switch", AC97_MASTER_MONO, 14, 1, 0),
-+SOC_SINGLE("Out4 Playback Volume", AC97_MASTER_MONO, 8, 63, 1),
-+
-+SOC_SINGLE("Out3 Playback Switch", AC97_MASTER_MONO, 7, 1, 1),
-+SOC_SINGLE("Out3 Playback ZC Switch", AC97_MASTER_MONO, 6, 1, 0),
-+SOC_SINGLE("Out3 Playback Volume", AC97_MASTER_MONO, 0, 63, 1),
-+
-+SOC_SINGLE("Mono Capture Volume", AC97_MASTER_TONE, 8, 31, 1),
-+SOC_SINGLE("Mono Playback Switch", AC97_MASTER_TONE, 7, 1, 1),
-+SOC_SINGLE("Mono Playback ZC Switch", AC97_MASTER_TONE, 6, 1, 0),
-+SOC_SINGLE("Mono Playback Volume", AC97_MASTER_TONE, 0, 31, 1),
-+
-+SOC_SINGLE("PC Beep Playback Headphone Volume", AC97_AUX, 12, 7, 1),
-+SOC_SINGLE("PC Beep Playback Speaker Volume", AC97_AUX, 8, 7, 1),
-+SOC_SINGLE("PC Beep Playback Mono Volume", AC97_AUX, 4, 7, 1),
-+
-+SOC_SINGLE("Voice Playback Headphone Volume", AC97_PCM, 12, 7, 1),
-+SOC_SINGLE("Voice Playback Master Volume", AC97_PCM, 8, 7, 1),
-+SOC_SINGLE("Voice Playback Mono Volume", AC97_PCM, 4, 7, 1),
-+
-+SOC_SINGLE("Aux Playback Headphone Volume", AC97_REC_SEL, 12, 7, 1),
-+SOC_SINGLE("Aux Playback Master Volume", AC97_REC_SEL, 8, 7, 1),
-+SOC_SINGLE("Aux Playback Mono Volume", AC97_REC_SEL, 4, 7, 1),
-+
-+SOC_ENUM("Bass Control", wm9713_enum[16]),
-+SOC_SINGLE("Bass Cut-off Switch", AC97_GENERAL_PURPOSE, 12, 1, 1),
-+SOC_SINGLE("Tone Cut-off Switch", AC97_GENERAL_PURPOSE, 4, 1, 1),
-+SOC_SINGLE("Playback Attenuate (-6dB) Switch", AC97_GENERAL_PURPOSE, 6, 1, 0),
-+SOC_SINGLE("Bass Volume", AC97_GENERAL_PURPOSE, 8, 15, 1),
-+SOC_SINGLE("Tone Volume", AC97_GENERAL_PURPOSE, 0, 15, 1),
-+
-+SOC_SINGLE("3D Upper Cut-off Switch", AC97_REC_GAIN_MIC, 5, 1, 0),
-+SOC_SINGLE("3D Lower Cut-off Switch", AC97_REC_GAIN_MIC, 4, 1, 0),
-+SOC_SINGLE("3D Depth", AC97_REC_GAIN_MIC, 0, 15, 1),
-+};
-+
-+/* add non dapm controls */
-+static int wm9713_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm9713_snd_ac97_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm9713_snd_ac97_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+      return 0;
-+}
-+
-+/* We have to create a fake left and right HP mixers because
-+ * the codec only has a single control that is shared by both channels.
-+ * This makes it impossible to determine the audio path using the current
-+ * register map, thus we add a new (virtual) register to help determine the
-+ * audio route within the device.
-+ */
-+static int mixer_event (struct snd_soc_dapm_widget *w, int event)
-+{
-+      u16 l, r, beep, tone, phone, rec, pcm, aux;
-+
-+      l = ac97_read(w->codec, HPL_MIXER);
-+      r = ac97_read(w->codec, HPR_MIXER);
-+      beep = ac97_read(w->codec, AC97_PC_BEEP);
-+      tone = ac97_read(w->codec, AC97_MASTER_TONE);
-+      phone = ac97_read(w->codec, AC97_PHONE);
-+      rec = ac97_read(w->codec, AC97_REC_SEL);
-+      pcm = ac97_read(w->codec, AC97_PCM);
-+      aux = ac97_read(w->codec, AC97_AUX);
-+
-+      if (event & SND_SOC_DAPM_PRE_REG)
-+              return 0;
-+      if (l & 0x1 || r & 0x1)
-+              ac97_write(w->codec, AC97_PC_BEEP, beep & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_PC_BEEP, beep | 0x8000);
-+
-+      if (l & 0x2 || r & 0x2)
-+              ac97_write(w->codec, AC97_MASTER_TONE, tone & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_MASTER_TONE, tone | 0x8000);
-+
-+      if (l & 0x4 || r & 0x4)
-+              ac97_write(w->codec, AC97_PHONE, phone & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_PHONE, phone | 0x8000);
-+
-+      if (l & 0x8 || r & 0x8)
-+              ac97_write(w->codec, AC97_REC_SEL, rec & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_REC_SEL, rec | 0x8000);
-+
-+      if (l & 0x10 || r & 0x10)
-+              ac97_write(w->codec, AC97_PCM, pcm & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_PCM, pcm | 0x8000);
-+
-+      if (l & 0x20 || r & 0x20)
-+              ac97_write(w->codec, AC97_AUX, aux & 0x7fff);
-+      else
-+              ac97_write(w->codec, AC97_AUX, aux | 0x8000);
-+
-+      return 0;
-+}
-+
-+/* Left Headphone Mixers */
-+static const struct snd_kcontrol_new wm9713_hpl_mixer_controls[] = {
-+SOC_DAPM_SINGLE("PC Beep Playback Switch", HPL_MIXER, 5, 1, 0),
-+SOC_DAPM_SINGLE("Voice Playback Switch", HPL_MIXER, 4, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", HPL_MIXER, 3, 1, 0),
-+SOC_DAPM_SINGLE("PCM Playback Switch", HPL_MIXER, 2, 1, 0),
-+SOC_DAPM_SINGLE("MonoIn Playback Switch", HPL_MIXER, 1, 1, 0),
-+SOC_DAPM_SINGLE("Bypass Playback Switch", HPL_MIXER, 0, 1, 0),
-+};
-+
-+/* Right Headphone Mixers */
-+static const struct snd_kcontrol_new wm9713_hpr_mixer_controls[] = {
-+SOC_DAPM_SINGLE("PC Beep Playback Switch", HPR_MIXER, 5, 1, 0),
-+SOC_DAPM_SINGLE("Voice Playback Switch", HPR_MIXER, 4, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", HPR_MIXER, 3, 1, 0),
-+SOC_DAPM_SINGLE("PCM Playback Switch", HPR_MIXER, 2, 1, 0),
-+SOC_DAPM_SINGLE("MonoIn Playback Switch", HPR_MIXER, 1, 1, 0),
-+SOC_DAPM_SINGLE("Bypass Playback Switch", HPR_MIXER, 0, 1, 0),
-+};
-+
-+/* headphone capture mux */
-+static const struct snd_kcontrol_new wm9713_hp_rec_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[1]);
-+
-+/* headphone mic mux */
-+static const struct snd_kcontrol_new wm9713_hp_mic_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[0]);
-+
-+/* Speaker Mixer */
-+static const struct snd_kcontrol_new wm9713_speaker_mixer_controls[] = {
-+SOC_DAPM_SINGLE("PC Beep Playback Switch", AC97_AUX, 11, 1, 1),
-+SOC_DAPM_SINGLE("Voice Playback Switch", AC97_PCM, 11, 1, 1),
-+SOC_DAPM_SINGLE("Aux Playback Switch", AC97_REC_SEL, 11, 1, 1),
-+SOC_DAPM_SINGLE("PCM Playback Switch", AC97_PHONE, 14, 1, 1),
-+SOC_DAPM_SINGLE("MonoIn Playback Switch", AC97_MASTER_TONE, 14, 1, 1),
-+SOC_DAPM_SINGLE("Bypass Playback Switch", AC97_PC_BEEP, 14, 1, 1),
-+};
-+
-+/* Mono Mixer */
-+static const struct snd_kcontrol_new wm9713_mono_mixer_controls[] = {
-+SOC_DAPM_SINGLE("PC Beep Playback Switch", AC97_AUX, 7, 1, 1),
-+SOC_DAPM_SINGLE("Voice Playback Switch", AC97_PCM, 7, 1, 1),
-+SOC_DAPM_SINGLE("Aux Playback Switch", AC97_REC_SEL, 7, 1, 1),
-+SOC_DAPM_SINGLE("PCM Playback Switch", AC97_PHONE, 13, 1, 1),
-+SOC_DAPM_SINGLE("MonoIn Playback Switch", AC97_MASTER_TONE, 13, 1, 1),
-+SOC_DAPM_SINGLE("Bypass Playback Switch", AC97_PC_BEEP, 13, 1, 1),
-+SOC_DAPM_SINGLE("Mic 1 Sidetone Switch", AC97_LINE, 7, 1, 1),
-+SOC_DAPM_SINGLE("Mic 2 Sidetone Switch", AC97_LINE, 6, 1, 1),
-+};
-+
-+/* mono mic mux */
-+static const struct snd_kcontrol_new wm9713_mono_mic_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[2]);
-+
-+/* mono output mux */
-+static const struct snd_kcontrol_new wm9713_mono_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[7]);
-+
-+/* speaker left output mux */
-+static const struct snd_kcontrol_new wm9713_hp_spkl_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[8]);
-+
-+/* speaker right output mux */
-+static const struct snd_kcontrol_new wm9713_hp_spkr_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[9]);
-+
-+/* headphone left output mux */
-+static const struct snd_kcontrol_new wm9713_hpl_out_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[10]);
-+
-+/* headphone right output mux */
-+static const struct snd_kcontrol_new wm9713_hpr_out_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[11]);
-+
-+/* Out3 mux */
-+static const struct snd_kcontrol_new wm9713_out3_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[12]);
-+
-+/* Out4 mux */
-+static const struct snd_kcontrol_new wm9713_out4_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[13]);
-+
-+/* DAC inv mux 1 */
-+static const struct snd_kcontrol_new wm9713_dac_inv1_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[14]);
-+
-+/* DAC inv mux 2 */
-+static const struct snd_kcontrol_new wm9713_dac_inv2_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[15]);
-+
-+/* Capture source left */
-+static const struct snd_kcontrol_new wm9713_rec_srcl_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[3]);
-+
-+/* Capture source right */
-+static const struct snd_kcontrol_new wm9713_rec_srcr_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[4]);
-+
-+/* mic source */
-+static const struct snd_kcontrol_new wm9713_mic_sel_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[18]);
-+
-+/* mic source B virtual control */
-+static const struct snd_kcontrol_new wm9713_micb_sel_mux_controls =
-+SOC_DAPM_ENUM("Route", wm9713_enum[19]);
-+
-+static const struct snd_soc_dapm_widget wm9713_dapm_widgets[] = {
-+SND_SOC_DAPM_MUX("Capture Headphone Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_hp_rec_mux_controls),
-+SND_SOC_DAPM_MUX("Sidetone Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_hp_mic_mux_controls),
-+SND_SOC_DAPM_MUX("Capture Mono Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_mono_mic_mux_controls),
-+SND_SOC_DAPM_MUX("Mono Out Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_mono_mux_controls),
-+SND_SOC_DAPM_MUX("Left Speaker Out Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_hp_spkl_mux_controls),
-+SND_SOC_DAPM_MUX("Right Speaker Out Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_hp_spkr_mux_controls),
-+SND_SOC_DAPM_MUX("Left Headphone Out Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_hpl_out_mux_controls),
-+SND_SOC_DAPM_MUX("Right Headphone Out Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_hpr_out_mux_controls),
-+SND_SOC_DAPM_MUX("Out 3 Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_out3_mux_controls),
-+SND_SOC_DAPM_MUX("Out 4 Mux", SND_SOC_NOPM, 0, 0,
-+      &wm9713_out4_mux_controls),
-+SND_SOC_DAPM_MUX("DAC Inv Mux 1", SND_SOC_NOPM, 0, 0,
-+      &wm9713_dac_inv1_mux_controls),
-+SND_SOC_DAPM_MUX("DAC Inv Mux 2", SND_SOC_NOPM, 0, 0,
-+      &wm9713_dac_inv2_mux_controls),
-+SND_SOC_DAPM_MUX("Left Capture Source", SND_SOC_NOPM, 0, 0,
-+      &wm9713_rec_srcl_mux_controls),
-+SND_SOC_DAPM_MUX("Right Capture Source", SND_SOC_NOPM, 0, 0,
-+      &wm9713_rec_srcr_mux_controls),
-+SND_SOC_DAPM_MUX("Mic A Source", SND_SOC_NOPM, 0, 0,
-+      &wm9713_mic_sel_mux_controls ),
-+SND_SOC_DAPM_MUX("Mic B Source", SND_SOC_NOPM, 0, 0,
-+      &wm9713_micb_sel_mux_controls ),
-+SND_SOC_DAPM_MIXER_E("Left HP Mixer", AC97_EXTENDED_MID, 3, 1,
-+      &wm9713_hpl_mixer_controls[0], ARRAY_SIZE(wm9713_hpl_mixer_controls),
-+      mixer_event, SND_SOC_DAPM_POST_REG),
-+SND_SOC_DAPM_MIXER_E("Right HP Mixer", AC97_EXTENDED_MID, 2, 1,
-+      &wm9713_hpr_mixer_controls[0], ARRAY_SIZE(wm9713_hpr_mixer_controls),
-+      mixer_event, SND_SOC_DAPM_POST_REG),
-+SND_SOC_DAPM_MIXER("Mono Mixer", AC97_EXTENDED_MID, 0, 1,
-+      &wm9713_mono_mixer_controls[0], ARRAY_SIZE(wm9713_mono_mixer_controls)),
-+SND_SOC_DAPM_MIXER("Speaker Mixer", AC97_EXTENDED_MID, 1, 1,
-+      &wm9713_speaker_mixer_controls[0],
-+      ARRAY_SIZE(wm9713_speaker_mixer_controls)),
-+SND_SOC_DAPM_DAC("Left DAC", "Left HiFi Playback", AC97_EXTENDED_MID, 7, 1),
-+SND_SOC_DAPM_DAC("Right DAC", "Right HiFi Playback", AC97_EXTENDED_MID, 6, 1),
-+SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
-+SND_SOC_DAPM_MIXER("HP Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
-+SND_SOC_DAPM_MIXER("Capture Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
-+SND_SOC_DAPM_DAC("Voice DAC", "Voice Playback", AC97_EXTENDED_MID, 12, 1),
-+SND_SOC_DAPM_DAC("Aux DAC", "Aux Playback", AC97_EXTENDED_MID, 11, 1),
-+SND_SOC_DAPM_ADC("Left ADC", "Left HiFi Capture", AC97_EXTENDED_MID, 5, 1),
-+SND_SOC_DAPM_ADC("Right ADC", "Right HiFi Capture", AC97_EXTENDED_MID, 4, 1),
-+SND_SOC_DAPM_PGA("Left Headphone", AC97_EXTENDED_MSTATUS, 10, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Right Headphone", AC97_EXTENDED_MSTATUS, 9, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Left Speaker", AC97_EXTENDED_MSTATUS, 8, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Right Speaker", AC97_EXTENDED_MSTATUS, 7, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Out 3", AC97_EXTENDED_MSTATUS, 11, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Out 4", AC97_EXTENDED_MSTATUS, 12, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Mono Out", AC97_EXTENDED_MSTATUS, 13, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Left Line In", AC97_EXTENDED_MSTATUS, 6, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Right Line In", AC97_EXTENDED_MSTATUS, 5, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Mono In", AC97_EXTENDED_MSTATUS, 4, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic A PGA", AC97_EXTENDED_MSTATUS, 3, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic B PGA", AC97_EXTENDED_MSTATUS, 2, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic A Pre Amp", AC97_EXTENDED_MSTATUS, 1, 1, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic B Pre Amp", AC97_EXTENDED_MSTATUS, 0, 1, NULL, 0),
-+SND_SOC_DAPM_MICBIAS("Mic Bias", AC97_EXTENDED_MSTATUS, 14, 1),
-+SND_SOC_DAPM_OUTPUT("MONO"),
-+SND_SOC_DAPM_OUTPUT("HPL"),
-+SND_SOC_DAPM_OUTPUT("HPR"),
-+SND_SOC_DAPM_OUTPUT("SPKL"),
-+SND_SOC_DAPM_OUTPUT("SPKR"),
-+SND_SOC_DAPM_OUTPUT("OUT3"),
-+SND_SOC_DAPM_OUTPUT("OUT4"),
-+SND_SOC_DAPM_INPUT("LINEL"),
-+SND_SOC_DAPM_INPUT("LINER"),
-+SND_SOC_DAPM_INPUT("MONOIN"),
-+SND_SOC_DAPM_INPUT("PCBEEP"),
-+SND_SOC_DAPM_INPUT("MIC1"),
-+SND_SOC_DAPM_INPUT("MIC2A"),
-+SND_SOC_DAPM_INPUT("MIC2B"),
-+SND_SOC_DAPM_VMID("VMID"),
-+};
-+
-+static const char *audio_map[][3] = {
-+      /* left HP mixer */
-+      {"Left HP Mixer", "PC Beep Playback Switch", "PCBEEP"},
-+      {"Left HP Mixer", "Voice Playback Switch",   "Voice DAC"},
-+      {"Left HP Mixer", "Aux Playback Switch",     "Aux DAC"},
-+      {"Left HP Mixer", "Bypass Playback Switch",  "Left Line In"},
-+      {"Left HP Mixer", "PCM Playback Switch",     "Left DAC"},
-+      {"Left HP Mixer", "MonoIn Playback Switch",  "Mono In"},
-+      {"Left HP Mixer", NULL,  "Capture Headphone Mux"},
-+
-+      /* right HP mixer */
-+      {"Right HP Mixer", "PC Beep Playback Switch", "PCBEEP"},
-+      {"Right HP Mixer", "Voice Playback Switch",   "Voice DAC"},
-+      {"Right HP Mixer", "Aux Playback Switch",     "Aux DAC"},
-+      {"Right HP Mixer", "Bypass Playback Switch",  "Right Line In"},
-+      {"Right HP Mixer", "PCM Playback Switch",     "Right DAC"},
-+      {"Right HP Mixer", "MonoIn Playback Switch",  "Mono In"},
-+      {"Right HP Mixer", NULL,  "Capture Headphone Mux"},
-+
-+      /* virtual mixer - mixes left & right channels for spk and mono */
-+      {"AC97 Mixer", NULL, "Left DAC"},
-+      {"AC97 Mixer", NULL, "Right DAC"},
-+      {"Line Mixer", NULL, "Right Line In"},
-+      {"Line Mixer", NULL, "Left Line In"},
-+      {"HP Mixer", NULL, "Left HP Mixer"},
-+      {"HP Mixer", NULL, "Right HP Mixer"},
-+      {"Capture Mixer", NULL, "Left Capture Source"},
-+      {"Capture Mixer", NULL, "Right Capture Source"},
-+
-+      /* speaker mixer */
-+      {"Speaker Mixer", "PC Beep Playback Switch", "PCBEEP"},
-+      {"Speaker Mixer", "Voice Playback Switch",   "Voice DAC"},
-+      {"Speaker Mixer", "Aux Playback Switch",     "Aux DAC"},
-+      {"Speaker Mixer", "Bypass Playback Switch",  "Line Mixer"},
-+      {"Speaker Mixer", "PCM Playback Switch",     "AC97 Mixer"},
-+      {"Speaker Mixer", "MonoIn Playback Switch",  "Mono In"},
-+
-+      /* mono mixer */
-+      {"Mono Mixer", "PC Beep Playback Switch", "PCBEEP"},
-+      {"Mono Mixer", "Voice Playback Switch",   "Voice DAC"},
-+      {"Mono Mixer", "Aux Playback Switch",     "Aux DAC"},
-+      {"Mono Mixer", "Bypass Playback Switch",  "Line Mixer"},
-+      {"Mono Mixer", "PCM Playback Switch",     "AC97 Mixer"},
-+      {"Mono Mixer", NULL,  "Capture Mono Mux"},
-+
-+      /* DAC inv mux 1 */
-+      {"DAC Inv Mux 1", "Mono", "Mono Mixer"},
-+      {"DAC Inv Mux 1", "Speaker", "Speaker Mixer"},
-+      {"DAC Inv Mux 1", "Left Headphone", "Left HP Mixer"},
-+      {"DAC Inv Mux 1", "Right Headphone", "Right HP Mixer"},
-+      {"DAC Inv Mux 1", "Headphone Mono", "HP Mixer"},
-+
-+      /* DAC inv mux 2 */
-+      {"DAC Inv Mux 2", "Mono", "Mono Mixer"},
-+      {"DAC Inv Mux 2", "Speaker", "Speaker Mixer"},
-+      {"DAC Inv Mux 2", "Left Headphone", "Left HP Mixer"},
-+      {"DAC Inv Mux 2", "Right Headphone", "Right HP Mixer"},
-+      {"DAC Inv Mux 2", "Headphone Mono", "HP Mixer"},
-+
-+      /* headphone left mux */
-+      {"Left Headphone Out Mux", "Headphone", "Left HP Mixer"},
-+
-+      /* headphone right mux */
-+      {"Right Headphone Out Mux", "Headphone", "Right HP Mixer"},
-+
-+      /* speaker left mux */
-+      {"Left Speaker Out Mux", "Headphone", "Left HP Mixer"},
-+      {"Left Speaker Out Mux", "Speaker", "Speaker Mixer"},
-+      {"Left Speaker Out Mux", "Inv", "DAC Inv Mux 1"},
-+
-+      /* speaker right mux */
-+      {"Right Speaker Out Mux", "Headphone", "Right HP Mixer"},
-+      {"Right Speaker Out Mux", "Speaker", "Speaker Mixer"},
-+      {"Right Speaker Out Mux", "Inv", "DAC Inv Mux 2"},
-+
-+      /* mono mux */
-+      {"Mono Out Mux", "Mono", "Mono Mixer"},
-+      {"Mono Out Mux", "Inv", "DAC Inv Mux 1"},
-+
-+      /* out 3 mux */
-+      {"Out 3 Mux", "Inv 1", "DAC Inv Mux 1"},
-+
-+      /* out 4 mux */
-+      {"Out 4 Mux", "Inv 2", "DAC Inv Mux 2"},
-+
-+      /* output pga */
-+      {"HPL", NULL, "Left Headphone"},
-+      {"Left Headphone", NULL, "Left Headphone Out Mux"},
-+      {"HPR", NULL, "Right Headphone"},
-+      {"Right Headphone", NULL, "Right Headphone Out Mux"},
-+      {"OUT3", NULL, "Out 3"},
-+      {"Out 3", NULL, "Out 3 Mux"},
-+      {"OUT4", NULL, "Out 4"},
-+      {"Out 4", NULL, "Out 4 Mux"},
-+      {"SPKL", NULL, "Left Speaker"},
-+      {"Left Speaker", NULL, "Left Speaker Out Mux"},
-+      {"SPKR", NULL, "Right Speaker"},
-+      {"Right Speaker", NULL, "Right Speaker Out Mux"},
-+      {"MONO", NULL, "Mono Out"},
-+      {"Mono Out", NULL, "Mono Out Mux"},
-+
-+      /* input pga */
-+      {"Left Line In", NULL, "LINEL"},
-+      {"Right Line In", NULL, "LINER"},
-+      {"Mono In", NULL, "MONOIN"},
-+      {"Mic A PGA", NULL, "Mic A Pre Amp"},
-+      {"Mic B PGA", NULL, "Mic B Pre Amp"},
-+
-+      /* left capture select */
-+      {"Left Capture Source", "Mic 1", "Mic A Pre Amp"},
-+      {"Left Capture Source", "Mic 2", "Mic B Pre Amp"},
-+      {"Left Capture Source", "Line", "LINEL"},
-+      {"Left Capture Source", "Mono In", "MONOIN"},
-+      {"Left Capture Source", "Headphone", "Left HP Mixer"},
-+      {"Left Capture Source", "Speaker", "Speaker Mixer"},
-+      {"Left Capture Source", "Mono Out", "Mono Mixer"},
-+
-+      /* right capture select */
-+      {"Right Capture Source", "Mic 1", "Mic A Pre Amp"},
-+      {"Right Capture Source", "Mic 2", "Mic B Pre Amp"},
-+      {"Right Capture Source", "Line", "LINER"},
-+      {"Right Capture Source", "Mono In", "MONOIN"},
-+      {"Right Capture Source", "Headphone", "Right HP Mixer"},
-+      {"Right Capture Source", "Speaker", "Speaker Mixer"},
-+      {"Right Capture Source", "Mono Out", "Mono Mixer"},
-+
-+      /* left ADC */
-+      {"Left ADC", NULL, "Left Capture Source"},
-+
-+      /* right ADC */
-+      {"Right ADC", NULL, "Right Capture Source"},
-+
-+      /* mic */
-+      {"Mic A Pre Amp", NULL, "Mic A Source"},
-+      {"Mic A Source", "Mic 1", "MIC1"},
-+      {"Mic A Source", "Mic 2 A", "MIC2A"},
-+      {"Mic A Source", "Mic 2 B", "Mic B Source"},
-+      {"Mic B Pre Amp", "MPB", "Mic B Source"},
-+      {"Mic B Source", NULL, "MIC2B"},
-+
-+      /* headphone capture */
-+      {"Capture Headphone Mux", "Stereo", "Capture Mixer"},
-+      {"Capture Headphone Mux", "Left", "Left Capture Source"},
-+      {"Capture Headphone Mux", "Right", "Right Capture Source"},
-+
-+      /* mono capture */
-+      {"Capture Mono Mux", "Stereo", "Capture Mixer"},
-+      {"Capture Mono Mux", "Left", "Left Capture Source"},
-+      {"Capture Mono Mux", "Right", "Right Capture Source"},
-+
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm9713_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm9713_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm9713_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+static unsigned int ac97_read(struct snd_soc_codec *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+
-+      if (reg == AC97_RESET || reg == AC97_GPIO_STATUS ||
-+              reg == AC97_VENDOR_ID1 || reg == AC97_VENDOR_ID2 ||
-+              reg == AC97_CD)
-+              return soc_ac97_ops.read(codec->ac97, reg);
-+      else {
-+              reg = reg >> 1;
-+
-+              if (reg > (ARRAY_SIZE(wm9713_reg)))
-+                      return -EIO;
-+
-+              return cache[reg];
-+      }
-+}
-+
-+static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int val)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg < 0x7c)
-+              soc_ac97_ops.write(codec->ac97, reg, val);
-+      reg = reg >> 1;
-+      if (reg <= (ARRAY_SIZE(wm9713_reg)))
-+              cache[reg] = val;
-+
-+      return 0;
-+}
-+
-+struct pll_ {
-+      unsigned int in_hz;
-+      unsigned int lf:1; /* allows low frequency use */
-+      unsigned int sdm:1; /* allows fraction n div */
-+      unsigned int divsel:1; /* enables input clock div */
-+      unsigned int divctl:1; /* input clock divider */
-+      unsigned int n:4;
-+      unsigned int k;
-+};
-+
-+struct pll_ pll[] = {
-+      {13000000, 0, 1, 0, 0, 7, 0x23f488},
-+      {2048000,  1, 0, 0, 0, 12, 0x0},
-+      {4096000,  1, 0, 0, 0, 6, 0x0},
-+      {12288000, 0, 0, 0, 0, 8, 0x0},
-+      /* liam - add more entries */
-+};
-+
-+/* we must have either 24.576MHz or a PLL freq */
-+static unsigned int wm9713_config_ac97sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      int i;
-+      dai->mclk = 0;
-+
-+      /* first check if we can get away witout burning any PLL power */
-+      if (24576000 == clk) {
-+              /* standard AC97 clock */
-+              dai->mclk = clk;
-+              goto out;
-+      }
-+
-+      /* ok no standard clock, so we must now try the PLL */
-+      for(i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (clk == pll[i].in_hz) {
-+                      dai->mclk = clk; /* clock out */
-+                      goto out;
-+              }
-+      }
-+
-+out:
-+      return dai->mclk;
-+}
-+
-+/* The WM9713 voice DAC can only run at 256FS. This interface and DAC are
-+ * clocked by the main AC97 clock divided down to 256 FS.
-+ */
-+static unsigned int wm9713_config_vsysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+
-+      int i, j, best_clk = info->fs * info->rate;
-+
-+      /* can we run at this clk without the PLL ? */
-+      for (i = 1; i <= 16; i++) {
-+              if (best_clk * i == clk) {
-+                      dai->pll_in = 0;
-+                      dai->clk_div = i << 1;
-+                      dai->mclk = best_clk;
-+                      return dai->mclk;
-+              }
-+      }
-+
-+      /* now check for PLL support */
-+      for (i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (pll[i].in_hz == clk) {
-+                      for (j = 1; j <= 16; j++) {
-+                              if (24576000 == j * best_clk) {
-+                                      dai->pll_in = clk;
-+                                      dai->pll_out = 24576000;
-+                                      dai->clk_div = j << 1;
-+                                      dai->mclk = best_clk;
-+                                      return dai->mclk;
-+                              }
-+                      }
-+              }
-+      }
-+
-+      /* this clk is not supported */
-+      return 0;
-+}
-+
-+u32 wm9713_set_pll(struct snd_soc_codec *codec, u32 in)
-+{
-+      struct wm9713 *wm = (struct wm9713*)codec->private_data;
-+      int i;
-+      u16 reg, reg2;
-+
-+      /* turn PLL off ? */
-+      if (in == 0) {
-+              /* disable PLL power and select ext source */
-+              reg = ac97_read(codec, AC97_HANDSET_RATE);
-+              ac97_write(codec, AC97_HANDSET_RATE, reg | 0x0080);
-+              reg = ac97_read(codec, AC97_EXTENDED_MID);
-+              ac97_write(codec, AC97_EXTENDED_MID, reg | 0x0200);
-+              wm->pll = 0;
-+              return 0;
-+      }
-+
-+      for (i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (pll[i].in_hz == in)
-+                      goto found;
-+      }
-+      return -EINVAL;
-+
-+found:
-+      if (pll[i].sdm == 0) {
-+              reg = (pll[i].n << 12) | (pll[i].lf << 11) |
-+                      (pll[i].divsel << 9) | (pll[i].divctl << 8);
-+              ac97_write(codec, AC97_LINE1_LEVEL, reg);
-+      } else {
-+              /* write the fractional k to the reg 0x46 pages */
-+              reg2 = (pll[i].n << 12) | (pll[i].lf << 11) | (pll[i].sdm << 10) |
-+                      (pll[i].divsel << 9) | (pll[i].divctl << 8);
-+
-+              reg = reg2 | (0x5 << 4) | (pll[i].k >> 20); /* K [21:20] */
-+              ac97_write(codec, AC97_LINE1_LEVEL, reg);
-+
-+              reg = reg2 | (0x4 << 4) | ((pll[i].k >> 16) & 0xf); /* K [19:16] */
-+              ac97_write(codec, AC97_LINE1_LEVEL, reg);
-+
-+              reg = reg2 | (0x3 << 4) | ((pll[i].k >> 12) & 0xf); /* K [15:12] */
-+              ac97_write(codec, AC97_LINE1_LEVEL, reg);
-+
-+              reg = reg2 | (0x2 << 4) | ((pll[i].k >> 8) & 0xf); /* K [11:8] */
-+              ac97_write(codec, AC97_LINE1_LEVEL, reg);
-+
-+              reg = reg2 | (0x1 << 4) | ((pll[i].k >> 4) & 0xf); /* K [7:4] */
-+              ac97_write(codec, AC97_LINE1_LEVEL, reg);
-+
-+              reg = reg2 | (0x0 << 4) | (pll[i].k & 0xf); /* K [3:0] */
-+              ac97_write(codec, AC97_LINE1_LEVEL, reg);
-+      }
-+
-+      /* turn PLL on and select as source */
-+      reg = ac97_read(codec, AC97_EXTENDED_MID);
-+      ac97_write(codec, AC97_EXTENDED_MID, reg & 0xfdff);
-+      reg = ac97_read(codec, AC97_HANDSET_RATE);
-+      ac97_write(codec, AC97_HANDSET_RATE, reg & 0xff7f);
-+      /* wait 10ms AC97 link frames for the link to stabilise */
-+      schedule_timeout_interruptible(msecs_to_jiffies(10));
-+      wm->pll = in;
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(wm9713_set_pll);
-+
-+static int wm9713_voice_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 reg = 0x8000, bfs, div, gpio;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+      gpio = ac97_read(codec, AC97_GPIO_CFG) & 0xffe2;
-+
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK){
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              reg |= 0x4000;
-+              gpio |= 0x0008;
-+              break;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              reg |= 0x6000;
-+              gpio |= 0x000c;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              reg |= 0x0200;
-+              gpio |= 0x000d;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFM:
-+              gpio |= 0x0009;
-+              break;
-+      }
-+      ac97_write(codec, AC97_GPIO_CFG, gpio);
-+
-+      /* enable PLL if needed */
-+      if (rtd->codec_dai->pll_in)
-+              wm9713_set_pll(codec, rtd->codec_dai->pll_in);
-+
-+      /* set the PCM divider */
-+      div = ac97_read(codec, AC97_HANDSET_RATE) & 0xf0ff;
-+      ac97_write(codec, AC97_HANDSET_RATE, div |
-+              ((rtd->codec_dai->clk_div >> 1) -1) << 8);
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_IB_IF:
-+              reg |= 0x00c0;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              reg |= 0x0080;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              reg |= 0x0040;
-+              break;
-+      }
-+
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              reg |= 0x0002;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              reg |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              reg |= 0x0003;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_B:
-+              reg |= 0x0043;
-+              break;
-+      }
-+
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              reg |= 0x0004;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              reg |= 0x0008;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              reg |= 0x000c;
-+              break;
-+      }
-+
-+      switch (bfs) {
-+      case 2:
-+              reg |= (0x1 << 9);
-+              break;
-+      case 4:
-+              reg |= (0x2 << 9);
-+              break;
-+      case 8:
-+              reg |= (0x3 << 9);
-+              break;
-+      case 16:
-+              reg |= (0x4 << 9);
-+              break;
-+      }
-+
-+      /* enable PCM interface in master mode */
-+      ac97_write(codec, AC97_CENTER_LFE_MASTER, reg);
-+      return 0;
-+}
-+
-+static void wm9713_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (!codec->active)
-+              wm9713_set_pll(codec, 0);
-+}
-+
-+static void wm9713_voiceshutdown(snd_pcm_substream_t *substream)
-+{
-+    struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+    struct snd_soc_device *socdev = rtd->socdev;
-+    struct snd_soc_codec *codec = socdev->codec;
-+    u16 status;
-+
-+    wm9713_shutdown(substream);
-+
-+    /* Gracefully shut down the voice interface. */
-+    status = ac97_read(codec, AC97_EXTENDED_STATUS) | 0x1000;
-+    ac97_write(codec,AC97_HANDSET_RATE,0x0280);
-+    schedule_timeout_interruptible(msecs_to_jiffies(1));
-+    ac97_write(codec,AC97_HANDSET_RATE,0x0F80);
-+    ac97_write(codec,AC97_EXTENDED_MID,status);
-+}
-+
-+static int ac97_hifi_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int reg;
-+      u16 vra;
-+
-+      /* we need a 24576000Hz clock to run at the correct speed */
-+      if (rtd->codec_dai->mclk != 24576000)
-+              wm9713_set_pll(codec, rtd->codec_dai->mclk);
-+
-+      vra = ac97_read(codec, AC97_EXTENDED_STATUS);
-+      ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              reg = AC97_PCM_FRONT_DAC_RATE;
-+      else
-+              reg = AC97_PCM_LR_ADC_RATE;
-+
-+      return ac97_write(codec, reg, runtime->rate);
-+}
-+
-+static int ac97_aux_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 vra, xsle;
-+
-+      /* we need a 24576000Hz clock to run at the correct speed */
-+      if (rtd->codec_dai->mclk != 24576000)
-+              wm9713_set_pll(codec, rtd->codec_dai->mclk);
-+
-+      vra = ac97_read(codec, AC97_EXTENDED_STATUS);
-+      ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);
-+      xsle = ac97_read(codec, AC97_PCI_SID);
-+      ac97_write(codec, AC97_PCI_SID, xsle | 0x8000);
-+
-+      if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
-+              return -ENODEV;
-+
-+      return ac97_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate);
-+}
-+
-+struct snd_soc_codec_dai wm9713_dai[] = {
-+{
-+      .name = "AC97 HiFi",
-+      .playback = {
-+              .stream_name = "HiFi Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = {
-+              .stream_name = "HiFi Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .config_sysclk = wm9713_config_ac97sysclk,
-+      .ops = {
-+              .shutdown = wm9713_shutdown,
-+              .prepare = ac97_hifi_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(ac97_modes),
-+              .mode = ac97_modes,},},
-+      {
-+      .name = "AC97 Aux",
-+      .playback = {
-+              .stream_name = "Aux Playback",
-+              .channels_min = 1,
-+              .channels_max = 1,},
-+      .config_sysclk = wm9713_config_ac97sysclk,
-+      .ops = {
-+              .shutdown = wm9713_shutdown,
-+              .prepare = ac97_aux_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(ac97_modes),
-+              .mode = ac97_modes,}
-+      },
-+      {
-+      .name = "WM9713 Voice",
-+      .playback = {
-+              .stream_name = "Voice Playback",
-+              .channels_min = 1,
-+              .channels_max = 1,},
-+      .capture = {
-+              .stream_name = "Voice Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .config_sysclk = wm9713_config_vsysclk,
-+      .ops = {
-+              .prepare = wm9713_voice_prepare,
-+              .shutdown = wm9713_voiceshutdown,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm9713_voice_modes),
-+              .mode = wm9713_voice_modes,},
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm9713_dai);
-+
-+int wm9713_reset(struct snd_soc_codec *codec, int try_warm)
-+{
-+      if (try_warm && soc_ac97_ops.warm_reset) {
-+              soc_ac97_ops.warm_reset(codec->ac97);
-+              if (!(ac97_read(codec, 0) & 0x8000))
-+                      return 1;
-+      }
-+
-+      soc_ac97_ops.reset(codec->ac97);
-+      if (ac97_read(codec, 0) & 0x8000)
-+              return -EIO;
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(wm9713_reset);
-+
-+static int wm9713_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      u16 reg;
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* enable thermal shutdown */
-+              reg = ac97_read(codec, AC97_EXTENDED_MID) & 0x1bff;
-+              ac97_write(codec, AC97_EXTENDED_MID, reg);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* enable master bias and vmid */
-+              reg = ac97_read(codec, AC97_EXTENDED_MID) & 0x3bff;
-+              ac97_write(codec, AC97_EXTENDED_MID, reg);
-+              ac97_write(codec, AC97_POWERDOWN, 0x0000);
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              /* disable everything including AC link */
-+              ac97_write(codec, AC97_EXTENDED_MID, 0xffff);
-+              ac97_write(codec, AC97_EXTENDED_MSTATUS, 0xffff);
-+              ac97_write(codec, AC97_POWERDOWN, 0xffff);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+static int wm9713_soc_suspend(struct platform_device *pdev,
-+      pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct wm9713 *wm = (struct wm9713*)codec->private_data;
-+
-+      if (wm->pll) {
-+              wm->pll_resume = wm->pll;
-+              wm9713_set_pll(codec, 0);
-+      }
-+      wm9713_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm9713_soc_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct wm9713 *wm = (struct wm9713*)codec->private_data;
-+      int i, ret;
-+      u16 *cache = codec->reg_cache;
-+
-+      if ((ret = wm9713_reset(codec, 1)) < 0){
-+              printk(KERN_ERR "could not reset AC97 codec\n");
-+              return ret;
-+      }
-+
-+      wm9713_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      /* only synchronise the codec if warm reset failed */
-+      if (ret == 0) {
-+              for (i = 2; i < ARRAY_SIZE(wm9713_reg) << 1; i+=2) {
-+                      if (i == AC97_POWERDOWN || i == AC97_EXTENDED_MID ||
-+                              i == AC97_EXTENDED_MSTATUS || i > 0x66)
-+                              continue;
-+                      soc_ac97_ops.write(codec->ac97, i, cache[i>>1]);
-+              }
-+      }
-+
-+      if (wm->pll_resume) {
-+              wm9713_set_pll(codec, wm->pll_resume);
-+              wm->pll_resume = 0;
-+      }
-+
-+      if (codec->suspend_dapm_state == SNDRV_CTL_POWER_D0)
-+              wm9713_dapm_event(codec, SNDRV_CTL_POWER_D0);
-+
-+      return ret;
-+}
-+
-+static int wm9713_soc_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec;
-+      int ret = 0, reg;
-+
-+      printk(KERN_INFO "WM9713/WM9714 SoC Audio Codec %s\n", WM9713_VERSION);
-+
-+      socdev->codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (socdev->codec == NULL)
-+              return -ENOMEM;
-+      codec = socdev->codec;
-+      mutex_init(&codec->mutex);
-+
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm9713_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL){
-+              kfree(socdev->codec);
-+              socdev->codec = NULL;
-+              return -ENOMEM;
-+      }
-+      memcpy(codec->reg_cache, wm9713_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm9713_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm9713_reg);
-+      codec->reg_cache_step = 2;
-+
-+      codec->private_data = kzalloc(sizeof(struct wm9713), GFP_KERNEL);
-+      if (codec->private_data == NULL) {
-+              kfree(codec->reg_cache);
-+              kfree(socdev->codec);
-+              socdev->codec = NULL;
-+              return -ENOMEM;
-+      }
-+
-+      codec->name = "WM9713";
-+      codec->owner = THIS_MODULE;
-+      codec->dai = wm9713_dai;
-+      codec->num_dai = ARRAY_SIZE(wm9713_dai);
-+      codec->write = ac97_write;
-+      codec->read = ac97_read;
-+      codec->dapm_event = wm9713_dapm_event;
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
-+      if (ret < 0)
-+              goto err;
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if (ret < 0)
-+              goto pcm_err;
-+
-+      /* do a cold reset for the controller and then try
-+       * a warm reset followed by an optional cold reset for codec */
-+      wm9713_reset(codec, 0);
-+      ret = wm9713_reset(codec, 1);
-+      if (ret < 0)    {
-+              printk(KERN_ERR "AC97 link error\n");
-+              goto reset_err;
-+      }
-+
-+      wm9713_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      /* unmute the adc - move to kcontrol */
-+      reg = ac97_read(codec, AC97_CD) & 0x7fff;
-+      ac97_write(codec, AC97_CD, reg);
-+
-+      wm9713_add_controls(codec);
-+      wm9713_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if (ret < 0)
-+              goto reset_err;
-+      return 0;
-+
-+reset_err:
-+      snd_soc_free_pcms(socdev);
-+
-+pcm_err:
-+      snd_soc_free_ac97_codec(codec);
-+
-+err:
-+      kfree(socdev->codec->private_data);
-+      kfree(socdev->codec->reg_cache);
-+      kfree(socdev->codec);
-+      socdev->codec = NULL;
-+      return ret;
-+}
-+
-+static int wm9713_soc_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec == NULL)
-+              return 0;
-+
-+      snd_soc_dapm_free(socdev);
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_free_ac97_codec(codec);
-+      kfree(codec->private_data);
-+      kfree(codec->reg_cache);
-+      kfree(codec);
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm9713= {
-+      .probe =        wm9713_soc_probe,
-+      .remove =       wm9713_soc_remove,
-+      .suspend =      wm9713_soc_suspend,
-+      .resume =       wm9713_soc_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm9713);
-+
-+MODULE_DESCRIPTION("ASoC WM9713/WM9714 driver");
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm9713.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm9713.h
-@@ -0,0 +1,18 @@
-+/*
-+ * wm9713.h  --  WM9713 Soc Audio driver
-+ */
-+
-+#ifndef _WM9713_H
-+#define _WM9713_H
-+
-+#define WM9713_DAI_AC97_HIFI  0
-+#define WM9713_DAI_AC97_AUX           1
-+#define WM9713_DAI_PCM_VOICE  2
-+
-+extern struct snd_soc_codec_device soc_codec_dev_wm9713;
-+extern struct snd_soc_codec_dai wm9713_dai[3];
-+
-+u32 wm9713_set_pll(struct snd_soc_codec *codec, u32 in);
-+int wm9713_reset(struct snd_soc_codec *codec,  int try_warm);
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/pxa/Kconfig
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/Kconfig
-@@ -0,0 +1,125 @@
-+menu "SoC Audio for the Intel PXA2xx"
-+
-+config SND_PXA2xx_SOC
-+      tristate "SoC Audio for the Intel PXA2xx chip"
-+      depends on ARCH_PXA && SND
-+      select SND_PCM
-+      help
-+        Say Y or M if you want to add support for codecs attached to
-+        the PXA2xx AC97, I2S or SSP interface. You will also need
-+        to select the audio interfaces to support below.
-+
-+config SND_PXA2xx_AC97
-+      tristate
-+      select SND_AC97_CODEC
-+
-+config SND_PXA2xx_SOC_AC97
-+      tristate
-+      select SND_AC97_BUS
-+      select SND_SOC_AC97_BUS
-+
-+config SND_PXA2xx_SOC_I2S
-+      tristate
-+
-+config SND_PXA2xx_SOC_SSP
-+      tristate
-+      select PXA_SSP
-+
-+config SND_PXA2xx_SOC_MAINSTONE
-+      tristate "SoC AC97 Audio support for Intel Mainstone"
-+      depends on SND_PXA2xx_SOC && MACH_MAINSTONE
-+      select SND_PXA2xx_AC97
-+      help
-+        Say Y if you want to add support for generic AC97 SoC audio on Mainstone.
-+
-+config SND_PXA2xx_SOC_MAINSTONE_WM8731
-+      tristate "SoC I2S Audio support for Intel Mainstone - WM8731"
-+      depends on SND_PXA2xx_SOC && MACH_MAINSTONE
-+      select SND_PXA2xx_SOC_I2S
-+      help
-+        Say Y if you want to add support for SoC audio on Mainstone
-+        with the WM8731.
-+
-+config SND_PXA2xx_SOC_MAINSTONE_WM8753
-+      tristate "SoC I2S/SSP Audio support for Intel Mainstone - WM8753"
-+      depends on SND_PXA2xx_SOC && MACH_MAINSTONE
-+      select SND_PXA2xx_SOC_I2S
-+      select SND_PXA2xx_SOC_SSP
-+      help
-+        Say Y if you want to add support for SoC audio on Mainstone
-+        with the WM8753.
-+
-+config SND_PXA2xx_SOC_MAINSTONE_WM8974
-+      tristate "SoC I2S Audio support for Intel Mainstone - WM8974"
-+      depends on SND_PXA2xx_SOC && MACH_MAINSTONE
-+      select SND_PXA2xx_SOC_I2S
-+      help
-+        Say Y if you want to add support for SoC audio on Mainstone
-+        with the WM8974.
-+
-+config SND_PXA2xx_SOC_MAINSTONE_WM9713
-+      tristate "SoC I2S/SSP Audio support for Intel Mainstone - WM9713"
-+      depends on SND_PXA2xx_SOC && MACH_MAINSTONE
-+      select SND_PXA2xx_SOC_AC97
-+      select SND_PXA2xx_SOC_SSP
-+      help
-+        Say Y if you want to add support for SoC voice audio on Mainstone
-+        with the WM9713.
-+
-+config SND_MAINSTONE_BASEBAND
-+      tristate "Example SoC Baseband Audio support for Intel Mainstone"
-+      depends on SND_PXA2xx_SOC && MACH_MAINSTONE
-+      select SND_PXA2xx_SOC_AC97
-+      help
-+        Say Y if you want to add support for SoC baseband on Mainstone
-+        with the WM9713 and example Baseband modem.
-+
-+config SND_MAINSTONE_BLUETOOTH
-+      tristate "Example SoC Bluetooth Audio support for Intel Mainstone"
-+      depends on SND_PXA2xx_SOC && MACH_MAINSTONE
-+      select SND_PXA2xx_SOC_I2S
-+      help
-+        Say Y if you want to add support for SoC bluetooth on Mainstone
-+        with the WM8753 and example Bluetooth codec.
-+
-+config SND_PXA2xx_SOC_MAINSTONE_WM9712
-+      tristate "SoC I2S/SSP Audio support for Intel Mainstone - WM9712"
-+      depends on SND_PXA2xx_SOC && MACH_MAINSTONE
-+      select SND_PXA2xx_SOC_AC97
-+      help
-+        Say Y if you want to add support for SoC voice audio on Mainstone
-+        with the WM9712.
-+
-+config SND_PXA2xx_SOC_CORGI
-+      tristate "SoC Audio support for Sharp Zaurus SL-C7x0"
-+      depends on SND_PXA2xx_SOC && PXA_SHARP_C7xx
-+      select SND_PXA2xx_SOC_I2S
-+      help
-+        Say Y if you want to add support for SoC audio on Sharp
-+        Zaurus SL-C7x0 models (Corgi, Shepherd, Husky).
-+
-+config SND_PXA2xx_SOC_SPITZ
-+      tristate "SoC Audio support for Sharp Zaurus SL-Cxx00"
-+      depends on SND_PXA2xx_SOC && PXA_SHARP_Cxx00
-+      select SND_PXA2xx_SOC_I2S
-+      help
-+        Say Y if you want to add support for SoC audio on Sharp
-+        Zaurus SL-Cxx00 models (Spitz, Borzoi and Akita).
-+
-+config SND_PXA2xx_SOC_POODLE
-+      tristate "SoC Audio support for Poodle"
-+      depends on SND_PXA2xx_SOC && MACH_POODLE
-+      select SND_PXA2xx_SOC_I2S
-+      help
-+        Say Y if you want to add support for SoC audio on Sharp
-+        Zaurus SL-5600 model (Poodle).
-+
-+config SND_PXA2xx_SOC_TOSA
-+      tristate "SoC AC97 Audio support for Tosa"
-+      depends on SND_PXA2xx_SOC && MACH_TOSA
-+      select SND_PXA2xx_SOC_AC97
-+      help
-+        Say Y if you want to add support for SoC audio on Sharp
-+        Zaurus SL-C6000x models (Tosa).
-+
-+endmenu
-Index: linux-2.6-pxa-new/sound/soc/pxa/Makefile
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/Makefile
-@@ -0,0 +1,36 @@
-+# PXA Platform Support
-+snd-soc-pxa2xx-objs := pxa2xx-pcm.o
-+snd-soc-pxa2xx-ac97-objs := pxa2xx-ac97.o
-+snd-soc-pxa2xx-i2s-objs := pxa2xx-i2s.o
-+snd-soc-pxa2xx-ssp-objs := pxa2xx-ssp.o
-+
-+obj-$(CONFIG_SND_PXA2xx_SOC) += snd-soc-pxa2xx.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_AC97) += snd-soc-pxa2xx-ac97.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_I2S) += snd-soc-pxa2xx-i2s.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_SSP) += snd-soc-pxa2xx-ssp.o
-+
-+# PXA Machine Support
-+snd-soc-corgi-objs := corgi.o
-+snd-soc-mainstone-wm8731-objs := mainstone_wm8731.o
-+snd-soc-mainstone-wm8753-objs := mainstone_wm8753.o
-+snd-soc-mainstone-wm8974-objs := mainstone_wm8974.o
-+snd-soc-mainstone-wm9713-objs := mainstone_wm9713.o
-+snd-soc-mainstone-wm9712-objs := mainstone_wm9712.o
-+snd-soc-mainstone-baseband-objs := mainstone_baseband.o
-+snd-soc-mainstone-bluetooth-objs := mainstone_bluetooth.o
-+snd-soc-poodle-objs := poodle.o
-+snd-soc-tosa-objs := tosa.o
-+snd-soc-spitz-objs := spitz.o
-+
-+obj-$(CONFIG_SND_PXA2xx_SOC_CORGI) += snd-soc-corgi.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8731) += snd-soc-mainstone-wm8731.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753) += snd-soc-mainstone-wm8753.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8974) += snd-soc-mainstone-wm8974.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713) += snd-soc-mainstone-wm9713.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712) += snd-soc-mainstone-wm9712.o
-+obj-$(CONFIG_SND_MAINSTONE_BASEBAND) += snd-soc-mainstone-baseband.o
-+obj-$(CONFIG_SND_MAINSTONE_BLUETOOTH) += snd-soc-mainstone-bluetooth.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_POODLE) += snd-soc-poodle.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_TOSA) += snd-soc-tosa.o
-+obj-$(CONFIG_SND_PXA2xx_SOC_SPITZ) += snd-soc-spitz.o
-+
-Index: linux-2.6-pxa-new/sound/soc/pxa/corgi.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/corgi.c
-@@ -0,0 +1,361 @@
-+/*
-+ * corgi.c  --  SoC audio for Corgi
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Authors: Liam Girdwood <liam.girdwood@wolfsonmicro.com>
-+ *          Richard Purdie <richard@openedhand.com>
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    30th Nov 2005   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/timer.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/hardware/scoop.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/hardware.h>
-+#include <asm/arch/corgi.h>
-+#include <asm/arch/audio.h>
-+
-+#include "../codecs/wm8731.h"
-+#include "pxa2xx-pcm.h"
-+
-+#define CORGI_HP        0
-+#define CORGI_MIC       1
-+#define CORGI_LINE      2
-+#define CORGI_HEADSET   3
-+#define CORGI_HP_OFF    4
-+#define CORGI_SPK_ON    0
-+#define CORGI_SPK_OFF   1
-+
-+ /* audio clock in Hz - rounded from 12.235MHz */
-+#define CORGI_AUDIO_CLOCK 12288000
-+
-+static int corgi_jack_func;
-+static int corgi_spk_func;
-+
-+static void corgi_ext_control(struct snd_soc_codec *codec)
-+{
-+      int spk = 0, mic = 0, line = 0, hp = 0, hs = 0;
-+
-+      /* set up jack connection */
-+      switch (corgi_jack_func) {
-+      case CORGI_HP:
-+              hp = 1;
-+              /* set = unmute headphone */
-+              set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L);
-+              set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_R);
-+              break;
-+      case CORGI_MIC:
-+              mic = 1;
-+              /* reset = mute headphone */
-+              reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L);
-+              reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_R);
-+              break;
-+      case CORGI_LINE:
-+              line = 1;
-+              reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L);
-+              reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_R);
-+              break;
-+      case CORGI_HEADSET:
-+              hs = 1;
-+              mic = 1;
-+              reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L);
-+              set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_R);
-+              break;
-+      }
-+
-+      if (corgi_spk_func == CORGI_SPK_ON)
-+              spk = 1;
-+
-+      /* set the enpoints to their new connetion states */
-+      snd_soc_dapm_set_endpoint(codec, "Ext Spk", spk);
-+      snd_soc_dapm_set_endpoint(codec, "Mic Jack", mic);
-+      snd_soc_dapm_set_endpoint(codec, "Line Jack", line);
-+      snd_soc_dapm_set_endpoint(codec, "Headphone Jack", hp);
-+      snd_soc_dapm_set_endpoint(codec, "Headset Jack", hs);
-+
-+      /* signal a DAPM event */
-+      snd_soc_dapm_sync_endpoints(codec);
-+}
-+
-+static int corgi_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->socdev->codec;
-+
-+      /* check the jack status at stream startup */
-+      corgi_ext_control(codec);
-+      return 0;
-+}
-+
-+/* we need to unmute the HP at shutdown as the mute burns power on corgi */
-+static int corgi_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->socdev->codec;
-+
-+      /* set = unmute headphone */
-+      set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L);
-+      set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_R);
-+      return 0;
-+}
-+
-+static struct snd_soc_ops corgi_ops = {
-+      .startup = corgi_startup,
-+      .shutdown = corgi_shutdown,
-+};
-+
-+static int corgi_get_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = corgi_jack_func;
-+      return 0;
-+}
-+
-+static int corgi_set_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-+
-+      if (corgi_jack_func == ucontrol->value.integer.value[0])
-+              return 0;
-+
-+      corgi_jack_func = ucontrol->value.integer.value[0];
-+      corgi_ext_control(codec);
-+      return 1;
-+}
-+
-+static int corgi_get_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = corgi_spk_func;
-+      return 0;
-+}
-+
-+static int corgi_set_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+
-+      if (corgi_spk_func == ucontrol->value.integer.value[0])
-+              return 0;
-+
-+      corgi_spk_func = ucontrol->value.integer.value[0];
-+      corgi_ext_control(codec);
-+      return 1;
-+}
-+
-+static int corgi_amp_event(struct snd_soc_dapm_widget *w, int event)
-+{
-+      if (SND_SOC_DAPM_EVENT_ON(event))
-+              set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_APM_ON);
-+      else
-+              reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_APM_ON);
-+
-+      return 0;
-+}
-+
-+static int corgi_mic_event(struct snd_soc_dapm_widget *w, int event)
-+{
-+      if (SND_SOC_DAPM_EVENT_ON(event))
-+              set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MIC_BIAS);
-+      else
-+              reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MIC_BIAS);
-+
-+      return 0;
-+}
-+
-+/* corgi machine dapm widgets */
-+static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = {
-+SND_SOC_DAPM_HP("Headphone Jack", NULL),
-+SND_SOC_DAPM_MIC("Mic Jack", corgi_mic_event),
-+SND_SOC_DAPM_SPK("Ext Spk", corgi_amp_event),
-+SND_SOC_DAPM_LINE("Line Jack", NULL),
-+SND_SOC_DAPM_HP("Headset Jack", NULL),
-+};
-+
-+/* Corgi machine audio map (connections to the codec pins) */
-+static const char *audio_map[][3] = {
-+
-+      /* headset Jack  - in = micin, out = LHPOUT*/
-+      {"Headset Jack", NULL, "LHPOUT"},
-+
-+      /* headphone connected to LHPOUT1, RHPOUT1 */
-+      {"Headphone Jack", NULL, "LHPOUT"},
-+      {"Headphone Jack", NULL, "RHPOUT"},
-+
-+      /* speaker connected to LOUT, ROUT */
-+      {"Ext Spk", NULL, "ROUT"},
-+      {"Ext Spk", NULL, "LOUT"},
-+
-+      /* mic is connected to MICIN (via right channel of headphone jack) */
-+      {"MICIN", NULL, "Mic Jack"},
-+
-+      /* Same as the above but no mic bias for line signals */
-+      {"MICIN", NULL, "Line Jack"},
-+
-+      {NULL, NULL, NULL},
-+};
-+
-+static const char *jack_function[] = {"Headphone", "Mic", "Line", "Headset",
-+      "Off"};
-+static const char *spk_function[] = {"On", "Off"};
-+static const struct soc_enum corgi_enum[] = {
-+      SOC_ENUM_SINGLE_EXT(5, jack_function),
-+      SOC_ENUM_SINGLE_EXT(2, spk_function),
-+};
-+
-+static const struct snd_kcontrol_new wm8731_corgi_controls[] = {
-+      SOC_ENUM_EXT("Jack Function", corgi_enum[0], corgi_get_jack,
-+              corgi_set_jack),
-+      SOC_ENUM_EXT("Speaker Function", corgi_enum[1], corgi_get_spk,
-+              corgi_set_spk),
-+};
-+
-+/*
-+ * Logic for a wm8731 as connected on a Sharp SL-C7x0 Device
-+ */
-+static int corgi_wm8731_init(struct snd_soc_codec *codec)
-+{
-+      int i, err;
-+
-+      snd_soc_dapm_set_endpoint(codec, "LLINEIN", 0);
-+      snd_soc_dapm_set_endpoint(codec, "RLINEIN", 0);
-+
-+      /* Add corgi specific controls */
-+      for (i = 0; i < ARRAY_SIZE(wm8731_corgi_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                      snd_soc_cnew(&wm8731_corgi_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      /* Add corgi specific widgets */
-+      for(i = 0; i < ARRAY_SIZE(wm8731_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8731_dapm_widgets[i]);
-+      }
-+
-+      /* Set up corgi specific audio path audio_map */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+      return 0;
-+}
-+
-+static unsigned int corgi_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      if (info->bclk_master & SND_SOC_DAIFMT_CBS_CFS) {
-+              /* pxa2xx is i2s master  */
-+              switch (info->rate) {
-+              case 44100:
-+              case 88200:
-+                      /* configure codec digital filters for 44.1, 88.2 */
-+                      rtd->codec_dai->config_sysclk(rtd->codec_dai, info,
-+                              11289600);
-+              break;
-+              default:
-+                      /* configure codec digital filters for all other rates */
-+                      rtd->codec_dai->config_sysclk(rtd->codec_dai, info,
-+                              CORGI_AUDIO_CLOCK);
-+              break;
-+              }
-+              /* config pxa i2s as master */
-+              return rtd->cpu_dai->config_sysclk(rtd->cpu_dai, info,
-+                      CORGI_AUDIO_CLOCK);
-+      } else {
-+              /* codec is i2s master -
-+               * only configure codec DAI clock and filters */
-+              return rtd->codec_dai->config_sysclk(rtd->codec_dai, info,
-+                      CORGI_AUDIO_CLOCK);
-+      }
-+}
-+
-+/* corgi digital audio interface glue - connects codec <--> CPU */
-+static struct snd_soc_dai_link corgi_dai = {
-+      .name = "WM8731",
-+      .stream_name = "WM8731",
-+      .cpu_dai = &pxa_i2s_dai,
-+      .codec_dai = &wm8731_dai,
-+      .init = corgi_wm8731_init,
-+      .config_sysclk = corgi_config_sysclk,
-+};
-+
-+/* corgi audio machine driver */
-+static struct snd_soc_machine snd_soc_machine_corgi = {
-+      .name = "Corgi",
-+      .dai_link = &corgi_dai,
-+      .num_links = 1,
-+      .ops = &corgi_ops,
-+};
-+
-+/* corgi audio private data */
-+static struct wm8731_setup_data corgi_wm8731_setup = {
-+      .i2c_address = 0x1b,
-+};
-+
-+/* corgi audio subsystem */
-+static struct snd_soc_device corgi_snd_devdata = {
-+      .machine = &snd_soc_machine_corgi,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm8731,
-+      .codec_data = &corgi_wm8731_setup,
-+};
-+
-+static struct platform_device *corgi_snd_device;
-+
-+static int __init corgi_init(void)
-+{
-+      int ret;
-+
-+      if (!(machine_is_corgi() || machine_is_shepherd() || machine_is_husky()))
-+              return -ENODEV;
-+
-+      corgi_snd_device = platform_device_alloc("soc-audio", -1);
-+      if (!corgi_snd_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(corgi_snd_device, &corgi_snd_devdata);
-+      corgi_snd_devdata.dev = &corgi_snd_device->dev;
-+      ret = platform_device_add(corgi_snd_device);
-+
-+      if (ret)
-+              platform_device_put(corgi_snd_device);
-+
-+      return ret;
-+}
-+
-+static void __exit corgi_exit(void)
-+{
-+      platform_device_unregister(corgi_snd_device);
-+}
-+
-+module_init(corgi_init);
-+module_exit(corgi_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Richard Purdie");
-+MODULE_DESCRIPTION("ALSA SoC Corgi");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/mainstone.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/mainstone.c
-@@ -0,0 +1,126 @@
-+/*
-+ * mainstone.c  --  SoC audio for Mainstone
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  Mainstone audio amplifier code taken from arch/arm/mach-pxa/mainstone.c
-+ *  Copyright:        MontaVista Software Inc.
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    30th Oct 2005   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/device.h>
-+#include <linux/i2c.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/mainstone.h>
-+#include <asm/arch/audio.h>
-+
-+#include "../codecs/ac97.h"
-+#include "pxa2xx-pcm.h"
-+
-+static struct snd_soc_machine mainstone;
-+static long mst_audio_suspend_mask;
-+
-+static int mainstone_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      mst_audio_suspend_mask = MST_MSCWR2;
-+      MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_resume(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 &= mst_audio_suspend_mask | ~MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_probe(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 &= ~MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_remove(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static struct snd_soc_machine_config codecs[] = {
-+{
-+      .name = "AC97",
-+      .sname = "AC97 HiFi",
-+      .iface = &pxa_ac97_interface[0],
-+},
-+{
-+      .name = "AC97 Aux",
-+      .sname = "AC97 Aux",
-+      .iface = &pxa_ac97_interface[1],
-+},
-+};
-+
-+static struct snd_soc_machine mainstone = {
-+      .name = "Mainstone",
-+      .probe = mainstone_probe,
-+      .remove = mainstone_remove,
-+      .suspend_pre = mainstone_suspend,
-+      .resume_post = mainstone_resume,
-+      .config = codecs,
-+      .nconfigs = ARRAY_SIZE(codecs),
-+};
-+
-+static struct snd_soc_device mainstone_snd_devdata = {
-+      .machine = &mainstone,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_ac97,
-+};
-+
-+static struct platform_device *mainstone_snd_device;
-+
-+static int __init mainstone_init(void)
-+{
-+      int ret;
-+
-+      mainstone_snd_device = platform_device_alloc("soc-audio", -1);
-+      if (!mainstone_snd_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(mainstone_snd_device, &mainstone_snd_devdata);
-+      mainstone_snd_devdata.dev = &mainstone_snd_device->dev;
-+      ret = platform_device_add(mainstone_snd_device);
-+
-+      if (ret)
-+              platform_device_put(mainstone_snd_device);
-+
-+      return ret;
-+}
-+
-+static void __exit mainstone_exit(void)
-+{
-+      platform_device_unregister(mainstone_snd_device);
-+}
-+
-+module_init(mainstone_init);
-+module_exit(mainstone_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("ALSA SoC Mainstone");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/mainstone_baseband.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/mainstone_baseband.c
-@@ -0,0 +1,249 @@
-+/*
-+ * mainstone_baseband.c
-+ * Mainstone Example Baseband modem  --  ALSA Soc Audio Layer
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    15th Apr 2006   Initial version.
-+ *
-+ * This is example code to demonstrate connecting a baseband modem to the PCM
-+ * DAI on the WM9713 codec on the Intel Mainstone platform. It is by no means
-+ * complete as it requires code to control the modem.
-+ *
-+ * The architecture consists of the WM9713 AC97 DAI connected to the PXA27x
-+ * AC97 controller and the WM9713 PCM DAI connected to the basebands DAI. The
-+ * baseband is controlled via a serial port. Audio is routed between the PXA27x
-+ * and the baseband via internal WM9713 analog paths.
-+ *
-+ * This driver is not the baseband modem driver. This driver only calls
-+ * functions from the Baseband driver to set up it's PCM DAI.
-+ *
-+ * It's intended to use this driver as follows:-
-+ *
-+ *  1. open() WM9713 PCM audio device.
-+ *  2. open() serial device (for AT commands).
-+ *  3. configure PCM audio device (rate etc) - sets up WM9713 PCM DAI,
-+ *      this will also set up the baseband PCM DAI (via calling baseband driver).
-+ *  4. send any further AT commands to set up baseband.
-+ *  5. configure codec audio mixer paths.
-+ *  6. open(), configure and read/write AC97 audio device - to Tx/Rx voice
-+ *
-+ * The PCM audio device is opened but IO is never performed on it as the IO is
-+ * directly between the codec and the baseband (and not the CPU).
-+ *
-+ * TODO:
-+ *  o Implement callbacks
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/audio.h>
-+#include <asm/arch/ssp.h>
-+
-+#include "../codecs/wm9713.h"
-+#include "pxa2xx-pcm.h"
-+
-+static struct snd_soc_machine mainstone;
-+
-+#define BASEBAND_XXX_DAIFMT \
-+      (SND_SOC_DAIFMT_DSP_B  | SND_SOC_DAIFMT_CBS_CFS |\
-+       SND_SOC_DAIFMT_NB_NF)
-+
-+#define BASEBAND_XXX_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+/*
-+ * PCM modes - 8k 16bit mono baseband modem is master
-+ */
-+static struct snd_soc_dai_mode mainstone_example_modes[] = {
-+      /* port master clk & frame modes */
-+      {BASEBAND_XXX_DAIFMT, SND_SOC_DAITDM_LRDW(0,0), SNDRV_PCM_FORMAT_S16_LE,
-+              SNDRV_PCM_RATE_8000, BASEBAND_XXX_DIR, SND_SOC_DAI_BFS_RATE, 256, 64},
-+};
-+
-+/* Do specific baseband PCM voice startup here */
-+static int mainstone_baseband_startup(struct snd_pcm_substream *substream)
-+{
-+      return 0;
-+}
-+
-+/* Do specific baseband PCM voice shutdown here */
-+static void mainstone_baseband_shutdown (struct snd_pcm_substream *substream)
-+{
-+}
-+
-+/* Do specific baseband modem PCM voice hw params init here */
-+static int mainstone_baseband_hw_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      return 0;
-+}
-+
-+/* Do specific baseband modem PCM voice hw params free here */
-+static int mainstone_baseband_hw_free(struct snd_pcm_substream *substream)
-+{
-+      return 0;
-+}
-+
-+static struct snd_soc_cpu_dai mainstone_example_dai[] = {
-+      {       .name = "Baseband",
-+              .id = 0,
-+              .type = SND_SOC_DAI_PCM,
-+              .playback = {
-+                      .channels_min = 1,
-+                      .channels_max = 1,},
-+              .capture = {
-+                      .channels_min = 1,
-+                      .channels_max = 1,},
-+              .ops = {
-+                      .startup = mainstone_baseband_startup,
-+                      .shutdown = mainstone_baseband_shutdown,
-+                      .hw_params = mainstone_baseband_hw_params,
-+                      .hw_free = mainstone_baseband_hw_free,
-+                      },
-+              .caps = {
-+                      .mode = mainstone_example_modes,
-+                      .num_modes = ARRAY_SIZE(mainstone_example_modes),},
-+      },
-+};
-+
-+/* do we need to do any thing on the mainstone when the stream is
-+ * started and stopped
-+ */
-+static int mainstone_startup(struct snd_pcm_substream *substream)
-+{
-+      return 0;
-+}
-+
-+static void mainstone_shutdown(struct snd_pcm_substream *substream)
-+{
-+}
-+
-+static struct snd_soc_ops mainstone_ops = {
-+      .startup = mainstone_startup,
-+      .shutdown = mainstone_shutdown,
-+};
-+
-+/* PM */
-+static int mainstone_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      return 0;
-+}
-+
-+static int mainstone_resume(struct platform_device *pdev)
-+{
-+      return 0;
-+}
-+
-+static int mainstone_probe(struct platform_device *pdev)
-+{
-+      return 0;
-+}
-+
-+static int mainstone_remove(struct platform_device *pdev)
-+{
-+      return 0;
-+}
-+
-+static int mainstone_wm9713_init(struct snd_soc_codec *codec)
-+{
-+      return 0;
-+}
-+
-+unsigned int mainstone_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      /* wm8753 has pll that generates mclk from 13MHz xtal */
-+      return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, 13000000);
-+}
-+
-+/* the physical audio connections between the WM9713, Baseband and pxa2xx */
-+static struct snd_soc_dai_link mainstone_dai[] = {
-+{
-+      .name = "AC97",
-+      .stream_name = "AC97 HiFi",
-+      .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
-+      .codec_dai = &wm9713_dai[WM9713_DAI_AC97_HIFI],
-+      .init = mainstone_wm9713_init,
-+},
-+{
-+      .name = "AC97 Aux",
-+      .stream_name = "AC97 Aux",
-+      .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
-+      .codec_dai = &wm9713_dai[WM9713_DAI_AC97_AUX],
-+},
-+{
-+      .name = "Baseband",
-+      .stream_name = "Voice",
-+      .cpu_dai = mainstone_example_dai,
-+      .codec_dai = &wm9713_dai[WM9713_DAI_PCM_VOICE],
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+};
-+
-+static struct snd_soc_machine mainstone = {
-+      .name = "Mainstone",
-+      .probe = mainstone_probe,
-+      .remove = mainstone_remove,
-+      .suspend_pre = mainstone_suspend,
-+      .resume_post = mainstone_resume,
-+      .ops = &mainstone_ops,
-+      .dai_link = mainstone_dai,
-+      .num_links = ARRAY_SIZE(mainstone_dai),
-+};
-+
-+static struct snd_soc_device mainstone_snd_ac97_devdata = {
-+      .machine = &mainstone,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm9713,
-+};
-+
-+static struct platform_device *mainstone_snd_ac97_device;
-+
-+static int __init mainstone_init(void)
-+{
-+      int ret;
-+
-+      mainstone_snd_ac97_device = platform_device_alloc("soc-audio", -1);
-+      if (!mainstone_snd_ac97_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(mainstone_snd_ac97_device, &mainstone_snd_ac97_devdata);
-+      mainstone_snd_ac97_devdata.dev = &mainstone_snd_ac97_device->dev;
-+
-+      if((ret = platform_device_add(mainstone_snd_ac97_device)) != 0)
-+              platform_device_put(mainstone_snd_ac97_device);
-+
-+      return ret;
-+}
-+
-+static void __exit mainstone_exit(void)
-+{
-+      platform_device_unregister(mainstone_snd_ac97_device);
-+}
-+
-+module_init(mainstone_init);
-+module_exit(mainstone_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("Mainstone Example Baseband PCM Interface");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/mainstone_bluetooth.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/mainstone_bluetooth.c
-@@ -0,0 +1,399 @@
-+/*
-+ * mainstone_bluetooth.c
-+ * Mainstone Example Bluetooth  --  ALSA Soc Audio Layer
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    15th May 2006   Initial version.
-+ *
-+ * This is example code to demonstrate connecting a bluetooth codec to the PCM
-+ * DAI on the WM8753 codec on the Intel Mainstone platform. It is by no means
-+ * complete as it requires code to control the BT codec.
-+ *
-+ * The architecture consists of the WM8753 HIFI DAI connected to the PXA27x
-+ * I2S controller and the WM8753 PCM DAI connected to the bluetooth DAI. The
-+ * bluetooth codec and wm8753 are controlled via I2C. Audio is routed between
-+ * the PXA27x and the bluetooth via internal WM8753 analog paths.
-+ *
-+ * This example supports the following audio input/outputs.
-+ *
-+ *  o Board mounted Mic and Speaker (spk has amplifier)
-+ *  o Headphones via jack socket
-+ *  o BT source and sink
-+ *
-+ * This driver is not the bluetooth codec driver. This driver only calls
-+ * functions from the Bluetooth driver to set up it's PCM DAI.
-+ *
-+ * It's intended to use the driver as follows:-
-+ *
-+ *  1. open() WM8753 PCM audio device.
-+ *  2. configure PCM audio device (rate etc) - sets up WM8753 PCM DAI,
-+ *      this should also set up the BT codec DAI (via calling bt driver).
-+ *  3. configure codec audio mixer paths.
-+ *  4. open(), configure and read/write HIFI audio device - to Tx/Rx voice
-+ *
-+ * The PCM audio device is opened but IO is never performed on it as the IO is
-+ * directly between the codec and the BT codec (and not the CPU).
-+ *
-+ * TODO:
-+ *  o Implement callbacks
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/audio.h>
-+#include <asm/arch/ssp.h>
-+
-+#include "../codecs/wm8753.h"
-+#include "pxa2xx-pcm.h"
-+
-+static struct snd_soc_machine mainstone;
-+
-+#define BLUETOOTH_DAIFMT \
-+      (SND_SOC_DAIFMT_DSP_B  | SND_SOC_DAIFMT_CBS_CFS |\
-+       SND_SOC_DAIFMT_NB_NF)
-+
-+#define BLUETOOTH_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+/*
-+ * PCM modes - 8k 16bit mono BT codec is master
-+ */
-+static struct snd_soc_dai_mode mainstone_bt_modes[] = {
-+      /* port master clk & frame modes */
-+      {BLUETOOTH_DAIFMT, SND_SOC_DAITDM_LRDW(0,0), SNDRV_PCM_FORMAT_S16_LE,
-+              SNDRV_PCM_RATE_8000, BLUETOOTH_DIR, SND_SOC_DAI_BFS_RATE, 256, 64},
-+};
-+
-+/* Do specific bluetooth PCM startup here */
-+static int mainstone_bt_startup(struct snd_pcm_substream *substream)
-+{
-+      return 0;
-+}
-+
-+/* Do specific bluetooth PCM shutdown here */
-+static void mainstone_bt_shutdown (struct snd_pcm_substream *substream)
-+{
-+}
-+
-+/* Do pecific bluetooth PCM hw params init here */
-+static int mainstone_bt_hw_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      return 0;
-+}
-+
-+/* Do specific bluetooth PCM hw params free here */
-+static int mainstone_bt_hw_free(struct snd_pcm_substream *substream)
-+{
-+      return 0;
-+}
-+
-+static struct snd_soc_cpu_dai mainstone_bt_dai[] = {
-+      {       .name = "Bluetooth",
-+              .id = 0,
-+              .type = SND_SOC_DAI_PCM,
-+              .playback = {
-+                      .channels_min = 1,
-+                      .channels_max = 1,},
-+              .capture = {
-+                      .channels_min = 1,
-+                      .channels_max = 1,},
-+              .ops = {
-+                      .startup = mainstone_bt_startup,
-+                      .shutdown = mainstone_bt_shutdown,
-+                      .hw_params = mainstone_bt_hw_params,
-+                      .hw_free = mainstone_bt_hw_free,
-+                      },
-+              .caps = {
-+                      .mode = mainstone_bt_modes,
-+                      .num_modes = ARRAY_SIZE(mainstone_bt_modes),},
-+      },
-+};
-+
-+/* do we need to do any thing on the mainstone when the stream is
-+ * started and stopped
-+ */
-+static int mainstone_startup(struct snd_pcm_substream *substream)
-+{
-+      return 0;
-+}
-+
-+static void mainstone_shutdown(struct snd_pcm_substream *substream)
-+{
-+}
-+
-+static struct snd_soc_ops mainstone_ops = {
-+      .startup = mainstone_startup,
-+      .shutdown = mainstone_shutdown,
-+};
-+
-+/* PM */
-+static int mainstone_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      return 0;
-+}
-+
-+static int mainstone_resume(struct platform_device *pdev)
-+{
-+      return 0;
-+}
-+
-+static int mainstone_probe(struct platform_device *pdev)
-+{
-+      return 0;
-+}
-+
-+static int mainstone_remove(struct platform_device *pdev)
-+{
-+      return 0;
-+}
-+
-+/*
-+ * Machine audio functions.
-+ *
-+ * The machine now has 3 extra audio controls.
-+ *
-+ * Jack function: Sets function (device plugged into Jack) to nothing (Off)
-+ *                or Headphones.
-+ *
-+ * Mic function: Set the on board Mic to On or Off
-+ * Spk function: Set the on board Spk to On or Off
-+ *
-+ * example: BT playback (of far end) and capture (of near end)
-+ *  Set Mic and Speaker to On, open BT alsa interface as above and set up
-+ *  internal audio paths.
-+ */
-+
-+static int machine_jack_func = 0;
-+static int machine_spk_func = 0;
-+static int machine_mic_func = 0;
-+
-+static int machine_get_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = machine_jack_func;
-+      return 0;
-+}
-+
-+static int machine_set_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+      machine_jack_func = ucontrol->value.integer.value[0];
-+      snd_soc_dapm_set_endpoint(codec, "Headphone Jack", machine_jack_func);
-+      return 0;
-+}
-+
-+static int machine_get_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = machine_spk_func;
-+      return 0;
-+}
-+
-+static int machine_set_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+      machine_spk_func = ucontrol->value.integer.value[0];
-+      snd_soc_dapm_set_endpoint(codec, "Spk", machine_spk_func);
-+      return 0;
-+}
-+
-+static int machine_get_mic(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = machine_spk_func;
-+      return 0;
-+}
-+
-+static int machine_set_mic(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+      machine_spk_func = ucontrol->value.integer.value[0];
-+      snd_soc_dapm_set_endpoint(codec, "Mic", machine_mic_func);
-+      return 0;
-+}
-+
-+/* turns on board speaker amp on/off */
-+static int machine_amp_event(struct snd_soc_dapm_widget *w, int event)
-+{
-+#if 0
-+      if (SND_SOC_DAPM_EVENT_ON(event))
-+              /* on */
-+      else
-+              /* off */
-+#endif
-+      return 0;
-+}
-+
-+/* machine dapm widgets */
-+static const struct snd_soc_dapm_widget machine_dapm_widgets[] = {
-+SND_SOC_DAPM_HP("Headphone Jack", NULL),
-+SND_SOC_DAPM_SPK("Spk", machine_amp_event),
-+SND_SOC_DAPM_MIC("Mic", NULL),
-+};
-+
-+/* machine connections to the codec pins */
-+static const char* audio_map[][3] = {
-+
-+      /* headphone connected to LOUT1, ROUT1 */
-+      {"Headphone Jack", NULL, "LOUT"},
-+      {"Headphone Jack", NULL, "ROUT"},
-+
-+      /* speaker connected to LOUT2, ROUT2 */
-+      {"Spk", NULL, "ROUT2"},
-+      {"Spk", NULL, "LOUT2"},
-+
-+      /* mic is connected to MIC1 (via Mic Bias) */
-+      {"MIC1", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Mic"},
-+
-+      {NULL, NULL, NULL},
-+};
-+
-+static const char* jack_function[] = {"Off", "Headphone"};
-+static const char* spk_function[] = {"Off", "On"};
-+static const char* mic_function[] = {"Off", "On"};
-+static const struct soc_enum machine_ctl_enum[] = {
-+      SOC_ENUM_SINGLE_EXT(2, jack_function),
-+      SOC_ENUM_SINGLE_EXT(2, spk_function),
-+      SOC_ENUM_SINGLE_EXT(2, mic_function),
-+};
-+
-+static const struct snd_kcontrol_new wm8753_machine_controls[] = {
-+      SOC_ENUM_EXT("Jack Function", machine_ctl_enum[0], machine_get_jack, machine_set_jack),
-+      SOC_ENUM_EXT("Speaker Function", machine_ctl_enum[1], machine_get_spk, machine_set_spk),
-+      SOC_ENUM_EXT("Mic Function", machine_ctl_enum[2], machine_get_mic, machine_set_mic),
-+};
-+
-+static int mainstone_wm8753_init(struct snd_soc_codec *codec)
-+{
-+      int i, err;
-+
-+      /* not used on this machine - e.g. will never be powered up */
-+      snd_soc_dapm_set_endpoint(codec, "OUT3", 0);
-+      snd_soc_dapm_set_endpoint(codec, "OUT4", 0);
-+      snd_soc_dapm_set_endpoint(codec, "MONO2", 0);
-+      snd_soc_dapm_set_endpoint(codec, "MONO1", 0);
-+      snd_soc_dapm_set_endpoint(codec, "LINE1", 0);
-+      snd_soc_dapm_set_endpoint(codec, "LINE2", 0);
-+      snd_soc_dapm_set_endpoint(codec, "RXP", 0);
-+      snd_soc_dapm_set_endpoint(codec, "RXN", 0);
-+      snd_soc_dapm_set_endpoint(codec, "MIC2", 0);
-+
-+      /* Add machine specific controls */
-+      for (i = 0; i < ARRAY_SIZE(wm8753_machine_controls); i++) {
-+              if ((err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8753_machine_controls[i],codec, NULL))) < 0)
-+                      return err;
-+      }
-+
-+      /* Add machine specific widgets */
-+      for(i = 0; i < ARRAY_SIZE(machine_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &machine_dapm_widgets[i]);
-+      }
-+
-+      /* Set up machine specific audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+      return 0;
-+}
-+
-+/* this configures the clocking between the WM8753 and the BT codec */
-+unsigned int mainstone_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      /* wm8753 has pll that generates mclk from 13MHz xtal */
-+      return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, 13000000);
-+}
-+
-+static struct snd_soc_dai_link mainstone_dai[] = {
-+{ /* Hifi Playback - for similatious use with voice below */
-+      .name = "WM8753",
-+      .stream_name = "WM8753 HiFi",
-+      .cpu_dai = &pxa_i2s_dai,
-+      .codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
-+      .init = mainstone_wm8753_init,
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+{ /* Voice via BT */
-+      .name = "Bluetooth",
-+      .stream_name = "Voice",
-+      .cpu_dai = mainstone_bt_dai,
-+      .codec_dai = &wm8753_dai[WM8753_DAI_VOICE],
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+};
-+
-+static struct snd_soc_machine mainstone = {
-+      .name = "Mainstone",
-+      .probe = mainstone_probe,
-+      .remove = mainstone_remove,
-+      .suspend_pre = mainstone_suspend,
-+      .resume_post = mainstone_resume,
-+      .ops = &mainstone_ops,
-+      .dai_link = mainstone_dai,
-+      .num_links = ARRAY_SIZE(mainstone_dai),
-+};
-+
-+static struct snd_soc_device mainstone_snd_wm8753_devdata = {
-+      .machine = &mainstone,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm8753,
-+};
-+
-+static struct platform_device *mainstone_snd_wm8753_device;
-+
-+static int __init mainstone_init(void)
-+{
-+      int ret;
-+
-+      mainstone_snd_wm8753_device = platform_device_alloc("soc-audio", -1);
-+      if (!mainstone_snd_wm8753_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(mainstone_snd_wm8753_device, &mainstone_snd_wm8753_devdata);
-+      mainstone_snd_wm8753_devdata.dev = &mainstone_snd_wm8753_device->dev;
-+
-+      if((ret = platform_device_add(mainstone_snd_wm8753_device)) != 0)
-+              platform_device_put(mainstone_snd_wm8753_device);
-+
-+      return ret;
-+}
-+
-+static void __exit mainstone_exit(void)
-+{
-+      platform_device_unregister(mainstone_snd_wm8753_device);
-+}
-+
-+module_init(mainstone_init);
-+module_exit(mainstone_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("Mainstone Example Bluetooth PCM Interface");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm8731.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm8731.c
-@@ -0,0 +1,156 @@
-+/*
-+ * mainstone.c  --  SoC audio for Mainstone
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  Mainstone audio amplifier code taken from arch/arm/mach-pxa/mainstone.c
-+ *  Copyright:        MontaVista Software Inc.
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    5th June 2006   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/device.h>
-+#include <linux/i2c.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/mainstone.h>
-+#include <asm/arch/audio.h>
-+
-+#include "../codecs/wm8731.h"
-+#include "pxa2xx-pcm.h"
-+
-+static struct snd_soc_machine mainstone;
-+
-+
-+static const struct snd_soc_dapm_widget dapm_widgets[] = {
-+      SND_SOC_DAPM_MIC("Int Mic", NULL),
-+      SND_SOC_DAPM_SPK("Ext Spk", NULL),
-+};
-+
-+static const char* intercon[][3] = {
-+
-+      /* speaker connected to LHPOUT */
-+      {"Ext Spk", NULL, "LHPOUT"},
-+
-+      /* mic is connected to Mic Jack, with WM8731 Mic Bias */
-+      {"MICIN", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Int Mic"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+/*
-+ * Logic for a wm8731 as connected on a Endrelia ETI-B1 board.
-+ */
-+static int mainstone_wm8731_init(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+
-+      /* Add specific widgets */
-+      for(i = 0; i < ARRAY_SIZE(dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &dapm_widgets[i]);
-+      }
-+
-+      /* Set up specific audio path interconnects */
-+      for(i = 0; intercon[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, intercon[i][0], intercon[i][1], intercon[i][2]);
-+      }
-+
-+      /* not connected */
-+      snd_soc_dapm_set_endpoint(codec, "RLINEIN", 0);
-+      snd_soc_dapm_set_endpoint(codec, "LLINEIN", 0);
-+
-+      /* always connected */
-+      snd_soc_dapm_set_endpoint(codec, "Int Mic", 1);
-+      snd_soc_dapm_set_endpoint(codec, "Ext Spk", 1);
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+
-+      return 0;
-+}
-+
-+unsigned int mainstone_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      /* we have a 12.288MHz crystal */
-+      return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, 12288000);
-+}
-+
-+static struct snd_soc_dai_link mainstone_dai[] = {
-+{
-+      .name = "WM8731",
-+      .stream_name = "WM8731 HiFi",
-+      .cpu_dai = &pxa_i2s_dai,
-+      .codec_dai = &wm8731_dai,
-+      .init = mainstone_wm8731_init,
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+};
-+
-+static struct snd_soc_machine mainstone = {
-+      .name = "Mainstone",
-+      .dai_link = mainstone_dai,
-+      .num_links = ARRAY_SIZE(mainstone_dai),
-+};
-+
-+static struct wm8731_setup_data corgi_wm8731_setup = {
-+      .i2c_address = 0x1b,
-+};
-+
-+static struct snd_soc_device mainstone_snd_devdata = {
-+      .machine = &mainstone,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm8731,
-+      .codec_data = &corgi_wm8731_setup,
-+};
-+
-+static struct platform_device *mainstone_snd_device;
-+
-+static int __init mainstone_init(void)
-+{
-+      int ret;
-+
-+      mainstone_snd_device = platform_device_alloc("soc-audio", -1);
-+      if (!mainstone_snd_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(mainstone_snd_device, &mainstone_snd_devdata);
-+      mainstone_snd_devdata.dev = &mainstone_snd_device->dev;
-+      ret = platform_device_add(mainstone_snd_device);
-+
-+      if (ret)
-+              platform_device_put(mainstone_snd_device);
-+
-+      return ret;
-+}
-+
-+static void __exit mainstone_exit(void)
-+{
-+      platform_device_unregister(mainstone_snd_device);
-+}
-+
-+module_init(mainstone_init);
-+module_exit(mainstone_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("ALSA SoC WM8731 Mainstone");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm8753.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm8753.c
-@@ -0,0 +1,226 @@
-+/*
-+ * mainstone.c  --  SoC audio for Mainstone
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  Mainstone audio amplifier code taken from arch/arm/mach-pxa/mainstone.c
-+ *  Copyright:        MontaVista Software Inc.
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    30th Oct 2005   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/device.h>
-+#include <linux/i2c.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/mainstone.h>
-+#include <asm/arch/audio.h>
-+
-+#include "../codecs/wm8753.h"
-+#include "pxa2xx-pcm.h"
-+
-+static struct snd_soc_machine mainstone;
-+
-+static int mainstone_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if(rtd->cpu_dai->type == SND_SOC_DAI_PCM && rtd->cpu_dai->id == 1) {
-+              /* enable USB on the go MUX so we can use SSPFRM2 */
-+              MST_MSCWR2 |= MST_MSCWR2_USB_OTG_SEL;
-+              MST_MSCWR2 &= ~MST_MSCWR2_USB_OTG_RST;
-+      }
-+      return 0;
-+}
-+
-+static void mainstone_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if(rtd->cpu_dai->type == SND_SOC_DAI_PCM && rtd->cpu_dai->id == 1) {
-+              /* disable USB on the go MUX so we can use ttyS0 */
-+              MST_MSCWR2 &= ~MST_MSCWR2_USB_OTG_SEL;
-+              MST_MSCWR2 |= MST_MSCWR2_USB_OTG_RST;
-+      }
-+}
-+
-+static struct snd_soc_ops mainstone_ops = {
-+      .startup = mainstone_startup,
-+      .shutdown = mainstone_shutdown,
-+};
-+
-+static long mst_audio_suspend_mask;
-+
-+static int mainstone_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      mst_audio_suspend_mask = MST_MSCWR2;
-+      MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_resume(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 &= mst_audio_suspend_mask | ~MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_probe(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 &= ~MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_remove(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+/* example machine audio_mapnections */
-+static const char* audio_map[][3] = {
-+
-+      /* mic is connected to mic1 - with bias */
-+      {"MIC1", NULL, "Mic Bias"},
-+      {"MIC1N", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Mic1 Jack"},
-+      {"Mic Bias", NULL, "Mic1 Jack"},
-+
-+      {"ACIN", NULL, "ACOP"},
-+      {NULL, NULL, NULL},
-+};
-+
-+/* headphone detect support on my board */
-+static const char * hp_pol[] = {"Headphone", "Speaker"};
-+static const struct soc_enum wm8753_enum =
-+      SOC_ENUM_SINGLE(WM8753_OUTCTL, 1, 2, hp_pol);
-+
-+static const struct snd_kcontrol_new wm8753_mainstone_controls[] = {
-+      SOC_SINGLE("Headphone Detect Switch", WM8753_OUTCTL, 6, 1, 0),
-+      SOC_ENUM("Headphone Detect Polarity", wm8753_enum),
-+};
-+
-+/*
-+ * This is an example machine initialisation for a wm8753 connected to a
-+ * Mainstone II. It is missing logic to detect hp/mic insertions and logic
-+ * to re-route the audio in such an event.
-+ */
-+static int mainstone_wm8753_init(struct snd_soc_codec *codec)
-+{
-+      int i, err;
-+
-+      /* set up mainstone codec pins */
-+      snd_soc_dapm_set_endpoint(codec, "RXP", 0);
-+      snd_soc_dapm_set_endpoint(codec, "RXN", 0);
-+      snd_soc_dapm_set_endpoint(codec, "MIC2", 0);
-+
-+      /* add mainstone specific controls */
-+      for (i = 0; i < ARRAY_SIZE(wm8753_mainstone_controls); i++) {
-+              if ((err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8753_mainstone_controls[i],codec, NULL))) < 0)
-+                      return err;
-+      }
-+
-+      /* set up mainstone specific audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+      return 0;
-+}
-+
-+unsigned int mainstone_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      /* wm8753 has pll that generates mclk from 13MHz xtal */
-+      return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, 13000000);
-+}
-+
-+static struct snd_soc_dai_link mainstone_dai[] = {
-+{ /* Hifi Playback - for similatious use with voice below */
-+      .name = "WM8753",
-+      .stream_name = "WM8753 HiFi",
-+      .cpu_dai = &pxa_i2s_dai,
-+      .codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
-+      .init = mainstone_wm8753_init,
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+{ /* Voice via BT */
-+      .name = "Bluetooth",
-+      .stream_name = "Voice",
-+      .cpu_dai = &pxa_ssp_dai[1],
-+      .codec_dai = &wm8753_dai[WM8753_DAI_VOICE],
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+};
-+
-+static struct snd_soc_machine mainstone = {
-+      .name = "Mainstone",
-+      .probe = mainstone_probe,
-+      .remove = mainstone_remove,
-+      .suspend_pre = mainstone_suspend,
-+      .resume_post = mainstone_resume,
-+      .ops = &mainstone_ops,
-+      .dai_link = mainstone_dai,
-+      .num_links = ARRAY_SIZE(mainstone_dai),
-+};
-+
-+static struct wm8753_setup_data mainstone_wm8753_setup = {
-+      .i2c_address = 0x1a,
-+};
-+
-+static struct snd_soc_device mainstone_snd_devdata = {
-+      .machine = &mainstone,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm8753,
-+      .codec_data = &mainstone_wm8753_setup,
-+};
-+
-+static struct platform_device *mainstone_snd_device;
-+
-+static int __init mainstone_init(void)
-+{
-+      int ret;
-+
-+      mainstone_snd_device = platform_device_alloc("soc-audio", -1);
-+      if (!mainstone_snd_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(mainstone_snd_device, &mainstone_snd_devdata);
-+      mainstone_snd_devdata.dev = &mainstone_snd_device->dev;
-+      ret = platform_device_add(mainstone_snd_device);
-+
-+      if (ret)
-+              platform_device_put(mainstone_snd_device);
-+
-+      return ret;
-+}
-+
-+static void __exit mainstone_exit(void)
-+{
-+      platform_device_unregister(mainstone_snd_device);
-+}
-+
-+module_init(mainstone_init);
-+module_exit(mainstone_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("ALSA SoC WM8753 Mainstone");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm8974.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm8974.c
-@@ -0,0 +1,112 @@
-+/*
-+ * mainstone.c  --  SoC audio for Mainstone
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  Mainstone audio amplifier code taken from arch/arm/mach-pxa/mainstone.c
-+ *  Copyright:        MontaVista Software Inc.
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    30th Oct 2005   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/device.h>
-+#include <linux/i2c.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/mainstone.h>
-+#include <asm/arch/audio.h>
-+
-+#include "../codecs/wm8974.h"
-+#include "pxa2xx-pcm.h"
-+
-+static struct snd_soc_machine mainstone;
-+
-+static int mainstone_wm8974_init(struct snd_soc_codec *codec)
-+{
-+      return 0;
-+}
-+
-+unsigned int mainstone_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      /* we have a PLL */
-+      return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, 12288000);
-+
-+}
-+
-+static struct snd_soc_dai_link mainstone_dai[] = {
-+{
-+      .name = "WM8974",
-+      .stream_name = "WM8974 HiFi",
-+      .cpu_dai = &pxa_i2s_dai,
-+      .codec_dai = &wm8974_dai,
-+      .init = mainstone_wm8974_init,
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+};
-+
-+static struct snd_soc_machine mainstone = {
-+      .name = "Mainstone",
-+      .dai_link = mainstone_dai,
-+      .num_links = ARRAY_SIZE(mainstone_dai),
-+};
-+
-+static struct wm8974_setup_data mainstone_wm8974_setup = {
-+      .i2c_address = 0x1a,
-+};
-+
-+static struct snd_soc_device mainstone_snd_devdata = {
-+      .machine = &mainstone,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm8974,
-+      .codec_data = &mainstone_wm8974_setup,
-+};
-+
-+static struct platform_device *mainstone_snd_device;
-+
-+static int __init mainstone_init(void)
-+{
-+      int ret;
-+
-+      mainstone_snd_device = platform_device_alloc("soc-audio", -1);
-+      if (!mainstone_snd_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(mainstone_snd_device, &mainstone_snd_devdata);
-+      mainstone_snd_devdata.dev = &mainstone_snd_device->dev;
-+      ret = platform_device_add(mainstone_snd_device);
-+
-+      if (ret)
-+              platform_device_put(mainstone_snd_device);
-+
-+      return ret;
-+}
-+
-+static void __exit mainstone_exit(void)
-+{
-+      platform_device_unregister(mainstone_snd_device);
-+}
-+
-+module_init(mainstone_init);
-+module_exit(mainstone_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("ALSA SoC Mainstone");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm9712.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm9712.c
-@@ -0,0 +1,171 @@
-+/*
-+ * mainstone.c  --  SoC audio for Mainstone
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  Mainstone audio amplifier code taken from arch/arm/mach-pxa/mainstone.c
-+ *  Copyright:        MontaVista Software Inc.
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    29th Jan 2006   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/device.h>
-+#include <linux/i2c.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/mainstone.h>
-+#include <asm/arch/audio.h>
-+
-+#include "../codecs/wm9712.h"
-+#include "pxa2xx-pcm.h"
-+
-+static struct snd_soc_machine mainstone;
-+static long mst_audio_suspend_mask;
-+
-+static int mainstone_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      mst_audio_suspend_mask = MST_MSCWR2;
-+      MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_resume(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 &= mst_audio_suspend_mask | ~MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_probe(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 &= ~MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_remove(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+/* mainstone machine dapm widgets */
-+static const struct snd_soc_dapm_widget mainstone_dapm_widgets[] = {
-+      SND_SOC_DAPM_MIC("Mic (Internal)", NULL),
-+};
-+
-+/* example machine interconnections */
-+static const char* intercon[][3] = {
-+
-+      /* mic is connected to mic1 - with bias */
-+      {"MIC1", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Mic (Internal)"},
-+
-+      {NULL, NULL, NULL},
-+};
-+
-+/*
-+ * This is an example machine initialisation for a wm8753 connected to a
-+ * Mainstone II. It is missing logic to detect hp/mic insertions and logic
-+ * to re-route the audio in such an event.
-+ */
-+static int mainstone_wm9712_init(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      /* set up mainstone codec pins */
-+      snd_soc_dapm_set_endpoint(codec, "RXP", 0);
-+      snd_soc_dapm_set_endpoint(codec, "RXN", 0);
-+      //snd_soc_dapm_set_endpoint(codec, "MIC2", 0);
-+
-+      /* Add mainstone specific widgets */
-+      for(i = 0; i < ARRAY_SIZE(mainstone_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &mainstone_dapm_widgets[i]);
-+      }
-+
-+      /* set up mainstone specific audio path interconnects */
-+      for(i = 0; intercon[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, intercon[i][0], intercon[i][1], intercon[i][2]);
-+      }
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+      return 0;
-+}
-+
-+static struct snd_soc_dai_link mainstone_dai[] = {
-+{
-+      .name = "AC97",
-+      .stream_name = "AC97 HiFi",
-+      .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
-+      .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI],
-+      .init = mainstone_wm9712_init,
-+},
-+{
-+      .name = "AC97 Aux",
-+      .stream_name = "AC97 Aux",
-+      .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
-+      .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX],
-+},
-+};
-+
-+static struct snd_soc_machine mainstone = {
-+      .name = "Mainstone",
-+      .probe = mainstone_probe,
-+      .remove = mainstone_remove,
-+      .suspend_pre = mainstone_suspend,
-+      .resume_post = mainstone_resume,
-+      .dai_link = mainstone_dai,
-+      .num_links = ARRAY_SIZE(mainstone_dai),
-+};
-+
-+static struct snd_soc_device mainstone_snd_ac97_devdata = {
-+      .machine = &mainstone,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm9712,
-+};
-+
-+static struct platform_device *mainstone_snd_ac97_device;
-+
-+static int __init mainstone_init(void)
-+{
-+      int ret;
-+
-+      mainstone_snd_ac97_device = platform_device_alloc("soc-audio", -1);
-+      if (!mainstone_snd_ac97_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(mainstone_snd_ac97_device, &mainstone_snd_ac97_devdata);
-+      mainstone_snd_ac97_devdata.dev = &mainstone_snd_ac97_device->dev;
-+
-+      if((ret = platform_device_add(mainstone_snd_ac97_device)) != 0)
-+              platform_device_put(mainstone_snd_ac97_device);
-+
-+      return ret;
-+}
-+
-+static void __exit mainstone_exit(void)
-+{
-+      platform_device_unregister(mainstone_snd_ac97_device);
-+}
-+
-+module_init(mainstone_init);
-+module_exit(mainstone_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("ALSA SoC WM9712 Mainstone");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm9713.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/mainstone_wm9713.c
-@@ -0,0 +1,263 @@
-+/*
-+ * mainstone.c  --  SoC audio for Mainstone
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  Mainstone audio amplifier code taken from arch/arm/mach-pxa/mainstone.c
-+ *  Copyright:        MontaVista Software Inc.
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    29th Jan 2006   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/device.h>
-+#include <linux/i2c.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/mainstone.h>
-+#include <asm/arch/audio.h>
-+
-+#include "../codecs/wm9713.h"
-+#include "pxa2xx-pcm.h"
-+
-+static struct snd_soc_machine mainstone;
-+
-+static int mainstone_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if(rtd->cpu_dai->type == SND_SOC_DAI_PCM && rtd->cpu_dai->id == 1) {
-+              /* enable USB on the go MUX so we can use SSPFRM2 */
-+              MST_MSCWR2 |= MST_MSCWR2_USB_OTG_SEL;
-+              MST_MSCWR2 &= ~MST_MSCWR2_USB_OTG_RST;
-+      }
-+      return 0;
-+}
-+
-+static void mainstone_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if(rtd->cpu_dai->type == SND_SOC_DAI_PCM && rtd->cpu_dai->id == 1) {
-+              /* disable USB on the go MUX so we can use ttyS0 */
-+              MST_MSCWR2 &= ~MST_MSCWR2_USB_OTG_SEL;
-+              MST_MSCWR2 |= MST_MSCWR2_USB_OTG_RST;
-+      }
-+}
-+
-+static struct snd_soc_ops mainstone_ops = {
-+      .startup = mainstone_startup,
-+      .shutdown = mainstone_shutdown,
-+};
-+
-+static int test = 0;
-+static int get_test(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = test;
-+      return 0;
-+}
-+
-+static int set_test(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-+
-+      test = ucontrol->value.integer.value[0];
-+      if(test) {
-+
-+      } else {
-+
-+      }
-+      return 0;
-+}
-+
-+static long mst_audio_suspend_mask;
-+
-+static int mainstone_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      mst_audio_suspend_mask = MST_MSCWR2;
-+      MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_resume(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 &= mst_audio_suspend_mask | ~MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_probe(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 &= ~MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static int mainstone_remove(struct platform_device *pdev)
-+{
-+      MST_MSCWR2 |= MST_MSCWR2_AC97_SPKROFF;
-+      return 0;
-+}
-+
-+static const char* test_function[] = {"Off", "On"};
-+static const struct soc_enum mainstone_enum[] = {
-+      SOC_ENUM_SINGLE_EXT(2, test_function),
-+};
-+
-+static const struct snd_kcontrol_new mainstone_controls[] = {
-+      SOC_ENUM_EXT("ATest Function", mainstone_enum[0], get_test, set_test),
-+};
-+
-+/* mainstone machine dapm widgets */
-+static const struct snd_soc_dapm_widget mainstone_dapm_widgets[] = {
-+      SND_SOC_DAPM_MIC("Mic 1", NULL),
-+      SND_SOC_DAPM_MIC("Mic 2", NULL),
-+      SND_SOC_DAPM_MIC("Mic 3", NULL),
-+};
-+
-+/* example machine audio_mapnections */
-+static const char* audio_map[][3] = {
-+
-+      /* mic is connected to mic1 - with bias */
-+      {"MIC1", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Mic 1"},
-+      /* mic is connected to mic2A - with bias */
-+      {"MIC2A", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Mic 2"},
-+      /* mic is connected to mic2B - with bias */
-+      {"MIC2B", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Mic 3"},
-+
-+      {NULL, NULL, NULL},
-+};
-+
-+/*
-+ * This is an example machine initialisation for a wm9713 connected to a
-+ * Mainstone II. It is missing logic to detect hp/mic insertions and logic
-+ * to re-route the audio in such an event.
-+ */
-+static int mainstone_wm9713_init(struct snd_soc_codec *codec)
-+{
-+      int i, err;
-+
-+      /* set up mainstone codec pins */
-+      snd_soc_dapm_set_endpoint(codec, "RXP", 0);
-+      snd_soc_dapm_set_endpoint(codec, "RXN", 0);
-+      //snd_soc_dapm_set_endpoint(codec, "MIC2", 0);
-+
-+      /* Add test specific controls */
-+      for (i = 0; i < ARRAY_SIZE(mainstone_controls); i++) {
-+              if ((err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&mainstone_controls[i],codec, NULL))) < 0)
-+                      return err;
-+      }
-+
-+      /* Add mainstone specific widgets */
-+      for(i = 0; i < ARRAY_SIZE(mainstone_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &mainstone_dapm_widgets[i]);
-+      }
-+
-+      /* set up mainstone specific audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+      return 0;
-+}
-+
-+/* configure the system audio clock */
-+unsigned int mainstone_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, 24576000);
-+}
-+
-+static struct snd_soc_dai_link mainstone_dai[] = {
-+{
-+      .name = "AC97",
-+      .stream_name = "AC97 HiFi",
-+      .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
-+      .codec_dai = &wm9713_dai[WM9713_DAI_AC97_HIFI],
-+      .init = mainstone_wm9713_init,
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+{
-+      .name = "AC97 Aux",
-+      .stream_name = "AC97 Aux",
-+      .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
-+      .codec_dai = &wm9713_dai[WM9713_DAI_AC97_AUX],
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+{
-+      .name = "WM9713",
-+      .stream_name = "WM9713 Voice",
-+      .cpu_dai = &pxa_ssp_dai[PXA2XX_DAI_SSP2],
-+      .codec_dai = &wm9713_dai[WM9713_DAI_PCM_VOICE],
-+      .config_sysclk = mainstone_config_sysclk,
-+},
-+};
-+
-+static struct snd_soc_machine mainstone = {
-+      .name = "Mainstone",
-+      .probe = mainstone_probe,
-+      .remove = mainstone_remove,
-+      .suspend_pre = mainstone_suspend,
-+      .resume_post = mainstone_resume,
-+      .ops = &mainstone_ops,
-+      .dai_link = mainstone_dai,
-+      .num_links = ARRAY_SIZE(mainstone_dai),
-+};
-+
-+static struct snd_soc_device mainstone_snd_ac97_devdata = {
-+      .machine = &mainstone,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm9713,
-+};
-+
-+static struct platform_device *mainstone_snd_ac97_device;
-+
-+static int __init mainstone_init(void)
-+{
-+      int ret;
-+
-+      mainstone_snd_ac97_device = platform_device_alloc("soc-audio", -1);
-+      if (!mainstone_snd_ac97_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(mainstone_snd_ac97_device, &mainstone_snd_ac97_devdata);
-+      mainstone_snd_ac97_devdata.dev = &mainstone_snd_ac97_device->dev;
-+
-+      if((ret = platform_device_add(mainstone_snd_ac97_device)) != 0)
-+              platform_device_put(mainstone_snd_ac97_device);
-+
-+      return ret;
-+}
-+
-+static void __exit mainstone_exit(void)
-+{
-+      platform_device_unregister(mainstone_snd_ac97_device);
-+}
-+
-+module_init(mainstone_init);
-+module_exit(mainstone_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("ALSA SoC WM9713 Mainstone");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/poodle.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/poodle.c
-@@ -0,0 +1,329 @@
-+/*
-+ * poodle.c  --  SoC audio for Poodle
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Authors: Liam Girdwood <liam.girdwood@wolfsonmicro.com>
-+ *          Richard Purdie <richard@openedhand.com>
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/timer.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/hardware/locomo.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/hardware.h>
-+#include <asm/arch/poodle.h>
-+#include <asm/arch/audio.h>
-+
-+#include "../codecs/wm8731.h"
-+#include "pxa2xx-pcm.h"
-+
-+#define POODLE_HP        1
-+#define POODLE_HP_OFF    0
-+#define POODLE_SPK_ON    1
-+#define POODLE_SPK_OFF   0
-+
-+ /* audio clock in Hz - rounded from 12.235MHz */
-+#define POODLE_AUDIO_CLOCK 12288000
-+
-+static int poodle_jack_func;
-+static int poodle_spk_func;
-+
-+static void poodle_ext_control(struct snd_soc_codec *codec)
-+{
-+      int spk = 0;
-+
-+      /* set up jack connection */
-+      if (poodle_jack_func == POODLE_HP) {
-+              /* set = unmute headphone */
-+              locomo_gpio_write(&poodle_locomo_device.dev,
-+                      POODLE_LOCOMO_GPIO_MUTE_L, 1);
-+              locomo_gpio_write(&poodle_locomo_device.dev,
-+                      POODLE_LOCOMO_GPIO_MUTE_R, 1);
-+              snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1);
-+      } else {
-+              locomo_gpio_write(&poodle_locomo_device.dev,
-+                      POODLE_LOCOMO_GPIO_MUTE_L, 0);
-+              locomo_gpio_write(&poodle_locomo_device.dev,
-+                      POODLE_LOCOMO_GPIO_MUTE_R, 0);
-+              snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0);
-+      }
-+
-+      if (poodle_spk_func == POODLE_SPK_ON)
-+              spk = 1;
-+
-+      /* set the enpoints to their new connetion states */
-+      snd_soc_dapm_set_endpoint(codec, "Ext Spk", spk);
-+
-+      /* signal a DAPM event */
-+      snd_soc_dapm_sync_endpoints(codec);
-+}
-+
-+static int poodle_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->socdev->codec;
-+
-+      /* check the jack status at stream startup */
-+      poodle_ext_control(codec);
-+      return 0;
-+}
-+
-+/* we need to unmute the HP at shutdown as the mute burns power on poodle */
-+static int poodle_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->socdev->codec;
-+
-+      /* set = unmute headphone */
-+      locomo_gpio_write(&poodle_locomo_device.dev,
-+              POODLE_LOCOMO_GPIO_MUTE_L, 1);
-+      locomo_gpio_write(&poodle_locomo_device.dev,
-+              POODLE_LOCOMO_GPIO_MUTE_R, 1);
-+      return 0;
-+}
-+
-+static struct snd_soc_ops poodle_ops = {
-+      .startup = poodle_startup,
-+      .shutdown = poodle_shutdown,
-+};
-+
-+static int poodle_get_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = poodle_jack_func;
-+      return 0;
-+}
-+
-+static int poodle_set_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+
-+      if (poodle_jack_func == ucontrol->value.integer.value[0])
-+              return 0;
-+
-+      poodle_jack_func = ucontrol->value.integer.value[0];
-+      poodle_ext_control(codec);
-+      return 1;
-+}
-+
-+static int poodle_get_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = poodle_spk_func;
-+      return 0;
-+}
-+
-+static int poodle_set_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+
-+      if (poodle_spk_func == ucontrol->value.integer.value[0])
-+              return 0;
-+
-+      poodle_spk_func = ucontrol->value.integer.value[0];
-+      poodle_ext_control(codec);
-+      return 1;
-+}
-+
-+static int poodle_amp_event(struct snd_soc_dapm_widget *w, int event)
-+{
-+      if (SND_SOC_DAPM_EVENT_ON(event))
-+              locomo_gpio_write(&poodle_locomo_device.dev,
-+                      POODLE_LOCOMO_GPIO_AMP_ON, 0);
-+      else
-+              locomo_gpio_write(&poodle_locomo_device.dev,
-+                      POODLE_LOCOMO_GPIO_AMP_ON, 1);
-+
-+      return 0;
-+}
-+
-+/* poodle machine dapm widgets */
-+static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = {
-+SND_SOC_DAPM_HP("Headphone Jack", NULL),
-+SND_SOC_DAPM_SPK("Ext Spk", poodle_amp_event),
-+};
-+
-+/* Corgi machine audio_mapnections to the codec pins */
-+static const char *audio_map[][3] = {
-+
-+      /* headphone connected to LHPOUT1, RHPOUT1 */
-+      {"Headphone Jack", NULL, "LHPOUT"},
-+      {"Headphone Jack", NULL, "RHPOUT"},
-+
-+      /* speaker connected to LOUT, ROUT */
-+      {"Ext Spk", NULL, "ROUT"},
-+      {"Ext Spk", NULL, "LOUT"},
-+
-+      {NULL, NULL, NULL},
-+};
-+
-+static const char *jack_function[] = {"Off", "Headphone"};
-+static const char *spk_function[] = {"Off", "On"};
-+static const struct soc_enum poodle_enum[] = {
-+      SOC_ENUM_SINGLE_EXT(2, jack_function),
-+      SOC_ENUM_SINGLE_EXT(2, spk_function),
-+};
-+
-+static const snd_kcontrol_new_t wm8731_poodle_controls[] = {
-+      SOC_ENUM_EXT("Jack Function", poodle_enum[0], poodle_get_jack,
-+              poodle_set_jack),
-+      SOC_ENUM_EXT("Speaker Function", poodle_enum[1], poodle_get_spk,
-+              poodle_set_spk),
-+};
-+
-+/*
-+ * Logic for a wm8731 as connected on a Sharp SL-C7x0 Device
-+ */
-+static int poodle_wm8731_init(struct snd_soc_codec *codec)
-+{
-+      int i, err;
-+
-+      snd_soc_dapm_set_endpoint(codec, "LLINEIN", 0);
-+      snd_soc_dapm_set_endpoint(codec, "RLINEIN", 0);
-+      snd_soc_dapm_set_endpoint(codec, "MICIN", 1);
-+
-+      /* Add poodle specific controls */
-+      for (i = 0; i < ARRAY_SIZE(wm8731_poodle_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                      snd_soc_cnew(&wm8731_poodle_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      /* Add poodle specific widgets */
-+      for (i = 0; i < ARRAY_SIZE(wm8731_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8731_dapm_widgets[i]);
-+      }
-+
-+      /* Set up poodle specific audio path audio_map */
-+      for (i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+      return 0;
-+}
-+
-+static unsigned int poodle_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      if (info->bclk_master & SND_SOC_DAIFMT_CBS_CFS) {
-+              /* pxa2xx is i2s master  */
-+              switch (info->rate) {
-+              case 44100:
-+              case 88200:
-+                      /* configure codec digital filters for 44.1, 88.2 */
-+                      rtd->codec_dai->config_sysclk(rtd->codec_dai, info,
-+                              11289600);
-+              break;
-+              default:
-+                      /* configure codec digital filters for all other rates */
-+                      rtd->codec_dai->config_sysclk(rtd->codec_dai, info,
-+                              POODLE_AUDIO_CLOCK);
-+              break;
-+              }
-+              return rtd->cpu_dai->config_sysclk(rtd->cpu_dai, info,
-+                      POODLE_AUDIO_CLOCK);
-+      } else {
-+              /* codec is i2s master -
-+               * only configure codec DAI clock and filters */
-+              return rtd->codec_dai->config_sysclk(rtd->codec_dai, info,
-+                      POODLE_AUDIO_CLOCK);
-+      }
-+}
-+
-+/* poodle digital audio interface glue - connects codec <--> CPU */
-+static struct snd_soc_dai_link poodle_dai = {
-+      .name = "WM8731",
-+      .stream_name = "WM8731",
-+      .cpu_dai = &pxa_i2s_dai,
-+      .codec_dai = &wm8731_dai,
-+      .init = poodle_wm8731_init,
-+      .config_sysclk = poodle_config_sysclk,
-+};
-+
-+/* poodle audio machine driver */
-+static struct snd_soc_machine snd_soc_machine_poodle = {
-+      .name = "Poodle",
-+      .dai_link = &poodle_dai,
-+      .num_links = 1,
-+      .ops = &poodle_ops,
-+};
-+
-+/* poodle audio private data */
-+static struct wm8731_setup_data poodle_wm8731_setup = {
-+      .i2c_address = 0x1b,
-+};
-+
-+/* poodle audio subsystem */
-+static struct snd_soc_device poodle_snd_devdata = {
-+      .machine = &snd_soc_machine_poodle,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm8731,
-+      .codec_data = &poodle_wm8731_setup,
-+};
-+
-+static struct platform_device *poodle_snd_device;
-+
-+static int __init poodle_init(void)
-+{
-+      int ret;
-+
-+      if (!machine_is_poodle())
-+              return -ENODEV;
-+
-+      locomo_gpio_set_dir(&poodle_locomo_device.dev,
-+              POODLE_LOCOMO_GPIO_AMP_ON, 0);
-+      /* should we mute HP at startup - burning power ?*/
-+      locomo_gpio_set_dir(&poodle_locomo_device.dev,
-+              POODLE_LOCOMO_GPIO_MUTE_L, 0);
-+      locomo_gpio_set_dir(&poodle_locomo_device.dev,
-+              POODLE_LOCOMO_GPIO_MUTE_R, 0);
-+
-+      poodle_snd_device = platform_device_alloc("soc-audio", -1);
-+      if (!poodle_snd_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(poodle_snd_device, &poodle_snd_devdata);
-+      poodle_snd_devdata.dev = &poodle_snd_device->dev;
-+      ret = platform_device_add(poodle_snd_device);
-+
-+      if (ret)
-+              platform_device_put(poodle_snd_device);
-+
-+      return ret;
-+}
-+
-+static void __exit poodle_exit(void)
-+{
-+      platform_device_unregister(poodle_snd_device);
-+}
-+
-+module_init(poodle_init);
-+module_exit(poodle_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Richard Purdie");
-+MODULE_DESCRIPTION("ALSA SoC Poodle");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-ac97.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-ac97.c
-@@ -0,0 +1,437 @@
-+/*
-+ * linux/sound/pxa2xx-ac97.c -- AC97 support for the Intel PXA2xx chip.
-+ *
-+ * Author:    Nicolas Pitre
-+ * Created:   Dec 02, 2004
-+ * Copyright: MontaVista Software 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.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/interrupt.h>
-+#include <linux/wait.h>
-+#include <linux/delay.h>
-+
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/ac97_codec.h>
-+#include <sound/initval.h>
-+#include <sound/soc.h>
-+
-+#include <asm/irq.h>
-+#include <linux/mutex.h>
-+#include <asm/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/audio.h>
-+
-+#include "pxa2xx-pcm.h"
-+
-+static DEFINE_MUTEX(car_mutex);
-+static DECLARE_WAIT_QUEUE_HEAD(gsr_wq);
-+static volatile long gsr_bits;
-+
-+#define AC97_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define AC97_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
-+
-+/* may need to expand this */
-+static struct snd_soc_dai_mode pxa2xx_ac97_modes[] = {
-+      {
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = AC97_RATES,
-+              .pcmdir = AC97_DIR,
-+      },
-+};
-+
-+/*
-+ * Beware PXA27x bugs:
-+ *
-+ *   o Slot 12 read from modem space will hang controller.
-+ *   o CDONE, SDONE interrupt fails after any slot 12 IO.
-+ *
-+ * We therefore have an hybrid approach for waiting on SDONE (interrupt or
-+ * 1 jiffy timeout if interrupt never comes).
-+ */
-+
-+static unsigned short pxa2xx_ac97_read(struct snd_ac97 *ac97,
-+      unsigned short reg)
-+{
-+      unsigned short val = -1;
-+      volatile u32 *reg_addr;
-+
-+      mutex_lock(&car_mutex);
-+
-+      /* set up primary or secondary codec/modem space */
-+#ifdef CONFIG_PXA27x
-+      reg_addr = ac97->num ? &SAC_REG_BASE : &PAC_REG_BASE;
-+#else
-+      if (reg == AC97_GPIO_STATUS)
-+              reg_addr = ac97->num ? &SMC_REG_BASE : &PMC_REG_BASE;
-+      else
-+              reg_addr = ac97->num ? &SAC_REG_BASE : &PAC_REG_BASE;
-+#endif
-+      reg_addr += (reg >> 1);
-+
-+#ifndef CONFIG_PXA27x
-+      if (reg == AC97_GPIO_STATUS) {
-+              /* read from controller cache */
-+              val = *reg_addr;
-+              goto out;
-+      }
-+#endif
-+
-+      /* start read access across the ac97 link */
-+      GSR = GSR_CDONE | GSR_SDONE;
-+      gsr_bits = 0;
-+      val = *reg_addr;
-+
-+      wait_event_timeout(gsr_wq, (GSR | gsr_bits) & GSR_SDONE, 1);
-+      if (!((GSR | gsr_bits) & GSR_SDONE)) {
-+              printk(KERN_ERR "%s: read error (ac97_reg=%x GSR=%#lx)\n",
-+                              __FUNCTION__, reg, GSR | gsr_bits);
-+              val = -1;
-+              goto out;
-+      }
-+
-+      /* valid data now */
-+      GSR = GSR_CDONE | GSR_SDONE;
-+      gsr_bits = 0;
-+      val = *reg_addr;
-+      /* but we've just started another cycle... */
-+      wait_event_timeout(gsr_wq, (GSR | gsr_bits) & GSR_SDONE, 1);
-+
-+out:  mutex_unlock(&car_mutex);
-+      return val;
-+}
-+
-+static void pxa2xx_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
-+      unsigned short val)
-+{
-+      volatile u32 *reg_addr;
-+
-+      mutex_lock(&car_mutex);
-+
-+      /* set up primary or secondary codec/modem space */
-+#ifdef CONFIG_PXA27x
-+      reg_addr = ac97->num ? &SAC_REG_BASE : &PAC_REG_BASE;
-+#else
-+      if (reg == AC97_GPIO_STATUS)
-+              reg_addr = ac97->num ? &SMC_REG_BASE : &PMC_REG_BASE;
-+      else
-+              reg_addr = ac97->num ? &SAC_REG_BASE : &PAC_REG_BASE;
-+#endif
-+      reg_addr += (reg >> 1);
-+
-+      GSR = GSR_CDONE | GSR_SDONE;
-+      gsr_bits = 0;
-+      *reg_addr = val;
-+      wait_event_timeout(gsr_wq, (GSR | gsr_bits) & GSR_CDONE, 1);
-+      if (!((GSR | gsr_bits) & GSR_CDONE))
-+              printk(KERN_ERR "%s: write error (ac97_reg=%x GSR=%#lx)\n",
-+                              __FUNCTION__, reg, GSR | gsr_bits);
-+
-+      mutex_unlock(&car_mutex);
-+}
-+
-+static void pxa2xx_ac97_warm_reset(struct snd_ac97 *ac97)
-+{
-+      gsr_bits = 0;
-+
-+#ifdef CONFIG_PXA27x
-+      /* warm reset broken on Bulverde,
-+         so manually keep AC97 reset high */
-+      pxa_gpio_mode(113 | GPIO_OUT | GPIO_DFLT_HIGH);
-+      udelay(10);
-+      GCR |= GCR_WARM_RST;
-+      pxa_gpio_mode(113 | GPIO_ALT_FN_2_OUT);
-+      udelay(500);
-+#else
-+      GCR |= GCR_WARM_RST | GCR_PRIRDY_IEN | GCR_SECRDY_IEN;
-+      wait_event_timeout(gsr_wq, gsr_bits & (GSR_PCR | GSR_SCR), 1);
-+#endif
-+
-+      if (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR)))
-+              printk(KERN_INFO "%s: warm reset timeout (GSR=%#lx)\n",
-+                               __FUNCTION__, gsr_bits);
-+
-+      GCR &= ~(GCR_PRIRDY_IEN|GCR_SECRDY_IEN);
-+      GCR |= GCR_SDONE_IE|GCR_CDONE_IE;
-+}
-+
-+static void pxa2xx_ac97_cold_reset(struct snd_ac97 *ac97)
-+{
-+      GCR &=  GCR_COLD_RST;  /* clear everything but nCRST */
-+      GCR &= ~GCR_COLD_RST;  /* then assert nCRST */
-+
-+      gsr_bits = 0;
-+#ifdef CONFIG_PXA27x
-+      /* PXA27x Developers Manual section 13.5.2.2.1 */
-+      pxa_set_cken(1 << 31, 1);
-+      udelay(5);
-+      pxa_set_cken(1 << 31, 0);
-+      GCR = GCR_COLD_RST;
-+      udelay(50);
-+#else
-+      GCR = GCR_COLD_RST;
-+      GCR |= GCR_CDONE_IE|GCR_SDONE_IE;
-+      wait_event_timeout(gsr_wq, gsr_bits & (GSR_PCR | GSR_SCR), 1);
-+#endif
-+
-+      if (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR)))
-+              printk(KERN_INFO "%s: cold reset timeout (GSR=%#lx)\n",
-+                               __FUNCTION__, gsr_bits);
-+
-+      GCR &= ~(GCR_PRIRDY_IEN|GCR_SECRDY_IEN);
-+      GCR |= GCR_SDONE_IE|GCR_CDONE_IE;
-+}
-+
-+static irqreturn_t pxa2xx_ac97_irq(int irq, void *dev_id)
-+{
-+      long status;
-+
-+      status = GSR;
-+      if (status) {
-+              GSR = status;
-+              gsr_bits |= status;
-+              wake_up(&gsr_wq);
-+
-+#ifdef CONFIG_PXA27x
-+              /* Although we don't use those we still need to clear them
-+                 since they tend to spuriously trigger when MMC is used
-+                 (hardware bug? go figure)... */
-+              MISR = MISR_EOC;
-+              PISR = PISR_EOC;
-+              MCSR = MCSR_EOC;
-+#endif
-+
-+              return IRQ_HANDLED;
-+      }
-+
-+      return IRQ_NONE;
-+}
-+
-+struct snd_ac97_bus_ops soc_ac97_ops = {
-+      .read   = pxa2xx_ac97_read,
-+      .write  = pxa2xx_ac97_write,
-+      .warm_reset     = pxa2xx_ac97_warm_reset,
-+      .reset  = pxa2xx_ac97_cold_reset,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ac97_pcm_stereo_out = {
-+      .name                   = "AC97 PCM Stereo out",
-+      .dev_addr               = __PREG(PCDR),
-+      .drcmr                  = &DRCMRTXPCDR,
-+      .dcmd                   = DCMD_INCSRCADDR | DCMD_FLOWTRG |
-+                                DCMD_BURST32 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ac97_pcm_stereo_in = {
-+      .name                   = "AC97 PCM Stereo in",
-+      .dev_addr               = __PREG(PCDR),
-+      .drcmr                  = &DRCMRRXPCDR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST32 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ac97_pcm_aux_mono_out = {
-+      .name                   = "AC97 Aux PCM (Slot 5) Mono out",
-+      .dev_addr               = __PREG(MODR),
-+      .drcmr                  = &DRCMRTXMODR,
-+      .dcmd                   = DCMD_INCSRCADDR | DCMD_FLOWTRG |
-+                                DCMD_BURST16 | DCMD_WIDTH2,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ac97_pcm_aux_mono_in = {
-+      .name                   = "AC97 Aux PCM (Slot 5) Mono in",
-+      .dev_addr               = __PREG(MODR),
-+      .drcmr                  = &DRCMRRXMODR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST16 | DCMD_WIDTH2,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ac97_pcm_mic_mono_in = {
-+      .name                   = "AC97 Mic PCM (Slot 6) Mono in",
-+      .dev_addr               = __PREG(MCDR),
-+      .drcmr                  = &DRCMRRXMCDR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST16 | DCMD_WIDTH2,
-+};
-+
-+#ifdef CONFIG_PM
-+static int pxa2xx_ac97_suspend(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      GCR |= GCR_ACLINK_OFF;
-+      pxa_set_cken(CKEN2_AC97, 0);
-+      return 0;
-+}
-+
-+static int pxa2xx_ac97_resume(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      pxa_gpio_mode(GPIO31_SYNC_AC97_MD);
-+      pxa_gpio_mode(GPIO30_SDATA_OUT_AC97_MD);
-+      pxa_gpio_mode(GPIO28_BITCLK_AC97_MD);
-+      pxa_gpio_mode(GPIO29_SDATA_IN_AC97_MD);
-+#ifdef CONFIG_PXA27x
-+      /* Use GPIO 113 as AC97 Reset on Bulverde */
-+      pxa_gpio_mode(113 | GPIO_ALT_FN_2_OUT);
-+#endif
-+      pxa_set_cken(CKEN2_AC97, 1);
-+      return 0;
-+}
-+
-+#else
-+#define pxa2xx_ac97_suspend   NULL
-+#define pxa2xx_ac97_resume    NULL
-+#endif
-+
-+static int pxa2xx_ac97_probe(struct platform_device *pdev)
-+{
-+      int ret;
-+
-+      ret = request_irq(IRQ_AC97, pxa2xx_ac97_irq, 0, "AC97", NULL);
-+      if (ret < 0)
-+              goto err;
-+
-+      pxa_gpio_mode(GPIO31_SYNC_AC97_MD);
-+      pxa_gpio_mode(GPIO30_SDATA_OUT_AC97_MD);
-+      pxa_gpio_mode(GPIO28_BITCLK_AC97_MD);
-+      pxa_gpio_mode(GPIO29_SDATA_IN_AC97_MD);
-+#ifdef CONFIG_PXA27x
-+      /* Use GPIO 113 as AC97 Reset on Bulverde */
-+      pxa_gpio_mode(113 | GPIO_ALT_FN_2_OUT);
-+#endif
-+      pxa_set_cken(CKEN2_AC97, 1);
-+      return 0;
-+
-+ err:
-+      if (CKEN & CKEN2_AC97) {
-+              GCR |= GCR_ACLINK_OFF;
-+              free_irq(IRQ_AC97, NULL);
-+              pxa_set_cken(CKEN2_AC97, 0);
-+      }
-+      return ret;
-+}
-+
-+static void pxa2xx_ac97_remove(struct platform_device *pdev)
-+{
-+      GCR |= GCR_ACLINK_OFF;
-+      free_irq(IRQ_AC97, NULL);
-+      pxa_set_cken(CKEN2_AC97, 0);
-+}
-+
-+static int pxa2xx_ac97_hw_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              rtd->cpu_dai->dma_data = &pxa2xx_ac97_pcm_stereo_out;
-+      else
-+              rtd->cpu_dai->dma_data = &pxa2xx_ac97_pcm_stereo_in;
-+
-+      return 0;
-+}
-+
-+static int pxa2xx_ac97_hw_aux_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              rtd->cpu_dai->dma_data = &pxa2xx_ac97_pcm_aux_mono_out;
-+      else
-+              rtd->cpu_dai->dma_data = &pxa2xx_ac97_pcm_aux_mono_in;
-+
-+      return 0;
-+}
-+
-+static int pxa2xx_ac97_hw_mic_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              return -ENODEV;
-+      else
-+              rtd->cpu_dai->dma_data = &pxa2xx_ac97_pcm_mic_mono_in;
-+
-+      return 0;
-+}
-+
-+/*
-+ * There is only 1 physical AC97 interface for pxa2xx, but it
-+ * has extra fifo's that can be used for aux DACs and ADCs.
-+ */
-+struct snd_soc_cpu_dai pxa_ac97_dai[] = {
-+{
-+      .name = "pxa2xx-ac97",
-+      .id = 0,
-+      .type = SND_SOC_DAI_AC97,
-+      .probe = pxa2xx_ac97_probe,
-+      .remove = pxa2xx_ac97_remove,
-+      .suspend = pxa2xx_ac97_suspend,
-+      .resume = pxa2xx_ac97_resume,
-+      .playback = {
-+              .stream_name = "AC97 Playback",
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .capture = {
-+              .stream_name = "AC97 Capture",
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .ops = {
-+              .hw_params = pxa2xx_ac97_hw_params,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(pxa2xx_ac97_modes),
-+              .mode = pxa2xx_ac97_modes,},
-+},
-+{
-+      .name = "pxa2xx-ac97-aux",
-+      .id = 1,
-+      .type = SND_SOC_DAI_AC97,
-+      .playback = {
-+              .stream_name = "AC97 Aux Playback",
-+              .channels_min = 1,
-+              .channels_max = 1,},
-+      .capture = {
-+              .stream_name = "AC97 Aux Capture",
-+              .channels_min = 1,
-+              .channels_max = 1,},
-+      .ops = {
-+              .hw_params = pxa2xx_ac97_hw_aux_params,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(pxa2xx_ac97_modes),
-+              .mode = pxa2xx_ac97_modes,},
-+},
-+{
-+      .name = "pxa2xx-ac97-mic",
-+      .id = 2,
-+      .type = SND_SOC_DAI_AC97,
-+      .capture = {
-+              .stream_name = "AC97 Mic Capture",
-+              .channels_min = 1,
-+              .channels_max = 1,},
-+      .ops = {
-+              .hw_params = pxa2xx_ac97_hw_mic_params,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(pxa2xx_ac97_modes),
-+              .mode = pxa2xx_ac97_modes,},},
-+};
-+
-+EXPORT_SYMBOL_GPL(pxa_ac97_dai);
-+EXPORT_SYMBOL_GPL(soc_ac97_ops);
-+
-+MODULE_AUTHOR("Nicolas Pitre");
-+MODULE_DESCRIPTION("AC97 driver for the Intel PXA2xx chip");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-i2s.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-i2s.c
-@@ -0,0 +1,354 @@
-+/*
-+ * pxa2xx-i2s.c  --  ALSA Soc Audio Layer
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    12th Aug 2005   Initial version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/device.h>
-+#include <linux/delay.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/initval.h>
-+#include <sound/soc.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/audio.h>
-+
-+#include "pxa2xx-pcm.h"
-+
-+/* used to disable sysclk if external crystal is used */
-+static int extclk;
-+module_param(extclk, int, 0);
-+MODULE_PARM_DESC(extclk, "set to 1 to disable pxa2xx i2s sysclk");
-+
-+struct pxa_i2s_port {
-+      u32 sadiv;
-+      u32 sacr0;
-+      u32 sacr1;
-+      u32 saimr;
-+      int master;
-+};
-+static struct pxa_i2s_port pxa_i2s;
-+
-+#define PXA_I2S_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF)
-+
-+#define PXA_I2S_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define PXA_I2S_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
-+
-+/* priv is divider */
-+static struct snd_soc_dai_mode pxa2xx_i2s_modes[] = {
-+      /* pxa2xx I2S frame and clock master modes */
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0x48,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0x34,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0x24,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0x1a,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0xd,
-+      },
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = PXA_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBD(4),
-+              .priv = 0xc,
-+      },
-+
-+      /* pxa2xx I2S frame master and clock slave mode */
-+      {
-+              .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBM_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = PXA_I2S_RATES,
-+              .pcmdir = PXA_I2S_DIR,
-+              .fs = SND_SOC_FS_ALL,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .bfs = 64,
-+              .priv = 0x48,
-+      },
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_i2s_pcm_stereo_out = {
-+      .name                   = "I2S PCM Stereo out",
-+      .dev_addr               = __PREG(SADR),
-+      .drcmr                  = &DRCMRTXSADR,
-+      .dcmd                   = DCMD_INCSRCADDR | DCMD_FLOWTRG |
-+                                DCMD_BURST32 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_i2s_pcm_stereo_in = {
-+      .name                   = "I2S PCM Stereo in",
-+      .dev_addr               = __PREG(SADR),
-+      .drcmr                  = &DRCMRRXSADR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST32 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_gpio gpio_bus[] = {
-+      { /* I2S SoC Slave */
-+              .rx = GPIO29_SDATA_IN_I2S_MD,
-+              .tx = GPIO30_SDATA_OUT_I2S_MD,
-+              .clk = GPIO28_BITCLK_IN_I2S_MD,
-+              .frm = GPIO31_SYNC_I2S_MD,
-+      },
-+      { /* I2S SoC Master */
-+#ifdef CONFIG_PXA27x
-+              .sys = GPIO113_I2S_SYSCLK_MD,
-+#else
-+              .sys = GPIO32_SYSCLK_I2S_MD,
-+#endif
-+              .rx = GPIO29_SDATA_IN_I2S_MD,
-+              .tx = GPIO30_SDATA_OUT_I2S_MD,
-+              .clk = GPIO28_BITCLK_OUT_I2S_MD,
-+              .frm = GPIO31_SYNC_I2S_MD,
-+      },
-+};
-+
-+static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if (!rtd->cpu_dai->active) {
-+              SACR0 |= SACR0_RST;
-+              SACR0 = 0;
-+      }
-+
-+      return 0;
-+}
-+
-+/* wait for I2S controller to be ready */
-+static int pxa_i2s_wait(void)
-+{
-+      int i;
-+
-+      /* flush the Rx FIFO */
-+      for(i = 0; i < 16; i++)
-+              SADR;
-+      return 0;
-+}
-+
-+static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      pxa_i2s.master = 0;
-+      if (rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CBS_CFS)
-+              pxa_i2s.master = 1;
-+
-+      if (pxa_i2s.master && !extclk)
-+              pxa_gpio_mode(gpio_bus[pxa_i2s.master].sys);
-+
-+      pxa_gpio_mode(gpio_bus[pxa_i2s.master].rx);
-+      pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx);
-+      pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm);
-+      pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk);
-+      pxa_set_cken(CKEN8_I2S, 1);
-+      pxa_i2s_wait();
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              rtd->cpu_dai->dma_data = &pxa2xx_i2s_pcm_stereo_out;
-+      else
-+              rtd->cpu_dai->dma_data = &pxa2xx_i2s_pcm_stereo_in;
-+
-+      /* is port used by another stream */
-+      if (!(SACR0 & SACR0_ENB)) {
-+
-+              SACR0 = 0;
-+              SACR1 = 0;
-+              if (pxa_i2s.master)
-+                      SACR0 |= SACR0_BCKD;
-+
-+              SACR0 |= SACR0_RFTH(14) | SACR0_TFTH(1);
-+
-+              if (rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_LEFT_J)
-+                      SACR1 |= SACR1_AMSL;
-+      }
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              SAIMR |= SAIMR_TFS;
-+      else
-+              SAIMR |= SAIMR_RFS;
-+
-+      SADIV = rtd->cpu_dai->dai_runtime.priv;
-+      return 0;
-+}
-+
-+static int pxa2xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      int ret = 0;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+              SACR0 |= SACR0_ENB;
-+              break;
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+      case SNDRV_PCM_TRIGGER_STOP:
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              break;
-+      default:
-+              ret = -EINVAL;
-+      }
-+
-+      return ret;
-+}
-+
-+static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream)
-+{
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+              SACR1 |= SACR1_DRPL;
-+              SAIMR &= ~SAIMR_TFS;
-+      } else {
-+              SACR1 |= SACR1_DREC;
-+              SAIMR &= ~SAIMR_RFS;
-+      }
-+
-+      if (SACR1 & (SACR1_DREC | SACR1_DRPL)) {
-+              SACR0 &= ~SACR0_ENB;
-+              pxa_i2s_wait();
-+              pxa_set_cken(CKEN8_I2S, 0);
-+      }
-+}
-+
-+#ifdef CONFIG_PM
-+static int pxa2xx_i2s_suspend(struct platform_device *dev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if (!dai->active)
-+              return 0;
-+
-+      /* store registers */
-+      pxa_i2s.sacr0 = SACR0;
-+      pxa_i2s.sacr1 = SACR1;
-+      pxa_i2s.saimr = SAIMR;
-+      pxa_i2s.sadiv = SADIV;
-+
-+      /* deactivate link */
-+      SACR0 &= ~SACR0_ENB;
-+      pxa_i2s_wait();
-+      return 0;
-+}
-+
-+static int pxa2xx_i2s_resume(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if (!dai->active)
-+              return 0;
-+
-+      pxa_i2s_wait();
-+
-+      SACR0 = pxa_i2s.sacr0 &= ~SACR0_ENB;
-+      SACR1 = pxa_i2s.sacr1;
-+      SAIMR = pxa_i2s.saimr;
-+      SADIV = pxa_i2s.sadiv;
-+      SACR0 |= SACR0_ENB;
-+
-+      return 0;
-+}
-+
-+#else
-+#define pxa2xx_i2s_suspend    NULL
-+#define pxa2xx_i2s_resume     NULL
-+#endif
-+
-+/* pxa2xx I2S sysclock is always 256 FS */
-+static unsigned int pxa_i2s_config_sysclk(struct snd_soc_cpu_dai *iface,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      return info->rate << 8;
-+}
-+
-+struct snd_soc_cpu_dai pxa_i2s_dai = {
-+      .name = "pxa2xx-i2s",
-+      .id = 0,
-+      .type = SND_SOC_DAI_I2S,
-+      .suspend = pxa2xx_i2s_suspend,
-+      .resume = pxa2xx_i2s_resume,
-+      .config_sysclk = pxa_i2s_config_sysclk,
-+      .playback = {
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .capture = {
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .ops = {
-+              .startup = pxa2xx_i2s_startup,
-+              .shutdown = pxa2xx_i2s_shutdown,
-+              .trigger = pxa2xx_i2s_trigger,
-+              .hw_params = pxa2xx_i2s_hw_params,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(pxa2xx_i2s_modes),
-+              .mode = pxa2xx_i2s_modes,},
-+};
-+
-+EXPORT_SYMBOL_GPL(pxa_i2s_dai);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("pxa2xx I2S SoC Interface");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-pcm.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-pcm.c
-@@ -0,0 +1,363 @@
-+/*
-+ * linux/sound/arm/pxa2xx-pcm.c -- ALSA PCM interface for the Intel PXA2xx chip
-+ *
-+ * Author:    Nicolas Pitre
-+ * Created:   Nov 30, 2004
-+ * Copyright: (C) 2004 MontaVista Software, 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.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/slab.h>
-+#include <linux/dma-mapping.h>
-+
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+
-+#include <asm/dma.h>
-+#include <asm/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/audio.h>
-+
-+#include "pxa2xx-pcm.h"
-+
-+static const struct snd_pcm_hardware pxa2xx_pcm_hardware = {
-+      .info                   = SNDRV_PCM_INFO_MMAP |
-+                                SNDRV_PCM_INFO_MMAP_VALID |
-+                                SNDRV_PCM_INFO_INTERLEAVED |
-+                                SNDRV_PCM_INFO_PAUSE |
-+                                SNDRV_PCM_INFO_RESUME,
-+      .formats                = SNDRV_PCM_FMTBIT_S16_LE |
-+                                      SNDRV_PCM_FMTBIT_S24_LE |
-+                                      SNDRV_PCM_FMTBIT_S32_LE,
-+      .period_bytes_min       = 32,
-+      .period_bytes_max       = 8192 - 32,
-+      .periods_min            = 1,
-+      .periods_max            = PAGE_SIZE/sizeof(pxa_dma_desc),
-+      .buffer_bytes_max       = 128 * 1024,
-+      .fifo_size              = 32,
-+};
-+
-+struct pxa2xx_runtime_data {
-+      int dma_ch;
-+      struct pxa2xx_pcm_dma_params *params;
-+      pxa_dma_desc *dma_desc_array;
-+      dma_addr_t dma_desc_array_phys;
-+};
-+
-+static void pxa2xx_pcm_dma_irq(int dma_ch, void *dev_id)
-+{
-+      struct snd_pcm_substream *substream = dev_id;
-+      struct pxa2xx_runtime_data *prtd = substream->runtime->private_data;
-+      int dcsr;
-+
-+      dcsr = DCSR(dma_ch);
-+      DCSR(dma_ch) = dcsr & ~DCSR_STOPIRQEN;
-+
-+      if (dcsr & DCSR_ENDINTR) {
-+              snd_pcm_period_elapsed(substream);
-+      } else {
-+              printk( KERN_ERR "%s: DMA error on channel %d (DCSR=%#x)\n",
-+                      prtd->params->name, dma_ch, dcsr );
-+      }
-+}
-+
-+static int pxa2xx_pcm_hw_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct pxa2xx_runtime_data *prtd = runtime->private_data;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct pxa2xx_pcm_dma_params *dma = rtd->cpu_dai->dma_data;
-+      size_t totsize = params_buffer_bytes(params);
-+      size_t period = params_period_bytes(params);
-+      pxa_dma_desc *dma_desc;
-+      dma_addr_t dma_buff_phys, next_desc_phys;
-+      int ret;
-+
-+      /* this may get called several times by oss emulation
-+       * with different params */
-+      if (prtd->params == NULL) {
-+              prtd->params = dma;
-+              ret = pxa_request_dma(prtd->params->name, DMA_PRIO_LOW,
-+                            pxa2xx_pcm_dma_irq, substream);
-+              if (ret < 0)
-+                      return ret;
-+              prtd->dma_ch = ret;
-+      } else if (prtd->params != dma) {
-+              pxa_free_dma(prtd->dma_ch);
-+              prtd->params = dma;
-+              ret = pxa_request_dma(prtd->params->name, DMA_PRIO_LOW,
-+                            pxa2xx_pcm_dma_irq, substream);
-+              if (ret < 0)
-+                      return ret;
-+              prtd->dma_ch = ret;
-+      }
-+
-+      snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
-+      runtime->dma_bytes = totsize;
-+
-+      dma_desc = prtd->dma_desc_array;
-+      next_desc_phys = prtd->dma_desc_array_phys;
-+      dma_buff_phys = runtime->dma_addr;
-+      do {
-+              next_desc_phys += sizeof(pxa_dma_desc);
-+              dma_desc->ddadr = next_desc_phys;
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+                      dma_desc->dsadr = dma_buff_phys;
-+                      dma_desc->dtadr = prtd->params->dev_addr;
-+              } else {
-+                      dma_desc->dsadr = prtd->params->dev_addr;
-+                      dma_desc->dtadr = dma_buff_phys;
-+              }
-+              if (period > totsize)
-+                      period = totsize;
-+              dma_desc->dcmd = prtd->params->dcmd | period | DCMD_ENDIRQEN;
-+              dma_desc++;
-+              dma_buff_phys += period;
-+      } while (totsize -= period);
-+      dma_desc[-1].ddadr = prtd->dma_desc_array_phys;
-+
-+      return 0;
-+}
-+
-+static int pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream)
-+{
-+      struct pxa2xx_runtime_data *prtd = substream->runtime->private_data;
-+
-+      if (prtd && prtd->params)
-+              *prtd->params->drcmr = 0;
-+
-+      if (prtd->dma_ch) {
-+              snd_pcm_set_runtime_buffer(substream, NULL);
-+              pxa_free_dma(prtd->dma_ch);
-+              prtd->dma_ch = 0;
-+      }
-+
-+      return 0;
-+}
-+
-+static int pxa2xx_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct pxa2xx_runtime_data *prtd = substream->runtime->private_data;
-+
-+      DCSR(prtd->dma_ch) &= ~DCSR_RUN;
-+      DCSR(prtd->dma_ch) = 0;
-+      DCMD(prtd->dma_ch) = 0;
-+      *prtd->params->drcmr = prtd->dma_ch | DRCMR_MAPVLD;
-+
-+      return 0;
-+}
-+
-+static int pxa2xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      struct pxa2xx_runtime_data *prtd = substream->runtime->private_data;
-+      int ret = 0;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+              DDADR(prtd->dma_ch) = prtd->dma_desc_array_phys;
-+              DCSR(prtd->dma_ch) = DCSR_RUN;
-+              break;
-+
-+      case SNDRV_PCM_TRIGGER_STOP:
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              DCSR(prtd->dma_ch) &= ~DCSR_RUN;
-+              break;
-+
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+              DCSR(prtd->dma_ch) |= DCSR_RUN;
-+              break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+              DDADR(prtd->dma_ch) = prtd->dma_desc_array_phys;
-+              DCSR(prtd->dma_ch) |= DCSR_RUN;
-+              break;
-+
-+      default:
-+              ret = -EINVAL;
-+      }
-+
-+      return ret;
-+}
-+
-+static snd_pcm_uframes_t
-+pxa2xx_pcm_pointer(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct pxa2xx_runtime_data *prtd = runtime->private_data;
-+
-+      dma_addr_t ptr = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) ?
-+                       DSADR(prtd->dma_ch) : DTADR(prtd->dma_ch);
-+      snd_pcm_uframes_t x = bytes_to_frames(runtime, ptr - runtime->dma_addr);
-+
-+      if (x == runtime->buffer_size)
-+              x = 0;
-+      return x;
-+}
-+
-+static int pxa2xx_pcm_open(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct pxa2xx_runtime_data *prtd;
-+      int ret;
-+
-+      snd_soc_set_runtime_hwparams(substream, &pxa2xx_pcm_hardware);
-+
-+      /*
-+       * For mysterious reasons (and despite what the manual says)
-+       * playback samples are lost if the DMA count is not a multiple
-+       * of the DMA burst size.  Let's add a rule to enforce that.
-+       */
-+      ret = snd_pcm_hw_constraint_step(runtime, 0,
-+              SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 32);
-+      if (ret)
-+              goto out;
-+
-+      ret = snd_pcm_hw_constraint_step(runtime, 0,
-+              SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 32);
-+      if (ret)
-+              goto out;
-+
-+      prtd = kzalloc(sizeof(struct pxa2xx_runtime_data), GFP_KERNEL);
-+      if (prtd == NULL) {
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+
-+      prtd->dma_desc_array =
-+              dma_alloc_writecombine(substream->pcm->card->dev, PAGE_SIZE,
-+                                     &prtd->dma_desc_array_phys, GFP_KERNEL);
-+      if (!prtd->dma_desc_array) {
-+              ret = -ENOMEM;
-+              goto err1;
-+      }
-+
-+      runtime->private_data = prtd;
-+      return 0;
-+
-+ err1:
-+      kfree(prtd);
-+ out:
-+      return ret;
-+}
-+
-+static int pxa2xx_pcm_close(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct pxa2xx_runtime_data *prtd = runtime->private_data;
-+
-+      dma_free_writecombine(substream->pcm->card->dev, PAGE_SIZE,
-+                            prtd->dma_desc_array, prtd->dma_desc_array_phys);
-+      kfree(prtd);
-+      return 0;
-+}
-+
-+static int pxa2xx_pcm_mmap(struct snd_pcm_substream *substream,
-+      struct vm_area_struct *vma)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      return dma_mmap_writecombine(substream->pcm->card->dev, vma,
-+                                   runtime->dma_area,
-+                                   runtime->dma_addr,
-+                                   runtime->dma_bytes);
-+}
-+
-+struct snd_pcm_ops pxa2xx_pcm_ops = {
-+      .open           = pxa2xx_pcm_open,
-+      .close          = pxa2xx_pcm_close,
-+      .ioctl          = snd_pcm_lib_ioctl,
-+      .hw_params      = pxa2xx_pcm_hw_params,
-+      .hw_free        = pxa2xx_pcm_hw_free,
-+      .prepare        = pxa2xx_pcm_prepare,
-+      .trigger        = pxa2xx_pcm_trigger,
-+      .pointer        = pxa2xx_pcm_pointer,
-+      .mmap           = pxa2xx_pcm_mmap,
-+};
-+
-+static int pxa2xx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
-+{
-+      struct snd_pcm_substream *substream = pcm->streams[stream].substream;
-+      struct snd_dma_buffer *buf = &substream->dma_buffer;
-+      size_t size = pxa2xx_pcm_hardware.buffer_bytes_max;
-+      buf->dev.type = SNDRV_DMA_TYPE_DEV;
-+      buf->dev.dev = pcm->card->dev;
-+      buf->private_data = NULL;
-+      buf->area = dma_alloc_writecombine(pcm->card->dev, size,
-+                                         &buf->addr, GFP_KERNEL);
-+      if (!buf->area)
-+              return -ENOMEM;
-+      buf->bytes = size;
-+      return 0;
-+}
-+
-+static void pxa2xx_pcm_free_dma_buffers(struct snd_pcm *pcm)
-+{
-+      struct snd_pcm_substream *substream;
-+      struct snd_dma_buffer *buf;
-+      int stream;
-+
-+      for (stream = 0; stream < 2; stream++) {
-+              substream = pcm->streams[stream].substream;
-+              if (!substream)
-+                      continue;
-+
-+              buf = &substream->dma_buffer;
-+              if (!buf->area)
-+                      continue;
-+
-+              dma_free_writecombine(pcm->card->dev, buf->bytes,
-+                                    buf->area, buf->addr);
-+              buf->area = NULL;
-+      }
-+}
-+
-+static u64 pxa2xx_pcm_dmamask = DMA_32BIT_MASK;
-+
-+int pxa2xx_pcm_new(struct snd_card *card, struct snd_soc_codec_dai *dai,
-+      struct snd_pcm *pcm)
-+{
-+      int ret = 0;
-+
-+      if (!card->dev->dma_mask)
-+              card->dev->dma_mask = &pxa2xx_pcm_dmamask;
-+      if (!card->dev->coherent_dma_mask)
-+              card->dev->coherent_dma_mask = DMA_32BIT_MASK;
-+
-+      if (dai->playback.channels_min) {
-+              ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
-+                      SNDRV_PCM_STREAM_PLAYBACK);
-+              if (ret)
-+                      goto out;
-+      }
-+
-+      if (dai->capture.channels_min) {
-+              ret = pxa2xx_pcm_preallocate_dma_buffer(pcm,
-+                      SNDRV_PCM_STREAM_CAPTURE);
-+              if (ret)
-+                      goto out;
-+      }
-+ out:
-+      return ret;
-+}
-+
-+struct snd_soc_platform pxa2xx_soc_platform = {
-+      .name           = "pxa2xx-audio",
-+      .pcm_ops        = &pxa2xx_pcm_ops,
-+      .pcm_new        = pxa2xx_pcm_new,
-+      .pcm_free       = pxa2xx_pcm_free_dma_buffers,
-+};
-+
-+EXPORT_SYMBOL_GPL(pxa2xx_soc_platform);
-+
-+MODULE_AUTHOR("Nicolas Pitre");
-+MODULE_DESCRIPTION("Intel PXA2xx PCM DMA module");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-pcm.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-pcm.h
-@@ -0,0 +1,48 @@
-+/*
-+ * linux/sound/arm/pxa2xx-pcm.h -- ALSA PCM interface for the Intel PXA2xx chip
-+ *
-+ * Author:    Nicolas Pitre
-+ * Created:   Nov 30, 2004
-+ * Copyright: MontaVista Software, 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.
-+ */
-+
-+#ifndef _PXA2XX_PCM_H
-+#define _PXA2XX_PCM_H
-+
-+struct pxa2xx_pcm_dma_params {
-+      char *name;                     /* stream identifier */
-+      u32 dcmd;                       /* DMA descriptor dcmd field */
-+      volatile u32 *drcmr;            /* the DMA request channel to use */
-+      u32 dev_addr;                   /* device physical address for DMA */
-+};
-+
-+struct pxa2xx_gpio {
-+      u32 sys;
-+      u32     rx;
-+      u32 tx;
-+      u32 clk;
-+      u32 frm;
-+};
-+
-+/* pxa2xx DAI ID's */
-+#define PXA2XX_DAI_AC97_HIFI  0
-+#define PXA2XX_DAI_AC97_AUX           1
-+#define PXA2XX_DAI_AC97_MIC           2
-+#define PXA2XX_DAI_I2S                        0
-+#define PXA2XX_DAI_SSP1                       0
-+#define PXA2XX_DAI_SSP2                       1
-+#define PXA2XX_DAI_SSP3                       2
-+
-+extern struct snd_soc_cpu_dai pxa_ac97_dai[3];
-+extern struct snd_soc_cpu_dai pxa_i2s_dai;
-+extern struct snd_soc_cpu_dai pxa_ssp_dai[3];
-+
-+/* platform data */
-+extern struct snd_soc_platform pxa2xx_soc_platform;
-+extern struct snd_ac97_bus_ops pxa2xx_ac97_ops;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-ssp.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/pxa2xx-ssp.c
-@@ -0,0 +1,767 @@
-+/*
-+ * pxa2xx-ssp.c  --  ALSA Soc Audio Layer
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    12th Aug 2005   Initial version.
-+ *
-+ * TODO:
-+ *  o Fix master mode (bug)
-+ *  o Fix resume (bug)
-+ *  o Add support for other clocks
-+ *  o Test network mode for > 16bit sample size
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/initval.h>
-+#include <sound/soc.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/audio.h>
-+#include <asm/arch/ssp.h>
-+
-+#include "pxa2xx-pcm.h"
-+
-+/*
-+ * SSP sysclock frequency in Hz
-+ * Neither default pxa2xx PLL clocks are good for audio, hence pxa27x
-+ * has audio clock. I would recommend using the pxa27x audio clock or an
-+ * external clock or making the codec master to gurantee better sample rates.
-+ */
-+#ifdef CONFIG_PXA27x
-+static int sysclk[3] = {13000000, 13000000, 13000000};
-+#else
-+static int sysclk[3] = {1843200, 1843200, 1843200};
-+#endif
-+module_param_array(sysclk, int, NULL, 0);
-+MODULE_PARM_DESC(sysclk, "sysclk frequency in Hz");
-+
-+/*
-+ * SSP sysclock source.
-+ * sysclk is ignored if audio clock is used
-+ */
-+#ifdef CONFIG_PXA27x
-+static int clksrc[3] = {0, 0, 0};
-+#else
-+static int clksrc[3] = {0, 0, 0};
-+#endif
-+module_param_array(clksrc, int, NULL, 0);
-+MODULE_PARM_DESC(clksrc,
-+      "sysclk source, 0 = internal PLL, 1 = ext, 2 = network, 3 = audio clock");
-+
-+/*
-+ * SSP GPIO's
-+ */
-+#define GPIO26_SSP1RX_MD      (26 | GPIO_ALT_FN_1_IN)
-+#define GPIO25_SSP1TX_MD      (25 | GPIO_ALT_FN_2_OUT)
-+#define GPIO23_SSP1CLKS_MD    (23 | GPIO_ALT_FN_2_IN)
-+#define GPIO24_SSP1FRMS_MD    (24 | GPIO_ALT_FN_2_IN)
-+#define GPIO23_SSP1CLKM_MD    (23 | GPIO_ALT_FN_2_OUT)
-+#define GPIO24_SSP1FRMM_MD    (24 | GPIO_ALT_FN_2_OUT)
-+
-+#define GPIO11_SSP2RX_MD      (11 | GPIO_ALT_FN_2_IN)
-+#define GPIO13_SSP2TX_MD      (13 | GPIO_ALT_FN_1_OUT)
-+#define GPIO22_SSP2CLKS_MD    (22 | GPIO_ALT_FN_3_IN)
-+#define GPIO88_SSP2FRMS_MD    (88 | GPIO_ALT_FN_3_IN)
-+#define GPIO22_SSP2CLKM_MD    (22 | GPIO_ALT_FN_3_OUT)
-+#define GPIO88_SSP2FRMM_MD    (88 | GPIO_ALT_FN_3_OUT)
-+
-+#define GPIO82_SSP3RX_MD      (82 | GPIO_ALT_FN_1_IN)
-+#define GPIO81_SSP3TX_MD      (81 | GPIO_ALT_FN_1_OUT)
-+#define GPIO84_SSP3CLKS_MD    (84 | GPIO_ALT_FN_1_IN)
-+#define GPIO83_SSP3FRMS_MD    (83 | GPIO_ALT_FN_1_IN)
-+#define GPIO84_SSP3CLKM_MD    (84 | GPIO_ALT_FN_1_OUT)
-+#define GPIO83_SSP3FRMM_MD    (83 | GPIO_ALT_FN_1_OUT)
-+
-+#define PXA_SSP_MDAIFMT \
-+      (SND_SOC_DAIFMT_DSP_B  |SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_CBM_CFS | \
-+      SND_SOC_DAIFMT_CBS_CFM | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF)
-+
-+#define PXA_SSP_SDAIFMT \
-+      (SND_SOC_DAIFMT_DSP_B  |SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS | \
-+      SND_SOC_DAIFMT_CBS_CFM | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF)
-+
-+#define PXA_SSP_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define PXA_SSP_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \
-+      SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000)
-+
-+#define PXA_SSP_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
-+
-+/*
-+ * SSP modes
-+ */
-+static struct snd_soc_dai_mode pxa2xx_ssp_modes[] = {
-+      /* port slave clk & frame modes */
-+      {
-+              .fmt = PXA_SSP_SDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = PXA_SSP_RATES,
-+              .pcmdir = PXA_SSP_DIR,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+
-+      /* port master clk & frame modes */
-+#ifdef CONFIG_PXA27x
-+      {
-+              .fmt = PXA_SSP_MDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = PXA_SSP_DIR,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBW(1),
-+      },
-+      {
-+              .fmt = PXA_SSP_MDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_11025,
-+              .pcmdir = PXA_SSP_DIR,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBW(1),
-+      },
-+      {
-+              .fmt = PXA_SSP_MDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = PXA_SSP_DIR,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBW(1),
-+      },
-+      {
-+              .fmt = PXA_SSP_MDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_22050,
-+              .pcmdir = PXA_SSP_DIR,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBW(1),
-+      },
-+      {
-+              .fmt = PXA_SSP_MDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = PXA_SSP_DIR,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBW(1),
-+      },
-+      {
-+              .fmt = PXA_SSP_MDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = PXA_SSP_DIR,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBW(1),
-+      },
-+      {
-+              .fmt = PXA_SSP_MDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = PXA_SSP_DIR,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 256,
-+              .bfs = SND_SOC_FSBW(1),
-+      },
-+      {
-+              .fmt = PXA_SSP_MDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200,
-+              .pcmdir = PXA_SSP_DIR,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 128,
-+              .bfs = SND_SOC_FSBW(1),
-+      },
-+      {
-+              .fmt = PXA_SSP_MDAIFMT,
-+              .pcmfmt = PXA_SSP_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = PXA_SSP_DIR,
-+              .flags = SND_SOC_DAI_BFS_RCW,
-+              .fs = 128,
-+              .bfs = SND_SOC_FSBW(1),
-+      },
-+#endif
-+};
-+
-+static struct ssp_dev ssp[3];
-+#ifdef CONFIG_PM
-+static struct ssp_state ssp_state[3];
-+#endif
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp1_pcm_mono_out = {
-+      .name                   = "SSP1 PCM Mono out",
-+      .dev_addr               = __PREG(SSDR_P1),
-+      .drcmr                  = &DRCMRTXSSDR,
-+      .dcmd                   = DCMD_INCSRCADDR | DCMD_FLOWTRG |
-+                                DCMD_BURST16 | DCMD_WIDTH2,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp1_pcm_mono_in = {
-+      .name                   = "SSP1 PCM Mono in",
-+      .dev_addr               = __PREG(SSDR_P1),
-+      .drcmr                  = &DRCMRRXSSDR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST16 | DCMD_WIDTH2,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp1_pcm_stereo_out = {
-+      .name                   = "SSP1 PCM Stereo out",
-+      .dev_addr               = __PREG(SSDR_P1),
-+      .drcmr                  = &DRCMRTXSSDR,
-+      .dcmd                   = DCMD_INCSRCADDR | DCMD_FLOWTRG |
-+                                DCMD_BURST16 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp1_pcm_stereo_in = {
-+      .name                   = "SSP1 PCM Stereo in",
-+      .dev_addr               = __PREG(SSDR_P1),
-+      .drcmr                  = &DRCMRRXSSDR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST16 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp2_pcm_mono_out = {
-+      .name                   = "SSP2 PCM Mono out",
-+      .dev_addr               = __PREG(SSDR_P2),
-+      .drcmr                  = &DRCMRTXSS2DR,
-+      .dcmd                   = DCMD_INCSRCADDR | DCMD_FLOWTRG |
-+                                DCMD_BURST16 | DCMD_WIDTH2,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp2_pcm_mono_in = {
-+      .name                   = "SSP2 PCM Mono in",
-+      .dev_addr               = __PREG(SSDR_P2),
-+      .drcmr                  = &DRCMRRXSS2DR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST16 | DCMD_WIDTH2,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp2_pcm_stereo_out = {
-+      .name                   = "SSP2 PCM Stereo out",
-+      .dev_addr               = __PREG(SSDR_P2),
-+      .drcmr                  = &DRCMRTXSS2DR,
-+      .dcmd                   = DCMD_INCSRCADDR | DCMD_FLOWTRG |
-+                                DCMD_BURST16 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp2_pcm_stereo_in = {
-+      .name                   = "SSP2 PCM Stereo in",
-+      .dev_addr               = __PREG(SSDR_P2),
-+      .drcmr                  = &DRCMRRXSS2DR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST16 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp3_pcm_mono_out = {
-+      .name                   = "SSP3 PCM Mono out",
-+      .dev_addr               = __PREG(SSDR_P3),
-+      .drcmr                  = &DRCMRTXSS3DR,
-+      .dcmd                   = DCMD_INCSRCADDR | DCMD_FLOWTRG |
-+                                DCMD_BURST16 | DCMD_WIDTH2,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp3_pcm_mono_in = {
-+      .name                   = "SSP3 PCM Mono in",
-+      .dev_addr               = __PREG(SSDR_P3),
-+      .drcmr                  = &DRCMRRXSS3DR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST16 | DCMD_WIDTH2,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp3_pcm_stereo_out = {
-+      .name                   = "SSP3 PCM Stereo out",
-+      .dev_addr               = __PREG(SSDR_P3),
-+      .drcmr                  = &DRCMRTXSS3DR,
-+      .dcmd                   = DCMD_INCSRCADDR | DCMD_FLOWTRG |
-+                                DCMD_BURST16 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_pcm_dma_params pxa2xx_ssp3_pcm_stereo_in = {
-+      .name                   = "SSP3 PCM Stereo in",
-+      .dev_addr               = __PREG(SSDR_P3),
-+      .drcmr                  = &DRCMRRXSS3DR,
-+      .dcmd                   = DCMD_INCTRGADDR | DCMD_FLOWSRC |
-+                                DCMD_BURST16 | DCMD_WIDTH4,
-+};
-+
-+static struct pxa2xx_pcm_dma_params *ssp_dma_params[3][4] = {
-+      {&pxa2xx_ssp1_pcm_mono_out, &pxa2xx_ssp1_pcm_mono_in,
-+      &pxa2xx_ssp1_pcm_stereo_out,&pxa2xx_ssp1_pcm_stereo_in,},
-+      {&pxa2xx_ssp2_pcm_mono_out, &pxa2xx_ssp2_pcm_mono_in,
-+      &pxa2xx_ssp2_pcm_stereo_out, &pxa2xx_ssp2_pcm_stereo_in,},
-+      {&pxa2xx_ssp3_pcm_mono_out, &pxa2xx_ssp3_pcm_mono_in,
-+      &pxa2xx_ssp3_pcm_stereo_out,&pxa2xx_ssp3_pcm_stereo_in,},
-+};
-+
-+static struct pxa2xx_gpio ssp_gpios[3][4] = {
-+      {{ /* SSP1 SND_SOC_DAIFMT_CBM_CFM */
-+              .rx = GPIO26_SSP1RX_MD,
-+              .tx = GPIO25_SSP1TX_MD,
-+              .clk = (23 | GPIO_ALT_FN_2_IN),
-+              .frm = (24 | GPIO_ALT_FN_2_IN),
-+      },
-+      { /* SSP1 SND_SOC_DAIFMT_CBS_CFS */
-+              .rx = GPIO26_SSP1RX_MD,
-+              .tx = GPIO25_SSP1TX_MD,
-+              .clk = (23 | GPIO_ALT_FN_2_OUT),
-+              .frm = (24 | GPIO_ALT_FN_2_OUT),
-+      },
-+      { /* SSP1 SND_SOC_DAIFMT_CBS_CFM */
-+              .rx = GPIO26_SSP1RX_MD,
-+              .tx = GPIO25_SSP1TX_MD,
-+              .clk = (23 | GPIO_ALT_FN_2_OUT),
-+              .frm = (24 | GPIO_ALT_FN_2_IN),
-+      },
-+      { /* SSP1 SND_SOC_DAIFMT_CBM_CFS */
-+              .rx = GPIO26_SSP1RX_MD,
-+              .tx = GPIO25_SSP1TX_MD,
-+              .clk = (23 | GPIO_ALT_FN_2_IN),
-+              .frm = (24 | GPIO_ALT_FN_2_OUT),
-+      }},
-+      {{ /* SSP2 SND_SOC_DAIFMT_CBM_CFM */
-+              .rx = GPIO11_SSP2RX_MD,
-+              .tx = GPIO13_SSP2TX_MD,
-+              .clk = (22 | GPIO_ALT_FN_3_IN),
-+              .frm = (88 | GPIO_ALT_FN_3_IN),
-+      },
-+      { /* SSP2 SND_SOC_DAIFMT_CBS_CFS */
-+              .rx = GPIO11_SSP2RX_MD,
-+              .tx = GPIO13_SSP2TX_MD,
-+              .clk = (22 | GPIO_ALT_FN_3_OUT),
-+              .frm = (88 | GPIO_ALT_FN_3_OUT),
-+      },
-+      { /* SSP2 SND_SOC_DAIFMT_CBS_CFM */
-+              .rx = GPIO11_SSP2RX_MD,
-+              .tx = GPIO13_SSP2TX_MD,
-+              .clk = (22 | GPIO_ALT_FN_3_OUT),
-+              .frm = (88 | GPIO_ALT_FN_3_IN),
-+      },
-+      { /* SSP2 SND_SOC_DAIFMT_CBM_CFS */
-+              .rx = GPIO11_SSP2RX_MD,
-+              .tx = GPIO13_SSP2TX_MD,
-+              .clk = (22 | GPIO_ALT_FN_3_IN),
-+              .frm = (88 | GPIO_ALT_FN_3_OUT),
-+      }},
-+      {{ /* SSP3 SND_SOC_DAIFMT_CBM_CFM */
-+              .rx = GPIO82_SSP3RX_MD,
-+              .tx = GPIO81_SSP3TX_MD,
-+              .clk = (84 | GPIO_ALT_FN_3_IN),
-+              .frm = (83 | GPIO_ALT_FN_3_IN),
-+      },
-+      { /* SSP3 SND_SOC_DAIFMT_CBS_CFS */
-+              .rx = GPIO82_SSP3RX_MD,
-+              .tx = GPIO81_SSP3TX_MD,
-+              .clk = (84 | GPIO_ALT_FN_3_OUT),
-+              .frm = (83 | GPIO_ALT_FN_3_OUT),
-+      },
-+      { /* SSP3 SND_SOC_DAIFMT_CBS_CFM */
-+              .rx = GPIO82_SSP3RX_MD,
-+              .tx = GPIO81_SSP3TX_MD,
-+              .clk = (84 | GPIO_ALT_FN_3_OUT),
-+              .frm = (83 | GPIO_ALT_FN_3_IN),
-+      },
-+      { /* SSP3 SND_SOC_DAIFMT_CBM_CFS */
-+              .rx = GPIO82_SSP3RX_MD,
-+              .tx = GPIO81_SSP3TX_MD,
-+              .clk = (84 | GPIO_ALT_FN_3_IN),
-+              .frm = (83 | GPIO_ALT_FN_3_OUT),
-+      }},
-+};
-+
-+static int pxa2xx_ssp_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      int ret = 0;
-+
-+      if (!rtd->cpu_dai->active) {
-+              ret = ssp_init (&ssp[rtd->cpu_dai->id], rtd->cpu_dai->id + 1,
-+                      SSP_NO_IRQ);
-+              if (ret < 0)
-+                      return ret;
-+              ssp_disable(&ssp[rtd->cpu_dai->id]);
-+      }
-+      return ret;
-+}
-+
-+static void pxa2xx_ssp_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if (!rtd->cpu_dai->active) {
-+              ssp_disable(&ssp[rtd->cpu_dai->id]);
-+              ssp_exit(&ssp[rtd->cpu_dai->id]);
-+      }
-+}
-+
-+#ifdef CONFIG_PM
-+
-+#if defined (CONFIG_PXA27x)
-+static int cken[3] = {CKEN23_SSP1, CKEN3_SSP2, CKEN4_SSP3};
-+#else
-+static int cken[3] = {CKEN3_SSP, CKEN9_NSSP, CKEN10_ASSP};
-+#endif
-+
-+static int pxa2xx_ssp_suspend(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if (!dai->active)
-+              return 0;
-+
-+      ssp_save_state(&ssp[dai->id], &ssp_state[dai->id]);
-+      pxa_set_cken(cken[dai->id], 0);
-+      return 0;
-+}
-+
-+static int pxa2xx_ssp_resume(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if (!dai->active)
-+              return 0;
-+
-+      pxa_set_cken(cken[dai->id], 1);
-+      ssp_restore_state(&ssp[dai->id], &ssp_state[dai->id]);
-+      ssp_enable(&ssp[dai->id]);
-+
-+      return 0;
-+}
-+
-+#else
-+#define pxa2xx_ssp_suspend    NULL
-+#define pxa2xx_ssp_resume     NULL
-+#endif
-+
-+/* todo - check clk source and PLL before returning clock rate */
-+static unsigned int pxa_ssp_config_sysclk(struct snd_soc_cpu_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      /* audio clock ? (divide by 1) */
-+      if (clksrc[dai->id] == 3) {
-+              switch(info->rate){
-+              case 8000:
-+              case 16000:
-+              case 32000:
-+              case 48000:
-+              case 96000:
-+                      return 12288000;
-+                      break;
-+              case 11025:
-+              case 22050:
-+              case 44100:
-+              case 88200:
-+                      return 11289600;
-+              break;
-+              }
-+      }
-+
-+      /* pll */
-+      return sysclk[dai->id];
-+}
-+
-+#ifdef CONFIG_PXA27x
-+static u32 pxa27x_set_audio_clk(unsigned int rate, unsigned int fs)
-+{
-+      u32 aclk = 0, div = 0;
-+
-+      if (rate == 0 || fs == 0)
-+              return 0;
-+
-+      switch(rate){
-+      case 8000:
-+      case 16000:
-+      case 32000:
-+      case 48000:
-+      case 96000:
-+              aclk = 0x2 << 4;
-+              div = 12288000 / (rate * fs);
-+              break;
-+      case 11025:
-+      case 22050:
-+      case 44100:
-+      case 88200:
-+              aclk = 0x1 << 4;
-+              div = 11289600 / (rate * fs);
-+              break;
-+      }
-+
-+      aclk |= ffs(div) - 1;
-+      return aclk;
-+}
-+#endif
-+
-+static inline int get_scr(int srate, int id)
-+{
-+      if (srate == 0)
-+              return 0;
-+      return (sysclk[id] / srate) - 1;
-+}
-+
-+static int pxa2xx_ssp_hw_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      int fmt = 0, dma = 0, fs, chn = params_channels(params);
-+      u32 ssp_mode = 0, ssp_setup = 0, psp_mode = 0, rate = 0;
-+
-+      fs = rtd->cpu_dai->dai_runtime.fs;
-+
-+      /* select correct DMA params */
-+      if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
-+              dma = 1;
-+      if (chn == 2 || rtd->cpu_dai->dai_runtime.pcmfmt != PXA_SSP_BITS)
-+              dma += 2;
-+      rtd->cpu_dai->dma_data = ssp_dma_params[rtd->cpu_dai->id][dma];
-+
-+      /* is port used by another stream */
-+      if (SSCR0 & SSCR0_SSE)
-+              return 0;
-+
-+      /* bit size */
-+      switch(rtd->cpu_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              ssp_mode |=SSCR0_DataSize(16);
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              ssp_mode |=(SSCR0_EDSS | SSCR0_DataSize(8));
-+              /* use network mode for stereo samples > 16 bits */
-+              if (chn == 2) {
-+                      ssp_mode |= (SSCR0_MOD | SSCR0_SlotsPerFrm(2) << 24);
-+                      /* active slots 0,1 */
-+                      SSTSA_P(rtd->cpu_dai->id +1) = 0x3;
-+                      SSRSA_P(rtd->cpu_dai->id +1) = 0x3;
-+              }
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              ssp_mode |= (SSCR0_EDSS | SSCR0_DataSize(16));
-+              /* use network mode for stereo samples > 16 bits */
-+              if (chn == 2) {
-+                      ssp_mode |= (SSCR0_MOD | SSCR0_SlotsPerFrm(2) << 24);
-+                      /* active slots 0,1 */
-+                      SSTSA_P(rtd->cpu_dai->id +1) = 0x3;
-+                      SSRSA_P(rtd->cpu_dai->id +1) = 0x3;
-+              }
-+              break;
-+      }
-+
-+      ssp_mode |= SSCR0_PSP;
-+      ssp_setup = SSCR1_RxTresh(14) | SSCR1_TxTresh(1) |
-+              SSCR1_TRAIL | SSCR1_RWOT;
-+
-+      switch(rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              ssp_setup |= (SSCR1_SCLKDIR | SSCR1_SFRMDIR);
-+              break;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              ssp_setup |= SSCR1_SCLKDIR;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFM:
-+              ssp_setup |= SSCR1_SFRMDIR;
-+              break;
-+      }
-+
-+      switch(rtd->cpu_dai->dai_runtime.fmt) {
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              fmt = 1;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFM:
-+              fmt = 2;
-+              break;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              fmt = 3;
-+              break;
-+      }
-+
-+      pxa_gpio_mode(ssp_gpios[rtd->cpu_dai->id][fmt].rx);
-+      pxa_gpio_mode(ssp_gpios[rtd->cpu_dai->id][fmt].tx);
-+      pxa_gpio_mode(ssp_gpios[rtd->cpu_dai->id][fmt].frm);
-+      pxa_gpio_mode(ssp_gpios[rtd->cpu_dai->id][fmt].clk);
-+
-+      switch (rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_NB_NF:
-+              psp_mode |= SSPSP_SFRMP | SSPSP_FSRT;
-+              break;
-+      }
-+
-+      if (rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_DSP_A)
-+              psp_mode |= SSPSP_SCMODE(2);
-+      if (rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_DSP_B)
-+              psp_mode |= SSPSP_SCMODE(3);
-+
-+      switch(clksrc[rtd->cpu_dai->id]) {
-+      case 2: /* network clock */
-+              ssp_mode |= SSCR0_NCS | SSCR0_MOD;
-+      case 1: /* external clock */
-+              ssp_mode |= SSCR0_ECS;
-+      case 0: /* internal clock */
-+              rate = get_scr(snd_soc_get_rate(rtd->cpu_dai->dai_runtime.pcmrate),
-+                      rtd->cpu_dai->id);
-+              break;
-+#ifdef CONFIG_PXA27x
-+      case 3: /* audio clock */
-+              ssp_mode |= (1 << 30);
-+              SSACD_P(rtd->cpu_dai->id) = (0x1 << 3) |
-+                      pxa27x_set_audio_clk(
-+                              snd_soc_get_rate(rtd->cpu_dai->dai_runtime.pcmrate), fs);
-+              break;
-+#endif
-+      }
-+
-+      ssp_config(&ssp[rtd->cpu_dai->id], ssp_mode, ssp_setup, psp_mode,
-+              SSCR0_SerClkDiv(rate));
-+#if 0
-+      printk("SSCR0 %x SSCR1 %x SSTO %x SSPSP %x SSSR %x\n",
-+              SSCR0_P(rtd->cpu_dai->id+1), SSCR1_P(rtd->cpu_dai->id+1),
-+              SSTO_P(rtd->cpu_dai->id+1), SSPSP_P(rtd->cpu_dai->id+1),
-+              SSSR_P(rtd->cpu_dai->id+1));
-+#endif
-+      return 0;
-+}
-+
-+static int pxa2xx_ssp_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      int ret = 0;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+              ssp_enable(&ssp[rtd->cpu_dai->id]);
-+              break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSCR1_P(rtd->cpu_dai->id+1) |= SSCR1_TSRE;
-+              else
-+                      SSCR1_P(rtd->cpu_dai->id+1) |= SSCR1_RSRE;
-+              SSSR_P(rtd->cpu_dai->id+1) |= SSSR_P(rtd->cpu_dai->id+1);
-+              break;
-+      case SNDRV_PCM_TRIGGER_START:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSCR1_P(rtd->cpu_dai->id+1) |= SSCR1_TSRE;
-+              else
-+                      SSCR1_P(rtd->cpu_dai->id+1) |= SSCR1_RSRE;
-+              ssp_enable(&ssp[rtd->cpu_dai->id]);
-+              break;
-+      case SNDRV_PCM_TRIGGER_STOP:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSCR1_P(rtd->cpu_dai->id+1) &= ~SSCR1_TSRE;
-+              else
-+                      SSCR1_P(rtd->cpu_dai->id+1) &= ~SSCR1_RSRE;
-+              break;
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+              ssp_disable(&ssp[rtd->cpu_dai->id]);
-+              break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSCR1_P(rtd->cpu_dai->id+1) &= ~SSCR1_TSRE;
-+              else
-+                      SSCR1_P(rtd->cpu_dai->id+1) &= ~SSCR1_RSRE;
-+              break;
-+
-+      default:
-+              ret = -EINVAL;
-+      }
-+#if 0
-+      printk("SSCR0 %x SSCR1 %x SSTO %x SSPSP %x SSSR %x\n",
-+              SSCR0_P(rtd->cpu_dai->id+1), SSCR1_P(rtd->cpu_dai->id+1),
-+              SSTO_P(rtd->cpu_dai->id+1), SSPSP_P(rtd->cpu_dai->id+1),
-+              SSSR_P(rtd->cpu_dai->id+1));
-+#endif
-+      return ret;
-+}
-+
-+struct snd_soc_cpu_dai pxa_ssp_dai[] = {
-+      {       .name = "pxa2xx-ssp1",
-+              .id = 0,
-+              .type = SND_SOC_DAI_PCM,
-+              .suspend = pxa2xx_ssp_suspend,
-+              .resume = pxa2xx_ssp_resume,
-+              .config_sysclk = pxa_ssp_config_sysclk,
-+              .playback = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .capture = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .ops = {
-+                      .startup = pxa2xx_ssp_startup,
-+                      .shutdown = pxa2xx_ssp_shutdown,
-+                      .trigger = pxa2xx_ssp_trigger,
-+                      .hw_params = pxa2xx_ssp_hw_params,},
-+              .caps = {
-+                      .mode = pxa2xx_ssp_modes,
-+                      .num_modes = ARRAY_SIZE(pxa2xx_ssp_modes),},
-+      },
-+      {       .name = "pxa2xx-ssp2",
-+              .id = 1,
-+              .type = SND_SOC_DAI_PCM,
-+              .suspend = pxa2xx_ssp_suspend,
-+              .resume = pxa2xx_ssp_resume,
-+              .config_sysclk = pxa_ssp_config_sysclk,
-+              .playback = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .capture = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .ops = {
-+                      .startup = pxa2xx_ssp_startup,
-+                      .shutdown = pxa2xx_ssp_shutdown,
-+                      .trigger = pxa2xx_ssp_trigger,
-+                      .hw_params = pxa2xx_ssp_hw_params,},
-+              .caps = {
-+                      .mode = pxa2xx_ssp_modes,
-+                      .num_modes = ARRAY_SIZE(pxa2xx_ssp_modes),},
-+      },
-+      {       .name = "pxa2xx-ssp3",
-+              .id = 2,
-+              .type = SND_SOC_DAI_PCM,
-+              .suspend = pxa2xx_ssp_suspend,
-+              .resume = pxa2xx_ssp_resume,
-+              .config_sysclk = pxa_ssp_config_sysclk,
-+              .playback = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .capture = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .ops = {
-+                      .startup = pxa2xx_ssp_startup,
-+                      .shutdown = pxa2xx_ssp_shutdown,
-+                      .trigger = pxa2xx_ssp_trigger,
-+                      .hw_params = pxa2xx_ssp_hw_params,},
-+              .caps = {
-+                      .mode = pxa2xx_ssp_modes,
-+                      .num_modes = ARRAY_SIZE(pxa2xx_ssp_modes),},
-+      },
-+};
-+
-+EXPORT_SYMBOL_GPL(pxa_ssp_dai);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("pxa2xx SSP/PCM SoC Interface");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/spitz.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/spitz.c
-@@ -0,0 +1,374 @@
-+/*
-+ * spitz.c  --  SoC audio for Sharp SL-Cxx00 models Spitz, Borzoi and Akita
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Authors: Liam Girdwood <liam.girdwood@wolfsonmicro.com>
-+ *          Richard Purdie <richard@openedhand.com>
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    30th Nov 2005   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/timer.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/hardware/scoop.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/hardware.h>
-+#include <asm/arch/akita.h>
-+#include <asm/arch/spitz.h>
-+#include <asm/mach-types.h>
-+#include "../codecs/wm8750.h"
-+#include "pxa2xx-pcm.h"
-+
-+#define SPITZ_HP        0
-+#define SPITZ_MIC       1
-+#define SPITZ_LINE      2
-+#define SPITZ_HEADSET   3
-+#define SPITZ_HP_OFF    4
-+#define SPITZ_SPK_ON    0
-+#define SPITZ_SPK_OFF   1
-+
-+ /* audio clock in Hz - rounded from 12.235MHz */
-+#define SPITZ_AUDIO_CLOCK 12288000
-+
-+static int spitz_jack_func;
-+static int spitz_spk_func;
-+
-+static void spitz_ext_control(struct snd_soc_codec *codec)
-+{
-+      if (spitz_spk_func == SPITZ_SPK_ON)
-+              snd_soc_dapm_set_endpoint(codec, "Ext Spk", 1);
-+      else
-+              snd_soc_dapm_set_endpoint(codec, "Ext Spk", 0);
-+
-+      /* set up jack connection */
-+      switch (spitz_jack_func) {
-+      case SPITZ_HP:
-+              /* enable and unmute hp jack, disable mic bias */
-+              snd_soc_dapm_set_endpoint(codec, "Headset Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Mic Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Line Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1);
-+              set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
-+              set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
-+              break;
-+      case SPITZ_MIC:
-+              /* enable mic jack and bias, mute hp */
-+              snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Headset Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Line Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Mic Jack", 1);
-+              reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
-+              reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
-+              break;
-+      case SPITZ_LINE:
-+              /* enable line jack, disable mic bias and mute hp */
-+              snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Headset Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Mic Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Line Jack", 1);
-+              reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
-+              reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
-+              break;
-+      case SPITZ_HEADSET:
-+              /* enable and unmute headset jack enable mic bias, mute L hp */
-+              snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Mic Jack", 1);
-+              snd_soc_dapm_set_endpoint(codec, "Line Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Headset Jack", 1);
-+              reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
-+              set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
-+              break;
-+      case SPITZ_HP_OFF:
-+
-+              /* jack removed, everything off */
-+              snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Headset Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Mic Jack", 0);
-+              snd_soc_dapm_set_endpoint(codec, "Line Jack", 0);
-+              reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L);
-+              reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R);
-+              break;
-+      }
-+      snd_soc_dapm_sync_endpoints(codec);
-+}
-+
-+static int spitz_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->socdev->codec;
-+
-+      /* check the jack status at stream startup */
-+      spitz_ext_control(codec);
-+      return 0;
-+}
-+
-+static struct snd_soc_ops spitz_ops = {
-+      .startup = spitz_startup,
-+};
-+
-+static int spitz_get_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = spitz_jack_func;
-+      return 0;
-+}
-+
-+static int spitz_set_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-+
-+      if (spitz_jack_func == ucontrol->value.integer.value[0])
-+              return 0;
-+
-+      spitz_jack_func = ucontrol->value.integer.value[0];
-+      spitz_ext_control(codec);
-+      return 1;
-+}
-+
-+static int spitz_get_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = spitz_spk_func;
-+      return 0;
-+}
-+
-+static int spitz_set_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+
-+      if (spitz_spk_func == ucontrol->value.integer.value[0])
-+              return 0;
-+
-+      spitz_spk_func = ucontrol->value.integer.value[0];
-+      spitz_ext_control(codec);
-+      return 1;
-+}
-+
-+static int spitz_mic_bias(struct snd_soc_dapm_widget *w, int event)
-+{
-+      if (machine_is_borzoi() || machine_is_spitz()) {
-+              if (SND_SOC_DAPM_EVENT_ON(event))
-+                      set_scoop_gpio(&spitzscoop2_device.dev,
-+                              SPITZ_SCP2_MIC_BIAS);
-+              else
-+                      reset_scoop_gpio(&spitzscoop2_device.dev,
-+                              SPITZ_SCP2_MIC_BIAS);
-+      }
-+
-+      if (machine_is_akita()) {
-+              if (SND_SOC_DAPM_EVENT_ON(event))
-+                      akita_set_ioexp(&akitaioexp_device.dev,
-+                              AKITA_IOEXP_MIC_BIAS);
-+              else
-+                      akita_reset_ioexp(&akitaioexp_device.dev,
-+                              AKITA_IOEXP_MIC_BIAS);
-+      }
-+      return 0;
-+}
-+
-+/* spitz machine dapm widgets */
-+static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = {
-+      SND_SOC_DAPM_HP("Headphone Jack", NULL),
-+      SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias),
-+      SND_SOC_DAPM_SPK("Ext Spk", NULL),
-+      SND_SOC_DAPM_LINE("Line Jack", NULL),
-+
-+      /* headset is a mic and mono headphone */
-+      SND_SOC_DAPM_HP("Headset Jack", NULL),
-+};
-+
-+/* Spitz machine audio_map */
-+static const char *audio_map[][3] = {
-+
-+      /* headphone connected to LOUT1, ROUT1 */
-+      {"Headphone Jack", NULL, "LOUT1"},
-+      {"Headphone Jack", NULL, "ROUT1"},
-+
-+      /* headset connected to ROUT1 and LINPUT1 with bias (def below) */
-+      {"Headset Jack", NULL, "ROUT1"},
-+
-+      /* ext speaker connected to LOUT2, ROUT2  */
-+      {"Ext Spk", NULL , "ROUT2"},
-+      {"Ext Spk", NULL , "LOUT2"},
-+
-+      /* mic is connected to input 1 - with bias */
-+      {"LINPUT1", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Mic Jack"},
-+
-+      /* line is connected to input 1 - no bias */
-+      {"LINPUT1", NULL, "Line Jack"},
-+
-+      {NULL, NULL, NULL},
-+};
-+
-+static const char *jack_function[] = {"Headphone", "Mic", "Line", "Headset",
-+      "Off"};
-+static const char *spk_function[] = {"On", "Off"};
-+static const struct soc_enum spitz_enum[] = {
-+      SOC_ENUM_SINGLE_EXT(5, jack_function),
-+      SOC_ENUM_SINGLE_EXT(2, spk_function),
-+};
-+
-+static const struct snd_kcontrol_new wm8750_spitz_controls[] = {
-+      SOC_ENUM_EXT("Jack Function", spitz_enum[0], spitz_get_jack,
-+              spitz_set_jack),
-+      SOC_ENUM_EXT("Speaker Function", spitz_enum[1], spitz_get_spk,
-+              spitz_set_spk),
-+};
-+
-+/*
-+ * Logic for a wm8750 as connected on a Sharp SL-Cxx00 Device
-+ */
-+static int spitz_wm8750_init(struct snd_soc_codec *codec)
-+{
-+      int i, err;
-+
-+      /* NC codec pins */
-+      snd_soc_dapm_set_endpoint(codec, "RINPUT1", 0);
-+      snd_soc_dapm_set_endpoint(codec, "LINPUT2", 0);
-+      snd_soc_dapm_set_endpoint(codec, "RINPUT2", 0);
-+      snd_soc_dapm_set_endpoint(codec, "LINPUT3", 0);
-+      snd_soc_dapm_set_endpoint(codec, "RINPUT3", 0);
-+      snd_soc_dapm_set_endpoint(codec, "OUT3", 0);
-+      snd_soc_dapm_set_endpoint(codec, "MONO", 0);
-+
-+      /* Add spitz specific controls */
-+      for (i = 0; i < ARRAY_SIZE(wm8750_spitz_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                      snd_soc_cnew(&wm8750_spitz_controls[i], codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      /* Add spitz specific widgets */
-+      for (i = 0; i < ARRAY_SIZE(wm8750_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8750_dapm_widgets[i]);
-+      }
-+
-+      /* Set up spitz specific audio path audio_map */
-+      for (i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+      return 0;
-+}
-+
-+static unsigned int spitz_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      if (info->bclk_master & SND_SOC_DAIFMT_CBS_CFS) {
-+              /* pxa2xx is i2s master  */
-+              switch (info->rate) {
-+              case 11025:
-+              case 22050:
-+              case 44100:
-+              case 88200:
-+                      /* configure codec digital filters
-+                       * for 11.025, 22.05, 44.1, 88.2 */
-+                      rtd->codec_dai->config_sysclk(rtd->codec_dai, info,
-+                              11289600);
-+              break;
-+              default:
-+                      /* configure codec digital filters for all other rates */
-+                      rtd->codec_dai->config_sysclk(rtd->codec_dai, info,
-+                              SPITZ_AUDIO_CLOCK);
-+              break;
-+              }
-+              /* configure pxa2xx i2s interface clocks as master */
-+              return rtd->cpu_dai->config_sysclk(rtd->cpu_dai, info,
-+                      SPITZ_AUDIO_CLOCK);
-+      } else {
-+              /* codec is i2s master - only configure codec DAI clock */
-+              return rtd->codec_dai->config_sysclk(rtd->codec_dai, info,
-+                      SPITZ_AUDIO_CLOCK);
-+      }
-+}
-+
-+/* spitz digital audio interface glue - connects codec <--> CPU */
-+static struct snd_soc_dai_link spitz_dai = {
-+      .name = "wm8750",
-+      .stream_name = "WM8750",
-+      .cpu_dai = &pxa_i2s_dai,
-+      .codec_dai = &wm8750_dai,
-+      .init = spitz_wm8750_init,
-+      .config_sysclk = spitz_config_sysclk,
-+};
-+
-+/* spitz audio machine driver */
-+static struct snd_soc_machine snd_soc_machine_spitz = {
-+      .name = "Spitz",
-+      .dai_link = &spitz_dai,
-+      .num_links = 1,
-+      .ops = &spitz_ops,
-+};
-+
-+/* spitz audio private data */
-+static struct wm8750_setup_data spitz_wm8750_setup = {
-+      .i2c_address = 0x1b,
-+};
-+
-+/* spitz audio subsystem */
-+static struct snd_soc_device spitz_snd_devdata = {
-+      .machine = &snd_soc_machine_spitz,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm8750,
-+      .codec_data = &spitz_wm8750_setup,
-+};
-+
-+static struct platform_device *spitz_snd_device;
-+
-+static int __init spitz_init(void)
-+{
-+      int ret;
-+
-+      if (!(machine_is_spitz() || machine_is_borzoi() || machine_is_akita()))
-+              return -ENODEV;
-+
-+      spitz_snd_device = platform_device_alloc("soc-audio", -1);
-+      if (!spitz_snd_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(spitz_snd_device, &spitz_snd_devdata);
-+      spitz_snd_devdata.dev = &spitz_snd_device->dev;
-+      ret = platform_device_add(spitz_snd_device);
-+
-+      if (ret)
-+              platform_device_put(spitz_snd_device);
-+
-+      return ret;
-+}
-+
-+static void __exit spitz_exit(void)
-+{
-+      platform_device_unregister(spitz_snd_device);
-+}
-+
-+module_init(spitz_init);
-+module_exit(spitz_exit);
-+
-+MODULE_AUTHOR("Richard Purdie");
-+MODULE_DESCRIPTION("ALSA SoC Spitz");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/pxa/tosa.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/pxa/tosa.c
-@@ -0,0 +1,287 @@
-+/*
-+ * tosa.c  --  SoC audio for Tosa
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Authors: Liam Girdwood <liam.girdwood@wolfsonmicro.com>
-+ *          Richard Purdie <richard@openedhand.com>
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    30th Nov 2005   Initial version.
-+ *
-+ * GPIO's
-+ *  1 - Jack Insertion
-+ *  5 - Hookswitch (headset answer/hang up switch)
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/device.h>
-+
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/hardware/tmio.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/hardware.h>
-+#include <asm/arch/audio.h>
-+#include <asm/arch/tosa.h>
-+
-+#include "../codecs/wm9712.h"
-+#include "pxa2xx-pcm.h"
-+
-+static struct snd_soc_machine tosa;
-+
-+#define TOSA_HP        0
-+#define TOSA_MIC_INT   1
-+#define TOSA_HEADSET   2
-+#define TOSA_HP_OFF    3
-+#define TOSA_SPK_ON    0
-+#define TOSA_SPK_OFF   1
-+
-+static int tosa_jack_func;
-+static int tosa_spk_func;
-+
-+static void tosa_ext_control(struct snd_soc_codec *codec)
-+{
-+      int spk = 0, mic_int = 0, hp = 0, hs = 0;
-+
-+      /* set up jack connection */
-+      switch (tosa_jack_func) {
-+      case TOSA_HP:
-+              hp = 1;
-+              break;
-+      case TOSA_MIC_INT:
-+              mic_int = 1;
-+              break;
-+      case TOSA_HEADSET:
-+              hs = 1;
-+              break;
-+      }
-+
-+      if (tosa_spk_func == TOSA_SPK_ON)
-+              spk = 1;
-+
-+      snd_soc_dapm_set_endpoint(codec, "Speaker", spk);
-+      snd_soc_dapm_set_endpoint(codec, "Mic (Internal)", mic_int);
-+      snd_soc_dapm_set_endpoint(codec, "Headphone Jack", hp);
-+      snd_soc_dapm_set_endpoint(codec, "Headset Jack", hs);
-+      snd_soc_dapm_sync_endpoints(codec);
-+}
-+
-+static int tosa_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_codec *codec = rtd->socdev->codec;
-+
-+      /* check the jack status at stream startup */
-+      tosa_ext_control(codec);
-+      return 0;
-+}
-+
-+static struct snd_soc_ops tosa_ops = {
-+      .startup = tosa_startup,
-+};
-+
-+static int tosa_get_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = tosa_jack_func;
-+      return 0;
-+}
-+
-+static int tosa_set_jack(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+
-+      if (tosa_jack_func == ucontrol->value.integer.value[0])
-+              return 0;
-+
-+      tosa_jack_func = ucontrol->value.integer.value[0];
-+      tosa_ext_control(codec);
-+      return 1;
-+}
-+
-+static int tosa_get_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      ucontrol->value.integer.value[0] = tosa_spk_func;
-+      return 0;
-+}
-+
-+static int tosa_set_spk(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec =  snd_kcontrol_chip(kcontrol);
-+
-+      if (tosa_spk_func == ucontrol->value.integer.value[0])
-+              return 0;
-+
-+      tosa_spk_func = ucontrol->value.integer.value[0];
-+      tosa_ext_control(codec);
-+      return 1;
-+}
-+
-+/* tosa dapm event handlers */
-+static int tosa_hp_event(struct snd_soc_dapm_widget *w, int event)
-+{
-+      if (SND_SOC_DAPM_EVENT_ON(event))
-+              set_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_L_MUTE);
-+      else
-+              reset_tc6393_gpio(&tc6393_device.dev,TOSA_TC6393_L_MUTE);
-+      return 0;
-+}
-+
-+/* tosa machine dapm widgets */
-+static const struct snd_soc_dapm_widget tosa_dapm_widgets[] = {
-+SND_SOC_DAPM_HP("Headphone Jack", tosa_hp_event),
-+SND_SOC_DAPM_HP("Headset Jack", NULL),
-+SND_SOC_DAPM_MIC("Mic (Internal)", NULL),
-+SND_SOC_DAPM_SPK("Speaker", NULL),
-+};
-+
-+/* tosa audio map */
-+static const char *audio_map[][3] = {
-+
-+      /* headphone connected to HPOUTL, HPOUTR */
-+      {"Headphone Jack", NULL, "HPOUTL"},
-+      {"Headphone Jack", NULL, "HPOUTR"},
-+
-+      /* ext speaker connected to LOUT2, ROUT2 */
-+      {"Speaker", NULL, "LOUT2"},
-+      {"Speaker", NULL, "ROUT2"},
-+
-+      /* internal mic is connected to mic1, mic2 differential - with bias */
-+      {"MIC1", NULL, "Mic Bias"},
-+      {"MIC2", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Mic (Internal)"},
-+
-+      /* headset is connected to HPOUTR, and LINEINR with bias */
-+      {"Headset Jack", NULL, "HPOUTR"},
-+      {"LINEINR", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Headset Jack"},
-+
-+      {NULL, NULL, NULL},
-+};
-+
-+static const char *jack_function[] = {"Headphone", "Mic", "Line", "Headset",
-+      "Off"};
-+static const char *spk_function[] = {"On", "Off"};
-+static const struct soc_enum tosa_enum[] = {
-+      SOC_ENUM_SINGLE_EXT(5, jack_function),
-+      SOC_ENUM_SINGLE_EXT(2, spk_function),
-+};
-+
-+static const struct snd_kcontrol_new tosa_controls[] = {
-+      SOC_ENUM_EXT("Jack Function", tosa_enum[0], tosa_get_jack,
-+              tosa_set_jack),
-+      SOC_ENUM_EXT("Speaker Function", tosa_enum[1], tosa_get_spk,
-+              tosa_set_spk),
-+};
-+
-+static int tosa_ac97_init(struct snd_soc_codec *codec)
-+{
-+      int i, err;
-+
-+      snd_soc_dapm_set_endpoint(codec, "OUT3", 0);
-+      snd_soc_dapm_set_endpoint(codec, "MONOOUT", 0);
-+
-+      /* add tosa specific controls */
-+      for (i = 0; i < ARRAY_SIZE(tosa_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&tosa_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      /* add tosa specific widgets */
-+      for (i = 0; i < ARRAY_SIZE(tosa_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &tosa_dapm_widgets[i]);
-+      }
-+
-+      /* set up tosa specific audio path audio_map */
-+      for (i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+      return 0;
-+}
-+
-+static struct snd_soc_dai_link tosa_dai[] = {
-+{
-+      .name = "AC97",
-+      .stream_name = "AC97 HiFi",
-+      .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_HIFI],
-+      .codec_dai = &wm9712_dai[WM9712_DAI_AC97_HIFI],
-+      .init = tosa_ac97_init,
-+},
-+{
-+      .name = "AC97 Aux",
-+      .stream_name = "AC97 Aux",
-+      .cpu_dai = &pxa_ac97_dai[PXA2XX_DAI_AC97_AUX],
-+      .codec_dai = &wm9712_dai[WM9712_DAI_AC97_AUX],
-+},
-+};
-+
-+static struct snd_soc_machine tosa = {
-+      .name = "Tosa",
-+      .dai_link = tosa_dai,
-+      .num_links = ARRAY_SIZE(tosa_dai),
-+      .ops = &tosa_ops,
-+};
-+
-+static struct snd_soc_device tosa_snd_devdata = {
-+      .machine = &tosa,
-+      .platform = &pxa2xx_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm9712,
-+};
-+
-+static struct platform_device *tosa_snd_device;
-+
-+static int __init tosa_init(void)
-+{
-+      int ret;
-+
-+      if (!machine_is_tosa())
-+              return -ENODEV;
-+
-+      tosa_snd_device = platform_device_alloc("soc-audio", -1);
-+      if (!tosa_snd_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(tosa_snd_device, &tosa_snd_devdata);
-+      tosa_snd_devdata.dev = &tosa_snd_device->dev;
-+      ret = platform_device_add(tosa_snd_device);
-+
-+      if (ret)
-+              platform_device_put(tosa_snd_device);
-+
-+      return ret;
-+}
-+
-+static void __exit tosa_exit(void)
-+{
-+      platform_device_unregister(tosa_snd_device);
-+}
-+
-+module_init(tosa_init);
-+module_exit(tosa_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Richard Purdie");
-+MODULE_DESCRIPTION("ALSA SoC Tosa");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/soc-dapm.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/soc-dapm.c
-@@ -0,0 +1,1327 @@
-+/*
-+ * soc-dapm.c  --  ALSA SoC Dynamic Audio Power Management
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    12th Aug 2005   Initial version.
-+ *    25th Oct 2005   Implemented path power domain.
-+ *    18th Dec 2005   Implemented machine and stream level power domain.
-+ *
-+ *  Features:
-+ *    o Changes power status of internal codec blocks depending on the
-+ *      dynamic configuration of codec internal audio paths and active
-+ *      DAC's/ADC's.
-+ *    o Platform power domain - can support external components i.e. amps and
-+ *      mic/meadphone insertion events.
-+ *    o Automatic Mic Bias support
-+ *    o Jack insertion power event initiation - e.g. hp insertion will enable
-+ *      sinks, dacs, etc
-+ *    o Delayed powerdown of audio susbsytem to reduce pops between a quick
-+ *      device reopen.
-+ *
-+ *  Todo:
-+ *    o DAPM power change sequencing - allow for configurable per
-+ *      codec sequences.
-+ *    o Support for analogue bias optimisation.
-+ *    o Support for reduced codec oversampling rates.
-+ *    o Support for reduced codec bias currents.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/bitops.h>
-+#include <linux/platform_device.h>
-+#include <linux/jiffies.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+/* debug */
-+#define DAPM_DEBUG 0
-+#if DAPM_DEBUG
-+#define dump_dapm(codec, action) dbg_dump_dapm(codec, action)
-+#define dbg(format, arg...) printk(format, ## arg)
-+#else
-+#define dump_dapm(codec, action)
-+#define dbg(format, arg...)
-+#endif
-+
-+#define POP_DEBUG 0
-+#if POP_DEBUG
-+#define POP_TIME 500 /* 500 msecs - change if pop debug is too fast */
-+#define pop_wait(time) schedule_timeout_interruptible(msecs_to_jiffies(time))
-+#define pop_dbg(format, arg...) printk(format, ## arg); pop_wait(POP_TIME)
-+#else
-+#define pop_dbg(format, arg...)
-+#define pop_wait(time)
-+#endif
-+
-+/* dapm power sequences - make this per codec in the future */
-+static int dapm_up_seq[] = {
-+      snd_soc_dapm_pre, snd_soc_dapm_micbias, snd_soc_dapm_mic,
-+      snd_soc_dapm_mux, snd_soc_dapm_dac, snd_soc_dapm_mixer, snd_soc_dapm_pga,
-+      snd_soc_dapm_adc, snd_soc_dapm_hp, snd_soc_dapm_spk, snd_soc_dapm_post
-+};
-+static int dapm_down_seq[] = {
-+      snd_soc_dapm_pre, snd_soc_dapm_adc, snd_soc_dapm_hp, snd_soc_dapm_spk,
-+      snd_soc_dapm_pga, snd_soc_dapm_mixer, snd_soc_dapm_dac, snd_soc_dapm_mic,
-+      snd_soc_dapm_micbias, snd_soc_dapm_mux, snd_soc_dapm_post
-+};
-+
-+static int dapm_status = 1;
-+module_param(dapm_status, int, 0);
-+MODULE_PARM_DESC(dapm_status, "enable DPM sysfs entries");
-+
-+/* create a new dapm widget */
-+static struct snd_soc_dapm_widget *dapm_cnew_widget(
-+      const struct snd_soc_dapm_widget *_widget)
-+{
-+      struct snd_soc_dapm_widget* widget;
-+      widget = kmalloc(sizeof(struct snd_soc_dapm_widget), GFP_KERNEL);
-+      if (!widget)
-+              return NULL;
-+
-+      memcpy(widget, _widget, sizeof(struct snd_soc_dapm_widget));
-+      return widget;
-+}
-+
-+/* set up initial codec paths */
-+static void dapm_set_path_status(struct snd_soc_dapm_widget *w,
-+      struct snd_soc_dapm_path *p, int i)
-+{
-+      switch (w->id) {
-+      case snd_soc_dapm_switch:
-+      case snd_soc_dapm_mixer: {
-+              int val;
-+              int reg = w->kcontrols[i].private_value & 0xff;
-+              int shift = (w->kcontrols[i].private_value >> 8) & 0x0f;
-+              int mask = (w->kcontrols[i].private_value >> 16) & 0xff;
-+              int invert = (w->kcontrols[i].private_value >> 24) & 0x01;
-+
-+              val = snd_soc_read(w->codec, reg);
-+              val = (val >> shift) & mask;
-+
-+              if ((invert && !val) || (!invert && val))
-+                      p->connect = 1;
-+              else
-+                      p->connect = 0;
-+      }
-+      break;
-+      case snd_soc_dapm_mux: {
-+              struct soc_enum *e = (struct soc_enum *)w->kcontrols[i].private_value;
-+              int val, item, bitmask;
-+
-+              for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
-+              ;
-+              val = snd_soc_read(w->codec, e->reg);
-+              item = (val >> e->shift_l) & (bitmask - 1);
-+
-+              p->connect = 0;
-+              for (i = 0; i < e->mask; i++) {
-+                      if (!(strcmp(p->name, e->texts[i])) && item == i)
-+                              p->connect = 1;
-+              }
-+      }
-+      break;
-+      /* does not effect routing - always connected */
-+      case snd_soc_dapm_pga:
-+      case snd_soc_dapm_output:
-+      case snd_soc_dapm_adc:
-+      case snd_soc_dapm_input:
-+      case snd_soc_dapm_dac:
-+      case snd_soc_dapm_micbias:
-+      case snd_soc_dapm_vmid:
-+              p->connect = 1;
-+      break;
-+      /* does effect routing - dynamically connected */
-+      case snd_soc_dapm_hp:
-+      case snd_soc_dapm_mic:
-+      case snd_soc_dapm_spk:
-+      case snd_soc_dapm_line:
-+      case snd_soc_dapm_pre:
-+      case snd_soc_dapm_post:
-+              p->connect = 0;
-+      break;
-+      }
-+}
-+
-+/* connect mux widget to it's interconnecting audio paths */
-+static int dapm_connect_mux(struct snd_soc_codec *codec,
-+      struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
-+      struct snd_soc_dapm_path *path, const char *control_name,
-+      const struct snd_kcontrol_new *kcontrol)
-+{
-+      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-+      int i;
-+
-+      for (i = 0; i < e->mask; i++) {
-+              if (!(strcmp(control_name, e->texts[i]))) {
-+                      list_add(&path->list, &codec->dapm_paths);
-+                      list_add(&path->list_sink, &dest->sources);
-+                      list_add(&path->list_source, &src->sinks);
-+                      path->name = (char*)e->texts[i];
-+                      dapm_set_path_status(dest, path, 0);
-+                      return 0;
-+              }
-+      }
-+
-+      return -ENODEV;
-+}
-+
-+/* connect mixer widget to it's interconnecting audio paths */
-+static int dapm_connect_mixer(struct snd_soc_codec *codec,
-+      struct snd_soc_dapm_widget *src, struct snd_soc_dapm_widget *dest,
-+      struct snd_soc_dapm_path *path, const char *control_name)
-+{
-+      int i;
-+
-+      /* search for mixer kcontrol */
-+      for (i = 0; i < dest->num_kcontrols; i++) {
-+              if (!strcmp(control_name, dest->kcontrols[i].name)) {
-+                      list_add(&path->list, &codec->dapm_paths);
-+                      list_add(&path->list_sink, &dest->sources);
-+                      list_add(&path->list_source, &src->sinks);
-+                      path->name = dest->kcontrols[i].name;
-+                      dapm_set_path_status(dest, path, i);
-+                      return 0;
-+              }
-+      }
-+      return -ENODEV;
-+}
-+
-+/* update dapm codec register bits */
-+static int dapm_update_bits(struct snd_soc_dapm_widget *widget)
-+{
-+      int change, power;
-+      unsigned short old, new;
-+      struct snd_soc_codec *codec = widget->codec;
-+
-+      /* check for valid widgets */
-+      if (widget->reg < 0 || widget->id == snd_soc_dapm_input ||
-+              widget->id == snd_soc_dapm_output ||
-+              widget->id == snd_soc_dapm_hp ||
-+              widget->id == snd_soc_dapm_mic ||
-+              widget->id == snd_soc_dapm_line ||
-+              widget->id == snd_soc_dapm_spk)
-+              return 0;
-+
-+      power = widget->power;
-+      if (widget->invert)
-+              power = (power ? 0:1);
-+
-+      old = snd_soc_read(codec, widget->reg);
-+      new = (old & ~(0x1 << widget->shift)) | (power << widget->shift);
-+
-+      change = old != new;
-+      if (change) {
-+              pop_dbg("pop test %s : %s in %d ms\n", widget->name,
-+                      widget->power ? "on" : "off", POP_TIME);
-+              snd_soc_write(codec, widget->reg, new);
-+              pop_wait(POP_TIME);
-+      }
-+      dbg("reg old %x new %x change %d\n", old, new, change);
-+      return change;
-+}
-+
-+/* ramps the volume up or down to minimise pops before or after a
-+ * DAPM power event */
-+static int dapm_set_pga(struct snd_soc_dapm_widget *widget, int power)
-+{
-+      const struct snd_kcontrol_new *k = widget->kcontrols;
-+
-+      if (widget->muted && !power)
-+              return 0;
-+      if (!widget->muted && power)
-+              return 0;
-+
-+      if (widget->num_kcontrols && k) {
-+              int reg = k->private_value & 0xff;
-+              int shift = (k->private_value >> 8) & 0x0f;
-+              int mask = (k->private_value >> 16) & 0xff;
-+              int invert = (k->private_value >> 24) & 0x01;
-+
-+              if (power) {
-+                      int i;
-+                      /* power up has happended, increase volume to last level */
-+                      if (invert) {
-+                              for (i = mask; i > widget->saved_value; i--)
-+                                      snd_soc_update_bits(widget->codec, reg, mask, i);
-+                      } else {
-+                              for (i = 0; i < widget->saved_value; i++)
-+                                      snd_soc_update_bits(widget->codec, reg, mask, i);
-+                      }
-+                      widget->muted = 0;
-+              } else {
-+                      /* power down is about to occur, decrease volume to mute */
-+                      int val = snd_soc_read(widget->codec, reg);
-+                      int i = widget->saved_value = (val >> shift) & mask;
-+                      if (invert) {
-+                              for (; i < mask; i++)
-+                                      snd_soc_update_bits(widget->codec, reg, mask, i);
-+                      } else {
-+                              for (; i > 0; i--)
-+                                      snd_soc_update_bits(widget->codec, reg, mask, i);
-+                      }
-+                      widget->muted = 1;
-+              }
-+      }
-+      return 0;
-+}
-+
-+/* create new dapm mixer control */
-+static int dapm_new_mixer(struct snd_soc_codec *codec,
-+      struct snd_soc_dapm_widget *w)
-+{
-+      int i, ret = 0;
-+      char name[32];
-+      struct snd_soc_dapm_path *path;
-+
-+      /* add kcontrol */
-+      for (i = 0; i < w->num_kcontrols; i++) {
-+
-+              /* match name */
-+              list_for_each_entry(path, &w->sources, list_sink) {
-+
-+                      /* mixer/mux paths name must match control name */
-+                      if (path->name != (char*)w->kcontrols[i].name)
-+                              continue;
-+
-+                      /* add dapm control with long name */
-+                      snprintf(name, 32, "%s %s", w->name, w->kcontrols[i].name);
-+                      path->long_name = kstrdup (name, GFP_KERNEL);
-+                      if (path->long_name == NULL)
-+                              return -ENOMEM;
-+
-+                      path->kcontrol = snd_soc_cnew(&w->kcontrols[i], w,
-+                              path->long_name);
-+                      ret = snd_ctl_add(codec->card, path->kcontrol);
-+                      if (ret < 0) {
-+                              printk(KERN_ERR "asoc: failed to add dapm kcontrol %s\n",
-+                                              path->long_name);
-+                              kfree(path->long_name);
-+                              path->long_name = NULL;
-+                              return ret;
-+                      }
-+              }
-+      }
-+      return ret;
-+}
-+
-+/* create new dapm mux control */
-+static int dapm_new_mux(struct snd_soc_codec *codec,
-+      struct snd_soc_dapm_widget *w)
-+{
-+      struct snd_soc_dapm_path *path = NULL;
-+      struct snd_kcontrol *kcontrol;
-+      int ret = 0;
-+
-+      if (!w->num_kcontrols) {
-+              printk(KERN_ERR "asoc: mux %s has no controls\n", w->name);
-+              return -EINVAL;
-+      }
-+
-+      kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name);
-+      ret = snd_ctl_add(codec->card, kcontrol);
-+      if (ret < 0)
-+              goto err;
-+
-+      list_for_each_entry(path, &w->sources, list_sink)
-+              path->kcontrol = kcontrol;
-+
-+      return ret;
-+
-+err:
-+      printk(KERN_ERR "asoc: failed to add kcontrol %s\n", w->name);
-+      return ret;
-+}
-+
-+/* create new dapm volume control */
-+static int dapm_new_pga(struct snd_soc_codec *codec,
-+      struct snd_soc_dapm_widget *w)
-+{
-+      struct snd_kcontrol *kcontrol;
-+      int ret = 0;
-+
-+      if (!w->num_kcontrols)
-+              return -EINVAL;
-+
-+      kcontrol = snd_soc_cnew(&w->kcontrols[0], w, w->name);
-+      ret = snd_ctl_add(codec->card, kcontrol);
-+      if (ret < 0) {
-+              printk(KERN_ERR "asoc: failed to add kcontrol %s\n", w->name);
-+              return ret;
-+      }
-+
-+      return ret;
-+}
-+
-+/* reset 'walked' bit for each dapm path */
-+static inline void dapm_clear_walk(struct snd_soc_codec *codec)
-+{
-+      struct snd_soc_dapm_path *p;
-+
-+      list_for_each_entry(p, &codec->dapm_paths, list)
-+              p->walked = 0;
-+}
-+
-+/*
-+ * Recursively check for a completed path to an active or physically connected
-+ * output widget. Returns number of complete paths.
-+ */
-+static int is_connected_output_ep(struct snd_soc_dapm_widget *widget)
-+{
-+      struct snd_soc_dapm_path *path;
-+      int con = 0;
-+
-+      if (widget->id == snd_soc_dapm_adc && widget->active)
-+              return 1;
-+
-+      if (widget->connected) {
-+              /* connected pin ? */
-+              if (widget->id == snd_soc_dapm_output && !widget->ext)
-+                      return 1;
-+
-+              /* connected jack or spk ? */
-+              if (widget->id == snd_soc_dapm_hp || widget->id == snd_soc_dapm_spk ||
-+                      widget->id == snd_soc_dapm_line)
-+                      return 1;
-+      }
-+
-+      list_for_each_entry(path, &widget->sinks, list_source) {
-+              if (path->walked)
-+                      continue;
-+
-+              if (path->sink && path->connect) {
-+                      path->walked = 1;
-+                      con += is_connected_output_ep(path->sink);
-+              }
-+      }
-+
-+      return con;
-+}
-+
-+/*
-+ * Recursively check for a completed path to an active or physically connected
-+ * input widget. Returns number of complete paths.
-+ */
-+static int is_connected_input_ep(struct snd_soc_dapm_widget *widget)
-+{
-+      struct snd_soc_dapm_path *path;
-+      int con = 0;
-+
-+      /* active stream ? */
-+      if (widget->id == snd_soc_dapm_dac && widget->active)
-+              return 1;
-+
-+      if (widget->connected) {
-+              /* connected pin ? */
-+              if (widget->id == snd_soc_dapm_input && !widget->ext)
-+                      return 1;
-+
-+              /* connected VMID/Bias for lower pops */
-+              if (widget->id == snd_soc_dapm_vmid)
-+                      return 1;
-+
-+              /* connected jack ? */
-+              if (widget->id == snd_soc_dapm_mic || widget->id == snd_soc_dapm_line)
-+                      return 1;
-+      }
-+
-+      list_for_each_entry(path, &widget->sources, list_sink) {
-+              if (path->walked)
-+                      continue;
-+
-+              if (path->source && path->connect) {
-+                      path->walked = 1;
-+                      con += is_connected_input_ep(path->source);
-+              }
-+      }
-+
-+      return con;
-+}
-+
-+/*
-+ * Scan each dapm widget for complete audio path.
-+ * A complete path is a route that has valid endpoints i.e.:-
-+ *
-+ *  o DAC to output pin.
-+ *  o Input Pin to ADC.
-+ *  o Input pin to Output pin (bypass, sidetone)
-+ *  o DAC to ADC (loopback).
-+ */
-+int dapm_power_widgets(struct snd_soc_codec *codec, int event)
-+{
-+      struct snd_soc_dapm_widget *w;
-+      int in, out, i, c = 1, *seq = NULL, ret = 0, power_change, power;
-+
-+      /* do we have a sequenced stream event */
-+      if (event == SND_SOC_DAPM_STREAM_START) {
-+              c = ARRAY_SIZE(dapm_up_seq);
-+              seq = dapm_up_seq;
-+      } else if (event == SND_SOC_DAPM_STREAM_STOP) {
-+              c = ARRAY_SIZE(dapm_down_seq);
-+              seq = dapm_down_seq;
-+      }
-+
-+      for(i = 0; i < c; i++) {
-+              list_for_each_entry(w, &codec->dapm_widgets, list) {
-+
-+                      /* is widget in stream order */
-+                      if (seq && seq[i] && w->id != seq[i])
-+                              continue;
-+
-+                      /* vmid - no action */
-+                      if (w->id == snd_soc_dapm_vmid)
-+                              continue;
-+
-+                      /* active ADC */
-+                      if (w->id == snd_soc_dapm_adc && w->active) {
-+                              in = is_connected_input_ep(w);
-+                              dapm_clear_walk(w->codec);
-+                              w->power = (in != 0) ? 1 : 0;
-+                              dapm_update_bits(w);
-+                              continue;
-+                      }
-+
-+                      /* active DAC */
-+                      if (w->id == snd_soc_dapm_dac && w->active) {
-+                              out = is_connected_output_ep(w);
-+                              dapm_clear_walk(w->codec);
-+                              w->power = (out != 0) ? 1 : 0;
-+                              dapm_update_bits(w);
-+                              continue;
-+                      }
-+
-+                      /* programmable gain/attenuation */
-+                      if (w->id == snd_soc_dapm_pga) {
-+                              int on;
-+                              in = is_connected_input_ep(w);
-+                              dapm_clear_walk(w->codec);
-+                              out = is_connected_output_ep(w);
-+                              dapm_clear_walk(w->codec);
-+                              w->power = on = (out != 0 && in != 0) ? 1 : 0;
-+
-+                              if (!on)
-+                                      dapm_set_pga(w, on); /* lower volume to reduce pops */
-+                              dapm_update_bits(w);
-+                              if (on)
-+                                      dapm_set_pga(w, on); /* restore volume from zero */
-+
-+                              continue;
-+                      }
-+
-+                      /* pre and post event widgets */
-+                      if (w->id == snd_soc_dapm_pre) {
-+                              if (!w->event)
-+                                      continue;
-+
-+                              if (event == SND_SOC_DAPM_STREAM_START) {
-+                                      ret = w->event(w, SND_SOC_DAPM_PRE_PMU);
-+                                      if (ret < 0)
-+                                              return ret;
-+                              } else if (event == SND_SOC_DAPM_STREAM_STOP) {
-+                                      ret = w->event(w, SND_SOC_DAPM_PRE_PMD);
-+                                      if (ret < 0)
-+                                              return ret;
-+                              }
-+                              continue;
-+                      }
-+                      if (w->id == snd_soc_dapm_post) {
-+                              if (!w->event)
-+                                      continue;
-+
-+                              if (event == SND_SOC_DAPM_STREAM_START) {
-+                                      ret = w->event(w, SND_SOC_DAPM_POST_PMU);
-+                                      if (ret < 0)
-+                                              return ret;
-+                              } else if (event == SND_SOC_DAPM_STREAM_STOP) {
-+                                      ret = w->event(w, SND_SOC_DAPM_POST_PMD);
-+                                      if (ret < 0)
-+                                              return ret;
-+                              }
-+                              continue;
-+                      }
-+
-+                      /* all other widgets */
-+                      in = is_connected_input_ep(w);
-+                      dapm_clear_walk(w->codec);
-+                      out = is_connected_output_ep(w);
-+                      dapm_clear_walk(w->codec);
-+                      power = (out != 0 && in != 0) ? 1 : 0;
-+                      power_change = (w->power == power) ? 0: 1;
-+                      w->power = power;
-+
-+                      /* call any power change event handlers */
-+                      if (power_change) {
-+                              if (w->event) {
-+                                      dbg("power %s event for %s flags %x\n",
-+                                              w->power ? "on" : "off", w->name, w->event_flags);
-+                                      if (power) {
-+                                              /* power up event */
-+                                              if (w->event_flags & SND_SOC_DAPM_PRE_PMU) {
-+                                                      ret = w->event(w, SND_SOC_DAPM_PRE_PMU);
-+                                                      if (ret < 0)
-+                                                              return ret;
-+                                              }
-+                                              dapm_update_bits(w);
-+                                              if (w->event_flags & SND_SOC_DAPM_POST_PMU){
-+                                                      ret = w->event(w, SND_SOC_DAPM_POST_PMU);
-+                                                      if (ret < 0)
-+                                                              return ret;
-+                                              }
-+                                      } else {
-+                                              /* power down event */
-+                                              if (w->event_flags & SND_SOC_DAPM_PRE_PMD) {
-+                                                      ret = w->event(w, SND_SOC_DAPM_PRE_PMD);
-+                                                      if (ret < 0)
-+                                                              return ret;
-+                                              }
-+                                              dapm_update_bits(w);
-+                                              if (w->event_flags & SND_SOC_DAPM_POST_PMD) {
-+                                                      ret = w->event(w, SND_SOC_DAPM_POST_PMD);
-+                                                      if (ret < 0)
-+                                                              return ret;
-+                                              }
-+                                      }
-+                              } else
-+                                      /* no event handler */
-+                                      dapm_update_bits(w);
-+                      }
-+              }
-+      }
-+
-+      return ret;
-+}
-+
-+#if DAPM_DEBUG
-+static void dbg_dump_dapm(struct snd_soc_codec* codec, const char *action)
-+{
-+      struct snd_soc_dapm_widget *w;
-+      struct snd_soc_dapm_path *p = NULL;
-+      int in, out;
-+
-+      printk("DAPM %s %s\n", codec->name, action);
-+
-+      list_for_each_entry(w, &codec->dapm_widgets, list) {
-+
-+              /* only display widgets that effect routing */
-+              switch (w->id) {
-+              case snd_soc_dapm_pre:
-+              case snd_soc_dapm_post:
-+              case snd_soc_dapm_vmid:
-+                      continue;
-+              case snd_soc_dapm_mux:
-+              case snd_soc_dapm_output:
-+              case snd_soc_dapm_input:
-+              case snd_soc_dapm_switch:
-+              case snd_soc_dapm_hp:
-+              case snd_soc_dapm_mic:
-+              case snd_soc_dapm_spk:
-+              case snd_soc_dapm_line:
-+              case snd_soc_dapm_micbias:
-+              case snd_soc_dapm_dac:
-+              case snd_soc_dapm_adc:
-+              case snd_soc_dapm_pga:
-+              case snd_soc_dapm_mixer:
-+                      if (w->name) {
-+                              in = is_connected_input_ep(w);
-+                              dapm_clear_walk(w->codec);
-+                              out = is_connected_output_ep(w);
-+                              dapm_clear_walk(w->codec);
-+                              printk("%s: %s  in %d out %d\n", w->name,
-+                                      w->power ? "On":"Off",in, out);
-+
-+                              list_for_each_entry(p, &w->sources, list_sink) {
-+                                      if (p->connect)
-+                                              printk(" in  %s %s\n", p->name ? p->name : "static",
-+                                                      p->source->name);
-+                              }
-+                              list_for_each_entry(p, &w->sinks, list_source) {
-+                                      p = list_entry(lp, struct snd_soc_dapm_path, list_source);
-+                                      if (p->connect)
-+                                              printk(" out %s %s\n", p->name ? p->name : "static",
-+                                                      p->sink->name);
-+                              }
-+                      }
-+              break;
-+              }
-+      }
-+}
-+#endif
-+
-+/* test and update the power status of a mux widget */
-+int dapm_mux_update_power(struct snd_soc_dapm_widget *widget,
-+      struct snd_kcontrol *kcontrol, int mask, int val, struct soc_enum* e)
-+{
-+      struct snd_soc_dapm_path *path;
-+      int found = 0;
-+
-+      if (widget->id != snd_soc_dapm_mux)
-+              return -ENODEV;
-+
-+      if (!snd_soc_test_bits(widget->codec, e->reg, mask, val))
-+              return 0;
-+
-+      /* find dapm widget path assoc with kcontrol */
-+      list_for_each_entry(path, &widget->codec->dapm_paths, list) {
-+              if (path->kcontrol != kcontrol)
-+                      continue;
-+
-+              if (!path->name || ! e->texts[val])
-+                      continue;
-+
-+              found = 1;
-+              /* we now need to match the string in the enum to the path */
-+              if (!(strcmp(path->name, e->texts[val])))
-+                      path->connect = 1; /* new connection */
-+              else
-+                      path->connect = 0; /* old connection must be powered down */
-+      }
-+
-+      if (found)
-+              dapm_power_widgets(widget->codec, SND_SOC_DAPM_STREAM_NOP);
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(dapm_mux_update_power);
-+
-+/* test and update the power status of a mixer widget */
-+int dapm_mixer_update_power(struct snd_soc_dapm_widget *widget,
-+      struct snd_kcontrol *kcontrol, int reg, int val_mask, int val, int invert)
-+{
-+      struct snd_soc_dapm_path *path;
-+      int found = 0;
-+
-+      if (widget->id != snd_soc_dapm_mixer)
-+              return -ENODEV;
-+
-+      if (!snd_soc_test_bits(widget->codec, reg, val_mask, val))
-+              return 0;
-+
-+      /* find dapm widget path assoc with kcontrol */
-+      list_for_each_entry(path, &widget->codec->dapm_paths, list) {
-+              if (path->kcontrol != kcontrol)
-+                      continue;
-+
-+              /* found, now check type */
-+              found = 1;
-+              if (val)
-+                      /* new connection */
-+                      path->connect = invert ? 0:1;
-+              else
-+                      /* old connection must be powered down */
-+                      path->connect = invert ? 1:0;
-+              break;
-+      }
-+
-+      if (found)
-+              dapm_power_widgets(widget->codec, SND_SOC_DAPM_STREAM_NOP);
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(dapm_mixer_update_power);
-+
-+/* show dapm widget status in sys fs */
-+static ssize_t dapm_widget_show(struct device *dev,
-+      struct device_attribute *attr, char *buf)
-+{
-+      struct snd_soc_device *devdata = dev_get_drvdata(dev);
-+      struct snd_soc_codec *codec = devdata->codec;
-+      struct snd_soc_dapm_widget *w;
-+      int count = 0;
-+      char *state = "not set";
-+
-+      list_for_each_entry(w, &codec->dapm_widgets, list) {
-+
-+              /* only display widgets that burnm power */
-+              switch (w->id) {
-+              case snd_soc_dapm_hp:
-+              case snd_soc_dapm_mic:
-+              case snd_soc_dapm_spk:
-+              case snd_soc_dapm_line:
-+              case snd_soc_dapm_micbias:
-+              case snd_soc_dapm_dac:
-+              case snd_soc_dapm_adc:
-+              case snd_soc_dapm_pga:
-+              case snd_soc_dapm_mixer:
-+                      if (w->name)
-+                              count += sprintf(buf + count, "%s: %s\n",
-+                                      w->name, w->power ? "On":"Off");
-+              break;
-+              default:
-+              break;
-+              }
-+      }
-+
-+      switch(codec->dapm_state){
-+      case SNDRV_CTL_POWER_D0:
-+              state = "D0";
-+              break;
-+      case SNDRV_CTL_POWER_D1:
-+              state = "D1";
-+              break;
-+      case SNDRV_CTL_POWER_D2:
-+              state = "D2";
-+              break;
-+      case SNDRV_CTL_POWER_D3hot:
-+              state = "D3hot";
-+              break;
-+      case SNDRV_CTL_POWER_D3cold:
-+              state = "D3cold";
-+              break;
-+      }
-+      count += sprintf(buf + count, "PM State: %s\n", state);
-+
-+      return count;
-+}
-+
-+static DEVICE_ATTR(dapm_widget, 0444, dapm_widget_show, NULL);
-+
-+int snd_soc_dapm_sys_add(struct device *dev)
-+{
-+      int ret = 0;
-+
-+      if (dapm_status)
-+              ret = device_create_file(dev, &dev_attr_dapm_widget);
-+
-+      return ret;
-+}
-+
-+static void snd_soc_dapm_sys_remove(struct device *dev)
-+{
-+      if (dapm_status)
-+              device_remove_file(dev, &dev_attr_dapm_widget);
-+}
-+
-+/* free all dapm widgets and resources */
-+void dapm_free_widgets(struct snd_soc_codec *codec)
-+{
-+      struct snd_soc_dapm_widget *w, *next_w;
-+      struct snd_soc_dapm_path *p, *next_p;
-+
-+      list_for_each_entry_safe(w, next_w, &codec->dapm_widgets, list) {
-+              list_del(&w->list);
-+              kfree(w);
-+      }
-+
-+      list_for_each_entry_safe(p, next_p, &codec->dapm_paths, list) {
-+              list_del(&p->list);
-+              kfree(p->long_name);
-+              kfree(p);
-+      }
-+}
-+
-+/**
-+ * snd_soc_dapm_sync_endpoints - scan and power dapm paths
-+ * @codec: audio codec
-+ *
-+ * Walks all dapm audio paths and powers widgets according to their
-+ * stream or path usage.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_dapm_sync_endpoints(struct snd_soc_codec *codec)
-+{
-+      return dapm_power_widgets(codec, SND_SOC_DAPM_STREAM_NOP);
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_sync_endpoints);
-+
-+/**
-+ * snd_soc_dapm_connect_input - connect dapm widgets
-+ * @codec: audio codec
-+ * @sink: name of target widget
-+ * @control: mixer control name
-+ * @source: name of source name
-+ *
-+ * Connects 2 dapm widgets together via a named audio path. The sink is
-+ * the widget receiving the audio signal, whilst the source is the sender
-+ * of the audio signal.
-+ *
-+ * Returns 0 for success else error.
-+ */
-+int snd_soc_dapm_connect_input(struct snd_soc_codec *codec, const char *sink,
-+      const char * control, const char *source)
-+{
-+      struct snd_soc_dapm_path *path;
-+      struct snd_soc_dapm_widget *wsource = NULL, *wsink = NULL, *w;
-+      int ret = 0;
-+
-+      /* find src and dest widgets */
-+      list_for_each_entry(w, &codec->dapm_widgets, list) {
-+
-+              if (!wsink && !(strcmp(w->name, sink))) {
-+                      wsink = w;
-+                      continue;
-+              }
-+              if (!wsource && !(strcmp(w->name, source))) {
-+                      wsource = w;
-+              }
-+      }
-+
-+      if (wsource == NULL || wsink == NULL)
-+              return -ENODEV;
-+
-+      path = kzalloc(sizeof(struct snd_soc_dapm_path), GFP_KERNEL);
-+      if (!path)
-+              return -ENOMEM;
-+
-+      path->source = wsource;
-+      path->sink = wsink;
-+      INIT_LIST_HEAD(&path->list);
-+      INIT_LIST_HEAD(&path->list_source);
-+      INIT_LIST_HEAD(&path->list_sink);
-+
-+      /* check for external widgets */
-+      if (wsink->id == snd_soc_dapm_input) {
-+              if (wsource->id == snd_soc_dapm_micbias ||
-+                      wsource->id == snd_soc_dapm_mic ||
-+                      wsink->id == snd_soc_dapm_line)
-+                      wsink->ext = 1;
-+      }
-+      if (wsource->id == snd_soc_dapm_output) {
-+              if (wsink->id == snd_soc_dapm_spk ||
-+                      wsink->id == snd_soc_dapm_hp ||
-+                      wsink->id == snd_soc_dapm_line)
-+                      wsource->ext = 1;
-+      }
-+
-+      /* connect static paths */
-+      if (control == NULL) {
-+              list_add(&path->list, &codec->dapm_paths);
-+              list_add(&path->list_sink, &wsink->sources);
-+              list_add(&path->list_source, &wsource->sinks);
-+              path->connect = 1;
-+              return 0;
-+      }
-+
-+      /* connect dynamic paths */
-+      switch(wsink->id) {
-+      case snd_soc_dapm_adc:
-+      case snd_soc_dapm_dac:
-+      case snd_soc_dapm_pga:
-+      case snd_soc_dapm_input:
-+      case snd_soc_dapm_output:
-+      case snd_soc_dapm_micbias:
-+      case snd_soc_dapm_vmid:
-+      case snd_soc_dapm_pre:
-+      case snd_soc_dapm_post:
-+              list_add(&path->list, &codec->dapm_paths);
-+              list_add(&path->list_sink, &wsink->sources);
-+              list_add(&path->list_source, &wsource->sinks);
-+              path->connect = 1;
-+              return 0;
-+      case snd_soc_dapm_mux:
-+              ret = dapm_connect_mux(codec, wsource, wsink, path, control,
-+                      &wsink->kcontrols[0]);
-+              if (ret != 0)
-+                      goto err;
-+              break;
-+      case snd_soc_dapm_switch:
-+      case snd_soc_dapm_mixer:
-+              ret = dapm_connect_mixer(codec, wsource, wsink, path, control);
-+              if (ret != 0)
-+                      goto err;
-+              break;
-+      case snd_soc_dapm_hp:
-+      case snd_soc_dapm_mic:
-+      case snd_soc_dapm_line:
-+      case snd_soc_dapm_spk:
-+              list_add(&path->list, &codec->dapm_paths);
-+              list_add(&path->list_sink, &wsink->sources);
-+              list_add(&path->list_source, &wsource->sinks);
-+              path->connect = 0;
-+              return 0;
-+      }
-+      return 0;
-+
-+err:
-+      printk(KERN_WARNING "asoc: no dapm match for %s --> %s --> %s\n", source,
-+              control, sink);
-+      kfree(path);
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_connect_input);
-+
-+/**
-+ * snd_soc_dapm_new_widgets - add new dapm widgets
-+ * @codec: audio codec
-+ *
-+ * Checks the codec for any new dapm widgets and creates them if found.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec)
-+{
-+      struct snd_soc_dapm_widget *w;
-+
-+      mutex_lock(&codec->mutex);
-+      list_for_each_entry(w, &codec->dapm_widgets, list)
-+      {
-+              if (w->new)
-+                      continue;
-+
-+              switch(w->id) {
-+              case snd_soc_dapm_switch:
-+              case snd_soc_dapm_mixer:
-+                      dapm_new_mixer(codec, w);
-+                      break;
-+              case snd_soc_dapm_mux:
-+                      dapm_new_mux(codec, w);
-+                      break;
-+              case snd_soc_dapm_adc:
-+              case snd_soc_dapm_dac:
-+              case snd_soc_dapm_pga:
-+                      dapm_new_pga(codec, w);
-+                      break;
-+              case snd_soc_dapm_input:
-+              case snd_soc_dapm_output:
-+              case snd_soc_dapm_micbias:
-+              case snd_soc_dapm_spk:
-+              case snd_soc_dapm_hp:
-+              case snd_soc_dapm_mic:
-+              case snd_soc_dapm_line:
-+              case snd_soc_dapm_vmid:
-+              case snd_soc_dapm_pre:
-+              case snd_soc_dapm_post:
-+                      break;
-+              }
-+              w->new = 1;
-+      }
-+
-+      dapm_power_widgets(codec, SND_SOC_DAPM_STREAM_NOP);
-+      mutex_unlock(&codec->mutex);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
-+
-+/**
-+ * snd_soc_dapm_get_volsw - dapm mixer get callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to get the value of a dapm mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
-+      int reg = kcontrol->private_value & 0xff;
-+      int shift = (kcontrol->private_value >> 8) & 0x0f;
-+      int rshift = (kcontrol->private_value >> 12) & 0x0f;
-+      int mask = (kcontrol->private_value >> 16) & 0xff;
-+      int invert = (kcontrol->private_value >> 24) & 0x01;
-+
-+      /* return the saved value if we are powered down */
-+      if (widget->id == snd_soc_dapm_pga && !widget->power) {
-+              ucontrol->value.integer.value[0] = widget->saved_value;
-+              return 0;
-+      }
-+
-+      ucontrol->value.integer.value[0] =
-+              (snd_soc_read(widget->codec, reg) >> shift) & mask;
-+      if (shift != rshift)
-+              ucontrol->value.integer.value[1] =
-+                      (snd_soc_read(widget->codec, reg) >> rshift) & mask;
-+      if (invert) {
-+              ucontrol->value.integer.value[0] =
-+                      mask - ucontrol->value.integer.value[0];
-+              if (shift != rshift)
-+                      ucontrol->value.integer.value[1] =
-+                              mask - ucontrol->value.integer.value[1];
-+      }
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw);
-+
-+/**
-+ * snd_soc_dapm_put_volsw - dapm mixer set callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to set the value of a dapm mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
-+      int reg = kcontrol->private_value & 0xff;
-+      int shift = (kcontrol->private_value >> 8) & 0x0f;
-+      int rshift = (kcontrol->private_value >> 12) & 0x0f;
-+      int mask = (kcontrol->private_value >> 16) & 0xff;
-+      int invert = (kcontrol->private_value >> 24) & 0x01;
-+      unsigned short val, val2, val_mask;
-+      int ret;
-+
-+      val = (ucontrol->value.integer.value[0] & mask);
-+
-+      if (invert)
-+              val = mask - val;
-+      val_mask = mask << shift;
-+      val = val << shift;
-+      if (shift != rshift) {
-+              val2 = (ucontrol->value.integer.value[1] & mask);
-+              if (invert)
-+                      val2 = mask - val2;
-+              val_mask |= mask << rshift;
-+              val |= val2 << rshift;
-+      }
-+
-+      mutex_lock(&widget->codec->mutex);
-+      widget->value = val;
-+
-+      /* save volume value if the widget is powered down */
-+      if (widget->id == snd_soc_dapm_pga && !widget->power) {
-+              widget->saved_value = val;
-+              mutex_unlock(&widget->codec->mutex);
-+              return 1;
-+      }
-+
-+      dapm_mixer_update_power(widget, kcontrol, reg, val_mask, val, invert);
-+      if (widget->event) {
-+              if (widget->event_flags & SND_SOC_DAPM_PRE_REG) {
-+                      ret = widget->event(widget, SND_SOC_DAPM_PRE_REG);
-+                      if (ret < 0)
-+                              goto out;
-+              }
-+              ret = snd_soc_update_bits(widget->codec, reg, val_mask, val);
-+              if (widget->event_flags & SND_SOC_DAPM_POST_REG)
-+                      ret = widget->event(widget, SND_SOC_DAPM_POST_REG);
-+      } else
-+              ret = snd_soc_update_bits(widget->codec, reg, val_mask, val);
-+
-+out:
-+      mutex_unlock(&widget->codec->mutex);
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
-+
-+/**
-+ * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to get the value of a dapm enumerated double mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
-+      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-+      unsigned short val, bitmask;
-+
-+      for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
-+              ;
-+      val = snd_soc_read(widget->codec, e->reg);
-+      ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1);
-+      if (e->shift_l != e->shift_r)
-+              ucontrol->value.enumerated.item[1] =
-+                      (val >> e->shift_r) & (bitmask - 1);
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double);
-+
-+/**
-+ * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to set the value of a dapm enumerated double mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_dapm_widget *widget = snd_kcontrol_chip(kcontrol);
-+      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-+      unsigned short val, mux;
-+      unsigned short mask, bitmask;
-+      int ret = 0;
-+
-+      for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
-+              ;
-+      if (ucontrol->value.enumerated.item[0] > e->mask - 1)
-+              return -EINVAL;
-+      mux = ucontrol->value.enumerated.item[0];
-+      val = mux << e->shift_l;
-+      mask = (bitmask - 1) << e->shift_l;
-+      if (e->shift_l != e->shift_r) {
-+              if (ucontrol->value.enumerated.item[1] > e->mask - 1)
-+                      return -EINVAL;
-+              val |= ucontrol->value.enumerated.item[1] << e->shift_r;
-+              mask |= (bitmask - 1) << e->shift_r;
-+      }
-+
-+      mutex_lock(&widget->codec->mutex);
-+      widget->value = val;
-+      dapm_mux_update_power(widget, kcontrol, mask, mux, e);
-+      if (widget->event) {
-+              if (widget->event_flags & SND_SOC_DAPM_PRE_REG) {
-+                      ret = widget->event(widget, SND_SOC_DAPM_PRE_REG);
-+                      if (ret < 0)
-+                              goto out;
-+              }
-+              ret = snd_soc_update_bits(widget->codec, e->reg, mask, val);
-+              if (widget->event_flags & SND_SOC_DAPM_POST_REG)
-+                      ret = widget->event(widget, SND_SOC_DAPM_POST_REG);
-+      } else
-+              ret = snd_soc_update_bits(widget->codec, e->reg, mask, val);
-+
-+out:
-+      mutex_unlock(&widget->codec->mutex);
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_put_enum_double);
-+
-+/**
-+ * snd_soc_dapm_new_control - create new dapm control
-+ * @codec: audio codec
-+ * @widget: widget template
-+ *
-+ * Creates a new dapm control based upon the template.
-+ *
-+ * Returns 0 for success else error.
-+ */
-+int snd_soc_dapm_new_control(struct snd_soc_codec *codec,
-+      const struct snd_soc_dapm_widget *widget)
-+{
-+      struct snd_soc_dapm_widget *w;
-+
-+      if ((w = dapm_cnew_widget(widget)) == NULL)
-+              return -ENOMEM;
-+
-+      w->codec = codec;
-+      INIT_LIST_HEAD(&w->sources);
-+      INIT_LIST_HEAD(&w->sinks);
-+      INIT_LIST_HEAD(&w->list);
-+      list_add(&w->list, &codec->dapm_widgets);
-+
-+      /* machine layer set ups unconnected pins and insertions */
-+      w->connected = 1;
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_new_control);
-+
-+/**
-+ * snd_soc_dapm_stream_event - send a stream event to the dapm core
-+ * @codec: audio codec
-+ * @stream: stream name
-+ * @event: stream event
-+ *
-+ * Sends a stream event to the dapm core. The core then makes any
-+ * necessary widget power changes.
-+ *
-+ * Returns 0 for success else error.
-+ */
-+int snd_soc_dapm_stream_event(struct snd_soc_codec *codec,
-+      char *stream, int event)
-+{
-+      struct snd_soc_dapm_widget *w;
-+
-+      mutex_lock(&codec->mutex);
-+      list_for_each_entry(w, &codec->dapm_widgets, list)
-+      {
-+              if (!w->sname)
-+                      continue;
-+              dbg("widget %s\n %s stream %s event %d\n", w->name, w->sname,
-+                      stream, event);
-+              if (strstr(w->sname, stream)) {
-+                      switch(event) {
-+                      case SND_SOC_DAPM_STREAM_START:
-+                              w->active = 1;
-+                              break;
-+                      case SND_SOC_DAPM_STREAM_STOP:
-+                              w->active = 0;
-+                              break;
-+                      case SND_SOC_DAPM_STREAM_SUSPEND:
-+                              if (w->active)
-+                                      w->suspend = 1;
-+                              w->active = 0;
-+                              break;
-+                      case SND_SOC_DAPM_STREAM_RESUME:
-+                              if (w->suspend) {
-+                                      w->active = 1;
-+                                      w->suspend = 0;
-+                              }
-+                              break;
-+                      case SND_SOC_DAPM_STREAM_PAUSE_PUSH:
-+                              break;
-+                      case SND_SOC_DAPM_STREAM_PAUSE_RELEASE:
-+                              break;
-+                      }
-+              }
-+      }
-+      mutex_unlock(&codec->mutex);
-+
-+      dapm_power_widgets(codec, event);
-+      dump_dapm(codec, __FUNCTION__);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_stream_event);
-+
-+/**
-+ * snd_soc_dapm_set_endpoint - set audio endpoint status
-+ * @codec: audio codec
-+ * @endpoint: audio signal endpoint (or start point)
-+ * @status: point status
-+ *
-+ * Set audio endpoint status - connected or disconnected.
-+ *
-+ * Returns 0 for success else error.
-+ */
-+int snd_soc_dapm_set_endpoint(struct snd_soc_codec *codec,
-+      char *endpoint, int status)
-+{
-+      struct snd_soc_dapm_widget *w;
-+
-+      list_for_each_entry(w, &codec->dapm_widgets, list) {
-+              if (!strcmp(w->name, endpoint)) {
-+                      w->connected = status;
-+              }
-+      }
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_set_endpoint);
-+
-+/**
-+ * snd_soc_dapm_free - free dapm resources
-+ * @socdev: SoC device
-+ *
-+ * Free all dapm widgets and resources.
-+ */
-+void snd_soc_dapm_free(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      snd_soc_dapm_sys_remove(socdev->dev);
-+      dapm_free_widgets(codec);
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_dapm_free);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("Dynamic Audio Power Management core for ALSA SoC");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/soc-core.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/soc-core.c
-@@ -0,0 +1,2063 @@
-+/*
-+ * soc-core.c  --  ALSA SoC Audio Layer
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    12th Aug 2005   Initial version.
-+ *    25th Oct 2005   Working Codec, Interface and Platform registration.
-+ *
-+ *  TODO:
-+ *   o Add hw rules to enforce rates, etc.
-+ *   o More testing with other codecs/machines.
-+ *   o Add more codecs and platforms to ensure good API coverage.
-+ *   o Support TDM on PCM and I2S
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/bitops.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+/* debug */
-+#define SOC_DEBUG 1
-+#if SOC_DEBUG
-+#define dbg(format, arg...) printk(format, ## arg)
-+#else
-+#define dbg(format, arg...)
-+#endif
-+/* debug DAI capabilities matching */
-+#define SOC_DEBUG_DAI 1
-+#if SOC_DEBUG_DAI
-+#define dbgc(format, arg...) printk(format, ## arg)
-+#else
-+#define dbgc(format, arg...)
-+#endif
-+
-+#define CODEC_CPU(codec, cpu) ((codec << 4) | cpu)
-+
-+static DEFINE_MUTEX(pcm_mutex);
-+static DEFINE_MUTEX(io_mutex);
-+static struct workqueue_struct *soc_workq;
-+static struct work_struct soc_stream_work;
-+static DECLARE_WAIT_QUEUE_HEAD(soc_pm_waitq);
-+
-+/* supported sample rates */
-+/* ATTENTION: these values depend on the definition in pcm.h! */
-+static const unsigned int rates[] = {
-+      5512, 8000, 11025, 16000, 22050, 32000, 44100,
-+      48000, 64000, 88200, 96000, 176400, 192000
-+};
-+
-+/*
-+ * This is a timeout to do a DAPM powerdown after a stream is closed().
-+ * It can be used to eliminate pops between different playback streams, e.g.
-+ * between two audio tracks.
-+ */
-+static int pmdown_time = 5000;
-+module_param(pmdown_time, int, 0);
-+MODULE_PARM_DESC(pmdown_time, "DAPM stream powerdown time (msecs)");
-+
-+#ifdef CONFIG_SND_SOC_AC97_BUS
-+/* unregister ac97 codec */
-+static int soc_ac97_dev_unregister(struct snd_soc_codec *codec)
-+{
-+      if (codec->ac97->dev.bus)
-+              device_unregister(&codec->ac97->dev);
-+      return 0;
-+}
-+
-+/* stop no dev release warning */
-+static void soc_ac97_device_release(struct device *dev){}
-+
-+/* register ac97 codec to bus */
-+static int soc_ac97_dev_register(struct snd_soc_codec *codec)
-+{
-+      int err;
-+
-+      codec->ac97->dev.bus = &ac97_bus_type;
-+      codec->ac97->dev.parent = NULL;
-+      codec->ac97->dev.release = soc_ac97_device_release;
-+
-+      snprintf(codec->ac97->dev.bus_id, BUS_ID_SIZE, "%d-%d:%s",
-+               codec->card->number, 0, codec->name);
-+      err = device_register(&codec->ac97->dev);
-+      if (err < 0) {
-+              snd_printk(KERN_ERR "Can't register ac97 bus\n");
-+              codec->ac97->dev.bus = NULL;
-+              return err;
-+      }
-+      return 0;
-+}
-+#endif
-+
-+static inline const char* get_dai_name(int type)
-+{
-+      switch(type) {
-+      case SND_SOC_DAI_AC97:
-+              return "AC97";
-+      case SND_SOC_DAI_I2S:
-+              return "I2S";
-+      case SND_SOC_DAI_PCM:
-+              return "PCM";
-+      }
-+      return NULL;
-+}
-+
-+/* get rate format from rate */
-+static inline int soc_get_rate_format(int rate)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(rates); i++) {
-+              if (rates[i] == rate)
-+                      return 1 << i;
-+      }
-+      return 0;
-+}
-+
-+/* gets the audio system mclk/sysclk for the given parameters */
-+static unsigned inline int soc_get_mclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_machine *machine = socdev->machine;
-+      int i;
-+
-+      /* find the matching machine config and get it's mclk for the given
-+       * sample rate and hardware format */
-+      for(i = 0; i < machine->num_links; i++) {
-+              if (machine->dai_link[i].cpu_dai == rtd->cpu_dai &&
-+                      machine->dai_link[i].config_sysclk)
-+                      return machine->dai_link[i].config_sysclk(rtd, info);
-+      }
-+      return 0;
-+}
-+
-+/* changes a bitclk multiplier mask to a divider mask */
-+static u64 soc_bfs_rcw_to_div(u64 bfs, int rate, unsigned int mclk,
-+      unsigned int pcmfmt, unsigned int chn)
-+{
-+      int i, j;
-+      u64 bfs_ = 0;
-+      int size = snd_pcm_format_physical_width(pcmfmt), min = 0;
-+
-+      if (size <= 0)
-+              return 0;
-+
-+      /* the minimum bit clock that has enough bandwidth */
-+      min = size * rate * chn;
-+      dbgc("rcw --> div min bclk %d with mclk %d\n", min, mclk);
-+
-+      for (i = 0; i < 64; i++) {
-+              if ((bfs >> i) & 0x1) {
-+                      j = min * (i + 1);
-+                      bfs_ |= SND_SOC_FSBD(mclk/j);
-+                      dbgc("rcw --> div support mult %d\n",
-+                              SND_SOC_FSBD_REAL(1<<i));
-+              }
-+      }
-+
-+      return bfs_;
-+}
-+
-+/* changes a bitclk divider mask to a multiplier mask */
-+static u64 soc_bfs_div_to_rcw(u64 bfs, int rate, unsigned int mclk,
-+      unsigned int pcmfmt, unsigned int chn)
-+{
-+      int i, j;
-+      u64 bfs_ = 0;
-+
-+      int size = snd_pcm_format_physical_width(pcmfmt), min = 0;
-+
-+      if (size <= 0)
-+              return 0;
-+
-+      /* the minimum bit clock that has enough bandwidth */
-+      min = size * rate * chn;
-+      dbgc("div to rcw min bclk %d with mclk %d\n", min, mclk);
-+
-+      for (i = 0; i < 64; i++) {
-+              if ((bfs >> i) & 0x1) {
-+                      j = mclk / (i + 1);
-+                      if (j >= min) {
-+                              bfs_ |= SND_SOC_FSBW(j/min);
-+                              dbgc("div --> rcw support div %d\n",
-+                                      SND_SOC_FSBW_REAL(1<<i));
-+                      }
-+              }
-+      }
-+
-+      return bfs_;
-+}
-+
-+/* changes a constant bitclk to a multiplier mask */
-+static u64 soc_bfs_rate_to_rcw(u64 bfs, int rate, unsigned int mclk,
-+      unsigned int pcmfmt, unsigned int chn)
-+{
-+      unsigned int bfs_ = rate * bfs;
-+      int size = snd_pcm_format_physical_width(pcmfmt), min = 0;
-+
-+      if (size <= 0)
-+              return 0;
-+
-+      /* the minimum bit clock that has enough bandwidth */
-+      min = size * rate * chn;
-+      dbgc("rate --> rcw min bclk %d with mclk %d\n", min, mclk);
-+
-+      if (bfs_ < min)
-+              return 0;
-+      else {
-+              bfs_ = SND_SOC_FSBW(bfs_/min);
-+              dbgc("rate --> rcw support div %d\n", SND_SOC_FSBW_REAL(bfs_));
-+              return bfs_;
-+      }
-+}
-+
-+/* changes a bitclk multiplier mask to a divider mask */
-+static u64 soc_bfs_rate_to_div(u64 bfs, int rate, unsigned int mclk,
-+      unsigned int pcmfmt, unsigned int chn)
-+{
-+      unsigned int bfs_ = rate * bfs;
-+      int size = snd_pcm_format_physical_width(pcmfmt), min = 0;
-+
-+      if (size <= 0)
-+              return 0;
-+
-+      /* the minimum bit clock that has enough bandwidth */
-+      min = size * rate * chn;
-+      dbgc("rate --> div min bclk %d with mclk %d\n", min, mclk);
-+
-+      if (bfs_ < min)
-+              return 0;
-+      else {
-+              bfs_ = SND_SOC_FSBW(mclk/bfs_);
-+              dbgc("rate --> div support div %d\n", SND_SOC_FSBD_REAL(bfs_));
-+              return bfs_;
-+      }
-+}
-+
-+/* Matches codec DAI and SoC CPU DAI hardware parameters */
-+static int soc_hw_match_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_dai_mode *codec_dai_mode = NULL;
-+      struct snd_soc_dai_mode *cpu_dai_mode = NULL;
-+      struct snd_soc_clock_info clk_info;
-+      unsigned int fs, mclk, rate = params_rate(params),
-+              chn, j, k, cpu_bclk, codec_bclk, pcmrate;
-+      u16 fmt = 0;
-+      u64 codec_bfs, cpu_bfs;
-+
-+      dbg("asoc: match version %s\n", SND_SOC_VERSION);
-+      clk_info.rate = rate;
-+      pcmrate = soc_get_rate_format(rate);
-+
-+      /* try and find a match from the codec and cpu DAI capabilities */
-+      for (j = 0; j < rtd->codec_dai->caps.num_modes; j++) {
-+              for (k = 0; k < rtd->cpu_dai->caps.num_modes; k++) {
-+                      codec_dai_mode = &rtd->codec_dai->caps.mode[j];
-+                      cpu_dai_mode = &rtd->cpu_dai->caps.mode[k];
-+
-+                      if (!(codec_dai_mode->pcmrate & cpu_dai_mode->pcmrate &
-+                                      pcmrate)) {
-+                              dbgc("asoc: DAI[%d:%d] failed to match rate\n", j, k);
-+                              continue;
-+                      }
-+
-+                      fmt = codec_dai_mode->fmt & cpu_dai_mode->fmt;
-+                      if (!(fmt & SND_SOC_DAIFMT_FORMAT_MASK)) {
-+                              dbgc("asoc: DAI[%d:%d] failed to match format\n", j, k);
-+                              continue;
-+                      }
-+
-+                      if (!(fmt & SND_SOC_DAIFMT_CLOCK_MASK)) {
-+                              dbgc("asoc: DAI[%d:%d] failed to match clock masters\n",
-+                                       j, k);
-+                              continue;
-+                      }
-+
-+                      if (!(fmt & SND_SOC_DAIFMT_INV_MASK)) {
-+                              dbgc("asoc: DAI[%d:%d] failed to match invert\n", j, k);
-+                              continue;
-+                      }
-+
-+                      if (!(codec_dai_mode->pcmfmt & cpu_dai_mode->pcmfmt)) {
-+                              dbgc("asoc: DAI[%d:%d] failed to match pcm format\n", j, k);
-+                              continue;
-+                      }
-+
-+                      if (!(codec_dai_mode->pcmdir & cpu_dai_mode->pcmdir)) {
-+                              dbgc("asoc: DAI[%d:%d] failed to match direction\n", j, k);
-+                              continue;
-+                      }
-+
-+                      /* todo - still need to add tdm selection */
-+                      rtd->cpu_dai->dai_runtime.fmt =
-+                      rtd->codec_dai->dai_runtime.fmt =
-+                              1 << (ffs(fmt & SND_SOC_DAIFMT_FORMAT_MASK) -1) |
-+                              1 << (ffs(fmt & SND_SOC_DAIFMT_CLOCK_MASK) - 1) |
-+                              1 << (ffs(fmt & SND_SOC_DAIFMT_INV_MASK) - 1);
-+                      clk_info.bclk_master =
-+                              rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK;
-+
-+                      /* make sure the ratio between rate and master
-+                       * clock is acceptable*/
-+                      fs = (cpu_dai_mode->fs & codec_dai_mode->fs);
-+                      if (fs == 0) {
-+                              dbgc("asoc: DAI[%d:%d] failed to match FS\n", j, k);
-+                              continue;
-+                      }
-+                      clk_info.fs = rtd->cpu_dai->dai_runtime.fs =
-+                              rtd->codec_dai->dai_runtime.fs = fs;
-+
-+                      /* calculate audio system clocking using slowest clocks possible*/
-+                      mclk = soc_get_mclk(rtd, &clk_info);
-+                      if (mclk == 0) {
-+                              dbgc("asoc: DAI[%d:%d] configuration not clockable\n", j, k);
-+                              dbgc("asoc: rate %d fs %d master %x\n", rate, fs,
-+                                      clk_info.bclk_master);
-+                              continue;
-+                      }
-+
-+                      /* calculate word size (per channel) and frame size */
-+                      rtd->codec_dai->dai_runtime.pcmfmt =
-+                              rtd->cpu_dai->dai_runtime.pcmfmt =
-+                              1 << params_format(params);
-+
-+                      chn = params_channels(params);
-+                      /* i2s always has left and right */
-+                      if (params_channels(params) == 1 &&
-+                              rtd->cpu_dai->dai_runtime.fmt & (SND_SOC_DAIFMT_I2S |
-+                                      SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_LEFT_J))
-+                              chn <<= 1;
-+
-+                      /* Calculate bfs - the ratio between bitclock and the sample rate
-+                       * We must take into consideration the dividers and multipliers
-+                       * used in the codec and cpu DAI modes. We always choose the
-+                       * lowest possible clocks to reduce power.
-+                       */
-+                      switch (CODEC_CPU(codec_dai_mode->flags, cpu_dai_mode->flags)) {
-+                      case CODEC_CPU(SND_SOC_DAI_BFS_DIV, SND_SOC_DAI_BFS_DIV):
-+                              /* cpu & codec bfs dividers */
-+                              rtd->cpu_dai->dai_runtime.bfs =
-+                                      rtd->codec_dai->dai_runtime.bfs =
-+                                      1 << (fls(codec_dai_mode->bfs & cpu_dai_mode->bfs) - 1);
-+                              break;
-+                      case CODEC_CPU(SND_SOC_DAI_BFS_DIV, SND_SOC_DAI_BFS_RCW):
-+                              /* normalise bfs codec divider & cpu rcw mult */
-+                              codec_bfs = soc_bfs_div_to_rcw(codec_dai_mode->bfs, rate,
-+                                      mclk, rtd->codec_dai->dai_runtime.pcmfmt, chn);
-+                              rtd->cpu_dai->dai_runtime.bfs =
-+                                      1 << (ffs(codec_bfs & cpu_dai_mode->bfs) - 1);
-+                              cpu_bfs = soc_bfs_rcw_to_div(cpu_dai_mode->bfs, rate, mclk,
-+                                              rtd->codec_dai->dai_runtime.pcmfmt, chn);
-+                              rtd->codec_dai->dai_runtime.bfs =
-+                                      1 << (fls(codec_dai_mode->bfs & cpu_bfs) - 1);
-+                              break;
-+                      case CODEC_CPU(SND_SOC_DAI_BFS_RCW, SND_SOC_DAI_BFS_DIV):
-+                              /* normalise bfs codec rcw mult & cpu divider */
-+                              codec_bfs = soc_bfs_rcw_to_div(codec_dai_mode->bfs, rate,
-+                                      mclk, rtd->codec_dai->dai_runtime.pcmfmt, chn);
-+                              rtd->cpu_dai->dai_runtime.bfs =
-+                                      1 << (fls(codec_bfs & cpu_dai_mode->bfs) -1);
-+                              cpu_bfs = soc_bfs_div_to_rcw(cpu_dai_mode->bfs, rate, mclk,
-+                                              rtd->codec_dai->dai_runtime.pcmfmt, chn);
-+                              rtd->codec_dai->dai_runtime.bfs =
-+                                      1 << (ffs(codec_dai_mode->bfs & cpu_bfs) -1);
-+                              break;
-+                      case CODEC_CPU(SND_SOC_DAI_BFS_RCW, SND_SOC_DAI_BFS_RCW):
-+                              /* codec & cpu bfs rate rcw multipliers */
-+                              rtd->cpu_dai->dai_runtime.bfs =
-+                                      rtd->codec_dai->dai_runtime.bfs =
-+                                      1 << (ffs(codec_dai_mode->bfs & cpu_dai_mode->bfs) -1);
-+                              break;
-+                      case CODEC_CPU(SND_SOC_DAI_BFS_DIV, SND_SOC_DAI_BFS_RATE):
-+                              /* normalise cpu bfs rate const multiplier & codec div */
-+                              cpu_bfs = soc_bfs_rate_to_div(cpu_dai_mode->bfs, rate,
-+                                      mclk, rtd->codec_dai->dai_runtime.pcmfmt, chn);
-+                              if(codec_dai_mode->bfs & cpu_bfs) {
-+                                      rtd->codec_dai->dai_runtime.bfs = cpu_bfs;
-+                                      rtd->cpu_dai->dai_runtime.bfs = cpu_dai_mode->bfs;
-+                              } else
-+                                      rtd->cpu_dai->dai_runtime.bfs = 0;
-+                              break;
-+                      case CODEC_CPU(SND_SOC_DAI_BFS_RCW, SND_SOC_DAI_BFS_RATE):
-+                              /* normalise cpu bfs rate const multiplier & codec rcw mult */
-+                              cpu_bfs = soc_bfs_rate_to_rcw(cpu_dai_mode->bfs, rate,
-+                                      mclk, rtd->codec_dai->dai_runtime.pcmfmt, chn);
-+                              if(codec_dai_mode->bfs & cpu_bfs) {
-+                                      rtd->codec_dai->dai_runtime.bfs = cpu_bfs;
-+                                      rtd->cpu_dai->dai_runtime.bfs = cpu_dai_mode->bfs;
-+                              } else
-+                                      rtd->cpu_dai->dai_runtime.bfs = 0;
-+                              break;
-+                      case CODEC_CPU(SND_SOC_DAI_BFS_RATE, SND_SOC_DAI_BFS_RCW):
-+                              /* normalise cpu bfs rate rcw multiplier & codec const mult */
-+                              codec_bfs = soc_bfs_rate_to_rcw(codec_dai_mode->bfs, rate,
-+                                      mclk, rtd->codec_dai->dai_runtime.pcmfmt, chn);
-+                              if(cpu_dai_mode->bfs & codec_bfs) {
-+                                      rtd->cpu_dai->dai_runtime.bfs = codec_bfs;
-+                                      rtd->codec_dai->dai_runtime.bfs = codec_dai_mode->bfs;
-+                              } else
-+                                      rtd->cpu_dai->dai_runtime.bfs = 0;
-+                              break;
-+                      case CODEC_CPU(SND_SOC_DAI_BFS_RATE, SND_SOC_DAI_BFS_DIV):
-+                              /* normalise cpu bfs div & codec const mult */
-+                              codec_bfs = soc_bfs_rate_to_div(codec_dai_mode->bfs, rate,
-+                                      mclk, rtd->codec_dai->dai_runtime.pcmfmt, chn);
-+                              if(codec_dai_mode->bfs & codec_bfs) {
-+                                      rtd->cpu_dai->dai_runtime.bfs = codec_bfs;
-+                                      rtd->codec_dai->dai_runtime.bfs = codec_dai_mode->bfs;
-+                              } else
-+                                      rtd->cpu_dai->dai_runtime.bfs = 0;
-+                              break;
-+                      case CODEC_CPU(SND_SOC_DAI_BFS_RATE, SND_SOC_DAI_BFS_RATE):
-+                              /* cpu & codec constant mult */
-+                              if(codec_dai_mode->bfs == cpu_dai_mode->bfs)
-+                                      rtd->cpu_dai->dai_runtime.bfs =
-+                                              rtd->codec_dai->dai_runtime.bfs =
-+                                              codec_dai_mode->bfs;
-+                              else
-+                                      rtd->cpu_dai->dai_runtime.bfs =
-+                                              rtd->codec_dai->dai_runtime.bfs = 0;
-+                              break;
-+                      default:
-+                              if(codec_dai_mode->flags == 0)
-+                                      printk(KERN_ERR "asoc: error missing codec DAI flags\n");
-+                              else
-+                                      printk(KERN_ERR "asoc: error missing CPU DAI flags\n");
-+                              break;
-+                      }
-+
-+                      /* make sure the bit clock speed is acceptable */
-+                      if (!rtd->cpu_dai->dai_runtime.bfs ||
-+                              !rtd->codec_dai->dai_runtime.bfs) {
-+                              dbgc("asoc: DAI[%d:%d] failed to match BFS\n", j, k);
-+                              dbgc("asoc: cpu_dai %llu codec %llu\n",
-+                                      rtd->cpu_dai->dai_runtime.bfs,
-+                                      rtd->codec_dai->dai_runtime.bfs);
-+                              dbgc("asoc: mclk %d hwfmt %x\n", mclk, fmt);
-+                              continue;
-+                      }
-+
-+                      goto found;
-+              }
-+      }
-+      printk(KERN_ERR "asoc: no matching DAI found between codec and CPU\n");
-+      return -EINVAL;
-+
-+found:
-+      /* we have matching DAI's, so complete the runtime info */
-+      rtd->codec_dai->dai_runtime.pcmrate =
-+              rtd->cpu_dai->dai_runtime.pcmrate =
-+              soc_get_rate_format(rate);
-+
-+      rtd->codec_dai->dai_runtime.priv = codec_dai_mode->priv;
-+      rtd->cpu_dai->dai_runtime.priv = cpu_dai_mode->priv;
-+      rtd->codec_dai->dai_runtime.flags = codec_dai_mode->flags;
-+      rtd->cpu_dai->dai_runtime.flags = cpu_dai_mode->flags;
-+
-+      /* for debug atm */
-+      dbg("asoc: DAI[%d:%d] Match OK\n", j, k);
-+      if (rtd->codec_dai->dai_runtime.flags == SND_SOC_DAI_BFS_DIV) {
-+              codec_bclk = (rtd->codec_dai->dai_runtime.fs * params_rate(params)) /
-+                      SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+              dbg("asoc: codec fs %d mclk %d bfs div %d bclk %d\n",
-+                      rtd->codec_dai->dai_runtime.fs, mclk,
-+                      SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs),     codec_bclk);
-+      } else if(rtd->codec_dai->dai_runtime.flags == SND_SOC_DAI_BFS_RATE) {
-+              codec_bclk = params_rate(params) * rtd->codec_dai->dai_runtime.bfs;
-+              dbg("asoc: codec fs %d mclk %d bfs rate mult %llu bclk %d\n",
-+                      rtd->codec_dai->dai_runtime.fs, mclk,
-+                      rtd->codec_dai->dai_runtime.bfs, codec_bclk);
-+      } else if (rtd->cpu_dai->dai_runtime.flags == SND_SOC_DAI_BFS_RCW) {
-+              codec_bclk = params_rate(params) * params_channels(params) *
-+                      snd_pcm_format_physical_width(rtd->codec_dai->dai_runtime.pcmfmt) *
-+                      SND_SOC_FSBW_REAL(rtd->codec_dai->dai_runtime.bfs);
-+              dbg("asoc: codec fs %d mclk %d bfs rcw mult %d bclk %d\n",
-+                      rtd->codec_dai->dai_runtime.fs, mclk,
-+                      SND_SOC_FSBW_REAL(rtd->codec_dai->dai_runtime.bfs), codec_bclk);
-+      } else
-+              codec_bclk = 0;
-+
-+      if (rtd->cpu_dai->dai_runtime.flags == SND_SOC_DAI_BFS_DIV) {
-+              cpu_bclk = (rtd->cpu_dai->dai_runtime.fs * params_rate(params)) /
-+                      SND_SOC_FSBD_REAL(rtd->cpu_dai->dai_runtime.bfs);
-+              dbg("asoc: cpu fs %d mclk %d bfs div %d bclk %d\n",
-+                      rtd->cpu_dai->dai_runtime.fs, mclk,
-+                      SND_SOC_FSBD_REAL(rtd->cpu_dai->dai_runtime.bfs), cpu_bclk);
-+      } else if (rtd->cpu_dai->dai_runtime.flags == SND_SOC_DAI_BFS_RATE) {
-+              cpu_bclk = params_rate(params) * rtd->cpu_dai->dai_runtime.bfs;
-+              dbg("asoc: cpu fs %d mclk %d bfs rate mult %llu bclk %d\n",
-+                      rtd->cpu_dai->dai_runtime.fs, mclk,
-+                      rtd->cpu_dai->dai_runtime.bfs, cpu_bclk);
-+      } else if (rtd->cpu_dai->dai_runtime.flags == SND_SOC_DAI_BFS_RCW) {
-+              cpu_bclk = params_rate(params) * params_channels(params) *
-+                      snd_pcm_format_physical_width(rtd->cpu_dai->dai_runtime.pcmfmt) *
-+                      SND_SOC_FSBW_REAL(rtd->cpu_dai->dai_runtime.bfs);
-+              dbg("asoc: cpu fs %d mclk %d bfs mult rcw %d bclk %d\n",
-+                      rtd->cpu_dai->dai_runtime.fs, mclk,
-+                      SND_SOC_FSBW_REAL(rtd->cpu_dai->dai_runtime.bfs), cpu_bclk);
-+      } else
-+              cpu_bclk = 0;
-+
-+      /*
-+       * Check we have matching bitclocks. If we don't then it means the
-+       * sysclock returned by either the codec or cpu DAI (selected by the
-+       * machine sysclock function) is wrong compared with the supported DAI
-+       * modes for the codec or cpu DAI.
-+       */
-+      if (cpu_bclk != codec_bclk && cpu_bclk){
-+              printk(KERN_ERR
-+                      "asoc: codec and cpu bitclocks differ, audio may be wrong speed\n"
-+                      );
-+              printk(KERN_ERR "asoc: codec %d != cpu %d\n", codec_bclk, cpu_bclk);
-+      }
-+
-+      switch(rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              dbg("asoc: DAI codec BCLK master, LRC master\n");
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFM:
-+              dbg("asoc: DAI codec BCLK slave, LRC master\n");
-+              break;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              dbg("asoc: DAI codec BCLK master, LRC slave\n");
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              dbg("asoc: DAI codec BCLK slave, LRC slave\n");
-+              break;
-+      }
-+      dbg("asoc: mode %x, invert %x\n",
-+              rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK,
-+              rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK);
-+      dbg("asoc: audio rate %d chn %d fmt %x\n", params_rate(params),
-+              params_channels(params), params_format(params));
-+
-+      return 0;
-+}
-+
-+static inline u32 get_rates(struct snd_soc_dai_mode *modes, int nmodes)
-+{
-+      int i;
-+      u32 rates = 0;
-+
-+      for(i = 0; i < nmodes; i++)
-+              rates |= modes[i].pcmrate;
-+
-+      return rates;
-+}
-+
-+static inline u64 get_formats(struct snd_soc_dai_mode *modes, int nmodes)
-+{
-+      int i;
-+      u64 formats = 0;
-+
-+      for(i = 0; i < nmodes; i++)
-+              formats |= modes[i].pcmfmt;
-+
-+      return formats;
-+}
-+
-+/*
-+ * Called by ALSA when a PCM substream is opened, the runtime->hw record is
-+ * then initialized and any private data can be allocated. This also calls
-+ * startup for the cpu DAI, platform, machine and codec DAI.
-+ */
-+static int soc_pcm_open(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct snd_soc_machine *machine = socdev->machine;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      struct snd_soc_codec_dai *codec_dai = rtd->codec_dai;
-+      struct snd_soc_cpu_dai *cpu_dai = rtd->cpu_dai;
-+      int ret = 0;
-+
-+      mutex_lock(&pcm_mutex);
-+
-+      /* startup the audio subsystem */
-+      if (rtd->cpu_dai->ops.startup) {
-+              ret = rtd->cpu_dai->ops.startup(substream);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: can't open interface %s\n",
-+                              rtd->cpu_dai->name);
-+                      goto out;
-+              }
-+      }
-+
-+      if (platform->pcm_ops->open) {
-+              ret = platform->pcm_ops->open(substream);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: can't open platform %s\n", platform->name);
-+                      goto platform_err;
-+              }
-+      }
-+
-+      if (machine->ops && machine->ops->startup) {
-+              ret = machine->ops->startup(substream);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: %s startup failed\n", machine->name);
-+                      goto machine_err;
-+              }
-+      }
-+
-+      if (rtd->codec_dai->ops.startup) {
-+              ret = rtd->codec_dai->ops.startup(substream);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: can't open codec %s\n",
-+                              rtd->codec_dai->name);
-+                      goto codec_dai_err;
-+              }
-+      }
-+
-+      /* create runtime params from DMA, codec and cpu DAI */
-+      if (runtime->hw.rates)
-+              runtime->hw.rates &=
-+                      get_rates(codec_dai->caps.mode, codec_dai->caps.num_modes) &
-+                      get_rates(cpu_dai->caps.mode, cpu_dai->caps.num_modes);
-+      else
-+              runtime->hw.rates =
-+                      get_rates(codec_dai->caps.mode, codec_dai->caps.num_modes) &
-+                      get_rates(cpu_dai->caps.mode, cpu_dai->caps.num_modes);
-+      if (runtime->hw.formats)
-+              runtime->hw.formats &=
-+                      get_formats(codec_dai->caps.mode, codec_dai->caps.num_modes) &
-+                      get_formats(cpu_dai->caps.mode, cpu_dai->caps.num_modes);
-+      else
-+              runtime->hw.formats =
-+                      get_formats(codec_dai->caps.mode, codec_dai->caps.num_modes) &
-+                      get_formats(cpu_dai->caps.mode, cpu_dai->caps.num_modes);
-+
-+      /* Check that the codec and cpu DAI's are compatible */
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+              runtime->hw.rate_min =
-+                      max(rtd->codec_dai->playback.rate_min,
-+                              rtd->cpu_dai->playback.rate_min);
-+              runtime->hw.rate_max =
-+                      min(rtd->codec_dai->playback.rate_max,
-+                              rtd->cpu_dai->playback.rate_max);
-+              runtime->hw.channels_min =
-+                      max(rtd->codec_dai->playback.channels_min,
-+                              rtd->cpu_dai->playback.channels_min);
-+              runtime->hw.channels_max =
-+                      min(rtd->codec_dai->playback.channels_max,
-+                              rtd->cpu_dai->playback.channels_max);
-+      } else {
-+              runtime->hw.rate_min =
-+                      max(rtd->codec_dai->capture.rate_min,
-+                              rtd->cpu_dai->capture.rate_min);
-+              runtime->hw.rate_max =
-+                      min(rtd->codec_dai->capture.rate_max,
-+                              rtd->cpu_dai->capture.rate_max);
-+              runtime->hw.channels_min =
-+                      max(rtd->codec_dai->capture.channels_min,
-+                              rtd->cpu_dai->capture.channels_min);
-+              runtime->hw.channels_max =
-+                      min(rtd->codec_dai->capture.channels_max,
-+                              rtd->cpu_dai->capture.channels_max);
-+      }
-+
-+      snd_pcm_limit_hw_rates(runtime);
-+      if (!runtime->hw.rates) {
-+              printk(KERN_ERR "asoc: %s <-> %s No matching rates\n",
-+                      rtd->codec_dai->name, rtd->cpu_dai->name);
-+              goto codec_dai_err;
-+      }
-+      if (!runtime->hw.formats) {
-+              printk(KERN_ERR "asoc: %s <-> %s No matching formats\n",
-+                      rtd->codec_dai->name, rtd->cpu_dai->name);
-+              goto codec_dai_err;
-+      }
-+      if (!runtime->hw.channels_min || !runtime->hw.channels_max) {
-+              printk(KERN_ERR "asoc: %s <-> %s No matching channels\n",
-+                      rtd->codec_dai->name, rtd->cpu_dai->name);
-+              goto codec_dai_err;
-+      }
-+
-+      dbg("asoc: %s <-> %s info:\n", rtd->codec_dai->name, rtd->cpu_dai->name);
-+      dbg("asoc: rate mask 0x%x\n", runtime->hw.rates);
-+      dbg("asoc: min ch %d max ch %d\n", runtime->hw.channels_min,
-+              runtime->hw.channels_max);
-+      dbg("asoc: min rate %d max rate %d\n", runtime->hw.rate_min,
-+              runtime->hw.rate_max);
-+
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              rtd->cpu_dai->playback.active = rtd->codec_dai->playback.active = 1;
-+      else
-+              rtd->cpu_dai->capture.active = rtd->codec_dai->capture.active = 1;
-+      rtd->cpu_dai->active = rtd->codec_dai->active = 1;
-+      rtd->cpu_dai->runtime = runtime;
-+      socdev->codec->active++;
-+      mutex_unlock(&pcm_mutex);
-+      return 0;
-+
-+codec_dai_err:
-+      if (machine->ops && machine->ops->shutdown)
-+              machine->ops->shutdown(substream);
-+
-+machine_err:
-+      if (platform->pcm_ops->close)
-+              platform->pcm_ops->close(substream);
-+
-+platform_err:
-+      if (rtd->cpu_dai->ops.shutdown)
-+              rtd->cpu_dai->ops.shutdown(substream);
-+out:
-+      mutex_unlock(&pcm_mutex);
-+      return ret;
-+}
-+
-+/*
-+ * Power down the audio subsytem pmdown_time msecs after close is called.
-+ * This is to ensure there are no pops or clicks in between any music tracks
-+ * due to DAPM power cycling.
-+ */
-+static void close_delayed_work(void *data)
-+{
-+      struct snd_soc_device *socdev = data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct snd_soc_codec_dai *codec_dai;
-+      int i;
-+
-+      mutex_lock(&pcm_mutex);
-+      for(i = 0; i < codec->num_dai; i++) {
-+              codec_dai = &codec->dai[i];
-+
-+              dbg("pop wq checking: %s status: %s waiting: %s\n",
-+                      codec_dai->playback.stream_name,
-+                      codec_dai->playback.active ? "active" : "inactive",
-+                      codec_dai->pop_wait ? "yes" : "no");
-+
-+              /* are we waiting on this codec DAI stream */
-+              if (codec_dai->pop_wait == 1) {
-+
-+                      codec_dai->pop_wait = 0;
-+                      snd_soc_dapm_stream_event(codec, codec_dai->playback.stream_name,
-+                              SND_SOC_DAPM_STREAM_STOP);
-+
-+                      /* power down the codec power domain if no longer active */
-+                      if (codec->active == 0) {
-+                              dbg("pop wq D3 %s %s\n", codec->name,
-+                                      codec_dai->playback.stream_name);
-+                              if (codec->dapm_event)
-+                                      codec->dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+                      }
-+              }
-+      }
-+      mutex_unlock(&pcm_mutex);
-+}
-+
-+/*
-+ * Called by ALSA when a PCM substream is closed. Private data can be
-+ * freed here. The cpu DAI, codec DAI, machine and platform are also
-+ * shutdown.
-+ */
-+static int soc_codec_close(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_machine *machine = socdev->machine;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      mutex_lock(&pcm_mutex);
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+              rtd->cpu_dai->playback.active = rtd->codec_dai->playback.active = 0;
-+      else
-+              rtd->cpu_dai->capture.active = rtd->codec_dai->capture.active = 0;
-+
-+      if (rtd->codec_dai->playback.active == 0 &&
-+              rtd->codec_dai->capture.active == 0) {
-+              rtd->cpu_dai->active = rtd->codec_dai->active = 0;
-+      }
-+      codec->active--;
-+
-+      if (rtd->cpu_dai->ops.shutdown)
-+              rtd->cpu_dai->ops.shutdown(substream);
-+
-+      if (rtd->codec_dai->ops.shutdown)
-+              rtd->codec_dai->ops.shutdown(substream);
-+
-+      if (machine->ops && machine->ops->shutdown)
-+              machine->ops->shutdown(substream);
-+
-+      if (platform->pcm_ops->close)
-+              platform->pcm_ops->close(substream);
-+      rtd->cpu_dai->runtime = NULL;
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+              /* start delayed pop wq here for playback streams */
-+              rtd->codec_dai->pop_wait = 1;
-+              queue_delayed_work(soc_workq, &soc_stream_work,
-+                      msecs_to_jiffies(pmdown_time));
-+      } else {
-+              /* capture streams can be powered down now */
-+              snd_soc_dapm_stream_event(codec, rtd->codec_dai->capture.stream_name,
-+                      SND_SOC_DAPM_STREAM_STOP);
-+
-+              if (codec->active == 0 && rtd->codec_dai->pop_wait == 0){
-+                      if (codec->dapm_event)
-+                              codec->dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+              }
-+      }
-+
-+      mutex_unlock(&pcm_mutex);
-+      return 0;
-+}
-+
-+/*
-+ * Called by ALSA when the PCM substream is prepared, can set format, sample
-+ * rate, etc.  This function is non atomic and can be called multiple times,
-+ * it can refer to the runtime info.
-+ */
-+static int soc_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int ret = 0;
-+
-+      mutex_lock(&pcm_mutex);
-+      if (platform->pcm_ops->prepare) {
-+              ret = platform->pcm_ops->prepare(substream);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: platform prepare error\n");
-+                      goto out;
-+              }
-+      }
-+
-+      if (rtd->codec_dai->ops.prepare) {
-+              ret = rtd->codec_dai->ops.prepare(substream);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: codec DAI prepare error\n");
-+                      goto out;
-+              }
-+      }
-+
-+      if (rtd->cpu_dai->ops.prepare)
-+              ret = rtd->cpu_dai->ops.prepare(substream);
-+
-+      /* we only want to start a DAPM playback stream if we are not waiting
-+       * on an existing one stopping */
-+      if (rtd->codec_dai->pop_wait) {
-+              /* we are waiting for the delayed work to start */
-+              if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
-+                              snd_soc_dapm_stream_event(codec,
-+                                      rtd->codec_dai->capture.stream_name,
-+                                      SND_SOC_DAPM_STREAM_START);
-+              else {
-+                      rtd->codec_dai->pop_wait = 0;
-+                      cancel_delayed_work(&soc_stream_work);
-+                      if (rtd->codec_dai->digital_mute)
-+                              rtd->codec_dai->digital_mute(codec, rtd->codec_dai, 0);
-+              }
-+      } else {
-+              /* no delayed work - do we need to power up codec */
-+              if (codec->dapm_state != SNDRV_CTL_POWER_D0) {
-+
-+                      if (codec->dapm_event)
-+                              codec->dapm_event(codec, SNDRV_CTL_POWER_D1);
-+
-+                      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                              snd_soc_dapm_stream_event(codec,
-+                                      rtd->codec_dai->playback.stream_name,
-+                                      SND_SOC_DAPM_STREAM_START);
-+                      else
-+                              snd_soc_dapm_stream_event(codec,
-+                                      rtd->codec_dai->capture.stream_name,
-+                                      SND_SOC_DAPM_STREAM_START);
-+
-+                      if (codec->dapm_event)
-+                              codec->dapm_event(codec, SNDRV_CTL_POWER_D0);
-+                      if (rtd->codec_dai->digital_mute)
-+                              rtd->codec_dai->digital_mute(codec, rtd->codec_dai, 0);
-+
-+              } else {
-+                      /* codec already powered - power on widgets */
-+                      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                              snd_soc_dapm_stream_event(codec,
-+                                      rtd->codec_dai->playback.stream_name,
-+                                      SND_SOC_DAPM_STREAM_START);
-+                      else
-+                              snd_soc_dapm_stream_event(codec,
-+                                      rtd->codec_dai->capture.stream_name,
-+                                      SND_SOC_DAPM_STREAM_START);
-+                      if (rtd->codec_dai->digital_mute)
-+                              rtd->codec_dai->digital_mute(codec, rtd->codec_dai, 0);
-+              }
-+      }
-+
-+out:
-+      mutex_unlock(&pcm_mutex);
-+      return ret;
-+}
-+
-+/*
-+ * Called by ALSA when the hardware params are set by application. This
-+ * function can also be called multiple times and can allocate buffers
-+ * (using snd_pcm_lib_* ). It's non-atomic.
-+ */
-+static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      struct snd_soc_machine *machine = socdev->machine;
-+      int ret = 0;
-+
-+      mutex_lock(&pcm_mutex);
-+
-+      /* we don't need to match any AC97 params */
-+      if (rtd->cpu_dai->type != SND_SOC_DAI_AC97) {
-+              ret = soc_hw_match_params(substream, params);
-+              if (ret < 0)
-+                      goto out;
-+      } else {
-+              struct snd_soc_clock_info clk_info;
-+              clk_info.rate = params_rate(params);
-+              ret = soc_get_mclk(rtd, &clk_info);
-+              if (ret < 0)
-+                      goto out;
-+      }
-+
-+      if (rtd->codec_dai->ops.hw_params) {
-+              ret = rtd->codec_dai->ops.hw_params(substream, params);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: can't set codec %s hw params\n",
-+                              rtd->codec_dai->name);
-+                      goto out;
-+              }
-+      }
-+
-+      if (rtd->cpu_dai->ops.hw_params) {
-+              ret = rtd->cpu_dai->ops.hw_params(substream, params);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: can't set interface %s hw params\n",
-+                              rtd->cpu_dai->name);
-+                      goto interface_err;
-+              }
-+      }
-+
-+      if (platform->pcm_ops->hw_params) {
-+              ret = platform->pcm_ops->hw_params(substream, params);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: can't set platform %s hw params\n",
-+                              platform->name);
-+                      goto platform_err;
-+              }
-+      }
-+
-+      if (machine->ops && machine->ops->hw_params) {
-+              ret = machine->ops->hw_params(substream, params);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: machine hw_params failed\n");
-+                      goto machine_err;
-+              }
-+      }
-+
-+out:
-+      mutex_unlock(&pcm_mutex);
-+      return ret;
-+
-+machine_err:
-+      if (platform->pcm_ops->hw_free)
-+              platform->pcm_ops->hw_free(substream);
-+
-+platform_err:
-+      if (rtd->cpu_dai->ops.hw_free)
-+              rtd->cpu_dai->ops.hw_free(substream);
-+
-+interface_err:
-+      if (rtd->codec_dai->ops.hw_free)
-+              rtd->codec_dai->ops.hw_free(substream);
-+
-+      mutex_unlock(&pcm_mutex);
-+      return ret;
-+}
-+
-+/*
-+ * Free's resources allocated by hw_params, can be called multiple times
-+ */
-+static int soc_pcm_hw_free(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct snd_soc_machine *machine = socdev->machine;
-+
-+      mutex_lock(&pcm_mutex);
-+
-+      /* apply codec digital mute */
-+      if (!codec->active && rtd->codec_dai->digital_mute)
-+              rtd->codec_dai->digital_mute(codec, rtd->codec_dai, 1);
-+
-+      /* free any machine hw params */
-+      if (machine->ops && machine->ops->hw_free)
-+              machine->ops->hw_free(substream);
-+
-+      /* free any DMA resources */
-+      if (platform->pcm_ops->hw_free)
-+              platform->pcm_ops->hw_free(substream);
-+
-+      /* now free hw params for the DAI's  */
-+      if (rtd->codec_dai->ops.hw_free)
-+              rtd->codec_dai->ops.hw_free(substream);
-+
-+      if (rtd->cpu_dai->ops.hw_free)
-+              rtd->cpu_dai->ops.hw_free(substream);
-+
-+      mutex_unlock(&pcm_mutex);
-+      return 0;
-+}
-+
-+static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      int ret;
-+
-+      if (rtd->codec_dai->ops.trigger) {
-+              ret = rtd->codec_dai->ops.trigger(substream, cmd);
-+              if (ret < 0)
-+                      return ret;
-+      }
-+
-+      if (platform->pcm_ops->trigger) {
-+              ret = platform->pcm_ops->trigger(substream, cmd);
-+              if (ret < 0)
-+                      return ret;
-+      }
-+
-+      if (rtd->cpu_dai->ops.trigger) {
-+              ret = rtd->cpu_dai->ops.trigger(substream, cmd);
-+              if (ret < 0)
-+                      return ret;
-+      }
-+      return 0;
-+}
-+
-+/* ASoC PCM operations */
-+static struct snd_pcm_ops soc_pcm_ops = {
-+      .open           = soc_pcm_open,
-+      .close          = soc_codec_close,
-+      .hw_params      = soc_pcm_hw_params,
-+      .hw_free        = soc_pcm_hw_free,
-+      .prepare        = soc_pcm_prepare,
-+      .trigger        = soc_pcm_trigger,
-+};
-+
-+#ifdef CONFIG_PM
-+/* powers down audio subsystem for suspend */
-+static int soc_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_machine *machine = socdev->machine;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+
-+      /* mute any active DAC's */
-+      for(i = 0; i < machine->num_links; i++) {
-+              struct snd_soc_codec_dai *dai = machine->dai_link[i].codec_dai;
-+              if (dai->digital_mute && dai->playback.active)
-+                      dai->digital_mute(codec, dai, 1);
-+      }
-+
-+      if (machine->suspend_pre)
-+              machine->suspend_pre(pdev, state);
-+
-+      for(i = 0; i < machine->num_links; i++) {
-+              struct snd_soc_cpu_dai  *cpu_dai = machine->dai_link[i].cpu_dai;
-+              if (cpu_dai->suspend && cpu_dai->type != SND_SOC_DAI_AC97)
-+                      cpu_dai->suspend(pdev, cpu_dai);
-+              if (platform->suspend)
-+                      platform->suspend(pdev, cpu_dai);
-+      }
-+
-+      /* close any waiting streams and save state */
-+      flush_workqueue(soc_workq);
-+      codec->suspend_dapm_state = codec->dapm_state;
-+
-+      for(i = 0; i < codec->num_dai; i++) {
-+              char *stream = codec->dai[i].playback.stream_name;
-+              if (stream != NULL)
-+                      snd_soc_dapm_stream_event(codec, stream,
-+                              SND_SOC_DAPM_STREAM_SUSPEND);
-+              stream = codec->dai[i].capture.stream_name;
-+              if (stream != NULL)
-+                      snd_soc_dapm_stream_event(codec, stream,
-+                              SND_SOC_DAPM_STREAM_SUSPEND);
-+      }
-+
-+      if (codec_dev->suspend)
-+              codec_dev->suspend(pdev, state);
-+
-+      for(i = 0; i < machine->num_links; i++) {
-+              struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
-+              if (cpu_dai->suspend && cpu_dai->type == SND_SOC_DAI_AC97)
-+                      cpu_dai->suspend(pdev, cpu_dai);
-+      }
-+
-+      if (machine->suspend_post)
-+              machine->suspend_post(pdev, state);
-+
-+      return 0;
-+}
-+
-+/* powers up audio subsystem after a suspend */
-+static int soc_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_machine *machine = socdev->machine;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+
-+      if (machine->resume_pre)
-+              machine->resume_pre(pdev);
-+
-+      for(i = 0; i < machine->num_links; i++) {
-+              struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
-+              if (cpu_dai->resume && cpu_dai->type == SND_SOC_DAI_AC97)
-+                      cpu_dai->resume(pdev, cpu_dai);
-+      }
-+
-+      if (codec_dev->resume)
-+              codec_dev->resume(pdev);
-+
-+      for(i = 0; i < codec->num_dai; i++) {
-+              char* stream = codec->dai[i].playback.stream_name;
-+              if (stream != NULL)
-+                      snd_soc_dapm_stream_event(codec, stream,
-+                              SND_SOC_DAPM_STREAM_RESUME);
-+              stream = codec->dai[i].capture.stream_name;
-+              if (stream != NULL)
-+                      snd_soc_dapm_stream_event(codec, stream,
-+                              SND_SOC_DAPM_STREAM_RESUME);
-+      }
-+
-+      /* unmute any active DAC's */
-+      for(i = 0; i < machine->num_links; i++) {
-+              struct snd_soc_codec_dai *dai = machine->dai_link[i].codec_dai;
-+              if (dai->digital_mute && dai->playback.active)
-+                      dai->digital_mute(codec, dai, 0);
-+      }
-+
-+      for(i = 0; i < machine->num_links; i++) {
-+              struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
-+              if (cpu_dai->resume && cpu_dai->type != SND_SOC_DAI_AC97)
-+                      cpu_dai->resume(pdev, cpu_dai);
-+              if (platform->resume)
-+                      platform->resume(pdev, cpu_dai);
-+      }
-+
-+      if (machine->resume_post)
-+              machine->resume_post(pdev);
-+
-+      return 0;
-+}
-+
-+#else
-+#define soc_suspend   NULL
-+#define soc_resume    NULL
-+#endif
-+
-+/* probes a new socdev */
-+static int soc_probe(struct platform_device *pdev)
-+{
-+      int ret = 0, i;
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_machine *machine = socdev->machine;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
-+
-+      if (machine->probe) {
-+              ret = machine->probe(pdev);
-+              if(ret < 0)
-+                      return ret;
-+      }
-+
-+      for (i = 0; i < machine->num_links; i++) {
-+              struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
-+              if (cpu_dai->probe) {
-+                      ret = cpu_dai->probe(pdev);
-+                      if(ret < 0)
-+                              goto cpu_dai_err;
-+              }
-+      }
-+
-+      if (codec_dev->probe) {
-+              ret = codec_dev->probe(pdev);
-+              if(ret < 0)
-+                      goto cpu_dai_err;
-+      }
-+
-+      if (platform->probe) {
-+              ret = platform->probe(pdev);
-+              if(ret < 0)
-+                      goto platform_err;
-+      }
-+
-+      /* DAPM stream work */
-+      soc_workq = create_workqueue("kdapm");
-+      if (soc_workq == NULL)
-+              goto work_err;
-+      INIT_WORK(&soc_stream_work, close_delayed_work, socdev);
-+      return 0;
-+
-+work_err:
-+      if (platform->remove)
-+              platform->remove(pdev);
-+
-+platform_err:
-+      if (codec_dev->remove)
-+              codec_dev->remove(pdev);
-+
-+cpu_dai_err:
-+      for (i--; i > 0; i--) {
-+              struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
-+              if (cpu_dai->remove)
-+                      cpu_dai->remove(pdev);
-+      }
-+
-+      if (machine->remove)
-+              machine->remove(pdev);
-+
-+      return ret;
-+}
-+
-+/* removes a socdev */
-+static int soc_remove(struct platform_device *pdev)
-+{
-+      int i;
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_machine *machine = socdev->machine;
-+      struct snd_soc_platform *platform = socdev->platform;
-+      struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
-+
-+      if (soc_workq)
-+              destroy_workqueue(soc_workq);
-+
-+      if (platform->remove)
-+              platform->remove(pdev);
-+
-+      if (codec_dev->remove)
-+              codec_dev->remove(pdev);
-+
-+      for (i = 0; i < machine->num_links; i++) {
-+              struct snd_soc_cpu_dai *cpu_dai = machine->dai_link[i].cpu_dai;
-+              if (cpu_dai->remove)
-+                      cpu_dai->remove(pdev);
-+      }
-+
-+      if (machine->remove)
-+              machine->remove(pdev);
-+
-+      return 0;
-+}
-+
-+/* ASoC platform driver */
-+static struct platform_driver soc_driver = {
-+      .driver         = {
-+              .name           = "soc-audio",
-+      },
-+      .probe          = soc_probe,
-+      .remove         = soc_remove,
-+      .suspend        = soc_suspend,
-+      .resume         = soc_resume,
-+};
-+
-+/* create a new pcm */
-+static int soc_new_pcm(struct snd_soc_device *socdev,
-+      struct snd_soc_dai_link *dai_link, int num)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct snd_soc_codec_dai *codec_dai = dai_link->codec_dai;
-+      struct snd_soc_cpu_dai *cpu_dai = dai_link->cpu_dai;
-+      struct snd_soc_pcm_runtime *rtd;
-+      struct snd_pcm *pcm;
-+      char new_name[64];
-+      int ret = 0, playback = 0, capture = 0;
-+
-+      rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL);
-+      if (rtd == NULL)
-+              return -ENOMEM;
-+      rtd->cpu_dai = cpu_dai;
-+      rtd->codec_dai = codec_dai;
-+      rtd->socdev = socdev;
-+
-+      /* check client and interface hw capabilities */
-+      sprintf(new_name, "%s %s-%s-%d",dai_link->stream_name, codec_dai->name,
-+              get_dai_name(cpu_dai->type), num);
-+
-+      if (codec_dai->playback.channels_min)
-+              playback = 1;
-+      if (codec_dai->capture.channels_min)
-+              capture = 1;
-+
-+      ret = snd_pcm_new(codec->card, new_name, codec->pcm_devs++, playback,
-+              capture, &pcm);
-+      if (ret < 0) {
-+              printk(KERN_ERR "asoc: can't create pcm for codec %s\n", codec->name);
-+              kfree(rtd);
-+              return ret;
-+      }
-+
-+      pcm->private_data = rtd;
-+      soc_pcm_ops.mmap = socdev->platform->pcm_ops->mmap;
-+      soc_pcm_ops.pointer = socdev->platform->pcm_ops->pointer;
-+      soc_pcm_ops.ioctl = socdev->platform->pcm_ops->ioctl;
-+      soc_pcm_ops.copy = socdev->platform->pcm_ops->copy;
-+      soc_pcm_ops.silence = socdev->platform->pcm_ops->silence;
-+      soc_pcm_ops.ack = socdev->platform->pcm_ops->ack;
-+      soc_pcm_ops.page = socdev->platform->pcm_ops->page;
-+
-+      if (playback)
-+              snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &soc_pcm_ops);
-+
-+      if (capture)
-+              snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &soc_pcm_ops);
-+
-+      ret = socdev->platform->pcm_new(codec->card, codec_dai, pcm);
-+      if (ret < 0) {
-+              printk(KERN_ERR "asoc: platform pcm constructor failed\n");
-+              kfree(rtd);
-+              return ret;
-+      }
-+
-+      pcm->private_free = socdev->platform->pcm_free;
-+      printk(KERN_INFO "asoc: %s <-> %s mapping ok\n", codec_dai->name,
-+              cpu_dai->name);
-+      return ret;
-+}
-+
-+/* codec register dump */
-+static ssize_t codec_reg_show(struct device *dev,
-+      struct device_attribute *attr, char *buf)
-+{
-+      struct snd_soc_device *devdata = dev_get_drvdata(dev);
-+      struct snd_soc_codec *codec = devdata->codec;
-+      int i, step = 1, count = 0;
-+
-+      if (!codec->reg_cache_size)
-+              return 0;
-+
-+      if (codec->reg_cache_step)
-+              step = codec->reg_cache_step;
-+
-+      count += sprintf(buf, "%s registers\n", codec->name);
-+      for(i = 0; i < codec->reg_cache_size; i += step)
-+              count += sprintf(buf + count, "%2x: %4x\n", i, codec->read(codec, i));
-+
-+      return count;
-+}
-+static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL);
-+
-+/**
-+ * snd_soc_new_ac97_codec - initailise AC97 device
-+ * @codec: audio codec
-+ * @ops: AC97 bus operations
-+ * @num: AC97 codec number
-+ *
-+ * Initialises AC97 codec resources for use by ad-hoc devices only.
-+ */
-+int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
-+      struct snd_ac97_bus_ops *ops, int num)
-+{
-+      mutex_lock(&codec->mutex);
-+
-+      codec->ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL);
-+      if (codec->ac97 == NULL) {
-+              mutex_unlock(&codec->mutex);
-+              return -ENOMEM;
-+      }
-+
-+      codec->ac97->bus = kzalloc(sizeof(struct snd_ac97_bus), GFP_KERNEL);
-+      if (codec->ac97->bus == NULL) {
-+              kfree(codec->ac97);
-+              codec->ac97 = NULL;
-+              mutex_unlock(&codec->mutex);
-+              return -ENOMEM;
-+      }
-+
-+      codec->ac97->bus->ops = ops;
-+      codec->ac97->num = num;
-+      mutex_unlock(&codec->mutex);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_new_ac97_codec);
-+
-+/**
-+ * snd_soc_free_ac97_codec - free AC97 codec device
-+ * @codec: audio codec
-+ *
-+ * Frees AC97 codec device resources.
-+ */
-+void snd_soc_free_ac97_codec(struct snd_soc_codec *codec)
-+{
-+      mutex_lock(&codec->mutex);
-+      kfree(codec->ac97->bus);
-+      kfree(codec->ac97);
-+      codec->ac97 = NULL;
-+      mutex_unlock(&codec->mutex);
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_free_ac97_codec);
-+
-+/**
-+ * snd_soc_update_bits - update codec register bits
-+ * @codec: audio codec
-+ * @reg: codec register
-+ * @mask: register mask
-+ * @value: new value
-+ *
-+ * Writes new register value.
-+ *
-+ * Returns 1 for change else 0.
-+ */
-+int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
-+                              unsigned short mask, unsigned short value)
-+{
-+      int change;
-+      unsigned short old, new;
-+
-+      mutex_lock(&io_mutex);
-+      old = snd_soc_read(codec, reg);
-+      new = (old & ~mask) | value;
-+      change = old != new;
-+      if (change)
-+              snd_soc_write(codec, reg, new);
-+
-+      mutex_unlock(&io_mutex);
-+      return change;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_update_bits);
-+
-+/**
-+ * snd_soc_test_bits - test register for change
-+ * @codec: audio codec
-+ * @reg: codec register
-+ * @mask: register mask
-+ * @value: new value
-+ *
-+ * Tests a register with a new value and checks if the new value is
-+ * different from the old value.
-+ *
-+ * Returns 1 for change else 0.
-+ */
-+int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
-+                              unsigned short mask, unsigned short value)
-+{
-+      int change;
-+      unsigned short old, new;
-+
-+      mutex_lock(&io_mutex);
-+      old = snd_soc_read(codec, reg);
-+      new = (old & ~mask) | value;
-+      change = old != new;
-+      mutex_unlock(&io_mutex);
-+
-+      return change;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_test_bits);
-+
-+/**
-+ * snd_soc_get_rate - get int sample rate
-+ * @hwpcmrate: the hardware pcm rate
-+ *
-+ * Returns the audio rate integaer value, else 0.
-+ */
-+int snd_soc_get_rate(int hwpcmrate)
-+{
-+      int rate = ffs(hwpcmrate) - 1;
-+
-+      if (rate > ARRAY_SIZE(rates))
-+              return 0;
-+      return rates[rate];
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_get_rate);
-+
-+/**
-+ * snd_soc_new_pcms - create new sound card and pcms
-+ * @socdev: the SoC audio device
-+ *
-+ * Create a new sound card based upon the codec and interface pcms.
-+ *
-+ * Returns 0 for success, else error.
-+ */
-+int snd_soc_new_pcms(struct snd_soc_device *socdev, int idx, const char * xid)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct snd_soc_machine *machine = socdev->machine;
-+      int ret = 0, i;
-+
-+      mutex_lock(&codec->mutex);
-+
-+      /* register a sound card */
-+      codec->card = snd_card_new(idx, xid, codec->owner, 0);
-+      if (!codec->card) {
-+              printk(KERN_ERR "asoc: can't create sound card for codec %s\n",
-+                      codec->name);
-+              mutex_unlock(&codec->mutex);
-+              return -ENODEV;
-+      }
-+
-+      codec->card->dev = socdev->dev;
-+      codec->card->private_data = codec;
-+      strncpy(codec->card->driver, codec->name, sizeof(codec->card->driver));
-+
-+      /* create the pcms */
-+      for(i = 0; i < machine->num_links; i++) {
-+              ret = soc_new_pcm(socdev, &machine->dai_link[i], i);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: can't create pcm %s\n",
-+                              machine->dai_link[i].stream_name);
-+                      mutex_unlock(&codec->mutex);
-+                      return ret;
-+              }
-+      }
-+
-+      mutex_unlock(&codec->mutex);
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_new_pcms);
-+
-+/**
-+ * snd_soc_register_card - register sound card
-+ * @socdev: the SoC audio device
-+ *
-+ * Register a SoC sound card. Also registers an AC97 device if the
-+ * codec is AC97 for ad hoc devices.
-+ *
-+ * Returns 0 for success, else error.
-+ */
-+int snd_soc_register_card(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct snd_soc_machine *machine = socdev->machine;
-+      int ret = 0, i, ac97 = 0, err = 0;
-+
-+      mutex_lock(&codec->mutex);
-+      for(i = 0; i < machine->num_links; i++) {
-+              if (socdev->machine->dai_link[i].init) {
-+                      err = socdev->machine->dai_link[i].init(codec);
-+                      if (err < 0) {
-+                              printk(KERN_ERR "asoc: failed to init %s\n",
-+                                      socdev->machine->dai_link[i].stream_name);
-+                              continue;
-+                      }
-+              }
-+              if (socdev->machine->dai_link[i].cpu_dai->type == SND_SOC_DAI_AC97)
-+                      ac97 = 1;
-+      }
-+      snprintf(codec->card->shortname, sizeof(codec->card->shortname),
-+               "%s", machine->name);
-+      snprintf(codec->card->longname, sizeof(codec->card->longname),
-+               "%s (%s)", machine->name, codec->name);
-+
-+      ret = snd_card_register(codec->card);
-+      if (ret < 0) {
-+              printk(KERN_ERR "asoc: failed to register soundcard for codec %s\n",
-+                              codec->name);
-+              goto out;
-+      }
-+
-+#ifdef CONFIG_SND_SOC_AC97_BUS
-+      if (ac97) {
-+              ret = soc_ac97_dev_register(codec);
-+              if (ret < 0) {
-+                      printk(KERN_ERR "asoc: AC97 device register failed\n");
-+                      snd_card_free(codec->card);
-+                      goto out;
-+              }
-+      }
-+#endif
-+
-+      err = snd_soc_dapm_sys_add(socdev->dev);
-+      if (err < 0)
-+              printk(KERN_WARNING "asoc: failed to add dapm sysfs entries\n");
-+
-+      err = device_create_file(socdev->dev, &dev_attr_codec_reg);
-+      if (err < 0)
-+              printk(KERN_WARNING "asoc: failed to add codec sysfs entries\n");
-+out:
-+      mutex_unlock(&codec->mutex);
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_register_card);
-+
-+/**
-+ * snd_soc_free_pcms - free sound card and pcms
-+ * @socdev: the SoC audio device
-+ *
-+ * Frees sound card and pcms associated with the socdev.
-+ * Also unregister the codec if it is an AC97 device.
-+ */
-+void snd_soc_free_pcms(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      mutex_lock(&codec->mutex);
-+#ifdef CONFIG_SND_SOC_AC97_BUS
-+      if (codec->ac97)
-+              soc_ac97_dev_unregister(codec);
-+#endif
-+
-+      if (codec->card)
-+              snd_card_free(codec->card);
-+      device_remove_file(socdev->dev, &dev_attr_codec_reg);
-+      mutex_unlock(&codec->mutex);
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_free_pcms);
-+
-+/**
-+ * snd_soc_set_runtime_hwparams - set the runtime hardware parameters
-+ * @substream: the pcm substream
-+ * @hw: the hardware parameters
-+ *
-+ * Sets the substream runtime hardware parameters.
-+ */
-+int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
-+      const struct snd_pcm_hardware *hw)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      runtime->hw.info = hw->info;
-+      runtime->hw.formats = hw->formats;
-+      runtime->hw.period_bytes_min = hw->period_bytes_min;
-+      runtime->hw.period_bytes_max = hw->period_bytes_max;
-+      runtime->hw.periods_min = hw->periods_min;
-+      runtime->hw.periods_max = hw->periods_max;
-+      runtime->hw.buffer_bytes_max = hw->buffer_bytes_max;
-+      runtime->hw.fifo_size = hw->fifo_size;
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams);
-+
-+/**
-+ * snd_soc_cnew - create new control
-+ * @_template: control template
-+ * @data: control private data
-+ * @lnng_name: control long name
-+ *
-+ * Create a new mixer control from a template control.
-+ *
-+ * Returns 0 for success, else error.
-+ */
-+struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
-+      void *data, char *long_name)
-+{
-+      struct snd_kcontrol_new template;
-+
-+      memcpy(&template, _template, sizeof(template));
-+      if (long_name)
-+              template.name = long_name;
-+      template.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
-+      template.index = 0;
-+
-+      return snd_ctl_new1(&template, data);
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_cnew);
-+
-+/**
-+ * snd_soc_info_enum_double - enumerated double mixer info callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to provide information about a double enumerated
-+ * mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo)
-+{
-+      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-+
-+      uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
-+      uinfo->count = e->shift_l == e->shift_r ? 1 : 2;
-+      uinfo->value.enumerated.items = e->mask;
-+
-+      if (uinfo->value.enumerated.item > e->mask - 1)
-+              uinfo->value.enumerated.item = e->mask - 1;
-+      strcpy(uinfo->value.enumerated.name,
-+              e->texts[uinfo->value.enumerated.item]);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_info_enum_double);
-+
-+/**
-+ * snd_soc_get_enum_double - enumerated double mixer get callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to get the value of a double enumerated mixer.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-+      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-+      unsigned short val, bitmask;
-+
-+      for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
-+              ;
-+      val = snd_soc_read(codec, e->reg);
-+      ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1);
-+      if (e->shift_l != e->shift_r)
-+              ucontrol->value.enumerated.item[1] =
-+                      (val >> e->shift_r) & (bitmask - 1);
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_get_enum_double);
-+
-+/**
-+ * snd_soc_put_enum_double - enumerated double mixer put callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to set the value of a double enumerated mixer.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-+      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-+      unsigned short val;
-+      unsigned short mask, bitmask;
-+
-+      for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
-+              ;
-+      if (ucontrol->value.enumerated.item[0] > e->mask - 1)
-+              return -EINVAL;
-+      val = ucontrol->value.enumerated.item[0] << e->shift_l;
-+      mask = (bitmask - 1) << e->shift_l;
-+      if (e->shift_l != e->shift_r) {
-+              if (ucontrol->value.enumerated.item[1] > e->mask - 1)
-+                      return -EINVAL;
-+              val |= ucontrol->value.enumerated.item[1] << e->shift_r;
-+              mask |= (bitmask - 1) << e->shift_r;
-+      }
-+
-+      return snd_soc_update_bits(codec, e->reg, mask, val);
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_put_enum_double);
-+
-+/**
-+ * snd_soc_info_enum_ext - external enumerated single mixer info callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to provide information about an external enumerated
-+ * single mixer.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo)
-+{
-+      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
-+
-+      uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
-+      uinfo->count = 1;
-+      uinfo->value.enumerated.items = e->mask;
-+
-+      if (uinfo->value.enumerated.item > e->mask - 1)
-+              uinfo->value.enumerated.item = e->mask - 1;
-+      strcpy(uinfo->value.enumerated.name,
-+              e->texts[uinfo->value.enumerated.item]);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_info_enum_ext);
-+
-+/**
-+ * snd_soc_info_volsw_ext - external single mixer info callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to provide information about a single external mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo)
-+{
-+      int mask = kcontrol->private_value;
-+
-+      uinfo->type =
-+              mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
-+      uinfo->count = 1;
-+      uinfo->value.integer.min = 0;
-+      uinfo->value.integer.max = mask;
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_info_volsw_ext);
-+
-+/**
-+ * snd_soc_info_bool_ext - external single boolean mixer info callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to provide information about a single boolean external mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_info_bool_ext(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;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_info_bool_ext);
-+
-+/**
-+ * snd_soc_info_volsw - single mixer info callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to provide information about a single mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo)
-+{
-+      int mask = (kcontrol->private_value >> 16) & 0xff;
-+      int shift = (kcontrol->private_value >> 8) & 0x0f;
-+      int rshift = (kcontrol->private_value >> 12) & 0x0f;
-+
-+      uinfo->type =
-+              mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
-+      uinfo->count = shift == rshift ? 1 : 2;
-+      uinfo->value.integer.min = 0;
-+      uinfo->value.integer.max = mask;
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_info_volsw);
-+
-+/**
-+ * snd_soc_get_volsw - single mixer get callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to get the value of a single mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-+      int reg = kcontrol->private_value & 0xff;
-+      int shift = (kcontrol->private_value >> 8) & 0x0f;
-+      int rshift = (kcontrol->private_value >> 12) & 0x0f;
-+      int mask = (kcontrol->private_value >> 16) & 0xff;
-+      int invert = (kcontrol->private_value >> 24) & 0x01;
-+
-+      ucontrol->value.integer.value[0] =
-+              (snd_soc_read(codec, reg) >> shift) & mask;
-+      if (shift != rshift)
-+              ucontrol->value.integer.value[1] =
-+                      (snd_soc_read(codec, reg) >> rshift) & mask;
-+      if (invert) {
-+              ucontrol->value.integer.value[0] =
-+                      mask - ucontrol->value.integer.value[0];
-+              if (shift != rshift)
-+                      ucontrol->value.integer.value[1] =
-+                              mask - ucontrol->value.integer.value[1];
-+      }
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
-+
-+/**
-+ * snd_soc_put_volsw - single mixer put callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to set the value of a single mixer control.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-+      int reg = kcontrol->private_value & 0xff;
-+      int shift = (kcontrol->private_value >> 8) & 0x0f;
-+      int rshift = (kcontrol->private_value >> 12) & 0x0f;
-+      int mask = (kcontrol->private_value >> 16) & 0xff;
-+      int invert = (kcontrol->private_value >> 24) & 0x01;
-+      int err;
-+      unsigned short val, val2, val_mask;
-+
-+      val = (ucontrol->value.integer.value[0] & mask);
-+      if (invert)
-+              val = mask - val;
-+      val_mask = mask << shift;
-+      val = val << shift;
-+      if (shift != rshift) {
-+              val2 = (ucontrol->value.integer.value[1] & mask);
-+              if (invert)
-+                      val2 = mask - val2;
-+              val_mask |= mask << rshift;
-+              val |= val2 << rshift;
-+      }
-+      err = snd_soc_update_bits(codec, reg, val_mask, val);
-+      return err;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
-+
-+/**
-+ * snd_soc_info_volsw_2r - double mixer info callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to provide information about a double mixer control that
-+ * spans 2 codec registers.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_info_volsw_2r(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_info *uinfo)
-+{
-+      int mask = (kcontrol->private_value >> 12) & 0xff;
-+
-+      uinfo->type =
-+              mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
-+      uinfo->count = 2;
-+      uinfo->value.integer.min = 0;
-+      uinfo->value.integer.max = mask;
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_info_volsw_2r);
-+
-+/**
-+ * snd_soc_get_volsw_2r - double mixer get callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to get the value of a double mixer control that spans 2 registers.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_get_volsw_2r(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-+      int reg = kcontrol->private_value & 0xff;
-+      int reg2 = (kcontrol->private_value >> 24) & 0xff;
-+      int shift = (kcontrol->private_value >> 8) & 0x0f;
-+      int mask = (kcontrol->private_value >> 12) & 0xff;
-+      int invert = (kcontrol->private_value >> 20) & 0x01;
-+
-+      ucontrol->value.integer.value[0] =
-+              (snd_soc_read(codec, reg) >> shift) & mask;
-+      ucontrol->value.integer.value[1] =
-+              (snd_soc_read(codec, reg2) >> shift) & mask;
-+      if (invert) {
-+              ucontrol->value.integer.value[0] =
-+                      mask - ucontrol->value.integer.value[0];
-+              ucontrol->value.integer.value[1] =
-+                      mask - ucontrol->value.integer.value[1];
-+      }
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_get_volsw_2r);
-+
-+/**
-+ * snd_soc_put_volsw_2r - double mixer set callback
-+ * @kcontrol: mixer control
-+ * @uinfo: control element information
-+ *
-+ * Callback to set the value of a double mixer control that spans 2 registers.
-+ *
-+ * Returns 0 for success.
-+ */
-+int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
-+      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
-+      int reg = kcontrol->private_value & 0xff;
-+      int reg2 = (kcontrol->private_value >> 24) & 0xff;
-+      int shift = (kcontrol->private_value >> 8) & 0x0f;
-+      int mask = (kcontrol->private_value >> 12) & 0xff;
-+      int invert = (kcontrol->private_value >> 20) & 0x01;
-+      int err;
-+      unsigned short val, val2, val_mask;
-+
-+      val_mask = mask << shift;
-+      val = (ucontrol->value.integer.value[0] & mask);
-+      val2 = (ucontrol->value.integer.value[1] & mask);
-+
-+      if (invert) {
-+              val = mask - val;
-+              val2 = mask - val2;
-+      }
-+
-+      val = val << shift;
-+      val2 = val2 << shift;
-+
-+      if ((err = snd_soc_update_bits(codec, reg, val_mask, val)) < 0)
-+              return err;
-+
-+      err = snd_soc_update_bits(codec, reg2, val_mask, val2);
-+      return err;
-+}
-+EXPORT_SYMBOL_GPL(snd_soc_put_volsw_2r);
-+
-+static int __devinit snd_soc_init(void)
-+{
-+      printk(KERN_INFO "ASoC version %s\n", SND_SOC_VERSION);
-+      return platform_driver_register(&soc_driver);
-+}
-+
-+static void snd_soc_exit(void)
-+{
-+      platform_driver_unregister(&soc_driver);
-+}
-+
-+module_init(snd_soc_init);
-+module_exit(snd_soc_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("ALSA SoC Core");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/at91/Kconfig
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/at91/Kconfig
-@@ -0,0 +1,24 @@
-+menu "SoC Audio for the Atmel AT91"
-+
-+config SND_AT91_SOC
-+      tristate "SoC Audio for the Atmel AT91 System-on-Chip"
-+      depends on ARCH_AT91 && SND
-+      select SND_PCM
-+      help
-+        Say Y or M if you want to add support for codecs attached to
-+        the AT91 SSC interface. You will also need
-+        to select the audio interfaces to support below.
-+
-+config SND_AT91_SOC_I2S
-+      tristate
-+
-+config SND_AT91_SOC_ETI_B1_WM8731
-+      tristate "SoC I2S Audio support for Endrelia ETI-B1 board"
-+      depends on SND_AT91_SOC && MACH_ETI_B1
-+      select SND_AT91_SOC_I2S
-+      select SND_SOC_WM8731
-+      help
-+        Say Y if you want to add support for SoC audio on Endrelia
-+          ETI-B1 board.
-+
-+endmenu
-Index: linux-2.6-pxa-new/sound/soc/at91/Makefile
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/at91/Makefile
-@@ -0,0 +1,11 @@
-+# AT91 Platform Support
-+snd-soc-at91-objs := at91rm9200-pcm.o
-+snd-soc-at91-i2s-objs := at91rm9200-i2s.o
-+
-+obj-$(CONFIG_SND_AT91_SOC) += snd-soc-at91.o
-+obj-$(CONFIG_SND_AT91_SOC_I2S) += snd-soc-at91-i2s.o
-+
-+# AT91 Machine Support
-+snd-soc-eti-b1-wm8731-objs := eti_b1_wm8731.o
-+
-+obj-$(CONFIG_SND_AT91_SOC_ETI_B1_WM8731) += snd-soc-eti-b1-wm8731.o
-Index: linux-2.6-pxa-new/sound/soc/at91/at91rm9200-i2s.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/at91/at91rm9200-i2s.c
-@@ -0,0 +1,715 @@
-+/*
-+ * at91rm9200-i2s.c  --  ALSA Soc Audio Layer Platform driver and DMA engine
-+ *
-+ * Author: Frank Mandarino <fmandarino@endrelia.com>
-+ *         Endrelia Technologies Inc.
-+ *
-+ * Based on pxa2xx Platform drivers by
-+ * Liam Girdwood <liam.girdwood@wolfsonmicro.com>
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *     3rd Mar 2006   Initial version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/device.h>
-+#include <linux/delay.h>
-+#include <linux/clk.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/initval.h>
-+#include <sound/soc.h>
-+
-+#include <asm/arch/at91rm9200.h>
-+#include <asm/arch/at91rm9200_ssc.h>
-+#include <asm/arch/at91rm9200_pdc.h>
-+#include <asm/arch/hardware.h>
-+
-+#include "at91rm9200-pcm.h"
-+
-+#if 0
-+#define       DBG(x...)       printk(KERN_DEBUG "at91rm9200-i2s:" x)
-+#else
-+#define       DBG(x...)
-+#endif
-+
-+#define AT91RM9200_I2S_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS | SND_SOC_DAIFMT_NB_NF)
-+
-+#define AT91RM9200_I2S_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+/* priv is (SSC_CMR.DIV << 16 | SSC_TCMR.PERIOD ) */
-+static struct snd_soc_dai_mode at91rm9200_i2s[] = {
-+
-+      /* 8k: BCLK = (MCLK/10) = (60MHz/50) = 1.2MHz */
-+      {
-+              .fmt = AT91RM9200_I2S_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = AT91RM9200_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1500,
-+              .bfs = SND_SOC_FSBD(10),
-+              .priv = (25 << 16 | 74),
-+      },
-+
-+      /* 16k: BCLK = (MCLK/3) ~= (60MHz/14) = 4.285714MHz */
-+      {
-+              .fmt = AT91RM9200_I2S_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_16000,
-+              .pcmdir = AT91RM9200_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 750,
-+              .bfs = SND_SOC_FSBD(3),
-+              .priv = (7 << 16 | 133),
-+      },
-+
-+      /* 32k: BCLK = (MCLK/3) ~= (60MHz/14) = 4.285714MHz */
-+      {
-+              .fmt = AT91RM9200_I2S_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = AT91RM9200_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 375,
-+              .bfs = SND_SOC_FSBD(3),
-+              .priv = (7 << 16 | 66),
-+      },
-+
-+      /* 48k: BCLK = (MCLK/5) ~= (60MHz/26) = 2.3076923MHz */
-+      {
-+              .fmt = AT91RM9200_I2S_DAIFMT,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = AT91RM9200_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 250,
-+              .bfs SND_SOC_FSBD(5),
-+              .priv = (13 << 16 | 23),
-+      },
-+};
-+
-+
-+/*
-+ * SSC registers required by the PCM DMA engine.
-+ */
-+static struct at91rm9200_ssc_regs ssc_reg[3] = {
-+      {
-+      .cr     = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_SSC_CR),
-+      .ier    = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_SSC_IER),
-+      .idr    = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_SSC_IDR),
-+      },
-+      {
-+      .cr     = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_SSC_CR),
-+      .ier    = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_SSC_IER),
-+      .idr    = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_SSC_IDR),
-+      },
-+      {
-+      .cr     = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_SSC_CR),
-+      .ier    = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_SSC_IER),
-+      .idr    = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_SSC_IDR),
-+      },
-+};
-+
-+static struct at91rm9200_pdc_regs pdc_tx_reg[3] = {
-+      {
-+      .xpr    = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_TPR),
-+      .xcr    = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_TCR),
-+      .xnpr   = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_TNPR),
-+      .xncr   = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_TNCR),
-+      .ptcr   = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_PTCR),
-+      },
-+      {
-+      .xpr    = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_TPR),
-+      .xcr    = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_TCR),
-+      .xnpr   = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_TNPR),
-+      .xncr   = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_TNCR),
-+      .ptcr   = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_PTCR),
-+      },
-+      {
-+      .xpr    = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_TPR),
-+      .xcr    = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_TCR),
-+      .xnpr   = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_TNPR),
-+      .xncr   = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_TNCR),
-+      .ptcr   = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_PTCR),
-+      },
-+};
-+
-+static struct at91rm9200_pdc_regs pdc_rx_reg[3] = {
-+      {
-+      .xpr    = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_RPR),
-+      .xcr    = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_RCR),
-+      .xnpr   = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_RNPR),
-+      .xncr   = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_RNCR),
-+      .ptcr   = (void __iomem *) (AT91_VA_BASE_SSC0 + AT91_PDC_PTCR),
-+      },
-+      {
-+      .xpr    = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_RPR),
-+      .xcr    = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_RCR),
-+      .xnpr   = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_RNPR),
-+      .xncr   = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_RNCR),
-+      .ptcr   = (void __iomem *) (AT91_VA_BASE_SSC1 + AT91_PDC_PTCR),
-+      },
-+      {
-+      .xpr    = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_RPR),
-+      .xcr    = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_RCR),
-+      .xnpr   = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_RNPR),
-+      .xncr   = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_RNCR),
-+      .ptcr   = (void __iomem *) (AT91_VA_BASE_SSC2 + AT91_PDC_PTCR),
-+      },
-+};
-+
-+/*
-+ * SSC & PDC status bits for transmit and receive.
-+ */
-+static struct at91rm9200_ssc_mask ssc_tx_mask = {
-+      .ssc_enable     = AT91_SSC_TXEN,
-+      .ssc_disable    = AT91_SSC_TXDIS,
-+      .ssc_endx       = AT91_SSC_ENDTX,
-+      .ssc_endbuf     = AT91_SSC_TXBUFE,
-+      .pdc_enable     = AT91_PDC_TXTEN,
-+      .pdc_disable    = AT91_PDC_TXTDIS,
-+};
-+
-+static struct at91rm9200_ssc_mask ssc_rx_mask = {
-+      .ssc_enable     = AT91_SSC_RXEN,
-+      .ssc_disable    = AT91_SSC_RXDIS,
-+      .ssc_endx       = AT91_SSC_ENDRX,
-+      .ssc_endbuf     = AT91_SSC_RXBUFF,
-+      .pdc_enable     = AT91_PDC_RXTEN,
-+      .pdc_disable    = AT91_PDC_RXTDIS,
-+};
-+
-+/*
-+ * A MUTEX is used to protect an SSC initialzed flag which allows
-+ * the substream hw_params() call to initialize the SSC only if
-+ * there are no other substreams open.  If there are other
-+ * substreams open, the hw_param() call can only check that
-+ * it is using the same format and rate.
-+ */
-+static DECLARE_MUTEX(ssc0_mutex);
-+static DECLARE_MUTEX(ssc1_mutex);
-+static DECLARE_MUTEX(ssc2_mutex);
-+
-+/*
-+ * DMA parameters.
-+ */
-+static at91rm9200_pcm_dma_params_t ssc_dma_params[3][2] = {
-+      {{
-+      .name           = "SSC0/I2S PCM Stereo out",
-+      .ssc            = &ssc_reg[0],
-+      .pdc            = &pdc_tx_reg[0],
-+      .mask           = &ssc_tx_mask,
-+      },
-+      {
-+      .name           = "SSC0/I2S PCM Stereo in",
-+      .ssc            = &ssc_reg[0],
-+      .pdc            = &pdc_rx_reg[0],
-+      .mask           = &ssc_rx_mask,
-+      }},
-+      {{
-+      .name           = "SSC1/I2S PCM Stereo out",
-+      .ssc            = &ssc_reg[1],
-+      .pdc            = &pdc_tx_reg[1],
-+      .mask           = &ssc_tx_mask,
-+      },
-+      {
-+      .name           = "SSC1/I2S PCM Stereo in",
-+      .ssc            = &ssc_reg[1],
-+      .pdc            = &pdc_rx_reg[1],
-+      .mask           = &ssc_rx_mask,
-+      }},
-+      {{
-+      .name           = "SSC2/I2S PCM Stereo out",
-+      .ssc            = &ssc_reg[2],
-+      .pdc            = &pdc_tx_reg[2],
-+      .mask           = &ssc_tx_mask,
-+      },
-+      {
-+      .name           = "SSC1/I2S PCM Stereo in",
-+      .ssc            = &ssc_reg[2],
-+      .pdc            = &pdc_rx_reg[2],
-+      .mask           = &ssc_rx_mask,
-+      }},
-+};
-+
-+
-+struct at91rm9200_ssc_state {
-+      u32     ssc_cmr;
-+      u32     ssc_rcmr;
-+      u32     ssc_rfmr;
-+      u32     ssc_tcmr;
-+      u32     ssc_tfmr;
-+      u32     ssc_sr;
-+      u32     ssc_imr;
-+};
-+
-+static struct at91rm9200_ssc_info {
-+      char            *name;
-+      void __iomem    *ssc_base;
-+      u32             pid;
-+      spinlock_t      lock;           /* lock for dir_mask */
-+      int             dir_mask;       /* 0=unused, 1=playback, 2=capture */
-+      struct semaphore *mutex;
-+      int             initialized;
-+      int             pcmfmt;
-+      int             rate;
-+      at91rm9200_pcm_dma_params_t *dma_params[2];
-+      struct at91rm9200_ssc_state ssc_state;
-+
-+} ssc_info[3] = {
-+      {
-+      .name           = "ssc0",
-+      .ssc_base       = (void __iomem *) AT91_VA_BASE_SSC0,
-+      .pid            = AT91_ID_SSC0,
-+      .lock           = SPIN_LOCK_UNLOCKED,
-+      .dir_mask       = 0,
-+      .mutex          = &ssc0_mutex,
-+      .initialized    = 0,
-+      },
-+      {
-+      .name           = "ssc1",
-+      .ssc_base       = (void __iomem *) AT91_VA_BASE_SSC1,
-+      .pid            = AT91_ID_SSC1,
-+      .lock           = SPIN_LOCK_UNLOCKED,
-+      .dir_mask       = 0,
-+      .mutex          = &ssc1_mutex,
-+      .initialized    = 0,
-+      },
-+      {
-+      .name           = "ssc2",
-+      .ssc_base       = (void __iomem *) AT91_VA_BASE_SSC2,
-+      .pid            = AT91_ID_SSC2,
-+      .lock           = SPIN_LOCK_UNLOCKED,
-+      .dir_mask       = 0,
-+      .mutex          = &ssc2_mutex,
-+      .initialized    = 0,
-+      },
-+};
-+
-+
-+static irqreturn_t at91rm9200_i2s_interrupt(int irq, void *dev_id)
-+{
-+      struct at91rm9200_ssc_info *ssc_p = dev_id;
-+      at91rm9200_pcm_dma_params_t *dma_params;
-+      u32 ssc_sr;
-+      int i;
-+
-+      ssc_sr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_SR)
-+                      & at91_ssc_read(ssc_p->ssc_base + AT91_SSC_IMR);
-+
-+      /*
-+       * Loop through the substreams attached to this SSC.  If
-+       * a DMA-related interrupt occurred on that substream, call
-+       * the DMA interrupt handler function, if one has been
-+       * registered in the dma_params structure by the PCM driver.
-+       */
-+      for (i = 0; i < ARRAY_SIZE(ssc_p->dma_params); i++) {
-+              dma_params = ssc_p->dma_params[i];
-+
-+              if (dma_params != NULL && dma_params->dma_intr_handler != NULL &&
-+                      (ssc_sr &
-+                      (dma_params->mask->ssc_endx | dma_params->mask->ssc_endbuf)))
-+
-+                      dma_params->dma_intr_handler(ssc_sr, dma_params->substream);
-+      }
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static int at91rm9200_i2s_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct at91rm9200_ssc_info *ssc_p = &ssc_info[rtd->cpu_dai->id];
-+      int dir_mask;
-+
-+      DBG("i2s_startup: SSC_SR=0x%08lx\n",
-+                      at91_ssc_read(ssc_p->ssc_base + AT91_SSC_SR));
-+      dir_mask = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0x1 : 0x2;
-+
-+      spin_lock_irq(&ssc_p->lock);
-+      if (ssc_p->dir_mask & dir_mask) {
-+              spin_unlock_irq(&ssc_p->lock);
-+              return -EBUSY;
-+      }
-+      ssc_p->dir_mask |= dir_mask;
-+      spin_unlock_irq(&ssc_p->lock);
-+
-+      return 0;
-+}
-+
-+static void at91rm9200_i2s_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct at91rm9200_ssc_info *ssc_p = &ssc_info[rtd->cpu_dai->id];
-+      at91rm9200_pcm_dma_params_t *dma_params = rtd->cpu_dai->dma_data;
-+      int dir, dir_mask;
-+
-+      dir = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
-+
-+      if (dma_params != NULL) {
-+              at91_ssc_write(dma_params->ssc->cr, dma_params->mask->ssc_disable);
-+              DBG("%s disabled SSC_SR=0x%08lx\n", (dir ? "receive" : "transmit"),
-+                      at91_ssc_read(ssc_p->ssc_base + AT91_SSC_SR));
-+
-+              dma_params->substream = NULL;
-+              ssc_p->dma_params[dir] = NULL;
-+      }
-+
-+      dir_mask = 1 << dir;
-+
-+      spin_lock_irq(&ssc_p->lock);
-+      ssc_p->dir_mask &= ~dir_mask;
-+      if (!ssc_p->dir_mask) {
-+              /* Shutdown the SSC clock. */
-+              DBG("Stopping pid %d clock\n", ssc_p->pid);
-+              at91_sys_write(AT91_PMC_PCDR, 1<<ssc_p->pid);
-+
-+              if (ssc_p->initialized)
-+                      free_irq(ssc_p->pid, ssc_p);
-+
-+              /* Reset the SSC */
-+              at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CR, AT91_SSC_SWRST);
-+
-+              /* Force a re-init on the next hw_params() call. */
-+              ssc_p->initialized = 0;
-+      }
-+      spin_unlock_irq(&ssc_p->lock);
-+}
-+
-+#ifdef CONFIG_PM
-+static int at91rm9200_i2s_suspend(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      struct at91rm9200_ssc_info *ssc_p;
-+
-+      if(!dai->active)
-+              return 0;
-+
-+      ssc_p = &ssc_info[dai->id];
-+
-+      /* Save the status register before disabling transmit and receive. */
-+      ssc_p->state->ssc_sr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_SR);
-+      at91_ssc_write(ssc_p->ssc_base +
-+              AT91_SSC_CR, AT91_SSC_TXDIS | AT91_SSC_RXDIS);
-+
-+      /* Save the current interrupt mask, then disable unmasked interrupts. */
-+      ssc_p->state->ssc_imr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_IMR);
-+      at91_ssc_write(ssc_p->ssc_base + AT91_SSC_IDR, ssc_p->state->ssc_imr);
-+
-+      ssc_p->state->ssc_cmr  = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_CMR);
-+      ssc_p->state->ssc_rcmr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_RCMR);
-+      ssc_p->state->ssc_rfmr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_RCMR);
-+      ssc_p->state->ssc_tcmr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_RCMR);
-+      ssc_p->state->ssc_tfmr = at91_ssc_read(ssc_p->ssc_base + AT91_SSC_RCMR);
-+
-+      return 0;
-+}
-+
-+static int at91rm9200_i2s_resume(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      struct at91rm9200_ssc_info *ssc_p;
-+      u32 cr_mask;
-+
-+      if(!dai->active)
-+              return 0;
-+
-+      ssc_p = &ssc_info[dai->id];
-+
-+      at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, ssc_p->state->ssc_tfmr);
-+      at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, ssc_p->state->ssc_tcmr);
-+      at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, ssc_p->state->ssc_rfmr);
-+      at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, ssc_p->state->ssc_rcmr);
-+      at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CMR,  ssc_p->state->ssc_cmr);
-+
-+      at91_ssc_write(ssc_p->ssc_base + AT91_SSC_IER,  ssc_p->state->ssc_imr);
-+
-+      at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CR,
-+              ((ssc_p->state->ssc_sr & AT91_SSC_RXENA) ? AT91_SSC_RXEN : 0) |
-+              ((ssc_p->state->ssc_sr & AT91_SSC_TXENA) ? AT91_SSC_TXEN : 0));
-+
-+      return 0;
-+}
-+
-+#else
-+#define at91rm9200_i2s_suspend        NULL
-+#define at91rm9200_i2s_resume NULL
-+#endif
-+
-+static unsigned int at91rm9200_i2s_config_sysclk(
-+      struct snd_soc_cpu_dai *iface, struct snd_soc_clock_info *info,
-+      unsigned int clk)
-+{
-+      /* Currently, there is only support for USB (12Mhz) mode */
-+      if (clk != 12000000)
-+              return 0;
-+      return 12000000;
-+}
-+
-+static int at91rm9200_i2s_hw_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      int id = rtd->cpu_dai->id;
-+      struct at91rm9200_ssc_info *ssc_p = &ssc_info[id];
-+      at91rm9200_pcm_dma_params_t *dma_params;
-+      unsigned int pcmfmt, rate;
-+      int dir, channels, bits;
-+      struct clk *mck_clk;
-+      unsigned long bclk;
-+      u32 div, period, tfmr, rfmr, tcmr, rcmr;
-+      int ret;
-+
-+      /*
-+       * Currently, there is only one set of dma params for
-+       * each direction.  If more are added, this code will
-+       * have to be changed to select the proper set.
-+       */
-+      dir = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? 0 : 1;
-+
-+      dma_params = &ssc_dma_params[id][dir];
-+      dma_params->substream = substream;
-+
-+      ssc_p->dma_params[dir] = dma_params;
-+      rtd->cpu_dai->dma_data = dma_params;
-+
-+      rate = params_rate(params);
-+      channels = params_channels(params);
-+
-+      pcmfmt = rtd->cpu_dai->dai_runtime.pcmfmt;
-+      switch (pcmfmt) {
-+              case SNDRV_PCM_FMTBIT_S16_LE:
-+                      /* likely this is all we'll ever support, but ... */
-+                      bits = 16;
-+                      dma_params->pdc_xfer_size = 2;
-+                      break;
-+              default:
-+                      printk(KERN_WARNING "at91rm9200-i2s: unsupported format %x\n",
-+                              pcmfmt);
-+                      return -EINVAL;
-+      }
-+
-+      /* Don't allow both SSC substreams to initialize at the same time. */
-+      down(ssc_p->mutex);
-+
-+      /*
-+       * If this SSC is alreadly initialized, then this substream must use
-+       * the same format and rate.
-+       */
-+      if (ssc_p->initialized) {
-+              if (pcmfmt != ssc_p->pcmfmt || rate != ssc_p->rate) {
-+                      printk(KERN_WARNING "at91rm9200-i2s: "
-+                              "incompatible substream in other direction\n");
-+                      up(ssc_p->mutex);
-+                      return -EINVAL;
-+              }
-+      } else {
-+              /* Enable PMC peripheral clock for this SSC */
-+              DBG("Starting pid %d clock\n", ssc_p->pid);
-+              at91_sys_write(AT91_PMC_PCER, 1<<ssc_p->pid);
-+
-+              /* Reset the SSC */
-+              at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CR, AT91_SSC_SWRST);
-+
-+              at91_ssc_write(ssc_p->ssc_base + AT91_PDC_RPR, 0);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_PDC_RCR, 0);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_PDC_RNPR, 0);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_PDC_RNCR, 0);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_PDC_TPR, 0);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_PDC_TCR, 0);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_PDC_TNPR, 0);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_PDC_TNCR, 0);
-+
-+              mck_clk = clk_get(NULL, "mck");
-+
-+              div = rtd->cpu_dai->dai_runtime.priv >> 16;
-+              period = rtd->cpu_dai->dai_runtime.priv & 0xffff;
-+              bclk = 60000000 / (2 * div);
-+
-+              DBG("mck %ld fsbd %d bfs %d bfs_real %d bclk %ld div %d period %d\n",
-+                      clk_get_rate(mck_clk),
-+                      SND_SOC_FSBD(6),
-+                      rtd->cpu_dai->dai_runtime.bfs,
-+                      SND_SOC_FSBD_REAL(rtd->cpu_dai->dai_runtime.bfs),
-+                      bclk,
-+                      div,
-+                      period);
-+
-+              clk_put(mck_clk);
-+
-+              at91_ssc_write(ssc_p->ssc_base + AT91_SSC_CMR, div);
-+
-+              /*
-+               * Setup the TFMR and RFMR for the proper data format.
-+               */
-+              tfmr =
-+                (( AT91_SSC_FSEDGE_POSITIVE        ) & AT91_SSC_FSEDGE)
-+              | (( 0                          << 23) & AT91_SSC_FSDEN)
-+              | (( AT91_SSC_FSOS_NEGATIVE          ) & AT91_SSC_FSOS)
-+              | (((bits - 1)                  << 16) & AT91_SSC_FSLEN)
-+              | (((channels - 1)              <<  8) & AT91_SSC_DATNB)
-+              | (( 1                          <<  7) & AT91_SSC_MSBF)
-+              | (( 0                          <<  5) & AT91_SSC_DATDEF)
-+              | (((bits - 1)                  <<  0) & AT91_SSC_DATALEN);
-+              DBG("SSC_TFMR=0x%08x\n", tfmr);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_SSC_TFMR, tfmr);
-+
-+              rfmr =
-+                (( AT91_SSC_FSEDGE_POSITIVE        ) & AT91_SSC_FSEDGE)
-+              | (( AT91_SSC_FSOS_NONE              ) & AT91_SSC_FSOS)
-+              | (( 0                          << 16) & AT91_SSC_FSLEN)
-+              | (((channels - 1)              <<  8) & AT91_SSC_DATNB)
-+              | (( 1                          <<  7) & AT91_SSC_MSBF)
-+              | (( 0                          <<  5) & AT91_SSC_LOOP)
-+              | (((bits - 1)                  <<  0) & AT91_SSC_DATALEN);
-+
-+              DBG("SSC_RFMR=0x%08x\n", rfmr);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RFMR, rfmr);
-+
-+              /*
-+               * Setup the TCMR and RCMR to generate the proper BCLK
-+               * and LRC signals.
-+               */
-+              tcmr =
-+                (( period                     << 24) & AT91_SSC_PERIOD)
-+              | (( 1                          << 16) & AT91_SSC_STTDLY)
-+              | (( AT91_SSC_START_FALLING_RF       ) & AT91_SSC_START)
-+              | (( AT91_SSC_CKI_FALLING            ) & AT91_SSC_CKI)
-+              | (( AT91_SSC_CKO_CONTINUOUS         ) & AT91_SSC_CKO)
-+              | (( AT91_SSC_CKS_DIV                ) & AT91_SSC_CKS);
-+
-+              DBG("SSC_TCMR=0x%08x\n", tcmr);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_SSC_TCMR, tcmr);
-+
-+              rcmr =
-+                (( 0                          << 24) & AT91_SSC_PERIOD)
-+              | (( 1                          << 16) & AT91_SSC_STTDLY)
-+              | (( AT91_SSC_START_TX_RX            ) & AT91_SSC_START)
-+              | (( AT91_SSC_CK_RISING              ) & AT91_SSC_CKI)
-+              | (( AT91_SSC_CKO_NONE               ) & AT91_SSC_CKO)
-+              | (( AT91_SSC_CKS_CLOCK              ) & AT91_SSC_CKS);
-+
-+              DBG("SSC_RCMR=0x%08x\n", rcmr);
-+              at91_ssc_write(ssc_p->ssc_base + AT91_SSC_RCMR, rcmr);
-+
-+              if ((ret = request_irq(ssc_p->pid, at91rm9200_i2s_interrupt,
-+                                      0, ssc_p->name, ssc_p)) < 0) {
-+                      printk(KERN_WARNING "at91rm9200-i2s: request_irq failure\n");
-+                      return ret;
-+              }
-+
-+              /*
-+               * Save the current substream parameters in order to check
-+               * that the substream in the opposite direction uses the
-+               * same parameters.
-+               */
-+              ssc_p->pcmfmt = pcmfmt;
-+              ssc_p->rate = rate;
-+              ssc_p->initialized = 1;
-+
-+              DBG("hw_params: SSC initialized\n");
-+      }
-+
-+      up(ssc_p->mutex);
-+
-+      return 0;
-+}
-+
-+
-+static int at91rm9200_i2s_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      at91rm9200_pcm_dma_params_t *dma_params = rtd->cpu_dai->dma_data;
-+
-+      at91_ssc_write(dma_params->ssc->cr, dma_params->mask->ssc_enable);
-+
-+      DBG("%s enabled SSC_SR=0x%08lx\n",
-+      substream->stream == SNDRV_PCM_STREAM_PLAYBACK ? "transmit" : "receive",
-+      at91_ssc_read(ssc_info[rtd->cpu_dai->id].ssc_base + AT91_SSC_SR));
-+      return 0;
-+}
-+
-+
-+struct snd_soc_cpu_dai at91rm9200_i2s_dai[] = {
-+      {       .name = "at91rm9200-ssc0/i2s",
-+              .id = 0,
-+              .type = SND_SOC_DAI_I2S,
-+              .suspend = at91rm9200_i2s_suspend,
-+              .resume = at91rm9200_i2s_resume,
-+              .config_sysclk = at91rm9200_i2s_config_sysclk,
-+              .playback = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .capture = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .ops = {
-+                      .startup = at91rm9200_i2s_startup,
-+                      .shutdown = at91rm9200_i2s_shutdown,
-+                      .prepare = at91rm9200_i2s_prepare,
-+                      .hw_params = at91rm9200_i2s_hw_params,},
-+              .caps = {
-+                      .mode = &at91rm9200_i2s[0],
-+                      .num_modes = ARRAY_SIZE(at91rm9200_i2s),},
-+      },
-+      {       .name = "at91rm9200-ssc1/i2s",
-+              .id = 1,
-+              .type = SND_SOC_DAI_I2S,
-+              .suspend = at91rm9200_i2s_suspend,
-+              .resume = at91rm9200_i2s_resume,
-+              .config_sysclk = at91rm9200_i2s_config_sysclk,
-+              .playback = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .capture = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .ops = {
-+                      .startup = at91rm9200_i2s_startup,
-+                      .shutdown = at91rm9200_i2s_shutdown,
-+                      .prepare = at91rm9200_i2s_prepare,
-+                      .hw_params = at91rm9200_i2s_hw_params,},
-+              .caps = {
-+                      .mode = &at91rm9200_i2s[0],
-+                      .num_modes = ARRAY_SIZE(at91rm9200_i2s),},
-+      },
-+      {       .name = "at91rm9200-ssc2/i2s",
-+              .id = 2,
-+              .type = SND_SOC_DAI_I2S,
-+              .suspend = at91rm9200_i2s_suspend,
-+              .resume = at91rm9200_i2s_resume,
-+              .config_sysclk = at91rm9200_i2s_config_sysclk,
-+              .playback = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .capture = {
-+                      .channels_min = 1,
-+                      .channels_max = 2,},
-+              .ops = {
-+                      .startup = at91rm9200_i2s_startup,
-+                      .shutdown = at91rm9200_i2s_shutdown,
-+                      .prepare = at91rm9200_i2s_prepare,
-+                      .hw_params = at91rm9200_i2s_hw_params,},
-+              .caps = {
-+                      .mode = &at91rm9200_i2s[0],
-+                      .num_modes = ARRAY_SIZE(at91rm9200_i2s),},
-+      },
-+};
-+
-+EXPORT_SYMBOL_GPL(at91rm9200_i2s_dai);
-+
-+/* Module information */
-+MODULE_AUTHOR("Frank Mandarino, fmandarino@endrelia.com, www.endrelia.com");
-+MODULE_DESCRIPTION("AT91RM9200 I2S ASoC Interface");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/at91/at91rm9200-pcm.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/at91/at91rm9200-pcm.c
-@@ -0,0 +1,428 @@
-+/*
-+ * at91rm9200-pcm.c -- ALSA PCM interface for the Atmel AT91RM9200 chip.
-+ *
-+ * Author:    Frank Mandarino <fmandarino@endrelia.com>
-+ *            Endrelia Technologies Inc.
-+ * Created:   Mar 3, 2006
-+ *
-+ * Based on pxa2xx-pcm.c by:
-+ *
-+ * Author:    Nicolas Pitre
-+ * Created:   Nov 30, 2004
-+ * Copyright: (C) 2004 MontaVista Software, 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.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/slab.h>
-+#include <linux/dma-mapping.h>
-+
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+
-+#include <asm/arch/at91rm9200.h>
-+#include <asm/arch/at91rm9200_ssc.h>
-+#include <asm/arch/at91rm9200_pdc.h>
-+#include <asm/arch/hardware.h>
-+
-+#include "at91rm9200-pcm.h"
-+
-+#if 0
-+#define       DBG(x...)       printk(KERN_INFO "at91rm9200-pcm: " x)
-+#else
-+#define       DBG(x...)
-+#endif
-+
-+static const snd_pcm_hardware_t at91rm9200_pcm_hardware = {
-+      .info                   = SNDRV_PCM_INFO_MMAP |
-+                                SNDRV_PCM_INFO_MMAP_VALID |
-+                                SNDRV_PCM_INFO_INTERLEAVED |
-+                                SNDRV_PCM_INFO_PAUSE,
-+      .formats                = SNDRV_PCM_FMTBIT_S16_LE,
-+      .period_bytes_min       = 32,
-+      .period_bytes_max       = 8192,
-+      .periods_min            = 2,
-+      .periods_max            = 1024,
-+      .buffer_bytes_max       = 32 * 1024,
-+};
-+
-+struct at91rm9200_runtime_data {
-+      at91rm9200_pcm_dma_params_t *params;
-+      dma_addr_t dma_buffer;                  /* physical address of dma buffer */
-+      dma_addr_t dma_buffer_end;              /* first address beyond DMA buffer */
-+      size_t period_size;
-+      dma_addr_t period_ptr;                  /* physical address of next period */
-+      u32 pdc_xpr_save;                       /* PDC register save */
-+      u32 pdc_xcr_save;
-+      u32 pdc_xnpr_save;
-+      u32 pdc_xncr_save;
-+};
-+
-+static void at91rm9200_pcm_dma_irq(u32 ssc_sr,
-+      struct snd_pcm_substream *substream)
-+{
-+      struct at91rm9200_runtime_data *prtd = substream->runtime->private_data;
-+      at91rm9200_pcm_dma_params_t *params = prtd->params;
-+      static int count = 0;
-+
-+      count++;
-+
-+      if (ssc_sr & params->mask->ssc_endbuf) {
-+
-+              printk(KERN_WARNING
-+                      "at91rm9200-pcm: buffer %s on %s (SSC_SR=%#x, count=%d)\n",
-+                      substream->stream == SNDRV_PCM_STREAM_PLAYBACK
-+                              ? "underrun" : "overrun",
-+                      params->name, ssc_sr, count);
-+
-+              /* re-start the PDC */
-+              at91_ssc_write(params->pdc->ptcr, params->mask->pdc_disable);
-+
-+              prtd->period_ptr += prtd->period_size;
-+              if (prtd->period_ptr >= prtd->dma_buffer_end) {
-+                      prtd->period_ptr = prtd->dma_buffer;
-+              }
-+
-+              at91_ssc_write(params->pdc->xpr, prtd->period_ptr);
-+              at91_ssc_write(params->pdc->xcr,
-+                              prtd->period_size / params->pdc_xfer_size);
-+
-+              at91_ssc_write(params->pdc->ptcr, params->mask->pdc_enable);
-+      }
-+
-+      if (ssc_sr & params->mask->ssc_endx) {
-+
-+              /* Load the PDC next pointer and counter registers */
-+              prtd->period_ptr += prtd->period_size;
-+              if (prtd->period_ptr >= prtd->dma_buffer_end) {
-+                      prtd->period_ptr = prtd->dma_buffer;
-+              }
-+              at91_ssc_write(params->pdc->xnpr, prtd->period_ptr);
-+              at91_ssc_write(params->pdc->xncr,
-+                              prtd->period_size / params->pdc_xfer_size);
-+      }
-+
-+      snd_pcm_period_elapsed(substream);
-+}
-+
-+static int at91rm9200_pcm_hw_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      snd_pcm_runtime_t *runtime = substream->runtime;
-+      struct at91rm9200_runtime_data *prtd = runtime->private_data;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      /* this may get called several times by oss emulation
-+       * with different params */
-+
-+      snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
-+      runtime->dma_bytes = params_buffer_bytes(params);
-+
-+      prtd->params = rtd->cpu_dai->dma_data;
-+      prtd->params->dma_intr_handler = at91rm9200_pcm_dma_irq;
-+
-+      prtd->dma_buffer = runtime->dma_addr;
-+      prtd->dma_buffer_end = runtime->dma_addr + runtime->dma_bytes;
-+      prtd->period_size = params_period_bytes(params);
-+
-+      DBG("hw_params: DMA for %s initialized (dma_bytes=%d, period_size=%d)\n",
-+              prtd->params->name, runtime->dma_bytes, prtd->period_size);
-+      return 0;
-+}
-+
-+static int at91rm9200_pcm_hw_free(struct snd_pcm_substream *substream)
-+{
-+      struct at91rm9200_runtime_data *prtd = substream->runtime->private_data;
-+      at91rm9200_pcm_dma_params_t *params = prtd->params;
-+
-+      if (params != NULL) {
-+              at91_ssc_write(params->pdc->ptcr, params->mask->pdc_disable);
-+              prtd->params->dma_intr_handler = NULL;
-+      }
-+
-+      return 0;
-+}
-+
-+static int at91rm9200_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct at91rm9200_runtime_data *prtd = substream->runtime->private_data;
-+      at91rm9200_pcm_dma_params_t *params = prtd->params;
-+
-+      at91_ssc_write(params->ssc->idr,
-+                      params->mask->ssc_endx | params->mask->ssc_endbuf);
-+
-+      at91_ssc_write(params->pdc->ptcr, params->mask->pdc_disable);
-+      return 0;
-+}
-+
-+static int at91rm9200_pcm_trigger(struct snd_pcm_substream *substream,
-+      int cmd)
-+{
-+      struct at91rm9200_runtime_data *prtd = substream->runtime->private_data;
-+      at91rm9200_pcm_dma_params_t *params = prtd->params;
-+      int ret = 0;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+              prtd->period_ptr = prtd->dma_buffer;
-+
-+              at91_ssc_write(params->pdc->xpr, prtd->period_ptr);
-+              at91_ssc_write(params->pdc->xcr,
-+                              prtd->period_size / params->pdc_xfer_size);
-+
-+              prtd->period_ptr += prtd->period_size;
-+              at91_ssc_write(params->pdc->xnpr, prtd->period_ptr);
-+              at91_ssc_write(params->pdc->xncr,
-+                              prtd->period_size / params->pdc_xfer_size);
-+
-+              DBG("trigger: period_ptr=%lx, xpr=%lx, xcr=%ld, xnpr=%lx, xncr=%ld\n",
-+                      (unsigned long) prtd->period_ptr,
-+                      at91_ssc_read(params->pdc->xpr),
-+                      at91_ssc_read(params->pdc->xcr),
-+                      at91_ssc_read(params->pdc->xnpr),
-+                      at91_ssc_read(params->pdc->xncr));
-+
-+              at91_ssc_write(params->ssc->ier,
-+                      params->mask->ssc_endx | params->mask->ssc_endbuf);
-+
-+              at91_ssc_write(params->pdc->ptcr, params->mask->pdc_enable);
-+
-+              DBG("sr=%lx imr=%lx\n", at91_ssc_read(params->ssc->ier - 4),
-+                                      at91_ssc_read(params->ssc->ier + 8));
-+              break;
-+
-+      case SNDRV_PCM_TRIGGER_STOP:
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              at91_ssc_write(params->pdc->ptcr, params->mask->pdc_disable);
-+              break;
-+
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+              at91_ssc_write(params->pdc->ptcr, params->mask->pdc_enable);
-+              break;
-+
-+      default:
-+              ret = -EINVAL;
-+      }
-+
-+      return ret;
-+}
-+
-+static snd_pcm_uframes_t at91rm9200_pcm_pointer(
-+      struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct at91rm9200_runtime_data *prtd = runtime->private_data;
-+      at91rm9200_pcm_dma_params_t *params = prtd->params;
-+      dma_addr_t ptr;
-+      snd_pcm_uframes_t x;
-+
-+      ptr = (dma_addr_t) at91_ssc_read(params->pdc->xpr);
-+      x = bytes_to_frames(runtime, ptr - prtd->dma_buffer);
-+
-+      if (x == runtime->buffer_size)
-+              x = 0;
-+      return x;
-+}
-+
-+static int at91rm9200_pcm_open(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct at91rm9200_runtime_data *prtd;
-+      int ret = 0;
-+
-+      snd_soc_set_runtime_hwparams(substream, &at91rm9200_pcm_hardware);
-+
-+      /* ensure that buffer size is a multiple of period size */
-+      ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
-+      if (ret < 0)
-+              goto out;
-+
-+      prtd = kzalloc(sizeof(struct at91rm9200_runtime_data), GFP_KERNEL);
-+      if (prtd == NULL) {
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+      runtime->private_data = prtd;
-+
-+ out:
-+      return ret;
-+}
-+
-+static int at91rm9200_pcm_close(struct snd_pcm_substream *substream)
-+{
-+      struct at91rm9200_runtime_data *prtd = substream->runtime->private_data;
-+
-+      kfree(prtd);
-+      return 0;
-+}
-+
-+static int at91rm9200_pcm_mmap(struct snd_pcm_substream *substream,
-+      struct vm_area_struct *vma)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+
-+      return dma_mmap_writecombine(substream->pcm->card->dev, vma,
-+                                   runtime->dma_area,
-+                                   runtime->dma_addr,
-+                                   runtime->dma_bytes);
-+}
-+
-+struct snd_pcm_ops at91rm9200_pcm_ops = {
-+      .open           = at91rm9200_pcm_open,
-+      .close          = at91rm9200_pcm_close,
-+      .ioctl          = snd_pcm_lib_ioctl,
-+      .hw_params      = at91rm9200_pcm_hw_params,
-+      .hw_free        = at91rm9200_pcm_hw_free,
-+      .prepare        = at91rm9200_pcm_prepare,
-+      .trigger        = at91rm9200_pcm_trigger,
-+      .pointer        = at91rm9200_pcm_pointer,
-+      .mmap           = at91rm9200_pcm_mmap,
-+};
-+
-+static int at91rm9200_pcm_preallocate_dma_buffer(struct snd_pcm *pcm,
-+      int stream)
-+{
-+      struct snd_pcm_substream *substream = pcm->streams[stream].substream;
-+      struct snd_dma_buffer *buf = &substream->dma_buffer;
-+      size_t size = at91rm9200_pcm_hardware.buffer_bytes_max;
-+
-+      buf->dev.type = SNDRV_DMA_TYPE_DEV;
-+      buf->dev.dev = pcm->card->dev;
-+      buf->private_data = NULL;
-+      buf->area = dma_alloc_writecombine(pcm->card->dev, size,
-+                                         &buf->addr, GFP_KERNEL);
-+
-+      DBG("preallocate_dma_buffer: area=%p, addr=%p, size=%d\n",
-+              (void *) buf->area,
-+              (void *) buf->addr,
-+              size);
-+
-+      if (!buf->area)
-+              return -ENOMEM;
-+
-+      buf->bytes = size;
-+      return 0;
-+}
-+
-+static u64 at91rm9200_pcm_dmamask = 0xffffffff;
-+
-+static int at91rm9200_pcm_new(struct snd_card *card,
-+      struct snd_soc_codec_dai *dai, struct snd_pcm *pcm)
-+{
-+      int ret = 0;
-+
-+      if (!card->dev->dma_mask)
-+              card->dev->dma_mask = &at91rm9200_pcm_dmamask;
-+      if (!card->dev->coherent_dma_mask)
-+              card->dev->coherent_dma_mask = 0xffffffff;
-+
-+      if (dai->playback.channels_min) {
-+              ret = at91rm9200_pcm_preallocate_dma_buffer(pcm,
-+                      SNDRV_PCM_STREAM_PLAYBACK);
-+              if (ret)
-+                      goto out;
-+      }
-+
-+      if (dai->capture.channels_min) {
-+              ret = at91rm9200_pcm_preallocate_dma_buffer(pcm,
-+                      SNDRV_PCM_STREAM_CAPTURE);
-+              if (ret)
-+                      goto out;
-+      }
-+ out:
-+      return ret;
-+}
-+
-+static void at91rm9200_pcm_free_dma_buffers(struct snd_pcm *pcm)
-+{
-+      struct snd_pcm_substream *substream;
-+      struct snd_dma_buffer *buf;
-+      int stream;
-+
-+      for (stream = 0; stream < 2; stream++) {
-+              substream = pcm->streams[stream].substream;
-+              if (!substream)
-+                      continue;
-+
-+              buf = &substream->dma_buffer;
-+              if (!buf->area)
-+                      continue;
-+
-+              dma_free_writecombine(pcm->card->dev, buf->bytes,
-+                                    buf->area, buf->addr);
-+              buf->area = NULL;
-+      }
-+}
-+
-+static int at91rm9200_pcm_suspend(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      struct snd_pcm_runtime *runtime = dai->runtime;
-+      struct at91rm9200_runtime_data *prtd;
-+      at91rm9200_pcm_dma_params_t *params;
-+
-+      if (!runtime)
-+              return 0;
-+
-+      prtd = runtime->private_data;
-+      params = prtd->params;
-+
-+      /* disable the PDC and save the PDC registers */
-+
-+      at91_ssc_write(params->pdc->ptcr, params->mask->pdc_disable);
-+
-+      prtd->pdc_xpr_save  = at91_ssc_read(params->pdc->xpr);
-+      prtd->pdc_xcr_save  = at91_ssc_read(params->pdc->xcr);
-+      prtd->pdc_xnpr_save = at91_ssc_read(params->pdc->xnpr);
-+      prtd->pdc_xncr_save = at91_ssc_read(params->pdc->xncr);
-+
-+      return 0;
-+}
-+
-+static int at91rm9200_pcm_resume(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      struct snd_pcm_runtime *runtime = dai->runtime;
-+      struct at91rm9200_runtime_data *prtd;
-+      at91rm9200_pcm_dma_params_t *params;
-+
-+      if (!runtime)
-+              return 0;
-+
-+      prtd = runtime->private_data;
-+      params = prtd->params;
-+
-+      /* restore the PDC registers and enable the PDC */
-+      at91_ssc_write(params->pdc->xpr,  prtd->pdc_xpr_save);
-+      at91_ssc_write(params->pdc->xcr,  prtd->pdc_xcr_save);
-+      at91_ssc_write(params->pdc->xnpr, prtd->pdc_xnpr_save);
-+      at91_ssc_write(params->pdc->xncr, prtd->pdc_xncr_save);
-+
-+      at91_ssc_write(params->pdc->ptcr, params->mask->pdc_enable);
-+      return 0;
-+}
-+
-+struct snd_soc_platform at91rm9200_soc_platform = {
-+      .name           = "at91rm9200-audio",
-+      .pcm_ops        = &at91rm9200_pcm_ops,
-+      .pcm_new        = at91rm9200_pcm_new,
-+      .pcm_free       = at91rm9200_pcm_free_dma_buffers,
-+      .suspend        = at91rm9200_pcm_suspend,
-+      .resume         = at91rm9200_pcm_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(at91rm9200_soc_platform);
-+
-+MODULE_AUTHOR("Frank Mandarino <fmandarino@endrelia.com>");
-+MODULE_DESCRIPTION("Atmel AT91RM9200 PCM module");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/at91/at91rm9200-pcm.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/at91/at91rm9200-pcm.h
-@@ -0,0 +1,75 @@
-+/*
-+ * at91rm9200-pcm.h - ALSA PCM interface for the Atmel AT91RM9200 chip
-+ *
-+ * Author:    Frank Mandarino <fmandarino@endrelia.com>
-+ *            Endrelia Technologies Inc.
-+ * Created:   Mar 3, 2006
-+ *
-+ * Based on pxa2xx-pcm.h by:
-+ *
-+ * Author:    Nicolas Pitre
-+ * Created:   Nov 30, 2004
-+ * Copyright: MontaVista Software, 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.
-+ */
-+
-+/*
-+ * Registers and status bits that are required by the PCM driver.
-+ */
-+struct at91rm9200_ssc_regs {
-+      void __iomem    *cr;            /* SSC control */
-+      void __iomem    *ier;           /* SSC interrupt enable */
-+      void __iomem    *idr;           /* SSC interrupt disable */
-+};
-+
-+struct at91rm9200_pdc_regs {
-+      void __iomem    *xpr;           /* PDC recv/trans pointer */
-+      void __iomem    *xcr;           /* PDC recv/trans counter */
-+      void __iomem    *xnpr;          /* PDC next recv/trans pointer */
-+      void __iomem    *xncr;          /* PDC next recv/trans counter */
-+      void __iomem    *ptcr;          /* PDC transfer control */
-+};
-+
-+struct at91rm9200_ssc_mask {
-+      u32     ssc_enable;             /* SSC recv/trans enable */
-+      u32     ssc_disable;            /* SSC recv/trans disable */
-+      u32     ssc_endx;               /* SSC ENDTX or ENDRX */
-+      u32     ssc_endbuf;             /* SSC TXBUFE or RXBUFF */
-+      u32     pdc_enable;             /* PDC recv/trans enable */
-+      u32     pdc_disable;            /* PDC recv/trans disable */
-+};
-+
-+
-+/*
-+ * This structure, shared between the PCM driver and the interface,
-+ * contains all information required by the PCM driver to perform the
-+ * PDC DMA operation.  All fields except dma_intr_handler() are initialized
-+ * by the interface.  The dms_intr_handler() pointer is set by the PCM
-+ * driver and called by the interface SSC interrupt handler if it is
-+ * non-NULL.
-+ */
-+typedef struct {
-+      char *name;                     /* stream identifier */
-+      int pdc_xfer_size;              /* PDC counter increment in bytes */
-+      struct at91rm9200_ssc_regs *ssc; /* SSC register addresses */
-+      struct at91rm9200_pdc_regs *pdc; /* PDC receive/transmit registers */
-+      struct at91rm9200_ssc_mask *mask;/* SSC & PDC status bits */
-+      snd_pcm_substream_t *substream;
-+      void (*dma_intr_handler)(u32, snd_pcm_substream_t *);
-+} at91rm9200_pcm_dma_params_t;
-+
-+extern struct snd_soc_cpu_dai at91rm9200_i2s_dai[3];
-+extern struct snd_soc_platform at91rm9200_soc_platform;
-+
-+
-+/*
-+ * SSC I/O helpers.
-+ * E.g., at91_ssc_write(AT91_SSC(1) + AT91_SSC_CR, AT91_SSC_RXEN);
-+ */
-+#define AT91_SSC(x) (((x)==0) ? AT91_VA_BASE_SSC0 :\
-+       ((x)==1) ? AT91_VA_BASE_SSC1 : ((x)==2) ? AT91_VA_BASE_SSC2 : NULL)
-+#define at91_ssc_read(a)      ((unsigned long) __raw_readl(a))
-+#define at91_ssc_write(a,v)   __raw_writel((v),(a))
-Index: linux-2.6-pxa-new/sound/soc/imx/imx-ssi.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/imx/imx-ssi.c
-@@ -0,0 +1,452 @@
-+/*
-+ * imx-ssi.c  --  SSI driver for Freescale IMX
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  Based on mxc-alsa-mc13783 (C) 2006 Freescale.
-+ *
-+ *  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.
-+ *
-+ *  Revision history
-+ *    29th Aug 2006   Initial version.
-+ *
-+ */
-+
-+#define IMX_DSP_DAIFMT \
-+      ( SND_SOC_DAIFMT_DSP__A |SND_SOC_DAIFMT_DSP_B  | \
-+      SND_SOC_DAIFMT_CBS_CFS |SND_SOC_DAIFMT_CBM_CFS | \
-+      SND_SOC_DAIFMT_CBS_CFM |SND_SOC_DAIFMT_NB_NF |\
-+      SND_SOC_DAIFMT_NB_IF)
-+
-+#define IMX_DSP_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define IMX_DSP_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | \
-+      SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
-+      SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | \
-+      SNDRV_PCM_RATE_96000)
-+
-+#define IMX_DSP_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE)
-+
-+static struct snd_soc_dai_mode imx_dsp_pcm_modes[] = {
-+
-+      /* frame master and clock slave mode */
-+      {IMX_DSP_DAIFMT | SND_SOC_DAIFMT_CBM_CFS,
-+              SND_SOC_DAITDM_LRDW(0,0), IMX_DSP_BITS, IMX_DSP_RATES,
-+               IMX_DSP_DIR, 0, SND_SOC_FS_ALL,
-+               SND_SOC_FSB(32) | SND_SOC_FSB(32) | SND_SOC_FSB(16)},
-+
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi1_pcm_stereo_out = {
-+      .name                   = "SSI1 PCM Stereo out",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = emi_2_per,
-+              .watermark_level = SDMA_TXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI1_STX0,
-+              .event_id = DMA_REQ_SSI1_TX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi1_pcm_stereo_in = {
-+      .name                   = "SSI1 PCM Stereo in",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = per_2_emi,
-+              .watermark_level = SDMA_RXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI1_SRX0,
-+              .event_id = DMA_REQ_SSI1_RX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi2_pcm_stereo_out = {
-+      .name                   = "SSI2 PCM Stereo out",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = per_2_emi,
-+              .watermark_level = SDMA_TXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI2_STX0,
-+              .event_id = DMA_REQ_SSI2_TX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi2_pcm_stereo_in = {
-+      .name                   = "SSI2 PCM Stereo in",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = per_2_emi,
-+              .watermark_level = SDMA_RXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI2_SRX0,
-+              .event_id = DMA_REQ_SSI2_RX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static int imx_dsp_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if (!rtd->cpu_dai->active) {
-+
-+      }
-+
-+      return 0;
-+}
-+
-+static int imx_ssi1_hw_tx_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 bfs, div;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->cpu_dai->dai_runtime.bfs);
-+
-+      SSI1_STCR = 0;
-+      SSI1_STCCR = 0;
-+
-+      /* DAI mode */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_DSP_B:
-+              SSI1_STCR |= SSI_STCR_TEFS; // data 1 bit after sync
-+      case SND_SOC_DAIFMT_DSP_A:
-+              SSI1_STCR |= SSI_STCR_TFSL; // frame is 1 bclk long
-+              break;
-+      }
-+
-+      /* DAI clock inversion */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_IB_IF:
-+              SSI1_STCR |= SSI_STCR_TFSI | SSI_STCR_TSCKP;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              SSI1_STCR |= SSI_STCR_TSCKP;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              SSI1_STCR |= SSI_STCR_TFSI;
-+              break;
-+      }
-+
-+      /* DAI data (word) size */
-+      switch(rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              SSI1_STCCR |= SSI_STCCR_WL(16);
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              SSI1_STCCR |= SSI_STCCR_WL(20);
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              SSI1_STCCR |= SSI_STCCR_WL(24);
-+              break;
-+      }
-+
-+      /* DAI clock master masks */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK){
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              SSI1_STCR |= SSI_STCR_TFDIR | SSI_STCR_TXDIR;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFM:
-+              SSI1_STCR |= SSI_STCR_TFDIR;
-+              break;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              SSI1_STCR |= SSI_STCR_TXDIR;
-+              break;
-+      }
-+
-+      /* DAI BCLK ratio to SYSCLK / MCLK */
-+      /* prescaler modulus - todo */
-+      switch (bfs) {
-+      case 2:
-+              break;
-+      case 4:
-+              break;
-+      case 8:
-+              break;
-+      case 16:
-+              break;
-+      }
-+
-+      /* TDM - todo, only fifo 0 atm */
-+      SSI1_STCR |= SSI_STCR_TFEN0;
-+      SSI1_STCCR |= SSI_STCCR_DC(params_channels(params));
-+
-+      return 0;
-+}
-+
-+static int imx_ssi1_hw_rx_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 bfs, div;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->cpu_dai->dai_runtime.bfs);
-+
-+      SSI1_SRCR = 0;
-+      SSI1_SRCCR = 0;
-+
-+      /* DAI mode */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_DSP_B:
-+              SSI1_SRCR |= SSI_SRCR_REFS; // data 1 bit after sync
-+      case SND_SOC_DAIFMT_DSP_A:
-+              SSI1_SRCR |= SSI_SRCR_RFSL; // frame is 1 bclk long
-+              break;
-+      }
-+
-+      /* DAI clock inversion */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_IB_IF:
-+              SSI1_SRCR |= SSI_SRCR_TFSI | SSI_SRCR_TSCKP;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              SSI1_SRCR |= SSI_SRCR_RSCKP;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              SSI1_SRCR |= SSI_SRCR_RFSI;
-+              break;
-+      }
-+
-+      /* DAI data (word) size */
-+      switch(rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              SSI1_SRCCR |= SSI_SRCCR_WL(16);
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              SSI1_SRCCR |= SSI_SRCCR_WL(20);
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              SSI1_SRCCR |= SSI_SRCCR_WL(24);
-+              break;
-+      }
-+
-+      /* DAI clock master masks */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK){
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              SSI1_SRCR |= SSI_SRCR_RFDIR | SSI_SRCR_RXDIR;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFM:
-+              SSI1_SRCR |= SSI_SRCR_RFDIR;
-+              break;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              SSI1_SRCR |= SSI_SRCR_RXDIR;
-+              break;
-+      }
-+
-+      /* DAI BCLK ratio to SYSCLK / MCLK */
-+      /* prescaler modulus - todo */
-+      switch (bfs) {
-+      case 2:
-+              break;
-+      case 4:
-+              break;
-+      case 8:
-+              break;
-+      case 16:
-+              break;
-+      }
-+
-+      /* TDM - todo, only fifo 0 atm */
-+      SSI1_SRCR |= SSI_SRCR_RFEN0;
-+      SSI1_SRCCR |= SSI_SRCCR_DC(params_channels(params));
-+
-+      return 0;
-+}
-+
-+static int imx_ssi_dsp_hw_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      /* clear register if not enabled */
-+      if(!(SSI1_SCR & SSI_SCR_SSIEN))
-+              SSI1_SCR = 0;
-+
-+      /* async */
-+      if (rtd->cpu_dai->flags & SND_SOC_DAI_ASYNC)
-+              SSI1_SCR |= SSI_SCR_SYN;
-+
-+      /* DAI mode */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              SSI1_SCR |= SSI_SCR_NET;
-+              break;
-+      }
-+
-+      /* TDM  - to complete */
-+
-+      /* Tx/Rx config */
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+              return imx_ssi1_dsp_hw_tx_params(substream, params);
-+      } else {
-+              return imx_ssi1_dsp_hw_rx_params(substream, params);
-+      }
-+}
-+
-+
-+
-+static int imx_ssi_dsp_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      int ret = 0;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+                      SSI1_SCR |= SSI_SCR_TE;
-+                      SSI1_SIER |= SSI_SIER_TDMAE;
-+              } else {
-+                      SSI1_SCR |= SSI_SCR_RE;
-+                      SSI1_SIER |= SSI_SIER_RDMAE;
-+              }
-+              SSI1_SCR |= SSI_SCR_SSIEN;
-+
-+              break;
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+      break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSI1_SCR |= SSI_SCR_TE;
-+              else
-+                      SSI1_SCR |= SSI_SCR_RE;
-+      break
-+      case SNDRV_PCM_TRIGGER_STOP:
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+      break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSI1_SCR &= ~SSI_SCR_TE;
-+              else
-+                      SSI1_SCR &= ~SSI_SCR_RE;
-+      break;
-+      default:
-+              ret = -EINVAL;
-+      }
-+
-+      return ret;
-+}
-+
-+static void imx_ssi_dsp_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      /* shutdown SSI */
-+      if (!rtd->cpu_dai->active) {
-+              if(rtd->cpu_dai->id == 0)
-+                      SSI1_SCR &= ~SSI_SCR_SSIEN;
-+              else
-+                      SSI2_SCR &= ~SSI_SCR_SSIEN;
-+      }
-+}
-+
-+#ifdef CONFIG_PM
-+static int imx_ssi_dsp_suspend(struct platform_device *dev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if(!dai->active)
-+              return 0;
-+
-+      if(rtd->cpu_dai->id == 0)
-+              SSI1_SCR &= ~SSI_SCR_SSIEN;
-+      else
-+              SSI2_SCR &= ~SSI_SCR_SSIEN;
-+
-+      return 0;
-+}
-+
-+static int imx_ssi_dsp_resume(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if(!dai->active)
-+              return 0;
-+
-+      if(rtd->cpu_dai->id == 0)
-+              SSI1_SCR |= SSI_SCR_SSIEN;
-+      else
-+              SSI2_SCR |= SSI_SCR_SSIEN;
-+
-+      return 0;
-+}
-+
-+#else
-+#define imx_ssi_dsp_suspend   NULL
-+#define imx_ssi_dsp_resume    NULL
-+#endif
-+
-+static unsigned int imx_ssi_config_dsp_sysclk(struct snd_soc_cpu_dai *iface,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      return clk;
-+}
-+
-+struct snd_soc_cpu_dai imx_ssi_dsp_dai = {
-+      .name = "imx-dsp-1",
-+      .id = 0,
-+      .type = SND_SOC_DAI_PCM,
-+      .suspend = imx_ssi_dsp_suspend,
-+      .resume = imx_ssi_dsp_resume,
-+      .config_sysclk = imx_ssi_config_dsp_sysclk,
-+      .playback = {
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = {
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .ops = {
-+              .startup = imx_ssi_dsp_startup,
-+              .shutdown = imx_ssi_dsp_shutdown,
-+              .trigger = imx_ssi_trigger,
-+              .hw_params = imx_ssi_dsp_hw_params,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(imx_dsp_modes),
-+              .mode = imx_dsp_modes,},
-+},
-+{
-+      .name = "imx-dsp-2",
-+      .id = 1,
-+      .type = SND_SOC_DAI_PCM,
-+      .suspend = imx_ssi_dsp_suspend,
-+      .resume = imx_ssi_dsp_resume,
-+      .config_sysclk = imx_ssi_config_dsp_sysclk,
-+      .playback = {
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = {
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .ops = {
-+              .startup = imx_dsp_startup,
-+              .shutdown = imx_dsp_shutdown,
-+              .trigger = imx_ssi1_trigger,
-+              .hw_params = imx_ssi1_pcm_hw_params,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(imx_dsp_modes),
-+              .mode = imx_dsp_modes,},
-+};
-+
-+
-+EXPORT_SYMBOL_GPL(imx_ssi_dsp_dai);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("i.MX ASoC SSI driver");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/imx/Kconfig
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/imx/Kconfig
-@@ -0,0 +1,31 @@
-+menu "SoC Audio for the Freescale i.MX"
-+
-+config SND_MXC_SOC
-+      tristate "SoC Audio for the Freescale i.MX CPU"
-+      depends on ARCH_MXC && SND
-+      select SND_PCM
-+      help
-+        Say Y or M if you want to add support for codecs attached to
-+        the MXC AC97, I2S or SSP interface. You will also need
-+        to select the audio interfaces to support below.
-+
-+config SND_MXC_AC97
-+      tristate
-+      select SND_AC97_CODEC
-+
-+config SND_MXC_SOC_AC97
-+      tristate
-+      select SND_AC97_BUS
-+
-+config SND_MXC_SOC_SSI
-+      tristate
-+
-+config SND_MXC_SOC_MX3_WM8753
-+      tristate "SoC Audio support for MX31 - WM8753"
-+      depends on SND_MXC_SOC && ARCH_MX3
-+      select SND_MXC_SOC_SSI
-+      help
-+        Say Y if you want to add support for SoC audio on MX31ADS
-+        with the WM8753.
-+
-+endmenu
-Index: linux-2.6-pxa-new/sound/soc/imx/Makefile
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/imx/Makefile
-@@ -0,0 +1,18 @@
-+# i.MX Platform Support
-+snd-soc-imx21-objs := imx21-pcm.o
-+snd-soc-imx31-objs := imx31-pcm.o
-+snd-soc-imx-ac97-objs := imx-ac97.o
-+snd-soc-imx-i2s-objs := imx-i2s.o
-+
-+obj-$(CONFIG_SND_MXC_SOC) += snd-soc-imx.o
-+obj-$(CONFIG_SND_MXC_SOC_AC97) += snd-soc-imx-ac97.o
-+obj-$(CONFIG_SND_MXC_SOC_I2S) += snd-soc-imx-i2s.o
-+
-+# i.MX Machine Support
-+snd-soc-mx31ads-wm8753-objs := mx31ads_wm8753.o
-+obj-$(CONFIG_SND_SOC_MX31ADS_WM8753) += snd-soc-mx31ads-wm8753.o
-+snd-soc-mx21ads-wm8753-objs := mx21ads_wm8753.o
-+obj-$(CONFIG_SND_SOC_MX21ADS_WM8753) += snd-soc-mx21ads-wm8753.o
-+snd-soc-mx21ads-wm8731-objs := mx21ads_wm8731.o
-+obj-$(CONFIG_SND_SOC_MX21ADS_WM8731) += snd-soc-mx21ads-wm8731.o
-+
-Index: linux-2.6.17/sound/Makefile
-===================================================================
---- linux-2.6.17.orig/sound/Makefile   2006-06-18 02:49:35.000000000 +0100
-+++ linux-2.6.17/sound/Makefile        2006-07-04 14:04:41.000000000 +0100
-@@ -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/ soc/
- ifeq ($(CONFIG_SND),y)
-   obj-y += last.o
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8711.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8711.c
-@@ -0,0 +1,843 @@
-+/*
-+ * wm8711.c  --  WM8711 ALSA SoC Audio driver
-+ *
-+ * Copyright 2006 Wolfson Microelectronics
-+ *
-+ * Author: Mike Arthur <linux@wolfsonmicro.com>
-+ *
-+ * Based on wm8711.c by Richard Purdie
-+ *
-+ * 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/moduleparam.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8711.h"
-+
-+#define AUDIO_NAME "wm8711"
-+#define WM8711_VERSION "0.2"
-+
-+/*
-+ * Debug
-+ */
-+
-+#define WM8711_DEBUG 0
-+
-+#ifdef WM8711_DEBUG
-+#define dbg(format, arg...) \
-+      printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
-+#else
-+#define dbg(format, arg...) do {} while (0)
-+#endif
-+#define err(format, arg...) \
-+      printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-+#define info(format, arg...) \
-+      printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-+#define warn(format, arg...) \
-+      printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8711;
-+
-+/*
-+ * wm8711 register cache
-+ * We can't read the WM8711 register space when we are
-+ * using 2 wire for device control, so we cache them instead.
-+ * There is no point in caching the reset register
-+ */
-+static const u16 wm8711_reg[WM8711_CACHEREGNUM] = {
-+    0x0079, 0x0079, 0x000a, 0x0008,
-+    0x009f, 0x000a, 0x0000, 0x0000
-+};
-+
-+#define WM8711_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+      SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \
-+      SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM8711_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK)
-+
-+#define WM8711_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
-+
-+#define WM8711_HIFI_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S24_LE | \
-+      SNDRV_PCM_FMTBIT_S32_LE)
-+
-+static struct snd_soc_dai_mode wm8711_modes[] = {
-+      /* codec frame and clock master modes */
-+      /* 8k */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 1536,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 2304,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 1408,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 2112,
-+              .bfs = 64,
-+      },
-+
-+      /* 32k */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 384,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_32000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 576,
-+              .bfs = 64,
-+      },
-+
-+      /* 44.1k & 48k */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 256,
-+              .bfs = 64,
-+      },
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 384,
-+              .bfs = 64,
-+      },
-+
-+      /* 88.2 & 96k */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 128,
-+              .bfs = 64,
-+
-+      },
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 192,
-+              .bfs = 64,
-+      },
-+
-+      /* USB codec frame and clock master modes */
-+      /* 8k */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_8000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 1500,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* 44.1k */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 272,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* 48k */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_48000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 250,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* 88.2k */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_88200,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 136,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* 96k */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = SNDRV_PCM_RATE_96000,
-+              .pcmdir = WM8711_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 125,
-+              .bfs = SND_SOC_FSBD(1),
-+      },
-+
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = WM8711_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM8711_HIFI_BITS,
-+              .pcmrate = WM8711_RATES,
-+              .pcmdir = WM8711_DIR,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * read wm8711 register cache
-+ */
-+static inline unsigned int wm8711_read_reg_cache(struct snd_soc_codec * codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg == WM8711_RESET)
-+              return 0;
-+      if (reg >= WM8711_CACHEREGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write wm8711 register cache
-+ */
-+static inline void wm8711_write_reg_cache(struct snd_soc_codec *codec,
-+      u16 reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg >= WM8711_CACHEREGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+/*
-+ * write to the WM8711 register space
-+ */
-+static int wm8711_write(struct snd_soc_codec * codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8753 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8711_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -EIO;
-+}
-+
-+#define wm8711_reset(c)       wm8711_write(c, WM8711_RESET, 0)
-+
-+static const struct snd_kcontrol_new wm8711_snd_controls[] = {
-+
-+SOC_DOUBLE_R("Master Playback Volume", WM8711_LOUT1V, WM8711_ROUT1V,
-+      0, 127, 0),
-+SOC_DOUBLE_R("Master Playback ZC Switch", WM8711_LOUT1V, WM8711_ROUT1V,
-+      7, 1, 0),
-+
-+};
-+
-+/* add non dapm controls */
-+static int wm8711_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8711_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8711_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      return 0;
-+}
-+
-+/* Output Mixer */
-+static const snd_kcontrol_new_t wm8711_output_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8711_APANA, 3, 1, 0),
-+SOC_DAPM_SINGLE("HiFi Playback Switch", WM8711_APANA, 4, 1, 0),
-+};
-+
-+static const struct snd_soc_dapm_widget wm8711_dapm_widgets[] = {
-+SND_SOC_DAPM_MIXER("Output Mixer", WM8711_PWR, 4, 1,
-+      &wm8711_output_mixer_controls[0],
-+      ARRAY_SIZE(wm8711_output_mixer_controls)),
-+SND_SOC_DAPM_DAC("DAC", "HiFi Playback", WM8711_PWR, 3, 1),
-+SND_SOC_DAPM_OUTPUT("LOUT"),
-+SND_SOC_DAPM_OUTPUT("LHPOUT"),
-+SND_SOC_DAPM_OUTPUT("ROUT"),
-+SND_SOC_DAPM_OUTPUT("RHPOUT"),
-+};
-+
-+static const char *intercon[][3] = {
-+      /* output mixer */
-+      {"Output Mixer", "Line Bypass Switch", "Line Input"},
-+      {"Output Mixer", "HiFi Playback Switch", "DAC"},
-+
-+      /* outputs */
-+      {"RHPOUT", NULL, "Output Mixer"},
-+      {"ROUT", NULL, "Output Mixer"},
-+      {"LHPOUT", NULL, "Output Mixer"},
-+      {"LOUT", NULL, "Output Mixer"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm8711_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm8711_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8711_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path interconnects */
-+      for(i = 0; intercon[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, intercon[i][0], intercon[i][1],
-+                      intercon[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+struct _coeff_div {
-+      u32 mclk;
-+      u32 rate;
-+      u16 fs;
-+      u8 sr:4;
-+      u8 bosr:1;
-+      u8 usb:1;
-+};
-+
-+/* codec mclk clock divider coefficients */
-+static const struct _coeff_div coeff_div[] = {
-+      /* 48k */
-+      {12288000, 48000, 256, 0x0, 0x0, 0x0},
-+      {18432000, 48000, 384, 0x0, 0x1, 0x0},
-+      {12000000, 48000, 250, 0x0, 0x0, 0x1},
-+
-+      /* 32k */
-+      {12288000, 32000, 384, 0x6, 0x0, 0x0},
-+      {18432000, 32000, 576, 0x6, 0x1, 0x0},
-+
-+      /* 8k */
-+      {12288000, 8000, 1536, 0x3, 0x0, 0x0},
-+      {18432000, 8000, 2304, 0x3, 0x1, 0x0},
-+      {11289600, 8000, 1408, 0xb, 0x0, 0x0},
-+      {16934400, 8000, 2112, 0xb, 0x1, 0x0},
-+      {12000000, 8000, 1500, 0x3, 0x0, 0x1},
-+
-+      /* 96k */
-+      {12288000, 96000, 128, 0x7, 0x0, 0x0},
-+      {18432000, 96000, 192, 0x7, 0x1, 0x0},
-+      {12000000, 96000, 125, 0x7, 0x0, 0x1},
-+
-+      /* 44.1k */
-+      {11289600, 44100, 256, 0x8, 0x0, 0x0},
-+      {16934400, 44100, 384, 0x8, 0x1, 0x0},
-+      {12000000, 44100, 272, 0x8, 0x1, 0x1},
-+
-+      /* 88.2k */
-+      {11289600, 88200, 128, 0xf, 0x0, 0x0},
-+      {16934400, 88200, 192, 0xf, 0x1, 0x0},
-+      {12000000, 88200, 136, 0xf, 0x1, 0x1},
-+};
-+
-+static inline int get_coeff(int mclk, int rate)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
-+              if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)
-+                      return i;
-+      }
-+      return 0;
-+}
-+
-+/* WM8711 supports numerous clocks per sample rate */
-+static unsigned int wm8711_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      dai->mclk = 0;
-+
-+      /* check that the calculated FS and rate actually match a clock from
-+       * the machine driver */
-+      if (info->fs * info->rate == clk)
-+              dai->mclk = clk;
-+
-+      return dai->mclk;
-+}
-+
-+static int wm8711_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 iface = 0, srate;
-+      int i = get_coeff(rtd->codec_dai->mclk,
-+              snd_soc_get_rate(rtd->codec_dai->dai_runtime.pcmrate));
-+
-+      /* set master/slave audio interface */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              iface |= 0x0040;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              break;
-+      }
-+      srate = (coeff_div[i].sr << 2) | (coeff_div[i].bosr << 1) |
-+              coeff_div[i].usb;
-+      wm8711_write(codec, WM8711_SRATE, srate);
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              iface |= 0x0002;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              iface |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              iface |= 0x0003;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_B:
-+              iface |= 0x0013;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FORMAT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FORMAT_S20_3LE:
-+              iface |= 0x0004;
-+              break;
-+      case SNDRV_PCM_FORMAT_S24_LE:
-+              iface |= 0x0008;
-+              break;
-+      case SNDRV_PCM_FORMAT_S32_LE:
-+              iface |= 0x000c;
-+              break;
-+      }
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_NB_NF:
-+              break;
-+      case SND_SOC_DAIFMT_IB_IF:
-+              iface |= 0x0090;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              iface |= 0x0080;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              iface |= 0x0010;
-+              break;
-+      }
-+
-+      /* set iface */
-+      wm8711_write(codec, WM8711_IFACE, iface);
-+
-+    /* set active */
-+    wm8711_write(codec, WM8711_ACTIVE, 0x0001);
-+    return 0;
-+}
-+
-+static void wm8711_shutdown(struct snd_pcm_substream *substream)
-+{
-+    struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+    struct snd_soc_device *socdev = rtd->socdev;
-+    struct snd_soc_codec *codec = socdev->codec;
-+
-+    /* deactivate */
-+    if (!codec->active) {
-+        udelay(50);
-+        wm8711_write(codec, WM8711_ACTIVE, 0x0);
-+    }
-+}
-+
-+static int wm8711_mute(struct snd_soc_codec *codec,
-+    struct snd_soc_codec_dai *dai, int mute)
-+{
-+    u16 mute_reg = wm8711_read_reg_cache(codec, WM8711_APDIGI) & 0xfff7;
-+    if (mute)
-+        wm8711_write(codec, WM8711_APDIGI, mute_reg | 0x8);
-+    else
-+        wm8711_write(codec, WM8711_APDIGI, mute_reg);
-+
-+      return 0;
-+}
-+
-+static int wm8711_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+      u16 reg = wm8711_read_reg_cache(codec, WM8711_PWR) & 0xff7f;
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* vref/mid, osc on, dac unmute */
-+              wm8711_write(codec, WM8711_PWR, reg);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* everything off except vref/vmid, */
-+              wm8711_write(codec, WM8711_PWR, reg | 0x0040);
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              /* everything off, dac mute, inactive */
-+              wm8711_write(codec, WM8711_ACTIVE, 0x0);
-+              wm8711_write(codec, WM8711_PWR, 0xffff);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai wm8711_dai = {
-+      .name = "WM8711",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .config_sysclk = wm8711_config_sysclk,
-+      .digital_mute = wm8711_mute,
-+      .ops = {
-+              .prepare = wm8711_pcm_prepare,
-+        .shutdown = wm8711_shutdown,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8711_modes),
-+              .mode = wm8711_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm8711_dai);
-+
-+static int wm8711_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8711_write(codec, WM8711_ACTIVE, 0x0);
-+      wm8711_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8711_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8711_reg); i++) {
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+      wm8711_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8711_dapm_event(codec, codec->suspend_dapm_state);
-+      return 0;
-+}
-+
-+/*
-+ * initialise the WM8711 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int wm8711_init(struct snd_soc_device* socdev)
-+{
-+      struct snd_soc_codec* codec = socdev->codec;
-+      int reg, ret = 0;
-+
-+      codec->name = "WM8711";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8711_read_reg_cache;
-+      codec->write = wm8711_write;
-+      codec->dapm_event = wm8711_dapm_event;
-+      codec->dai = &wm8711_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8711_reg);
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8711_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, wm8711_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm8711_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8711_reg);
-+
-+      wm8711_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if (ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* power on device */
-+      wm8711_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+
-+      /* set the update bits */
-+      reg = wm8711_read_reg_cache(codec, WM8711_LOUT1V);
-+      wm8711_write(codec, WM8711_LOUT1V, reg | 0x0100);
-+      reg = wm8711_read_reg_cache(codec, WM8711_ROUT1V);
-+      wm8711_write(codec, WM8711_ROUT1V, reg | 0x0100);
-+
-+      wm8711_add_controls(codec);
-+      wm8711_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+    if (ret < 0) {
-+        snd_soc_free_pcms(socdev);
-+        snd_soc_dapm_free(socdev);
-+    }
-+
-+      return ret;
-+}
-+
-+static struct snd_soc_device *wm8711_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+/*
-+ * WM8711 2 wire address is determined by GPIO5
-+ * state during powerup.
-+ *    low  = 0x1a
-+ *    high = 0x1b
-+ */
-+#define I2C_DRIVERID_WM8711 0xfefe /* liam -  need a proper id */
-+
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver wm8711_i2c_driver;
-+static struct i2c_client client_template;
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+
-+static int wm8711_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = wm8711_socdev;
-+      struct wm8711_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL){
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+
-+      i2c_set_clientdata(i2c, codec);
-+
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if (ret < 0) {
-+              err("failed to attach codec at addr %x\n", addr);
-+        goto err;
-+    }
-+
-+      ret = wm8711_init(socdev);
-+    if (ret < 0) {
-+        err("failed to initialise WM8711\n");
-+        goto err;
-+    }
-+    return ret;
-+
-+err:
-+    kfree(codec);
-+    kfree(i2c);
-+    return ret;
-+
-+}
-+
-+static int wm8711_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec* codec = i2c_get_clientdata(client);
-+
-+      i2c_detach_client(client);
-+
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+
-+      return 0;
-+}
-+
-+static int wm8711_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, wm8711_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver wm8711_i2c_driver = {
-+      .driver = {
-+              .name = "WM8711 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_WM8711,
-+      .attach_adapter = wm8711_i2c_attach,
-+      .detach_client =  wm8711_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "WM8711",
-+      .driver = &wm8711_i2c_driver,
-+};
-+#endif
-+
-+static int wm8711_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8711_setup_data *setup;
-+      struct snd_soc_codec* codec;
-+      int ret = 0;
-+
-+      info("WM8711 Audio Codec %s", WM8711_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      wm8711_socdev = socdev;
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&wm8711_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+      /* Add other interfaces here */
-+#endif
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8711_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8711_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&wm8711_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8711 = {
-+      .probe =        wm8711_probe,
-+      .remove =       wm8711_remove,
-+      .suspend =      wm8711_suspend,
-+      .resume =       wm8711_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8711);
-+
-+MODULE_DESCRIPTION("ASoC WM8711 driver");
-+MODULE_AUTHOR("Mike Arthur");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8711.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8711.h
-@@ -0,0 +1,39 @@
-+/*
-+ * wm8711.h  --  WM8711 Soc Audio driver
-+ *
-+ * Copyright 2006 Wolfson Microelectronics
-+ *
-+ * Author: Mike Arthur <linux@wolfsonmicro.com>
-+ *
-+ * Based on wm8731.h
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _WM8711_H
-+#define _WM8711_H
-+
-+/* WM8711 register space */
-+
-+#define WM8711_LOUT1V   0x02
-+#define WM8711_ROUT1V   0x03
-+#define WM8711_APANA    0x04
-+#define WM8711_APDIGI   0x05
-+#define WM8711_PWR      0x06
-+#define WM8711_IFACE    0x07
-+#define WM8711_SRATE    0x08
-+#define WM8711_ACTIVE   0x09
-+#define WM8711_RESET  0x0f
-+
-+#define WM8711_CACHEREGNUM    8
-+
-+struct wm8711_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+extern struct snd_soc_codec_dai wm8711_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_wm8711;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8980.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8980.c
-@@ -0,0 +1,991 @@
-+/*
-+ * wm8980.c  --  WM8980 ALSA Soc Audio driver
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ *
-+ * Authors:
-+ * Mike Arthur      <linux@wolfsonmicro.com>
-+ *
-+ * 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/moduleparam.h>
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8980.h"
-+
-+#define AUDIO_NAME "wm8980"
-+#define WM8980_VERSION "0.2"
-+
-+/*
-+ * Debug
-+ */
-+
-+#define WM8980_DEBUG 0
-+
-+#ifdef WM8980_DEBUG
-+#define dbg(format, arg...) \
-+      printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
-+#else
-+#define dbg(format, arg...) do {} while (0)
-+#endif
-+#define err(format, arg...) \
-+      printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-+#define info(format, arg...) \
-+      printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-+#define warn(format, arg...) \
-+      printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8980;
-+
-+/*
-+ * wm8980 register cache
-+ * We can't read the WM8980 register space when we are
-+ * using 2 wire for device control, so we cache them instead.
-+ */
-+static const u16 wm8980_reg[WM8980_CACHEREGNUM] = {
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0050, 0x0000, 0x0140, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x00ff,
-+    0x00ff, 0x0000, 0x0100, 0x00ff,
-+    0x00ff, 0x0000, 0x012c, 0x002c,
-+    0x002c, 0x002c, 0x002c, 0x0000,
-+    0x0032, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0038, 0x000b, 0x0032, 0x0000,
-+    0x0008, 0x000c, 0x0093, 0x00e9,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0033, 0x0010, 0x0010, 0x0100,
-+    0x0100, 0x0002, 0x0001, 0x0001,
-+    0x0039, 0x0039, 0x0039, 0x0039,
-+    0x0001, 0x0001,
-+};
-+
-+#define WM8980_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S  | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+    SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_DSP_B  | SND_SOC_DAIFMT_NB_NF   | \
-+    SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF  | SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM8980_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM8980_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+#define WM8980_PCM_FORMATS \
-+      (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
-+      SNDRV_PCM_FORMAT_S24_3LE | SNDRV_PCM_FORMAT_S24_LE  | \
-+    SNDRV_PCM_FORMAT_S32_LE)
-+
-+#define WM8980_BCLK \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | SND_SOC_FSBD(8) |\
-+    SND_SOC_FSBD(16) | SND_SOC_FSBD(32))
-+
-+static struct snd_soc_dai_mode wm8980_modes[] = {
-+      /* codec frame and clock master modes */
-+      {
-+              .fmt = WM8980_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8980_PCM_FORMATS,
-+              .pcmrate = WM8980_RATES,
-+              .pcmdir = WM8980_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = WM8980_BCLK,
-+      },
-+
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = WM8980_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+        .pcmfmt = WM8980_PCM_FORMATS,
-+        .pcmrate = WM8980_RATES,
-+        .pcmdir = WM8980_DIR,
-+        .fs = SND_SOC_FS_ALL,
-+        .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * read wm8980 register cache
-+ */
-+static inline unsigned int wm8980_read_reg_cache(struct snd_soc_codec  *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg == WM8980_RESET)
-+              return 0;
-+      if (reg >= WM8980_CACHEREGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write wm8980 register cache
-+ */
-+static inline void wm8980_write_reg_cache(struct snd_soc_codec  *codec,
-+      u16 reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg >= WM8980_CACHEREGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+/*
-+ * write to the WM8980 register space
-+ */
-+static int wm8980_write(struct snd_soc_codec  *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8980 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8980_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -1;
-+}
-+
-+#define wm8980_reset(c)       wm8980_write(c, WM8980_RESET, 0)
-+
-+static const char *wm8980_companding[] = {"Off", "NC", "u-law", "A-law" };
-+static const char *wm8980_deemp[] = {"None", "32kHz", "44.1kHz", "48kHz" };
-+static const char *wm8980_eqmode[] = {"Capture", "Playback" };
-+static const char *wm8980_bw[] = {"Narrow", "Wide" };
-+static const char *wm8980_eq1[] = {"80Hz", "105Hz", "135Hz", "175Hz" };
-+static const char *wm8980_eq2[] = {"230Hz", "300Hz", "385Hz", "500Hz" };
-+static const char *wm8980_eq3[] = {"650Hz", "850Hz", "1.1kHz", "1.4kHz" };
-+static const char *wm8980_eq4[] = {"1.8kHz", "2.4kHz", "3.2kHz", "4.1kHz" };
-+static const char *wm8980_eq5[] = {"5.3kHz", "6.9kHz", "9kHz", "11.7kHz" };
-+static const char *wm8980_alc[] =
-+    {"ALC both on", "ALC left only", "ALC right only", "Limiter" };
-+
-+static const struct soc_enum wm8980_enum[] = {
-+      SOC_ENUM_SINGLE(WM8980_COMP, 1, 4, wm8980_companding), /* adc */
-+      SOC_ENUM_SINGLE(WM8980_COMP, 3, 4, wm8980_companding), /* dac */
-+      SOC_ENUM_SINGLE(WM8980_DAC,  4, 4, wm8980_deemp),
-+      SOC_ENUM_SINGLE(WM8980_EQ1,  8, 2, wm8980_eqmode),
-+
-+      SOC_ENUM_SINGLE(WM8980_EQ1,  5, 4, wm8980_eq1),
-+      SOC_ENUM_SINGLE(WM8980_EQ2,  8, 2, wm8980_bw),
-+      SOC_ENUM_SINGLE(WM8980_EQ2,  5, 4, wm8980_eq2),
-+      SOC_ENUM_SINGLE(WM8980_EQ3,  8, 2, wm8980_bw),
-+
-+      SOC_ENUM_SINGLE(WM8980_EQ3,  5, 4, wm8980_eq3),
-+      SOC_ENUM_SINGLE(WM8980_EQ4,  8, 2, wm8980_bw),
-+      SOC_ENUM_SINGLE(WM8980_EQ4,  5, 4, wm8980_eq4),
-+      SOC_ENUM_SINGLE(WM8980_EQ5,  8, 2, wm8980_bw),
-+
-+      SOC_ENUM_SINGLE(WM8980_EQ5,  5, 4, wm8980_eq5),
-+      SOC_ENUM_SINGLE(WM8980_ALC3,  8, 2, wm8980_alc),
-+};
-+
-+static const struct snd_kcontrol_new wm8980_snd_controls[] = {
-+SOC_SINGLE("Digital Loopback Switch", WM8980_COMP, 0, 1, 0),
-+
-+SOC_ENUM("ADC Companding", wm8980_enum[0]),
-+SOC_ENUM("DAC Companding", wm8980_enum[1]),
-+
-+SOC_SINGLE("Jack Detection Enable", WM8980_JACK1, 6, 1, 0),
-+
-+SOC_SINGLE("DAC Right Inversion Switch", WM8980_DAC, 1, 1, 0),
-+SOC_SINGLE("DAC Left Inversion Switch", WM8980_DAC, 0, 1, 0),
-+
-+SOC_SINGLE("Left Playback Volume", WM8980_DACVOLL, 0, 127, 0),
-+SOC_SINGLE("Right Playback Volume", WM8980_DACVOLR, 0, 127, 0),
-+
-+SOC_SINGLE("High Pass Filter Switch", WM8980_ADC, 8, 1, 0),
-+SOC_SINGLE("High Pass Filter Switch", WM8980_ADC, 8, 1, 0),
-+SOC_SINGLE("High Pass Cut Off", WM8980_ADC, 4, 7, 0),
-+SOC_SINGLE("Right ADC Inversion Switch", WM8980_ADC, 1, 1, 0),
-+SOC_SINGLE("Left ADC Inversion Switch", WM8980_ADC, 0, 1, 0),
-+
-+SOC_SINGLE("Left Capture Volume", WM8980_ADCVOLL,  0, 127, 0),
-+SOC_SINGLE("Right Capture Volume", WM8980_ADCVOLR,  0, 127, 0),
-+
-+SOC_ENUM("Equaliser Function", wm8980_enum[3]),
-+SOC_ENUM("EQ1 Cut Off", wm8980_enum[4]),
-+SOC_SINGLE("EQ1 Volume", WM8980_EQ1,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ2 Bandwith", wm8980_enum[5]),
-+SOC_ENUM("EQ2 Cut Off", wm8980_enum[6]),
-+SOC_SINGLE("EQ2 Volume", WM8980_EQ2,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ3 Bandwith", wm8980_enum[7]),
-+SOC_ENUM("EQ3 Cut Off", wm8980_enum[8]),
-+SOC_SINGLE("EQ3 Volume", WM8980_EQ3,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ4 Bandwith", wm8980_enum[9]),
-+SOC_ENUM("EQ4 Cut Off", wm8980_enum[10]),
-+SOC_SINGLE("EQ4 Volume", WM8980_EQ4,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ5 Bandwith", wm8980_enum[11]),
-+SOC_ENUM("EQ5 Cut Off", wm8980_enum[12]),
-+SOC_SINGLE("EQ5 Volume", WM8980_EQ5,  0, 31, 1),
-+
-+SOC_SINGLE("DAC Playback Limiter Switch", WM8980_DACLIM1,  8, 1, 0),
-+SOC_SINGLE("DAC Playback Limiter Decay", WM8980_DACLIM1,  4, 15, 0),
-+SOC_SINGLE("DAC Playback Limiter Attack", WM8980_DACLIM1,  0, 15, 0),
-+
-+SOC_SINGLE("DAC Playback Limiter Threshold", WM8980_DACLIM2,  4, 7, 0),
-+SOC_SINGLE("DAC Playback Limiter Boost", WM8980_DACLIM2,  0, 15, 0),
-+
-+SOC_SINGLE("ALC Enable Switch", WM8980_ALC1,  8, 1, 0),
-+SOC_SINGLE("ALC Capture Max Gain", WM8980_ALC1,  3, 7, 0),
-+SOC_SINGLE("ALC Capture Min Gain", WM8980_ALC1,  0, 7, 0),
-+
-+SOC_SINGLE("ALC Capture ZC Switch", WM8980_ALC2,  8, 1, 0),
-+SOC_SINGLE("ALC Capture Hold", WM8980_ALC2,  4, 7, 0),
-+SOC_SINGLE("ALC Capture Target", WM8980_ALC2,  0, 15, 0),
-+
-+SOC_ENUM("ALC Capture Mode", wm8980_enum[13]),
-+SOC_SINGLE("ALC Capture Decay", WM8980_ALC3,  4, 15, 0),
-+SOC_SINGLE("ALC Capture Attack", WM8980_ALC3,  0, 15, 0),
-+
-+SOC_SINGLE("ALC Capture Noise Gate Switch", WM8980_NGATE,  3, 1, 0),
-+SOC_SINGLE("ALC Capture Noise Gate Threshold", WM8980_NGATE,  0, 7, 0),
-+
-+SOC_SINGLE("Left Capture PGA ZC Switch", WM8980_INPPGAL,  7, 1, 0),
-+SOC_SINGLE("Left Capture PGA Volume", WM8980_INPPGAL,  0, 63, 0),
-+
-+SOC_SINGLE("Right Capture PGA ZC Switch", WM8980_INPPGAR,  7, 1, 0),
-+SOC_SINGLE("Right Capture PGA Volume", WM8980_INPPGAR,  0, 63, 0),
-+
-+SOC_SINGLE("Left Headphone Playback ZC Switch", WM8980_HPVOLL,  7, 1, 0),
-+SOC_SINGLE("Left Headphone Playback Switch", WM8980_HPVOLL,  6, 1, 1),
-+SOC_SINGLE("Left Headphone Playback Volume", WM8980_HPVOLL,  0, 63, 0),
-+
-+SOC_SINGLE("Right Headphone Playback ZC Switch", WM8980_HPVOLR,  7, 1, 0),
-+SOC_SINGLE("Right Headphone Playback Switch", WM8980_HPVOLR,  6, 1, 1),
-+SOC_SINGLE("Right Headphone Playback Volume", WM8980_HPVOLR,  0, 63, 0),
-+
-+SOC_SINGLE("Left Speaker Playback ZC Switch", WM8980_SPKVOLL,  7, 1, 0),
-+SOC_SINGLE("Left Speaker Playback Switch", WM8980_SPKVOLL,  6, 1, 1),
-+SOC_SINGLE("Left Speaker Playback Volume", WM8980_SPKVOLL,  0, 63, 0),
-+
-+SOC_SINGLE("Right Speaker Playback ZC Switch", WM8980_SPKVOLR,  7, 1, 0),
-+SOC_SINGLE("Right Speaker Playback Switch", WM8980_SPKVOLR,  6, 1, 1),
-+SOC_SINGLE("Right Speaker Playback Volume", WM8980_SPKVOLR,  0, 63, 0),
-+
-+SOC_DOUBLE_R("Capture Boost(+20dB)", WM8980_ADCBOOSTL, WM8980_ADCBOOSTR,
-+      8, 1, 0),
-+};
-+
-+/* add non dapm controls */
-+static int wm8980_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8980_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8980_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      return 0;
-+}
-+
-+/* Left Output Mixer */
-+static const snd_kcontrol_new_t wm8980_left_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Right PCM Playback Switch", WM8980_OUTPUT, 6, 1, 1),
-+SOC_DAPM_SINGLE("Left PCM Playback Switch", WM8980_MIXL, 0, 1, 1),
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8980_MIXL, 1, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", WM8980_MIXL, 5, 1, 0),
-+};
-+
-+/* Right Output Mixer */
-+static const snd_kcontrol_new_t wm8980_right_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Left PCM Playback Switch", WM8980_OUTPUT, 5, 1, 1),
-+SOC_DAPM_SINGLE("Right PCM Playback Switch", WM8980_MIXR, 0, 1, 1),
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8980_MIXR, 1, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", WM8980_MIXR, 5, 1, 0),
-+};
-+
-+/* Left AUX Input boost vol */
-+static const snd_kcontrol_new_t wm8980_laux_boost_controls =
-+SOC_DAPM_SINGLE("Left Aux Volume", WM8980_ADCBOOSTL, 0, 3, 0);
-+
-+/* Right AUX Input boost vol */
-+static const snd_kcontrol_new_t wm8980_raux_boost_controls =
-+SOC_DAPM_SINGLE("Right Aux Volume", WM8980_ADCBOOSTR, 0, 3, 0);
-+
-+/* Left Input boost vol */
-+static const snd_kcontrol_new_t wm8980_lmic_boost_controls =
-+SOC_DAPM_SINGLE("Left Input Volume", WM8980_ADCBOOSTL, 4, 3, 0);
-+
-+/* Right Input boost vol */
-+static const snd_kcontrol_new_t wm8980_rmic_boost_controls =
-+SOC_DAPM_SINGLE("Right Input Volume", WM8980_ADCBOOSTR, 4, 3, 0);
-+
-+/* Left Aux In to PGA */
-+static const snd_kcontrol_new_t wm8980_laux_capture_boost_controls =
-+SOC_DAPM_SINGLE("Left Capture Switch", WM8980_ADCBOOSTL,  8, 1, 0);
-+
-+/* Right  Aux In to PGA */
-+static const snd_kcontrol_new_t wm8980_raux_capture_boost_controls =
-+SOC_DAPM_SINGLE("Right Capture Switch", WM8980_ADCBOOSTR,  8, 1, 0);
-+
-+/* Left Input P In to PGA */
-+static const snd_kcontrol_new_t wm8980_lmicp_capture_boost_controls =
-+SOC_DAPM_SINGLE("Left Input P Capture Boost Switch", WM8980_INPUT,  0, 1, 0);
-+
-+/* Right Input P In to PGA */
-+static const snd_kcontrol_new_t wm8980_rmicp_capture_boost_controls =
-+SOC_DAPM_SINGLE("Right Input P Capture Boost Switch", WM8980_INPUT,  4, 1, 0);
-+
-+/* Left Input N In to PGA */
-+static const snd_kcontrol_new_t wm8980_lmicn_capture_boost_controls =
-+SOC_DAPM_SINGLE("Left Input N Capture Boost Switch", WM8980_INPUT,  1, 1, 0);
-+
-+/* Right Input N In to PGA */
-+static const snd_kcontrol_new_t wm8980_rmicn_capture_boost_controls =
-+SOC_DAPM_SINGLE("Right Input N Capture Boost Switch", WM8980_INPUT,  5, 1, 0);
-+
-+// TODO Widgets
-+static const struct snd_soc_dapm_widget wm8980_dapm_widgets[] = {
-+#if 0
-+//SND_SOC_DAPM_MUTE("Mono Mute", WM8980_MONOMIX, 6, 0),
-+//SND_SOC_DAPM_MUTE("Speaker Mute", WM8980_SPKMIX, 6, 0),
-+
-+SND_SOC_DAPM_MIXER("Speaker Mixer", WM8980_POWER3, 2, 0,
-+      &wm8980_speaker_mixer_controls[0],
-+      ARRAY_SIZE(wm8980_speaker_mixer_controls)),
-+SND_SOC_DAPM_MIXER("Mono Mixer", WM8980_POWER3, 3, 0,
-+      &wm8980_mono_mixer_controls[0],
-+      ARRAY_SIZE(wm8980_mono_mixer_controls)),
-+SND_SOC_DAPM_DAC("DAC", "HiFi Playback", WM8980_POWER3, 0, 0),
-+SND_SOC_DAPM_ADC("ADC", "HiFi Capture", WM8980_POWER3, 0, 0),
-+SND_SOC_DAPM_PGA("Aux Input", WM8980_POWER1, 6, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("SpkN Out", WM8980_POWER3, 5, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("SpkP Out", WM8980_POWER3, 6, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mono Out", WM8980_POWER3, 7, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic PGA", WM8980_POWER2, 2, 0, NULL, 0),
-+
-+SND_SOC_DAPM_PGA("Aux Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8980_aux_boost_controls, 1),
-+SND_SOC_DAPM_PGA("Mic Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8980_mic_boost_controls, 1),
-+SND_SOC_DAPM_SWITCH("Capture Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8980_capture_boost_controls),
-+
-+SND_SOC_DAPM_MIXER("Boost Mixer", WM8980_POWER2, 4, 0, NULL, 0),
-+
-+SND_SOC_DAPM_MICBIAS("Mic Bias", WM8980_POWER1, 4, 0),
-+
-+SND_SOC_DAPM_INPUT("MICN"),
-+SND_SOC_DAPM_INPUT("MICP"),
-+SND_SOC_DAPM_INPUT("AUX"),
-+SND_SOC_DAPM_OUTPUT("MONOOUT"),
-+SND_SOC_DAPM_OUTPUT("SPKOUTP"),
-+SND_SOC_DAPM_OUTPUT("SPKOUTN"),
-+#endif
-+};
-+
-+static const char *audio_map[][3] = {
-+      /* Mono output mixer */
-+      {"Mono Mixer", "PCM Playback Switch", "DAC"},
-+      {"Mono Mixer", "Aux Playback Switch", "Aux Input"},
-+      {"Mono Mixer", "Line Bypass Switch", "Boost Mixer"},
-+
-+      /* Speaker output mixer */
-+      {"Speaker Mixer", "PCM Playback Switch", "DAC"},
-+      {"Speaker Mixer", "Aux Playback Switch", "Aux Input"},
-+      {"Speaker Mixer", "Line Bypass Switch", "Boost Mixer"},
-+
-+      /* Outputs */
-+      {"Mono Out", NULL, "Mono Mixer"},
-+      {"MONOOUT", NULL, "Mono Out"},
-+      {"SpkN Out", NULL, "Speaker Mixer"},
-+      {"SpkP Out", NULL, "Speaker Mixer"},
-+      {"SPKOUTN", NULL, "SpkN Out"},
-+      {"SPKOUTP", NULL, "SpkP Out"},
-+
-+      /* Boost Mixer */
-+      {"Boost Mixer", NULL, "ADC"},
-+      {"Capture Boost Switch", "Aux Capture Boost Switch", "AUX"},
-+      {"Aux Boost", "Aux Volume", "Boost Mixer"},
-+      {"Capture Boost", "Capture Switch", "Boost Mixer"},
-+      {"Mic Boost", "Mic Volume", "Boost Mixer"},
-+
-+      /* Inputs */
-+      {"MICP", NULL, "Mic Boost"},
-+      {"MICN", NULL, "Mic PGA"},
-+      {"Mic PGA", NULL, "Capture Boost"},
-+      {"AUX", NULL, "Aux Input"},
-+
-+    /*  */
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm8980_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm8980_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8980_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path map */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1],
-+            audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+struct pll_ {
-+      unsigned int in_hz, out_hz;
-+      unsigned int pre:4; /* prescale - 1 */
-+      unsigned int n:4;
-+      unsigned int k;
-+};
-+
-+struct pll_ pll[] = {
-+      {12000000, 11289600, 0, 7, 0x86c220},
-+      {12000000, 12288000, 0, 8, 0x3126e8},
-+      {13000000, 11289600, 0, 6, 0xf28bd4},
-+      {13000000, 12288000, 0, 7, 0x8fd525},
-+      {12288000, 11289600, 0, 7, 0x59999a},
-+      {11289600, 12288000, 0, 8, 0x80dee9},
-+      /* TODO: liam - add more entries */
-+};
-+
-+static int set_pll(struct snd_soc_codec *codec, unsigned int in,
-+      unsigned int out)
-+{
-+      int i;
-+      u16 reg;
-+
-+      if(out == 0) {
-+              reg = wm8980_read_reg_cache(codec, WM8980_POWER1);
-+              wm8980_write(codec, WM8980_POWER1, reg & 0x1df);
-+              return 0;
-+      }
-+
-+      for(i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (in == pll[i].in_hz && out == pll[i].out_hz) {
-+                      wm8980_write(codec, WM8980_PLLN, (pll[i].pre << 4) | pll[i].n);
-+                      wm8980_write(codec, WM8980_PLLK1, pll[i].k >> 18);
-+                      wm8980_write(codec, WM8980_PLLK1, (pll[i].k >> 9) && 0x1ff);
-+                      wm8980_write(codec, WM8980_PLLK1, pll[i].k && 0x1ff);
-+                      reg = wm8980_read_reg_cache(codec, WM8980_POWER1);
-+                      wm8980_write(codec, WM8980_POWER1, reg | 0x020);
-+                      return 0;
-+              }
-+      }
-+      return -EINVAL;
-+}
-+
-+/* mclk dividers * 2 */
-+static unsigned char mclk_div[] = {2, 3, 4, 6, 8, 12, 16, 24};
-+
-+/* we need 256FS to drive the DAC's and ADC's */
-+static unsigned int wm8980_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      int i, j, best_clk = info->fs * info->rate;
-+
-+      /* can we run at this clk without the PLL ? */
-+      for (i = 0; i < ARRAY_SIZE(mclk_div); i++) {
-+              if ((best_clk >> 1) * mclk_div[i] == clk) {
-+                      dai->pll_in = 0;
-+                      dai->clk_div = mclk_div[i];
-+                      dai->mclk = best_clk;
-+                      return dai->mclk;
-+              }
-+      }
-+
-+      /* now check for PLL support */
-+      for (i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (pll[i].in_hz == clk) {
-+                      for (j = 0; j < ARRAY_SIZE(mclk_div); j++) {
-+                              if (pll[i].out_hz == mclk_div[j] * (best_clk >> 1)) {
-+                                      dai->pll_in = clk;
-+                                      dai->pll_out = pll[i].out_hz;
-+                                      dai->clk_div = mclk_div[j];
-+                                      dai->mclk = best_clk;
-+                                      return dai->mclk;
-+                              }
-+                      }
-+              }
-+      }
-+
-+      /* this clk is not supported */
-+      return 0;
-+}
-+
-+static int wm8980_pcm_prepare(snd_pcm_substream_t *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct snd_soc_codec_dai *dai = rtd->codec_dai;
-+      u16 iface = 0, bfs, clk = 0, adn;
-+      int fs = 48000 << 7, i;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+      switch (bfs) {
-+      case 2:
-+              clk |= 0x1 << 2;
-+              break;
-+      case 4:
-+              clk |= 0x2 << 2;
-+              break;
-+      case 8:
-+              clk |= 0x3 << 2;
-+              break;
-+      case 16:
-+              clk |= 0x4 << 2;
-+              break;
-+      case 32:
-+              clk |= 0x5 << 2;
-+              break;
-+      }
-+
-+      /* set master/slave audio interface */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              clk |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              break;
-+      }
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              iface |= 0x0010;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              iface |= 0x0008;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              iface |= 0x00018;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              iface |= 0x0020;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              iface |= 0x0040;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              iface |= 0x0060;
-+              break;
-+      }
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_NB_NF:
-+              break;
-+      case SND_SOC_DAIFMT_IB_IF:
-+              iface |= 0x0180;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              iface |= 0x0100;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              iface |= 0x0080;
-+              break;
-+      }
-+
-+      /* filter coefficient */
-+      adn = wm8980_read_reg_cache(codec, WM8980_ADD) & 0x1f1;
-+      switch (rtd->codec_dai->dai_runtime.pcmrate) {
-+      case SNDRV_PCM_RATE_8000:
-+              adn |= 0x5 << 1;
-+              fs = 8000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_11025:
-+              adn |= 0x4 << 1;
-+              fs = 11025 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_16000:
-+              adn |= 0x3 << 1;
-+              fs = 16000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_22050:
-+              adn |= 0x2 << 1;
-+              fs = 22050 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_32000:
-+              adn |= 0x1 << 1;
-+              fs = 32000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_44100:
-+              fs = 44100 << 7;
-+              break;
-+      }
-+
-+      /* do we need to enable the PLL */
-+      if(dai->pll_in)
-+              set_pll(codec, dai->pll_in, dai->pll_out);
-+
-+      /* divide the clock to 256 fs */
-+      for(i = 0; i < ARRAY_SIZE(mclk_div); i++) {
-+              if (dai->clk_div == mclk_div[i]) {
-+                      clk |= i << 5;
-+                      clk &= 0xff;
-+                      goto set;
-+              }
-+      }
-+
-+set:
-+      /* set iface */
-+      wm8980_write(codec, WM8980_IFACE, iface);
-+      wm8980_write(codec, WM8980_CLOCK, clk);
-+
-+      return 0;
-+}
-+
-+static int wm8980_hw_free(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      set_pll(codec, 0, 0);
-+      return 0;
-+}
-+
-+static int wm8980_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = wm8980_read_reg_cache(codec, WM8980_DAC) & 0xffbf;
-+      if(mute)
-+              wm8980_write(codec, WM8980_DAC, mute_reg | 0x40);
-+      else
-+              wm8980_write(codec, WM8980_DAC, mute_reg);
-+
-+      return 0;
-+}
-+
-+/* TODO: liam need to make this lower power with dapm */
-+static int wm8980_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* vref/mid, clk and osc on, dac unmute, active */
-+              wm8980_write(codec, WM8980_POWER1, 0x1ff);
-+              wm8980_write(codec, WM8980_POWER2, 0x1ff);
-+              wm8980_write(codec, WM8980_POWER3, 0x1ff);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* everything off except vref/vmid, dac mute, inactive */
-+
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              /* everything off, dac mute, inactive */
-+              wm8980_write(codec, WM8980_POWER1, 0x0);
-+              wm8980_write(codec, WM8980_POWER2, 0x0);
-+              wm8980_write(codec, WM8980_POWER3, 0x0);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai wm8980_dai = {
-+      .name = "WM8980 HiFi",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .config_sysclk = wm8980_config_sysclk,
-+      .digital_mute = wm8980_mute,
-+      .ops = {
-+              .prepare = wm8980_pcm_prepare,
-+              .hw_free = wm8980_hw_free,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8980_modes),
-+              .mode = wm8980_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm8980_dai);
-+
-+static int wm8980_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8980_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8980_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8980_reg); i++) {
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+      wm8980_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8980_dapm_event(codec, codec->suspend_dapm_state);
-+      return 0;
-+}
-+
-+/*
-+ * initialise the WM8980 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int wm8980_init(struct snd_soc_device* socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int ret = 0;
-+
-+      codec->name = "WM8980";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8980_read_reg_cache;
-+      codec->write = wm8980_write;
-+      codec->dapm_event = wm8980_dapm_event;
-+      codec->dai = &wm8980_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8980_reg);
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8980_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, wm8980_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm8980_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8980_reg);
-+
-+      wm8980_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if(ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* power on device */
-+      wm8980_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8980_add_controls(codec);
-+      wm8980_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if(ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+static struct snd_soc_device *wm8980_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+/*
-+ * WM8980 2 wire address is 0x1a
-+ */
-+#define I2C_DRIVERID_WM8980 0xfefe /* liam -  need a proper id */
-+
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver wm8980_i2c_driver;
-+static struct i2c_client client_template;
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+
-+static int wm8980_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = wm8980_socdev;
-+      struct wm8980_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL){
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+
-+      i2c_set_clientdata(i2c, codec);
-+
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if(ret < 0) {
-+              err("failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = wm8980_init(socdev);
-+      if(ret < 0) {
-+              err("failed to initialise WM8980\n");
-+              goto err;
-+      }
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+
-+}
-+
-+static int wm8980_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec *codec = i2c_get_clientdata(client);
-+
-+      i2c_detach_client(client);
-+
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+
-+      return 0;
-+}
-+
-+static int wm8980_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, wm8980_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver wm8980_i2c_driver = {
-+      .driver = {
-+              .name = "WM8980 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_WM8980,
-+      .attach_adapter = wm8980_i2c_attach,
-+      .detach_client =  wm8980_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "WM8980",
-+      .driver = &wm8980_i2c_driver,
-+};
-+#endif
-+
-+static int wm8980_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8980_setup_data *setup;
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      info("WM8980 Audio Codec %s", WM8980_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      wm8980_socdev = socdev;
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&wm8980_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+      /* Add other interfaces here */
-+#endif
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8980_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8980_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&wm8980_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8980 = {
-+      .probe =        wm8980_probe,
-+      .remove =       wm8980_remove,
-+      .suspend =      wm8980_suspend,
-+      .resume =       wm8980_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8980);
-+
-+MODULE_DESCRIPTION("ASoC WM8980 driver");
-+MODULE_AUTHOR("Mike Arthur");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8980.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8980.h
-@@ -0,0 +1,77 @@
-+/*
-+ * wm8980.h  --  WM8980 Soc Audio driver
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _WM8980_H
-+#define _WM8980_H
-+
-+/* WM8980 register space */
-+
-+#define WM8980_RESET          0x0
-+#define WM8980_POWER1         0x1
-+#define WM8980_POWER2         0x2
-+#define WM8980_POWER3         0x3
-+#define WM8980_IFACE          0x4
-+#define WM8980_COMP                   0x5
-+#define WM8980_CLOCK          0x6
-+#define WM8980_ADD                    0x7
-+#define WM8980_GPIO                   0x8
-+#define WM8980_JACK1        0x9
-+#define WM8980_DAC                    0xa
-+#define WM8980_DACVOLL            0xb
-+#define WM8980_DACVOLR      0xc
-+#define WM8980_JACK2        0xd
-+#define WM8980_ADC                    0xe
-+#define WM8980_ADCVOLL                0xf
-+#define WM8980_ADCVOLR      0x10
-+#define WM8980_EQ1                    0x12
-+#define WM8980_EQ2                    0x13
-+#define WM8980_EQ3                    0x14
-+#define WM8980_EQ4                    0x15
-+#define WM8980_EQ5                    0x16
-+#define WM8980_DACLIM1                0x18
-+#define WM8980_DACLIM2                0x19
-+#define WM8980_NOTCH1         0x1b
-+#define WM8980_NOTCH2         0x1c
-+#define WM8980_NOTCH3         0x1d
-+#define WM8980_NOTCH4         0x1e
-+#define WM8980_ALC1                   0x20
-+#define WM8980_ALC2                   0x21
-+#define WM8980_ALC3                   0x22
-+#define WM8980_NGATE          0x23
-+#define WM8980_PLLN                   0x24
-+#define WM8980_PLLK1          0x25
-+#define WM8980_PLLK2          0x26
-+#define WM8980_PLLK3          0x27
-+#define WM8980_VIDEO          0x28
-+#define WM8980_3D           0x29
-+#define WM8980_BEEP         0x2b
-+#define WM8980_INPUT          0x2c
-+#define WM8980_INPPGAL        0x2d
-+#define WM8980_INPPGAR      0x2e
-+#define WM8980_ADCBOOSTL      0x2f
-+#define WM8980_ADCBOOSTR    0x30
-+#define WM8980_OUTPUT         0x31
-+#define WM8980_MIXL           0x32
-+#define WM8980_MIXR         0x33
-+#define WM8980_HPVOLL         0x34
-+#define WM8980_HPVOLR       0x35
-+#define WM8980_SPKVOLL      0x36
-+#define WM8980_SPKVOLR      0x37
-+#define WM8980_OUT3MIX                0x38
-+#define WM8980_MONOMIX      0x39
-+
-+#define WM8980_CACHEREGNUM    58
-+
-+struct wm8980_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+extern struct snd_soc_codec_dai wm8980_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_wm8980;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/at91/eti_b1_wm8731.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/at91/eti_b1_wm8731.c
-@@ -0,0 +1,230 @@
-+/*
-+ * eti_b1_wm8731  --  SoC audio for Endrelia ETI_B1.
-+ *
-+ * Author:    Frank Mandarino <fmandarino@endrelia.com>
-+ *            Endrelia Technologies Inc.
-+ * Created:   Mar 29, 2006
-+ *
-+ * Based on corgi.c by:
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2005 Openedhand Ltd.
-+ *
-+ * Authors: Liam Girdwood <liam.girdwood@wolfsonmicro.com>
-+ *          Richard Purdie <richard@openedhand.com>
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    30th Nov 2005   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/clk.h>
-+#include <linux/timer.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+
-+#include <asm/arch/at91rm9200.h>
-+#include <asm/arch/gpio.h>
-+#include <asm/arch/hardware.h>
-+
-+#include "../codecs/wm8731.h"
-+#include "at91rm9200-pcm.h"
-+
-+#if 0
-+#define       DBG(x...)       printk(KERN_INFO "eti_b1_wm8731:" x)
-+#else
-+#define       DBG(x...)
-+#endif
-+
-+static struct clk *pck1_clk;
-+static struct clk *pllb_clk;
-+
-+static int eti_b1_startup(snd_pcm_substream_t *substream)
-+{
-+      /* Start PCK1 clock. */
-+      clk_enable(pck1_clk);
-+      DBG("pck1 started\n");
-+
-+      return 0;
-+}
-+
-+static void eti_b1_shutdown(snd_pcm_substream_t *substream)
-+{
-+      /* Stop PCK1 clock. */
-+      clk_disable(pck1_clk);
-+      DBG("pck1 stopped\n");
-+}
-+
-+static struct snd_soc_ops eti_b1_ops = {
-+      .startup = eti_b1_startup,
-+      .shutdown = eti_b1_shutdown,
-+};
-+
-+
-+static const struct snd_soc_dapm_widget eti_b1_dapm_widgets[] = {
-+      SND_SOC_DAPM_MIC("Int Mic", NULL),
-+      SND_SOC_DAPM_SPK("Ext Spk", NULL),
-+};
-+
-+static const char *intercon[][3] = {
-+
-+      /* speaker connected to LHPOUT */
-+      {"Ext Spk", NULL, "LHPOUT"},
-+
-+      /* mic is connected to Mic Jack, with WM8731 Mic Bias */
-+      {"MICIN", NULL, "Mic Bias"},
-+      {"Mic Bias", NULL, "Int Mic"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+/*
-+ * Logic for a wm8731 as connected on a Endrelia ETI-B1 board.
-+ */
-+static int eti_b1_wm8731_init(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      DBG("eti_b1_wm8731_init() called\n");
-+
-+      /* Add specific widgets */
-+      for(i = 0; i < ARRAY_SIZE(eti_b1_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &eti_b1_dapm_widgets[i]);
-+      }
-+
-+      /* Set up specific audio path interconnects */
-+      for(i = 0; intercon[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, intercon[i][0],
-+                      intercon[i][1], intercon[i][2]);
-+      }
-+
-+      /* not connected */
-+      snd_soc_dapm_set_endpoint(codec, "RLINEIN", 0);
-+      snd_soc_dapm_set_endpoint(codec, "LLINEIN", 0);
-+
-+      /* always connected */
-+      snd_soc_dapm_set_endpoint(codec, "Int Mic", 1);
-+      snd_soc_dapm_set_endpoint(codec, "Ext Spk", 1);
-+
-+      snd_soc_dapm_sync_endpoints(codec);
-+
-+      return 0;
-+}
-+
-+unsigned int eti_b1_config_sysclk(struct snd_soc_pcm_runtime *rtd,
-+      struct snd_soc_clock_info *info)
-+{
-+      if(info->bclk_master & SND_SOC_DAIFMT_CBS_CFS) {
-+              return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, 12000000);
-+      }
-+      return 0;
-+}
-+
-+static struct snd_soc_dai_link eti_b1_dai = {
-+      .name = "WM8731",
-+      .stream_name = "WM8731",
-+      .cpu_dai = &at91rm9200_i2s_dai[1],
-+      .codec_dai = &wm8731_dai,
-+      .init = eti_b1_wm8731_init,
-+      .config_sysclk = eti_b1_config_sysclk,
-+};
-+
-+static struct snd_soc_machine snd_soc_machine_eti_b1 = {
-+      .name = "ETI_B1",
-+      .dai_link = &eti_b1_dai,
-+      .num_links = 1,
-+      .ops = &eti_b1_ops,
-+};
-+
-+static struct wm8731_setup_data eti_b1_wm8731_setup = {
-+      .i2c_address = 0x1a,
-+};
-+
-+static struct snd_soc_device eti_b1_snd_devdata = {
-+      .machine = &snd_soc_machine_eti_b1,
-+      .platform = &at91rm9200_soc_platform,
-+      .codec_dev = &soc_codec_dev_wm8731,
-+      .codec_data = &eti_b1_wm8731_setup,
-+};
-+
-+static struct platform_device *eti_b1_snd_device;
-+
-+static int __init eti_b1_init(void)
-+{
-+      int ret;
-+      u32 ssc_pio_lines;
-+
-+      eti_b1_snd_device = platform_device_alloc("soc-audio", -1);
-+      if (!eti_b1_snd_device)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(eti_b1_snd_device, &eti_b1_snd_devdata);
-+      eti_b1_snd_devdata.dev = &eti_b1_snd_device->dev;
-+
-+      ret = platform_device_add(eti_b1_snd_device);
-+      if (ret) {
-+              platform_device_put(eti_b1_snd_device);
-+              return ret;
-+      }
-+
-+      ssc_pio_lines = AT91_PB6_TF1 | AT91_PB7_TK1 | AT91_PB8_TD1
-+                      | AT91_PB9_RD1 /* | AT91_PB10_RK1 | AT91_PB11_RF1 */;
-+
-+      /* Reset all PIO registers and assign lines to peripheral A */
-+      at91_sys_write(AT91_PIOB + PIO_PDR,  ssc_pio_lines);
-+      at91_sys_write(AT91_PIOB + PIO_ODR,  ssc_pio_lines);
-+      at91_sys_write(AT91_PIOB + PIO_IFDR, ssc_pio_lines);
-+      at91_sys_write(AT91_PIOB + PIO_CODR, ssc_pio_lines);
-+      at91_sys_write(AT91_PIOB + PIO_IDR,  ssc_pio_lines);
-+      at91_sys_write(AT91_PIOB + PIO_MDDR, ssc_pio_lines);
-+      at91_sys_write(AT91_PIOB + PIO_PUDR, ssc_pio_lines);
-+      at91_sys_write(AT91_PIOB + PIO_ASR,  ssc_pio_lines);
-+      at91_sys_write(AT91_PIOB + PIO_OWDR, ssc_pio_lines);
-+
-+      /*
-+       * Set PCK1 parent to PLLB and its rate to 12 Mhz.
-+       */
-+      pllb_clk = clk_get(NULL, "pllb");
-+      pck1_clk = clk_get(NULL, "pck1");
-+
-+      clk_set_parent(pck1_clk, pllb_clk);
-+      clk_set_rate(pck1_clk, 12000000);
-+
-+      DBG("MCLK rate %luHz\n", clk_get_rate(pck1_clk));
-+
-+      /* assign the GPIO pin to PCK1 */
-+      at91_set_B_periph(AT91_PIN_PA24, 0);
-+
-+      return ret;
-+}
-+
-+static void __exit eti_b1_exit(void)
-+{
-+      clk_put(pck1_clk);
-+      clk_put(pllb_clk);
-+
-+      platform_device_unregister(eti_b1_snd_device);
-+}
-+
-+module_init(eti_b1_init);
-+module_exit(eti_b1_exit);
-+
-+/* Module information */
-+MODULE_AUTHOR("Frank Mandarino <fmandarino@endrelia.com>");
-+MODULE_DESCRIPTION("ALSA SoC ETI-B1-WM8731");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8510.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8510.c
-@@ -0,0 +1,895 @@
-+/*
-+ * wm8510.c  --  WM8510 ALSA Soc Audio driver
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ *
-+ * Author: Liam Girdwood <liam.girdwood@wolfsonmicro.com>
-+ *
-+ * 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/moduleparam.h>
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8510.h"
-+
-+#define AUDIO_NAME "wm8510"
-+#define WM8510_VERSION "0.5"
-+
-+/*
-+ * Debug
-+ */
-+
-+#define WM8510_DEBUG 0
-+
-+#ifdef WM8510_DEBUG
-+#define dbg(format, arg...) \
-+      printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
-+#else
-+#define dbg(format, arg...) do {} while (0)
-+#endif
-+#define err(format, arg...) \
-+      printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-+#define info(format, arg...) \
-+      printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-+#define warn(format, arg...) \
-+      printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8510;
-+
-+/*
-+ * wm8510 register cache
-+ * We can't read the WM8510 register space when we are
-+ * using 2 wire for device control, so we cache them instead.
-+ */
-+static const u16 wm8510_reg[WM8510_CACHEREGNUM] = {
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0050, 0x0000, 0x0140, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x00ff,
-+    0x0000, 0x0000, 0x0100, 0x00ff,
-+    0x0000, 0x0000, 0x012c, 0x002c,
-+    0x002c, 0x002c, 0x002c, 0x0000,
-+    0x0032, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0038, 0x000b, 0x0032, 0x0000,
-+    0x0008, 0x000c, 0x0093, 0x00e9,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0003, 0x0010, 0x0000, 0x0000,
-+    0x0000, 0x0002, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0039, 0x0000,
-+    0x0000,
-+};
-+
-+#define WM8510_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+      SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \
-+      SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM8510_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM8510_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+#define WM8794_BCLK \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | SND_SOC_FSBD(8) |\
-+       SND_SOC_FSBD(16) | SND_SOC_FSBD(32))
-+
-+#define WM8794_HIFI_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
-+
-+static struct snd_soc_dai_mode wm8510_modes[] = {
-+      /* codec frame and clock master modes */
-+      {
-+              .fmt = WM8510_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8794_HIFI_BITS,
-+              .pcmrate = WM8510_RATES,
-+              .pcmdir = WM8510_DIR,
-+              .fs = 256,
-+              .bfs = WM8794_BCLK,
-+      },
-+
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = WM8510_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = WM8794_HIFI_BITS,
-+              .pcmrate = WM8510_RATES,
-+              .pcmdir = WM8510_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * read wm8510 register cache
-+ */
-+static inline unsigned int wm8510_read_reg_cache(struct snd_soc_codec * codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg == WM8510_RESET)
-+              return 0;
-+      if (reg >= WM8510_CACHEREGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write wm8510 register cache
-+ */
-+static inline void wm8510_write_reg_cache(struct snd_soc_codec *codec,
-+      u16 reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg >= WM8510_CACHEREGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+/*
-+ * write to the WM8510 register space
-+ */
-+static int wm8510_write(struct snd_soc_codec *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8510 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8510_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -EIO;
-+}
-+
-+#define wm8510_reset(c)       wm8510_write(c, WM8510_RESET, 0)
-+
-+static const char *wm8510_companding[] = {"Off", "NC", "u-law", "A-law" };
-+static const char *wm8510_deemp[] = {"None", "32kHz", "44.1kHz", "48kHz" };
-+static const char *wm8510_alc[] = {"ALC", "Limiter" };
-+
-+static const struct soc_enum wm8510_enum[] = {
-+      SOC_ENUM_SINGLE(WM8510_COMP, 1, 4, wm8510_companding), /* adc */
-+      SOC_ENUM_SINGLE(WM8510_COMP, 3, 4, wm8510_companding), /* dac */
-+      SOC_ENUM_SINGLE(WM8510_DAC,  4, 4, wm8510_deemp),
-+      SOC_ENUM_SINGLE(WM8510_ALC3,  8, 2, wm8510_alc),
-+};
-+
-+static const struct snd_kcontrol_new wm8510_snd_controls[] = {
-+
-+SOC_SINGLE("Digital Loopback Switch", WM8510_COMP, 0, 1, 0),
-+
-+SOC_ENUM("DAC Companding", wm8510_enum[1]),
-+SOC_ENUM("ADC Companding", wm8510_enum[0]),
-+
-+SOC_ENUM("Playback De-emphasis", wm8510_enum[2]),
-+SOC_SINGLE("DAC Inversion Switch", WM8510_DAC, 0, 1, 0),
-+
-+SOC_SINGLE("Master Playback Volume", WM8510_DACVOL, 0, 127, 0),
-+
-+SOC_SINGLE("High Pass Filter Switch", WM8510_ADC, 8, 1, 0),
-+SOC_SINGLE("High Pass Cut Off", WM8510_ADC, 4, 7, 0),
-+SOC_SINGLE("ADC Inversion Switch", WM8510_COMP, 0, 1, 0),
-+
-+SOC_SINGLE("Capture Volume", WM8510_ADCVOL,  0, 127, 0),
-+
-+SOC_SINGLE("DAC Playback Limiter Switch", WM8510_DACLIM1,  8, 1, 0),
-+SOC_SINGLE("DAC Playback Limiter Decay", WM8510_DACLIM1,  4, 15, 0),
-+SOC_SINGLE("DAC Playback Limiter Attack", WM8510_DACLIM1,  0, 15, 0),
-+
-+SOC_SINGLE("DAC Playback Limiter Threshold", WM8510_DACLIM2,  4, 7, 0),
-+SOC_SINGLE("DAC Playback Limiter Boost", WM8510_DACLIM2,  0, 15, 0),
-+
-+SOC_SINGLE("ALC Enable Switch", WM8510_ALC1,  8, 1, 0),
-+SOC_SINGLE("ALC Capture Max Gain", WM8510_ALC1,  3, 7, 0),
-+SOC_SINGLE("ALC Capture Min Gain", WM8510_ALC1,  0, 7, 0),
-+
-+SOC_SINGLE("ALC Capture ZC Switch", WM8510_ALC2,  8, 1, 0),
-+SOC_SINGLE("ALC Capture Hold", WM8510_ALC2,  4, 7, 0),
-+SOC_SINGLE("ALC Capture Target", WM8510_ALC2,  0, 15, 0),
-+
-+SOC_ENUM("ALC Capture Mode", wm8510_enum[3]),
-+SOC_SINGLE("ALC Capture Decay", WM8510_ALC3,  4, 15, 0),
-+SOC_SINGLE("ALC Capture Attack", WM8510_ALC3,  0, 15, 0),
-+
-+SOC_SINGLE("ALC Capture Noise Gate Switch", WM8510_NGATE,  3, 1, 0),
-+SOC_SINGLE("ALC Capture Noise Gate Threshold", WM8510_NGATE,  0, 7, 0),
-+
-+SOC_SINGLE("Capture PGA ZC Switch", WM8510_INPPGA,  7, 1, 0),
-+SOC_SINGLE("Capture PGA Volume", WM8510_INPPGA,  0, 63, 0),
-+
-+SOC_SINGLE("Speaker Playback ZC Switch", WM8510_SPKVOL,  7, 1, 0),
-+SOC_SINGLE("Speaker Playback Switch", WM8510_SPKVOL,  6, 1, 1),
-+SOC_SINGLE("Speaker Playback Volume", WM8510_SPKVOL,  0, 63, 0),
-+
-+SOC_SINGLE("Capture Boost(+20dB)", WM8510_ADCBOOST,  8, 1, 0),
-+SOC_SINGLE("Mono Playback Switch", WM8510_MONOMIX, 6, 1, 0),
-+};
-+
-+/* add non dapm controls */
-+static int wm8510_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8510_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8510_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      return 0;
-+}
-+
-+/* Speaker Output Mixer */
-+static const struct snd_kcontrol_new wm8510_speaker_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8510_SPKMIX, 1, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", WM8510_SPKMIX, 5, 1, 0),
-+SOC_DAPM_SINGLE("PCM Playback Switch", WM8510_SPKMIX, 0, 1, 1),
-+};
-+
-+/* Mono Output Mixer */
-+static const struct snd_kcontrol_new wm8510_mono_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8510_MONOMIX, 1, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", WM8510_MONOMIX, 2, 1, 0),
-+SOC_DAPM_SINGLE("PCM Playback Switch", WM8510_MONOMIX, 0, 1, 1),
-+};
-+
-+/* AUX Input boost vol */
-+static const struct snd_kcontrol_new wm8510_aux_boost_controls =
-+SOC_DAPM_SINGLE("Aux Volume", WM8510_ADCBOOST, 0, 7, 0);
-+
-+/* Mic Input boost vol */
-+static const struct snd_kcontrol_new wm8510_mic_boost_controls =
-+SOC_DAPM_SINGLE("Mic Volume", WM8510_ADCBOOST, 4, 7, 0);
-+
-+/* Capture boost switch */
-+static const struct snd_kcontrol_new wm8510_capture_boost_controls =
-+SOC_DAPM_SINGLE("Capture Boost Switch", WM8510_INPPGA,  6, 1, 0);
-+
-+/* Aux In to PGA */
-+static const struct snd_kcontrol_new wm8510_aux_capture_boost_controls =
-+SOC_DAPM_SINGLE("Aux Capture Boost Switch", WM8510_INPPGA,  2, 1, 0);
-+
-+/* Mic P In to PGA */
-+static const struct snd_kcontrol_new wm8510_micp_capture_boost_controls =
-+SOC_DAPM_SINGLE("Mic P Capture Boost Switch", WM8510_INPPGA,  0, 1, 0);
-+
-+/* Mic N In to PGA */
-+static const struct snd_kcontrol_new wm8510_micn_capture_boost_controls =
-+SOC_DAPM_SINGLE("Mic N Capture Boost Switch", WM8510_INPPGA,  1, 1, 0);
-+
-+static const struct snd_soc_dapm_widget wm8510_dapm_widgets[] = {
-+SND_SOC_DAPM_MIXER("Speaker Mixer", WM8510_POWER3, 2, 0,
-+      &wm8510_speaker_mixer_controls[0],
-+      ARRAY_SIZE(wm8510_speaker_mixer_controls)),
-+SND_SOC_DAPM_MIXER("Mono Mixer", WM8510_POWER3, 3, 0,
-+      &wm8510_mono_mixer_controls[0],
-+      ARRAY_SIZE(wm8510_mono_mixer_controls)),
-+SND_SOC_DAPM_DAC("DAC", "HiFi Playback", WM8510_POWER3, 0, 0),
-+SND_SOC_DAPM_ADC("ADC", "HiFi Capture", WM8510_POWER3, 0, 0),
-+SND_SOC_DAPM_PGA("Aux Input", WM8510_POWER1, 6, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("SpkN Out", WM8510_POWER3, 5, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("SpkP Out", WM8510_POWER3, 6, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mono Out", WM8510_POWER3, 7, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic PGA", WM8510_POWER2, 2, 0, NULL, 0),
-+
-+SND_SOC_DAPM_PGA("Aux Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8510_aux_boost_controls, 1),
-+SND_SOC_DAPM_PGA("Mic Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8510_mic_boost_controls, 1),
-+SND_SOC_DAPM_SWITCH("Capture Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8510_capture_boost_controls),
-+
-+SND_SOC_DAPM_MIXER("Boost Mixer", WM8510_POWER2, 4, 0, NULL, 0),
-+
-+SND_SOC_DAPM_MICBIAS("Mic Bias", WM8510_POWER1, 4, 0),
-+
-+SND_SOC_DAPM_INPUT("MICN"),
-+SND_SOC_DAPM_INPUT("MICP"),
-+SND_SOC_DAPM_INPUT("AUX"),
-+SND_SOC_DAPM_OUTPUT("MONOOUT"),
-+SND_SOC_DAPM_OUTPUT("SPKOUTP"),
-+SND_SOC_DAPM_OUTPUT("SPKOUTN"),
-+};
-+
-+static const char *audio_map[][3] = {
-+      /* Mono output mixer */
-+      {"Mono Mixer", "PCM Playback Switch", "DAC"},
-+      {"Mono Mixer", "Aux Playback Switch", "Aux Input"},
-+      {"Mono Mixer", "Line Bypass Switch", "Boost Mixer"},
-+
-+      /* Speaker output mixer */
-+      {"Speaker Mixer", "PCM Playback Switch", "DAC"},
-+      {"Speaker Mixer", "Aux Playback Switch", "Aux Input"},
-+      {"Speaker Mixer", "Line Bypass Switch", "Boost Mixer"},
-+
-+      /* Outputs */
-+      {"Mono Out", NULL, "Mono Mixer"},
-+      {"MONOOUT", NULL, "Mono Out"},
-+      {"SpkN Out", NULL, "Speaker Mixer"},
-+      {"SpkP Out", NULL, "Speaker Mixer"},
-+      {"SPKOUTN", NULL, "SpkN Out"},
-+      {"SPKOUTP", NULL, "SpkP Out"},
-+
-+      /* Boost Mixer */
-+      {"Boost Mixer", NULL, "ADC"},
-+    {"Capture Boost Switch", "Aux Capture Boost Switch", "AUX"},
-+      {"Aux Boost", "Aux Volume", "Boost Mixer"},
-+    {"Capture Boost", "Capture Switch", "Boost Mixer"},
-+      {"Mic Boost", "Mic Volume", "Boost Mixer"},
-+
-+      /* Inputs */
-+      {"MICP", NULL, "Mic Boost"},
-+      {"MICN", NULL, "Mic PGA"},
-+      {"Mic PGA", NULL, "Capture Boost"},
-+      {"AUX", NULL, "Aux Input"},
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm8510_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm8510_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8510_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path audio_mapnects */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0],
-+                      audio_map[i][1], audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+struct pll_ {
-+      unsigned int in_hz, out_hz;
-+      unsigned int pre:4; /* prescale - 1 */
-+      unsigned int n:4;
-+      unsigned int k;
-+};
-+
-+struct pll_ pll[] = {
-+      {12000000, 11289600, 0, 7, 0x86c220},
-+      {12000000, 12288000, 0, 8, 0x3126e8},
-+      {13000000, 11289600, 0, 6, 0xf28bd4},
-+      {13000000, 12288000, 0, 7, 0x8fd525},
-+      {12288000, 11289600, 0, 7, 0x59999a},
-+      {11289600, 12288000, 0, 8, 0x80dee9},
-+      /* liam - add more entries */
-+};
-+
-+static int set_pll(struct snd_soc_codec *codec, unsigned int in,
-+      unsigned int out)
-+{
-+      int i;
-+      u16 reg;
-+
-+      if(out == 0) {
-+              reg = wm8510_read_reg_cache(codec, WM8510_POWER1);
-+              wm8510_write(codec, WM8510_POWER1, reg & 0x1df);
-+              return 0;
-+      }
-+
-+      for(i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (in == pll[i].in_hz && out == pll[i].out_hz) {
-+                      wm8510_write(codec, WM8510_PLLN, (pll[i].pre << 4) | pll[i].n);
-+                      wm8510_write(codec, WM8510_PLLK1, pll[i].k >> 18);
-+                      wm8510_write(codec, WM8510_PLLK1, (pll[i].k >> 9) && 0x1ff);
-+                      wm8510_write(codec, WM8510_PLLK1, pll[i].k && 0x1ff);
-+                      reg = wm8510_read_reg_cache(codec, WM8510_POWER1);
-+                      wm8510_write(codec, WM8510_POWER1, reg | 0x020);
-+                      return 0;
-+              }
-+      }
-+      return -EINVAL;
-+}
-+
-+/* mclk dividers * 2 */
-+static unsigned char mclk_div[] = {2, 3, 4, 6, 8, 12, 16, 24};
-+
-+/* we need 256FS to drive the DAC's and ADC's */
-+static unsigned int wm8510_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      int i, j, best_clk = info->fs * info->rate;
-+
-+      /* can we run at this clk without the PLL ? */
-+      for (i = 0; i < ARRAY_SIZE(mclk_div); i++) {
-+              if ((best_clk >> 1) * mclk_div[i] == clk) {
-+                      dai->pll_in = 0;
-+                      dai->clk_div = mclk_div[i];
-+                      dai->mclk = best_clk;
-+                      return dai->mclk;
-+              }
-+      }
-+
-+      /* now check for PLL support */
-+      for (i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (pll[i].in_hz == clk) {
-+                      for (j = 0; j < ARRAY_SIZE(mclk_div); j++) {
-+                              if (pll[i].out_hz == mclk_div[j] * (best_clk >> 1)) {
-+                                      dai->pll_in = clk;
-+                                      dai->pll_out = pll[i].out_hz;
-+                                      dai->clk_div = mclk_div[j];
-+                                      dai->mclk = best_clk;
-+                                      return dai->mclk;
-+                              }
-+                      }
-+              }
-+      }
-+
-+      /* this clk is not supported */
-+      return 0;
-+}
-+
-+static int wm8510_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct snd_soc_codec_dai *dai = rtd->codec_dai;
-+      u16 iface = 0, bfs, clk = 0, adn;
-+      int fs = 48000 << 7, i;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+      switch (bfs) {
-+      case 2:
-+              clk |= 0x1 << 2;
-+              break;
-+      case 4:
-+              clk |= 0x2 << 2;
-+              break;
-+      case 8:
-+              clk |= 0x3 << 2;
-+              break;
-+      case 16:
-+              clk |= 0x4 << 2;
-+              break;
-+      case 32:
-+              clk |= 0x5 << 2;
-+              break;
-+      }
-+
-+      /* set master/slave audio interface */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              clk |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              break;
-+      }
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              iface |= 0x0010;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              iface |= 0x0008;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              iface |= 0x00018;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              iface |= 0x0020;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              iface |= 0x0040;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              iface |= 0x0060;
-+              break;
-+      }
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_NB_NF:
-+              break;
-+      case SND_SOC_DAIFMT_IB_IF:
-+              iface |= 0x0180;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              iface |= 0x0100;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              iface |= 0x0080;
-+              break;
-+      }
-+
-+      /* filter coefficient */
-+      adn = wm8510_read_reg_cache(codec, WM8510_ADD) & 0x1f1;
-+      switch (rtd->codec_dai->dai_runtime.pcmrate) {
-+      case SNDRV_PCM_RATE_8000:
-+              adn |= 0x5 << 1;
-+              fs = 8000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_11025:
-+              adn |= 0x4 << 1;
-+              fs = 11025 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_16000:
-+              adn |= 0x3 << 1;
-+              fs = 16000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_22050:
-+              adn |= 0x2 << 1;
-+              fs = 22050 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_32000:
-+              adn |= 0x1 << 1;
-+              fs = 32000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_44100:
-+              fs = 44100 << 7;
-+              break;
-+      }
-+
-+      /* do we need to enable the PLL */
-+      if(dai->pll_in)
-+              set_pll(codec, dai->pll_in, dai->pll_out);
-+
-+      /* divide the clock to 256 fs */
-+      for(i = 0; i < ARRAY_SIZE(mclk_div); i++) {
-+              if (dai->clk_div == mclk_div[i]) {
-+                      clk |= i << 5;
-+                      clk &= 0xff;
-+                      goto set;
-+              }
-+      }
-+
-+set:
-+      /* set iface */
-+      wm8510_write(codec, WM8510_IFACE, iface);
-+      wm8510_write(codec, WM8510_CLOCK, clk);
-+
-+      return 0;
-+}
-+
-+static int wm8510_hw_free(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      set_pll(codec, 0, 0);
-+      return 0;
-+}
-+
-+static int wm8510_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = wm8510_read_reg_cache(codec, WM8510_DAC) & 0xffbf;
-+      if(mute)
-+              wm8510_write(codec, WM8510_DAC, mute_reg | 0x40);
-+      else
-+              wm8510_write(codec, WM8510_DAC, mute_reg);
-+      return 0;
-+}
-+
-+/* liam need to make this lower power with dapm */
-+static int wm8510_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* vref/mid, clk and osc on, dac unmute, active */
-+              wm8510_write(codec, WM8510_POWER1, 0x1ff);
-+              wm8510_write(codec, WM8510_POWER2, 0x1ff);
-+              wm8510_write(codec, WM8510_POWER3, 0x1ff);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* everything off except vref/vmid, dac mute, inactive */
-+
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              /* everything off, dac mute, inactive */
-+              wm8510_write(codec, WM8510_POWER1, 0x0);
-+              wm8510_write(codec, WM8510_POWER2, 0x0);
-+              wm8510_write(codec, WM8510_POWER3, 0x0);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai wm8510_dai = {
-+      .name = "WM8510 HiFi",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 1,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 1,
-+      },
-+      .config_sysclk = wm8510_config_sysclk,
-+      .digital_mute = wm8510_mute,
-+      .ops = {
-+              .prepare = wm8510_pcm_prepare,
-+              .hw_free = wm8510_hw_free,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8510_modes),
-+              .mode = wm8510_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm8510_dai);
-+
-+static int wm8510_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8510_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8510_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8510_reg); i++) {
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+      wm8510_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8510_dapm_event(codec, codec->suspend_dapm_state);
-+      return 0;
-+}
-+
-+/*
-+ * initialise the WM8510 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int wm8510_init(struct snd_soc_device *socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int ret = 0;
-+
-+      codec->name = "WM8510";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8510_read_reg_cache;
-+      codec->write = wm8510_write;
-+      codec->dapm_event = wm8510_dapm_event;
-+      codec->dai = &wm8510_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8510_reg);
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8510_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, wm8510_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm8510_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8510_reg);
-+
-+      wm8510_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if(ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* power on device */
-+      wm8510_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8510_add_controls(codec);
-+      wm8510_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if(ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+static struct snd_soc_device *wm8510_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+/*
-+ * WM8510 2 wire address is 0x1a
-+ */
-+#define I2C_DRIVERID_WM8510 0xfefe /* liam -  need a proper id */
-+
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver wm8510_i2c_driver;
-+static struct i2c_client client_template;
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+
-+static int wm8510_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = wm8510_socdev;
-+      struct wm8510_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL){
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+      i2c_set_clientdata(i2c, codec);
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if(ret < 0) {
-+              err("failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = wm8510_init(socdev);
-+      if(ret < 0) {
-+              err("failed to initialise WM8510\n");
-+              goto err;
-+      }
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+}
-+
-+static int wm8510_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec *codec = i2c_get_clientdata(client);
-+      i2c_detach_client(client);
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+      return 0;
-+}
-+
-+static int wm8510_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, wm8510_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver wm8510_i2c_driver = {
-+      .driver = {
-+              .name = "WM8510 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_WM8510,
-+      .attach_adapter = wm8510_i2c_attach,
-+      .detach_client =  wm8510_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "WM8510",
-+      .driver = &wm8510_i2c_driver,
-+};
-+#endif
-+
-+static int wm8510_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8510_setup_data *setup;
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      info("WM8510 Audio Codec %s", WM8510_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      wm8510_socdev = socdev;
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&wm8510_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+      /* Add other interfaces here */
-+#endif
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8510_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8510_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&wm8510_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8510 = {
-+      .probe =        wm8510_probe,
-+      .remove =       wm8510_remove,
-+      .suspend =      wm8510_suspend,
-+      .resume =       wm8510_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8510);
-+
-+MODULE_DESCRIPTION("ASoC WM8510 driver");
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8510.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8510.h
-@@ -0,0 +1,64 @@
-+/*
-+ * wm8510.h  --  WM8510 Soc Audio driver
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _WM8510_H
-+#define _WM8510_H
-+
-+/* WM8510 register space */
-+
-+#define WM8510_RESET          0x0
-+#define WM8510_POWER1         0x1
-+#define WM8510_POWER2         0x2
-+#define WM8510_POWER3         0x3
-+#define WM8510_IFACE          0x4
-+#define WM8510_COMP                   0x5
-+#define WM8510_CLOCK          0x6
-+#define WM8510_ADD                    0x7
-+#define WM8510_GPIO                   0x8
-+#define WM8510_DAC                    0xa
-+#define WM8510_DACVOL         0xb
-+#define WM8510_ADC                    0xe
-+#define WM8510_ADCVOL         0xf
-+#define WM8510_EQ1                    0x12
-+#define WM8510_EQ2                    0x13
-+#define WM8510_EQ3                    0x14
-+#define WM8510_EQ4                    0x15
-+#define WM8510_EQ5                    0x16
-+#define WM8510_DACLIM1                0x18
-+#define WM8510_DACLIM2                0x19
-+#define WM8510_NOTCH1         0x1b
-+#define WM8510_NOTCH2         0x1c
-+#define WM8510_NOTCH3         0x1d
-+#define WM8510_NOTCH4         0x1e
-+#define WM8510_ALC1                   0x20
-+#define WM8510_ALC2                   0x21
-+#define WM8510_ALC3                   0x22
-+#define WM8510_NGATE          0x23
-+#define WM8510_PLLN                   0x24
-+#define WM8510_PLLK1          0x25
-+#define WM8510_PLLK2          0x26
-+#define WM8510_PLLK3          0x27
-+#define WM8510_ATTEN          0x28
-+#define WM8510_INPUT          0x2c
-+#define WM8510_INPPGA         0x2d
-+#define WM8510_ADCBOOST               0x2f
-+#define WM8510_OUTPUT         0x31
-+#define WM8510_SPKMIX         0x32
-+#define WM8510_SPKVOL         0x36
-+#define WM8510_MONOMIX                0x38
-+
-+#define WM8510_CACHEREGNUM    57
-+
-+struct wm8510_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+extern struct snd_soc_codec_dai wm8510_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_wm8510;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/imx/imx-ac97.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/imx/imx-ac97.c
-@@ -0,0 +1,281 @@
-+/*
-+ * imx-ssi.c  --  SSI driver for Freescale IMX
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  Based on mxc-alsa-mc13783 (C) 2006 Freescale.
-+ *
-+ *  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.
-+ *
-+ *  Revision history
-+ *    29th Aug 2006   Initial version.
-+ *
-+ */
-+
-+#define IMX_AC97_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
-+      SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
-+      SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+/* may need to expand this */
-+static struct snd_soc_dai_mode imx_ssi_ac97_modes[] = {
-+      {0, 0,  SNDRV_PCM_FMTBIT_S16_LE,        IMX_AC97_RATES},
-+      {0, 0,  SNDRV_PCM_FMTBIT_S18_3LE,       IMX_AC97_RATES},
-+      {0, 0,  SNDRV_PCM_FMTBIT_S20_3LE,       IMX_AC97_RATES},
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi1_pcm_stereo_out = {
-+      .name                   = "SSI1 PCM Stereo out",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = emi_2_per,
-+              .watermark_level = SDMA_TXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI1_STX0,
-+              .event_id = DMA_REQ_SSI1_TX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi1_pcm_stereo_in = {
-+      .name                   = "SSI1 PCM Stereo in",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = per_2_emi,
-+              .watermark_level = SDMA_RXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI1_SRX0,
-+              .event_id = DMA_REQ_SSI1_RX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi2_pcm_stereo_out = {
-+      .name                   = "SSI2 PCM Stereo out",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = per_2_emi,
-+              .watermark_level = SDMA_TXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI2_STX0,
-+              .event_id = DMA_REQ_SSI2_TX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi2_pcm_stereo_in = {
-+      .name                   = "SSI2 PCM Stereo in",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = per_2_emi,
-+              .watermark_level = SDMA_RXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI2_SRX0,
-+              .event_id = DMA_REQ_SSI2_RX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static unsigned short imx_ssi_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
-+{
-+}
-+
-+static void imx_ssi_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short val)
-+{
-+}
-+
-+static void imx_ssi_ac97_warm_reset(struct snd_ac97 *ac97)
-+{
-+}
-+
-+static void imx_ssi_ac97_cold_reset(struct snd_ac97 *ac97)
-+{
-+}
-+
-+struct snd_ac97_bus_ops soc_ac97_ops = {
-+      .read   = imx_ssi_ac97_read,
-+      .write  = imx_ssi_ac97_write,
-+      .warm_reset     = imx_ssi_ac97_warm_reset,
-+      .reset  = imx_ssi_ac97_cold_reset,
-+};
-+
-+
-+static intimx_ssi1_ac97_probe(struct platform_device *pdev)
-+{
-+      int ret;
-+
-+
-+      return ret;
-+}
-+
-+static void imx_ssi1_ac97_remove(struct platform_device *pdev)
-+{
-+      /* shutdown SSI */
-+              if(rtd->cpu_dai->id == 0)
-+                      SSI1_SCR &= ~SSI_SCR_SSIEN;
-+              else
-+                      SSI2_SCR &= ~SSI_SCR_SSIEN;
-+      }
-+
-+}
-+
-+static int imx_ssi1_ac97_prepare(struct snd_pcm_substream *substream)
-+{
-+      // set vra
-+}
-+
-+static int imx_ssi_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if (!rtd->cpu_dai->active) {
-+
-+      }
-+
-+      return 0;
-+}
-+
-+static int imx_ssi1_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      int ret = 0;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+                      SSI1_SCR |= SSI_SCR_TE;
-+                      SSI1_SIER |= SSI_SIER_TDMAE;
-+              } else {
-+                      SSI1_SCR |= SSI_SCR_RE;
-+                      SSI1_SIER |= SSI_SIER_RDMAE;
-+              }
-+              SSI1_SCR |= SSI_SCR_SSIEN;
-+
-+              break;
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+      break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSI1_SCR |= SSI_SCR_TE;
-+              else
-+                      SSI1_SCR |= SSI_SCR_RE;
-+      break
-+      case SNDRV_PCM_TRIGGER_STOP:
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+      break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSI1_SCR &= ~SSI_SCR_TE;
-+              else
-+                      SSI1_SCR &= ~SSI_SCR_RE;
-+      break;
-+      default:
-+              ret = -EINVAL;
-+      }
-+
-+      return ret;
-+}
-+
-+static void imx_ssi_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+
-+}
-+
-+#ifdef CONFIG_PM
-+static int imx_ssi_suspend(struct platform_device *dev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if(!dai->active)
-+              return 0;
-+
-+      if(rtd->cpu_dai->id == 0)
-+              SSI1_SCR &= ~SSI_SCR_SSIEN;
-+      else
-+              SSI2_SCR &= ~SSI_SCR_SSIEN;
-+
-+      return 0;
-+}
-+
-+static int imx_ssi_resume(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if(!dai->active)
-+              return 0;
-+
-+      if(rtd->cpu_dai->id == 0)
-+              SSI1_SCR |= SSI_SCR_SSIEN;
-+      else
-+              SSI2_SCR |= SSI_SCR_SSIEN;
-+
-+      return 0;
-+}
-+
-+#else
-+#define imx_ssi_suspend       NULL
-+#define imx_ssi_resume        NULL
-+#endif
-+
-+static unsigned int imx_ssi_config_ac97_sysclk(struct snd_soc_cpu_dai *iface,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      return clk;
-+}
-+
-+struct snd_soc_cpu_dai imx_ssi_ac97_dai = {
-+      .name = "imx-ac97-1",
-+      .id = 0,
-+      .type = SND_SOC_DAI_AC97,
-+      .suspend = imx_ssi_suspend,
-+      .resume = imx_ssi_resume,
-+      .config_sysclk = imx_ssi_ac97_config_sysclk,
-+      .playback = {
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .capture = {
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .ops = {
-+              .probe = imx_ac97_probe,
-+              .remove = imx_ac97_shutdown,
-+              .trigger = imx_ssi1_trigger,
-+              .prepare = imx_ssi_ac97_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(imx_ssi_ac97_modes),
-+              .mode = imx_ssi_ac97_modes,},
-+},
-+{
-+      .name = "imx-ac97-2",
-+      .id = 1,
-+      .type = SND_SOC_DAI_AC97,
-+      .suspend = imx_ssi_suspend,
-+      .resume = imx_ssi_resume,
-+      .config_sysclk = imx_ssi_ac97_config_sysclk,
-+      .playback = {
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .capture = {
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .ops = {
-+              .probe = imx_ac97_probe,
-+              .remove = imx_ac97_shutdown,
-+              .trigger = imx_ssi1_trigger,
-+              .prepare = imx_ssi_ac97_prepare,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(imx_ssi_ac97_modes),
-+              .mode = imx_ssi_ac97_modes,},
-+};
-+
-+EXPORT_SYMBOL_GPL(imx_ssi_ac97_dai);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("i.MX ASoC AC97 driver");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/imx/imx-i2s.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/imx/imx-i2s.c
-@@ -0,0 +1,473 @@
-+/*
-+ * imx-ssi.c  --  SSI driver for Freescale IMX
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  Based on mxc-alsa-mc13783 (C) 2006 Freescale.
-+ *
-+ *  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.
-+ *
-+ *  Revision history
-+ *    29th Aug 2006   Initial version.
-+ *
-+ */
-+
-+#define IMX_SSI_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J |\
-+      SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_DSP__A |\
-+      SND_SOC_DAIFMT_DSP_B  | SND_SOC_DAIFMT_CBS_CFS |\
-+      SND_SOC_DAIFMT_CBM_CFS |  SND_SOC_DAIFMT_CBS_CFM |\
-+      SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF)
-+
-+#define IMX_SSI_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define IMX_SSI_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | \
-+      SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
-+      SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | \
-+      SNDRV_PCM_RATE_96000)
-+
-+#define IMX_SSI_BITS \
-+      (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
-+      SNDRV_PCM_FMTBIT_S24_LE)
-+
-+static struct snd_soc_dai_mode imx_ssi_pcm_modes[] = {
-+
-+      /* frame master and clock slave mode */
-+      {
-+              .fmt = IMX_SSI_DAIFMT | SND_SOC_DAIFMT_CBM_CFS,
-+              .tdm = SND_SOC_DAITDM_LRDW(0,0),
-+              .pcmfmt = IMX_SSI_BITS,
-+              .pcmrate = IMX_SSI_RATES,
-+              .pcmdir = IMX_SSI_DIR,
-+              .flags =  SND_SOC_DAI_BFS_RCW,
-+              .fs = SND_SOC_FS_ALL,
-+              .bfs = SND_SOC_FSBW(1) | SND_SOC_FSBW(2),
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi1_pcm_stereo_out = {
-+      .name                   = "SSI1 PCM Stereo out",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = emi_2_per,
-+              .watermark_level = SDMA_TXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI1_STX0,
-+              .event_id = DMA_REQ_SSI1_TX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi1_pcm_stereo_in = {
-+      .name                   = "SSI1 PCM Stereo in",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = per_2_emi,
-+              .watermark_level = SDMA_RXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI1_SRX0,
-+              .event_id = DMA_REQ_SSI1_RX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi2_pcm_stereo_out = {
-+      .name                   = "SSI2 PCM Stereo out",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = per_2_emi,
-+              .watermark_level = SDMA_TXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI2_STX0,
-+              .event_id = DMA_REQ_SSI2_TX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+static imx_pcm_dma_params_t imx_ssi2_pcm_stereo_in = {
-+      .name                   = "SSI2 PCM Stereo in",
-+      .params = {
-+              .bd_number = 1,
-+              .transfer_type = per_2_emi,
-+              .watermark_level = SDMA_RXFIFO_WATERMARK,
-+              .word_size = TRANSFER_16BIT, // maybe add this in setup func
-+              .per_address = SSI2_SRX0,
-+              .event_id = DMA_REQ_SSI2_RX1,
-+              .peripheral_type = SSI,
-+      },
-+};
-+
-+
-+static int imx_ssi_startup(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      if (!rtd->cpu_dai->active) {
-+
-+      }
-+
-+      return 0;
-+}
-+
-+static int imx_ssi1_hw_tx_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 bfs, div;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->cpu_dai->dai_runtime.bfs);
-+
-+      SSI1_STCR = 0;
-+      SSI1_STCCR = 0;
-+
-+      /* DAI mode */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              SSI1_STCR |= SSI_STCR_TSCKP | SSI_STCR_TFSI |
-+                      SSI_STCR_TEFS | SSI_STCR_TXBIT0;
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              SSI1_STCR |= SSI_STCR_TSCKP | SSI_STCR_TFSI | SSI_STCR_TXBIT0;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_B:
-+              SSI1_STCR |= SSI_STCR_TEFS; // data 1 bit after sync
-+      case SND_SOC_DAIFMT_DSP_A:
-+              SSI1_STCR |= SSI_STCR_TFSL; // frame is 1 bclk long
-+
-+              /* DAI clock inversion */
-+              switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+              case SND_SOC_DAIFMT_IB_IF:
-+                      SSI1_STCR |= SSI_STCR_TFSI | SSI_STCR_TSCKP;
-+                      break;
-+              case SND_SOC_DAIFMT_IB_NF:
-+                      SSI1_STCR |= SSI_STCR_TSCKP;
-+                      break;
-+              case SND_SOC_DAIFMT_NB_IF:
-+                      SSI1_STCR |= SSI_STCR_TFSI;
-+                      break;
-+              }
-+              break;
-+      }
-+
-+      /* DAI data (word) size */
-+      switch(rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              SSI1_STCCR |= SSI_STCCR_WL(16);
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              SSI1_STCCR |= SSI_STCCR_WL(20);
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              SSI1_STCCR |= SSI_STCCR_WL(24);
-+              break;
-+      }
-+
-+      /* DAI clock master masks */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK){
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              SSI1_STCR |= SSI_STCR_TFDIR | SSI_STCR_TXDIR;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFM:
-+              SSI1_STCR |= SSI_STCR_TFDIR;
-+              break;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              SSI1_STCR |= SSI_STCR_TXDIR;
-+              break;
-+      }
-+
-+      /* DAI BCLK ratio to SYSCLK / MCLK */
-+      /* prescaler modulus - todo */
-+      switch (bfs) {
-+      case 2:
-+              break;
-+      case 4:
-+              break;
-+      case 8:
-+              break;
-+      case 16:
-+              break;
-+      }
-+
-+      /* TDM - todo, only fifo 0 atm */
-+      SSI1_STCR |= SSI_STCR_TFEN0;
-+      SSI1_STCCR |= SSI_STCCR_DC(params_channels(params));
-+
-+      return 0;
-+}
-+
-+static int imx_ssi1_hw_rx_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      u16 bfs, div;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->cpu_dai->dai_runtime.bfs);
-+
-+      SSI1_SRCR = 0;
-+      SSI1_SRCCR = 0;
-+
-+      /* DAI mode */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              SSI1_SRCR |= SSI_SRCR_RSCKP | SSI_SRCR_RFSI |
-+                      SSI_STCR_REFS | SSI_STCR_RXBIT0;
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              SSI1_SRCR |= SSI_SRCR_RSCKP | SSI_SRCR_RFSI | SSI_SRCR_RXBIT0;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_B:
-+              SSI1_SRCR |= SSI_SRCR_REFS; // data 1 bit after sync
-+      case SND_SOC_DAIFMT_DSP_A:
-+              SSI1_SRCR |= SSI_SRCR_RFSL; // frame is 1 bclk long
-+
-+              /* DAI clock inversion */
-+              switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+              case SND_SOC_DAIFMT_IB_IF:
-+                      SSI1_SRCR |= SSI_SRCR_TFSI | SSI_SRCR_TSCKP;
-+                      break;
-+              case SND_SOC_DAIFMT_IB_NF:
-+                      SSI1_SRCR |= SSI_SRCR_RSCKP;
-+                      break;
-+              case SND_SOC_DAIFMT_NB_IF:
-+                      SSI1_SRCR |= SSI_SRCR_RFSI;
-+                      break;
-+              }
-+              break;
-+      }
-+
-+      /* DAI data (word) size */
-+      switch(rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              SSI1_SRCCR |= SSI_SRCCR_WL(16);
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              SSI1_SRCCR |= SSI_SRCCR_WL(20);
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              SSI1_SRCCR |= SSI_SRCCR_WL(24);
-+              break;
-+      }
-+
-+      /* DAI clock master masks */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK){
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              SSI1_SRCR |= SSI_SRCR_RFDIR | SSI_SRCR_RXDIR;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFM:
-+              SSI1_SRCR |= SSI_SRCR_RFDIR;
-+              break;
-+      case SND_SOC_DAIFMT_CBM_CFS:
-+              SSI1_SRCR |= SSI_SRCR_RXDIR;
-+              break;
-+      }
-+
-+      /* DAI BCLK ratio to SYSCLK / MCLK */
-+      /* prescaler modulus - todo */
-+      switch (bfs) {
-+      case 2:
-+              break;
-+      case 4:
-+              break;
-+      case 8:
-+              break;
-+      case 16:
-+              break;
-+      }
-+
-+      /* TDM - todo, only fifo 0 atm */
-+      SSI1_SRCR |= SSI_SRCR_RFEN0;
-+      SSI1_SRCCR |= SSI_SRCCR_DC(params_channels(params));
-+
-+      return 0;
-+}
-+
-+static int imx_ssi1_hw_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      /* clear register if not enabled */
-+      if(!(SSI1_SCR & SSI_SCR_SSIEN))
-+              SSI1_SCR = 0;
-+
-+      /* async */
-+      if (rtd->cpu_dai->flags & SND_SOC_DAI_ASYNC)
-+              SSI1_SCR |= SSI_SCR_SYN;
-+
-+      /* DAI mode */
-+      switch(rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              SSI1_SCR |= SSI_SCR_NET;
-+              break;
-+      }
-+
-+      /* TDM  - to complete */
-+
-+      /* Tx/Rx config */
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+              return imx_ssi1_hw_tx_params(substream, params);
-+      } else {
-+              return imx_ssi1_hw_rx_params(substream, params);
-+      }
-+}
-+
-+
-+
-+static int imx_ssi1_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      int ret = 0;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+                      SSI1_SCR |= SSI_SCR_TE;
-+                      SSI1_SIER |= SSI_SIER_TDMAE;
-+              } else {
-+                      SSI1_SCR |= SSI_SCR_RE;
-+                      SSI1_SIER |= SSI_SIER_RDMAE;
-+              }
-+              SSI1_SCR |= SSI_SCR_SSIEN;
-+
-+              break;
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+      break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSI1_SCR |= SSI_SCR_TE;
-+              else
-+                      SSI1_SCR |= SSI_SCR_RE;
-+      break
-+      case SNDRV_PCM_TRIGGER_STOP:
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+      break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      SSI1_SCR &= ~SSI_SCR_TE;
-+              else
-+                      SSI1_SCR &= ~SSI_SCR_RE;
-+      break;
-+      default:
-+              ret = -EINVAL;
-+      }
-+
-+      return ret;
-+}
-+
-+static void imx_ssi_shutdown(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+
-+      /* shutdown SSI */
-+      if (!rtd->cpu_dai->active) {
-+              if(rtd->cpu_dai->id == 0)
-+                      SSI1_SCR &= ~SSI_SCR_SSIEN;
-+              else
-+                      SSI2_SCR &= ~SSI_SCR_SSIEN;
-+      }
-+}
-+
-+#ifdef CONFIG_PM
-+static int imx_ssi_suspend(struct platform_device *dev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if(!dai->active)
-+              return 0;
-+
-+      if(rtd->cpu_dai->id == 0)
-+              SSI1_SCR &= ~SSI_SCR_SSIEN;
-+      else
-+              SSI2_SCR &= ~SSI_SCR_SSIEN;
-+
-+      return 0;
-+}
-+
-+static int imx_ssi_resume(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+      if(!dai->active)
-+              return 0;
-+
-+      if(rtd->cpu_dai->id == 0)
-+              SSI1_SCR |= SSI_SCR_SSIEN;
-+      else
-+              SSI2_SCR |= SSI_SCR_SSIEN;
-+
-+      return 0;
-+}
-+
-+#else
-+#define imx_ssi_suspend       NULL
-+#define imx_ssi_resume        NULL
-+#endif
-+
-+static unsigned int imx_ssi_config_pcm_sysclk(struct snd_soc_cpu_dai *iface,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      return clk;
-+}
-+
-+struct snd_soc_cpu_dai imx_ssi_pcm_dai = {
-+      .name = "imx-i2s-1",
-+      .id = 0,
-+      .type = SND_SOC_DAI_I2S,
-+      .suspend = imx_ssi_suspend,
-+      .resume = imx_ssi_resume,
-+      .config_sysclk = imx_ssi_config_pcm_sysclk,
-+      .playback = {
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = {
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .ops = {
-+              .startup = imx_ssi_startup,
-+              .shutdown = imx_ssi_shutdown,
-+              .trigger = imx_ssi1_trigger,
-+              .hw_params = imx_ssi1_pcm_hw_params,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(imx_ssi_modes),
-+              .mode = imx_ssi_modes,},
-+},
-+{
-+      .name = "imx-i2s-2",
-+      .id = 1,
-+      .type = SND_SOC_DAI_I2S,
-+      .suspend = imx_ssi_suspend,
-+      .resume = imx_ssi_resume,
-+      .config_sysclk = imx_ssi_config_pcm_sysclk,
-+      .playback = {
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .capture = {
-+              .channels_min = 1,
-+              .channels_max = 2,},
-+      .ops = {
-+              .startup = imx_ssi_startup,
-+              .shutdown = imx_ssi_shutdown,
-+              .trigger = imx_ssi1_trigger,
-+              .hw_params = imx_ssi1_pcm_hw_params,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(imx_ssi_modes),
-+              .mode = imx_ssi_modes,},
-+};
-+
-+
-+EXPORT_SYMBOL_GPL(imx_ssi_i2s_dai);
-+
-+/* Module information */
-+MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("i.MX ASoC I2S driver");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/include/linux/i2c-id.h
-===================================================================
---- linux-2.6.17/include/linux/i2c-id.h.orig   2006-11-25 00:15:33.571185017 +0100
-+++ linux-2.6.17/include/linux/i2c-id.h        2006-11-25 00:17:31.017877925 +0100
-@@ -113,6 +113,9 @@
- #define I2C_DRIVERID_PCF8563  83      /* Philips PCF8563 RTC          */
- #define I2C_DRIVERID_RS5C372  84      /* Ricoh RS5C372 RTC            */
-+#define I2C_DRIVERID_WM8731    89      /* Wolfson WM8731 audio codec */
-+#define I2C_DRIVERID_WM8750    90      /* Wolfson WM8750 audio codec */
-+
- #define I2C_DRIVERID_I2CDEV   900
- #define I2C_DRIVERID_ARP        902    /* SMBus ARP Client              */
- #define I2C_DRIVERID_ALERT      903    /* SMBus Alert Responder Client  */
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8976.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8976.c
-@@ -0,0 +1,953 @@
-+/*
-+ * wm8976.c  --  WM8976 ALSA Soc Audio driver
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ *
-+ * 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/moduleparam.h>
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/i2c.h>
-+#include <linux/platform_device.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <sound/soc-dapm.h>
-+#include <sound/initval.h>
-+
-+#include "wm8976.h"
-+
-+#define AUDIO_NAME "wm8976"
-+#define WM8976_VERSION "0.2"
-+
-+/*
-+ * Debug
-+ */
-+
-+#define WM8976_DEBUG 0
-+
-+#ifdef WM8976_DEBUG
-+#define dbg(format, arg...) \
-+      printk(KERN_DEBUG AUDIO_NAME ": " format "\n" , ## arg)
-+#else
-+#define dbg(format, arg...) do {} while (0)
-+#endif
-+#define err(format, arg...) \
-+      printk(KERN_ERR AUDIO_NAME ": " format "\n" , ## arg)
-+#define info(format, arg...) \
-+      printk(KERN_INFO AUDIO_NAME ": " format "\n" , ## arg)
-+#define warn(format, arg...) \
-+      printk(KERN_WARNING AUDIO_NAME ": " format "\n" , ## arg)
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8976;
-+
-+/*
-+ * wm8976 register cache
-+ * We can't read the WM8976 register space when we are
-+ * using 2 wire for device control, so we cache them instead.
-+ */
-+static const u16 wm8976_reg[WM8976_CACHEREGNUM] = {
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0050, 0x0000, 0x0140, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x00ff,
-+    0x00ff, 0x0000, 0x0100, 0x00ff,
-+    0x00ff, 0x0000, 0x012c, 0x002c,
-+    0x002c, 0x002c, 0x002c, 0x0000,
-+    0x0032, 0x0000, 0x0000, 0x0000,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0038, 0x000b, 0x0032, 0x0000,
-+    0x0008, 0x000c, 0x0093, 0x00e9,
-+    0x0000, 0x0000, 0x0000, 0x0000,
-+    0x0033, 0x0010, 0x0010, 0x0100,
-+    0x0100, 0x0002, 0x0001, 0x0001,
-+    0x0039, 0x0039, 0x0039, 0x0039,
-+    0x0001, 0x0001,
-+};
-+
-+#define WM8976_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S  | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \
-+    SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_DSP_B  | SND_SOC_DAIFMT_NB_NF   | \
-+    SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF  | SND_SOC_DAIFMT_IB_IF)
-+
-+#define WM8976_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define WM8976_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000)
-+
-+#define WM8976_PCM_FORMATS \
-+      (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
-+      SNDRV_PCM_FORMAT_S24_3LE | SNDRV_PCM_FORMAT_S24_LE  | \
-+    SNDRV_PCM_FORMAT_S32_LE)
-+
-+#define WM8976_BCLK \
-+      (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | SND_SOC_FSBD(8) |\
-+    SND_SOC_FSBD(16) | SND_SOC_FSBD(32))
-+
-+static struct snd_soc_dai_mode wm8976_modes[] = {
-+      /* codec frame and clock master modes */
-+      {
-+              .fmt = WM8976_DAIFMT | SND_SOC_DAIFMT_CBM_CFM,
-+              .pcmfmt = WM8976_PCM_FORMATS,
-+              .pcmrate = WM8976_RATES,
-+              .pcmdir = WM8976_DIR,
-+              .flags = SND_SOC_DAI_BFS_DIV,
-+              .fs = 256,
-+              .bfs = WM8976_BCLK,
-+      },
-+
-+      /* codec frame and clock slave modes */
-+      {
-+              .fmt = WM8976_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+        .pcmfmt = WM8976_PCM_FORMATS,
-+        .pcmrate = WM8976_RATES,
-+        .pcmdir = WM8976_DIR,
-+        .fs = SND_SOC_FS_ALL,
-+        .bfs = SND_SOC_FSB_ALL,
-+      },
-+};
-+
-+/*
-+ * read wm8976 register cache
-+ */
-+static inline unsigned int wm8976_read_reg_cache(struct snd_soc_codec  *codec,
-+      unsigned int reg)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg == WM8976_RESET)
-+              return 0;
-+      if (reg >= WM8976_CACHEREGNUM)
-+              return -1;
-+      return cache[reg];
-+}
-+
-+/*
-+ * write wm8976 register cache
-+ */
-+static inline void wm8976_write_reg_cache(struct snd_soc_codec  *codec,
-+      u16 reg, unsigned int value)
-+{
-+      u16 *cache = codec->reg_cache;
-+      if (reg >= WM8976_CACHEREGNUM)
-+              return;
-+      cache[reg] = value;
-+}
-+
-+/*
-+ * write to the WM8976 register space
-+ */
-+static int wm8976_write(struct snd_soc_codec  *codec, unsigned int reg,
-+      unsigned int value)
-+{
-+      u8 data[2];
-+
-+      /* data is
-+       *   D15..D9 WM8976 register offset
-+       *   D8...D0 register data
-+       */
-+      data[0] = (reg << 1) | ((value >> 8) & 0x0001);
-+      data[1] = value & 0x00ff;
-+
-+      wm8976_write_reg_cache (codec, reg, value);
-+      if (codec->hw_write(codec->control_data, data, 2) == 2)
-+              return 0;
-+      else
-+              return -1;
-+}
-+
-+#define wm8976_reset(c)       wm8976_write(c, WM8976_RESET, 0)
-+
-+static const char *wm8976_companding[] = {"Off", "NC", "u-law", "A-law" };
-+static const char *wm8976_deemp[] = {"None", "32kHz", "44.1kHz", "48kHz" };
-+static const char *wm8976_eqmode[] = {"Capture", "Playback" };
-+static const char *wm8976_bw[] = {"Narrow", "Wide" };
-+static const char *wm8976_eq1[] = {"80Hz", "105Hz", "135Hz", "175Hz" };
-+static const char *wm8976_eq2[] = {"230Hz", "300Hz", "385Hz", "500Hz" };
-+static const char *wm8976_eq3[] = {"650Hz", "850Hz", "1.1kHz", "1.4kHz" };
-+static const char *wm8976_eq4[] = {"1.8kHz", "2.4kHz", "3.2kHz", "4.1kHz" };
-+static const char *wm8976_eq5[] = {"5.3kHz", "6.9kHz", "9kHz", "11.7kHz" };
-+static const char *wm8976_alc[] =
-+    {"ALC both on", "ALC left only", "ALC right only", "Limiter" };
-+
-+static const struct soc_enum wm8976_enum[] = {
-+      SOC_ENUM_SINGLE(WM8976_COMP, 1, 4, wm8976_companding), /* adc */
-+      SOC_ENUM_SINGLE(WM8976_COMP, 3, 4, wm8976_companding), /* dac */
-+      SOC_ENUM_SINGLE(WM8976_DAC,  4, 4, wm8976_deemp),
-+      SOC_ENUM_SINGLE(WM8976_EQ1,  8, 2, wm8976_eqmode),
-+
-+      SOC_ENUM_SINGLE(WM8976_EQ1,  5, 4, wm8976_eq1),
-+      SOC_ENUM_SINGLE(WM8976_EQ2,  8, 2, wm8976_bw),
-+      SOC_ENUM_SINGLE(WM8976_EQ2,  5, 4, wm8976_eq2),
-+      SOC_ENUM_SINGLE(WM8976_EQ3,  8, 2, wm8976_bw),
-+
-+      SOC_ENUM_SINGLE(WM8976_EQ3,  5, 4, wm8976_eq3),
-+      SOC_ENUM_SINGLE(WM8976_EQ4,  8, 2, wm8976_bw),
-+      SOC_ENUM_SINGLE(WM8976_EQ4,  5, 4, wm8976_eq4),
-+      SOC_ENUM_SINGLE(WM8976_EQ5,  8, 2, wm8976_bw),
-+
-+      SOC_ENUM_SINGLE(WM8976_EQ5,  5, 4, wm8976_eq5),
-+      SOC_ENUM_SINGLE(WM8976_ALC3,  8, 2, wm8976_alc),
-+};
-+
-+static const struct snd_kcontrol_new wm8976_snd_controls[] = {
-+SOC_SINGLE("Digital Loopback Switch", WM8976_COMP, 0, 1, 0),
-+
-+SOC_ENUM("ADC Companding", wm8976_enum[0]),
-+SOC_ENUM("DAC Companding", wm8976_enum[1]),
-+
-+SOC_SINGLE("Jack Detection Enable", WM8976_JACK1, 6, 1, 0),
-+
-+SOC_DOUBLE("DAC Inversion Switch", WM8976_DAC, 0, 1, 1, 0),
-+
-+SOC_DOUBLE_R("Headphone Playback Volume", WM8976_DACVOLL, WM8976_DACVOLR, 0, 127, 0),
-+
-+SOC_SINGLE("High Pass Filter Switch", WM8976_ADC, 8, 1, 0),
-+SOC_SINGLE("High Pass Filter Switch", WM8976_ADC, 8, 1, 0),
-+SOC_SINGLE("High Pass Cut Off", WM8976_ADC, 4, 7, 0),
-+
-+SOC_DOUBLE("ADC Inversion Switch", WM8976_ADC, 0, 1, 1, 0),
-+
-+SOC_SINGLE("Capture Volume", WM8976_ADCVOL,  0, 127, 0),
-+
-+SOC_ENUM("Equaliser Function", wm8976_enum[3]),
-+SOC_ENUM("EQ1 Cut Off", wm8976_enum[4]),
-+SOC_SINGLE("EQ1 Volume", WM8976_EQ1,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ2 Bandwith", wm8976_enum[5]),
-+SOC_ENUM("EQ2 Cut Off", wm8976_enum[6]),
-+SOC_SINGLE("EQ2 Volume", WM8976_EQ2,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ3 Bandwith", wm8976_enum[7]),
-+SOC_ENUM("EQ3 Cut Off", wm8976_enum[8]),
-+SOC_SINGLE("EQ3 Volume", WM8976_EQ3,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ4 Bandwith", wm8976_enum[9]),
-+SOC_ENUM("EQ4 Cut Off", wm8976_enum[10]),
-+SOC_SINGLE("EQ4 Volume", WM8976_EQ4,  0, 31, 1),
-+
-+SOC_ENUM("Equaliser EQ5 Bandwith", wm8976_enum[11]),
-+SOC_ENUM("EQ5 Cut Off", wm8976_enum[12]),
-+SOC_SINGLE("EQ5 Volume", WM8976_EQ5,  0, 31, 1),
-+
-+SOC_SINGLE("DAC Playback Limiter Switch", WM8976_DACLIM1,  8, 1, 0),
-+SOC_SINGLE("DAC Playback Limiter Decay", WM8976_DACLIM1,  4, 15, 0),
-+SOC_SINGLE("DAC Playback Limiter Attack", WM8976_DACLIM1,  0, 15, 0),
-+
-+SOC_SINGLE("DAC Playback Limiter Threshold", WM8976_DACLIM2,  4, 7, 0),
-+SOC_SINGLE("DAC Playback Limiter Boost", WM8976_DACLIM2,  0, 15, 0),
-+
-+SOC_SINGLE("ALC Enable Switch", WM8976_ALC1,  8, 1, 0),
-+SOC_SINGLE("ALC Capture Max Gain", WM8976_ALC1,  3, 7, 0),
-+SOC_SINGLE("ALC Capture Min Gain", WM8976_ALC1,  0, 7, 0),
-+
-+SOC_SINGLE("ALC Capture ZC Switch", WM8976_ALC2,  8, 1, 0),
-+SOC_SINGLE("ALC Capture Hold", WM8976_ALC2,  4, 7, 0),
-+SOC_SINGLE("ALC Capture Target", WM8976_ALC2,  0, 15, 0),
-+
-+SOC_ENUM("ALC Capture Mode", wm8976_enum[13]),
-+SOC_SINGLE("ALC Capture Decay", WM8976_ALC3,  4, 15, 0),
-+SOC_SINGLE("ALC Capture Attack", WM8976_ALC3,  0, 15, 0),
-+
-+SOC_SINGLE("ALC Capture Noise Gate Switch", WM8976_NGATE,  3, 1, 0),
-+SOC_SINGLE("ALC Capture Noise Gate Threshold", WM8976_NGATE,  0, 7, 0),
-+
-+SOC_SINGLE("Capture PGA ZC Switch", WM8976_INPPGA,  7, 1, 0),
-+SOC_SINGLE("Capture PGA Volume", WM8976_INPPGA,  0, 63, 0),
-+
-+SOC_DOUBLE_R("Headphone Playback ZC Switch", WM8976_HPVOLL,  WM8976_HPVOLR, 7, 1, 0),
-+SOC_DOUBLE_R("Headphone Playback Switch", WM8976_HPVOLL,  WM8976_HPVOLR, 6, 1, 1),
-+SOC_DOUBLE_R("Headphone Playback Volume", WM8976_HPVOLL,  WM8976_HPVOLR, 0, 63, 0),
-+
-+SOC_DOUBLE_R("Speaker Playback ZC Switch", WM8976_SPKVOLL,  WM8976_SPKVOLR, 7, 1, 0),
-+SOC_DOUBLE_R("Speaker Playback Switch", WM8976_SPKVOLL,  WM8976_SPKVOLR, 6, 1, 1),
-+SOC_DOUBLE_R("Speaker Playback Volume", WM8976_SPKVOLL,  WM8976_SPKVOLR, 0, 63, 0),
-+
-+SOC_SINGLE("Capture Boost(+20dB)", WM8976_ADCBOOST, 8, 1, 0),
-+};
-+
-+/* add non dapm controls */
-+static int wm8976_add_controls(struct snd_soc_codec *codec)
-+{
-+      int err, i;
-+
-+      for (i = 0; i < ARRAY_SIZE(wm8976_snd_controls); i++) {
-+              err = snd_ctl_add(codec->card,
-+                              snd_soc_cnew(&wm8976_snd_controls[i],codec, NULL));
-+              if (err < 0)
-+                      return err;
-+      }
-+
-+      return 0;
-+}
-+
-+/* Left Output Mixer */
-+static const snd_kcontrol_new_t wm8976_left_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Right PCM Playback Switch", WM8976_OUTPUT, 6, 1, 1),
-+SOC_DAPM_SINGLE("Left PCM Playback Switch", WM8976_MIXL, 0, 1, 1),
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8976_MIXL, 1, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", WM8976_MIXL, 5, 1, 0),
-+};
-+
-+/* Right Output Mixer */
-+static const snd_kcontrol_new_t wm8976_right_mixer_controls[] = {
-+SOC_DAPM_SINGLE("Left PCM Playback Switch", WM8976_OUTPUT, 5, 1, 1),
-+SOC_DAPM_SINGLE("Right PCM Playback Switch", WM8976_MIXR, 0, 1, 1),
-+SOC_DAPM_SINGLE("Line Bypass Switch", WM8976_MIXR, 1, 1, 0),
-+SOC_DAPM_SINGLE("Aux Playback Switch", WM8976_MIXR, 5, 1, 0),
-+};
-+
-+/* Left AUX Input boost vol */
-+static const snd_kcontrol_new_t wm8976_laux_boost_controls =
-+SOC_DAPM_SINGLE("Aux Volume", WM8976_ADCBOOST, 0, 3, 0);
-+
-+/* Left Input boost vol */
-+static const snd_kcontrol_new_t wm8976_lmic_boost_controls =
-+SOC_DAPM_SINGLE("Input Volume", WM8976_ADCBOOST, 4, 3, 0);
-+
-+/* Left Aux In to PGA */
-+static const snd_kcontrol_new_t wm8976_laux_capture_boost_controls =
-+SOC_DAPM_SINGLE("Capture Switch", WM8976_ADCBOOST,  8, 1, 0);
-+
-+/* Left Input P In to PGA */
-+static const snd_kcontrol_new_t wm8976_lmicp_capture_boost_controls =
-+SOC_DAPM_SINGLE("Input P Capture Boost Switch", WM8976_INPUT,  0, 1, 0);
-+
-+/* Left Input N In to PGA */
-+static const snd_kcontrol_new_t wm8976_lmicn_capture_boost_controls =
-+SOC_DAPM_SINGLE("Input N Capture Boost Switch", WM8976_INPUT,  1, 1, 0);
-+
-+// TODO Widgets
-+static const struct snd_soc_dapm_widget wm8976_dapm_widgets[] = {
-+#if 0
-+//SND_SOC_DAPM_MUTE("Mono Mute", WM8976_MONOMIX, 6, 0),
-+//SND_SOC_DAPM_MUTE("Speaker Mute", WM8976_SPKMIX, 6, 0),
-+
-+SND_SOC_DAPM_MIXER("Speaker Mixer", WM8976_POWER3, 2, 0,
-+      &wm8976_speaker_mixer_controls[0],
-+      ARRAY_SIZE(wm8976_speaker_mixer_controls)),
-+SND_SOC_DAPM_MIXER("Mono Mixer", WM8976_POWER3, 3, 0,
-+      &wm8976_mono_mixer_controls[0],
-+      ARRAY_SIZE(wm8976_mono_mixer_controls)),
-+SND_SOC_DAPM_DAC("DAC", "HiFi Playback", WM8976_POWER3, 0, 0),
-+SND_SOC_DAPM_ADC("ADC", "HiFi Capture", WM8976_POWER3, 0, 0),
-+SND_SOC_DAPM_PGA("Aux Input", WM8976_POWER1, 6, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("SpkN Out", WM8976_POWER3, 5, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("SpkP Out", WM8976_POWER3, 6, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mono Out", WM8976_POWER3, 7, 0, NULL, 0),
-+SND_SOC_DAPM_PGA("Mic PGA", WM8976_POWER2, 2, 0, NULL, 0),
-+
-+SND_SOC_DAPM_PGA("Aux Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8976_aux_boost_controls, 1),
-+SND_SOC_DAPM_PGA("Mic Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8976_mic_boost_controls, 1),
-+SND_SOC_DAPM_SWITCH("Capture Boost", SND_SOC_NOPM, 0, 0,
-+      &wm8976_capture_boost_controls),
-+
-+SND_SOC_DAPM_MIXER("Boost Mixer", WM8976_POWER2, 4, 0, NULL, 0),
-+
-+SND_SOC_DAPM_MICBIAS("Mic Bias", WM8976_POWER1, 4, 0),
-+
-+SND_SOC_DAPM_INPUT("MICN"),
-+SND_SOC_DAPM_INPUT("MICP"),
-+SND_SOC_DAPM_INPUT("AUX"),
-+SND_SOC_DAPM_OUTPUT("MONOOUT"),
-+SND_SOC_DAPM_OUTPUT("SPKOUTP"),
-+SND_SOC_DAPM_OUTPUT("SPKOUTN"),
-+#endif
-+};
-+
-+static const char *audio_map[][3] = {
-+      /* Mono output mixer */
-+      {"Mono Mixer", "PCM Playback Switch", "DAC"},
-+      {"Mono Mixer", "Aux Playback Switch", "Aux Input"},
-+      {"Mono Mixer", "Line Bypass Switch", "Boost Mixer"},
-+
-+      /* Speaker output mixer */
-+      {"Speaker Mixer", "PCM Playback Switch", "DAC"},
-+      {"Speaker Mixer", "Aux Playback Switch", "Aux Input"},
-+      {"Speaker Mixer", "Line Bypass Switch", "Boost Mixer"},
-+
-+      /* Outputs */
-+      {"Mono Out", NULL, "Mono Mixer"},
-+      {"MONOOUT", NULL, "Mono Out"},
-+      {"SpkN Out", NULL, "Speaker Mixer"},
-+      {"SpkP Out", NULL, "Speaker Mixer"},
-+      {"SPKOUTN", NULL, "SpkN Out"},
-+      {"SPKOUTP", NULL, "SpkP Out"},
-+
-+      /* Boost Mixer */
-+      {"Boost Mixer", NULL, "ADC"},
-+      {"Capture Boost Switch", "Aux Capture Boost Switch", "AUX"},
-+      {"Aux Boost", "Aux Volume", "Boost Mixer"},
-+      {"Capture Boost", "Capture Switch", "Boost Mixer"},
-+      {"Mic Boost", "Mic Volume", "Boost Mixer"},
-+
-+      /* Inputs */
-+      {"MICP", NULL, "Mic Boost"},
-+      {"MICN", NULL, "Mic PGA"},
-+      {"Mic PGA", NULL, "Capture Boost"},
-+      {"AUX", NULL, "Aux Input"},
-+
-+    /*  */
-+
-+      /* terminator */
-+      {NULL, NULL, NULL},
-+};
-+
-+static int wm8976_add_widgets(struct snd_soc_codec *codec)
-+{
-+      int i;
-+
-+      for(i = 0; i < ARRAY_SIZE(wm8976_dapm_widgets); i++) {
-+              snd_soc_dapm_new_control(codec, &wm8976_dapm_widgets[i]);
-+      }
-+
-+      /* set up audio path map */
-+      for(i = 0; audio_map[i][0] != NULL; i++) {
-+              snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1],
-+            audio_map[i][2]);
-+      }
-+
-+      snd_soc_dapm_new_widgets(codec);
-+      return 0;
-+}
-+
-+struct pll_ {
-+      unsigned int in_hz, out_hz;
-+      unsigned int pre:4; /* prescale - 1 */
-+      unsigned int n:4;
-+      unsigned int k;
-+};
-+
-+struct pll_ pll[] = {
-+      {12000000, 11289600, 0, 7, 0x86c220},
-+      {12000000, 12288000, 0, 8, 0x3126e8},
-+      {13000000, 11289600, 0, 6, 0xf28bd4},
-+      {13000000, 12288000, 0, 7, 0x8fd525},
-+      {12288000, 11289600, 0, 7, 0x59999a},
-+      {11289600, 12288000, 0, 8, 0x80dee9},
-+      /* TODO: liam - add more entries */
-+};
-+
-+static int set_pll(struct snd_soc_codec *codec, unsigned int in,
-+      unsigned int out)
-+{
-+      int i;
-+      u16 reg;
-+
-+      if(out == 0) {
-+              reg = wm8976_read_reg_cache(codec, WM8976_POWER1);
-+              wm8976_write(codec, WM8976_POWER1, reg & 0x1df);
-+              return 0;
-+      }
-+
-+      for(i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (in == pll[i].in_hz && out == pll[i].out_hz) {
-+                      wm8976_write(codec, WM8976_PLLN, (pll[i].pre << 4) | pll[i].n);
-+                      wm8976_write(codec, WM8976_PLLK1, pll[i].k >> 18);
-+                      wm8976_write(codec, WM8976_PLLK1, (pll[i].k >> 9) && 0x1ff);
-+                      wm8976_write(codec, WM8976_PLLK1, pll[i].k && 0x1ff);
-+                      reg = wm8976_read_reg_cache(codec, WM8976_POWER1);
-+                      wm8976_write(codec, WM8976_POWER1, reg | 0x020);
-+                      return 0;
-+              }
-+      }
-+      return -EINVAL;
-+}
-+
-+/* mclk dividers * 2 */
-+static unsigned char mclk_div[] = {2, 3, 4, 6, 8, 12, 16, 24};
-+
-+/* we need 256FS to drive the DAC's and ADC's */
-+static unsigned int wm8976_config_sysclk(struct snd_soc_codec_dai *dai,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      int i, j, best_clk = info->fs * info->rate;
-+
-+      /* can we run at this clk without the PLL ? */
-+      for (i = 0; i < ARRAY_SIZE(mclk_div); i++) {
-+              if ((best_clk >> 1) * mclk_div[i] == clk) {
-+                      dai->pll_in = 0;
-+                      dai->clk_div = mclk_div[i];
-+                      dai->mclk = best_clk;
-+                      return dai->mclk;
-+              }
-+      }
-+
-+      /* now check for PLL support */
-+      for (i = 0; i < ARRAY_SIZE(pll); i++) {
-+              if (pll[i].in_hz == clk) {
-+                      for (j = 0; j < ARRAY_SIZE(mclk_div); j++) {
-+                              if (pll[i].out_hz == mclk_div[j] * (best_clk >> 1)) {
-+                                      dai->pll_in = clk;
-+                                      dai->pll_out = pll[i].out_hz;
-+                                      dai->clk_div = mclk_div[j];
-+                                      dai->mclk = best_clk;
-+                                      return dai->mclk;
-+                              }
-+                      }
-+              }
-+      }
-+
-+      /* this clk is not supported */
-+      return 0;
-+}
-+
-+static int wm8976_pcm_prepare(snd_pcm_substream_t *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct snd_soc_codec_dai *dai = rtd->codec_dai;
-+      u16 iface = 0, bfs, clk = 0, adn;
-+      int fs = 48000 << 7, i;
-+
-+      bfs = SND_SOC_FSBD_REAL(rtd->codec_dai->dai_runtime.bfs);
-+      switch (bfs) {
-+      case 2:
-+              clk |= 0x1 << 2;
-+              break;
-+      case 4:
-+              clk |= 0x2 << 2;
-+              break;
-+      case 8:
-+              clk |= 0x3 << 2;
-+              break;
-+      case 16:
-+              clk |= 0x4 << 2;
-+              break;
-+      case 32:
-+              clk |= 0x5 << 2;
-+              break;
-+      }
-+
-+      /* set master/slave audio interface */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CLOCK_MASK) {
-+      case SND_SOC_DAIFMT_CBM_CFM:
-+              clk |= 0x0001;
-+              break;
-+      case SND_SOC_DAIFMT_CBS_CFS:
-+              break;
-+      }
-+
-+      /* interface format */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
-+      case SND_SOC_DAIFMT_I2S:
-+              iface |= 0x0010;
-+              break;
-+      case SND_SOC_DAIFMT_RIGHT_J:
-+              break;
-+      case SND_SOC_DAIFMT_LEFT_J:
-+              iface |= 0x0008;
-+              break;
-+      case SND_SOC_DAIFMT_DSP_A:
-+              iface |= 0x00018;
-+              break;
-+      }
-+
-+      /* bit size */
-+      switch (rtd->codec_dai->dai_runtime.pcmfmt) {
-+      case SNDRV_PCM_FMTBIT_S16_LE:
-+              break;
-+      case SNDRV_PCM_FMTBIT_S20_3LE:
-+              iface |= 0x0020;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S24_LE:
-+              iface |= 0x0040;
-+              break;
-+      case SNDRV_PCM_FMTBIT_S32_LE:
-+              iface |= 0x0060;
-+              break;
-+      }
-+
-+      /* clock inversion */
-+      switch (rtd->codec_dai->dai_runtime.fmt & SND_SOC_DAIFMT_INV_MASK) {
-+      case SND_SOC_DAIFMT_NB_NF:
-+              break;
-+      case SND_SOC_DAIFMT_IB_IF:
-+              iface |= 0x0180;
-+              break;
-+      case SND_SOC_DAIFMT_IB_NF:
-+              iface |= 0x0100;
-+              break;
-+      case SND_SOC_DAIFMT_NB_IF:
-+              iface |= 0x0080;
-+              break;
-+      }
-+
-+      /* filter coefficient */
-+      adn = wm8976_read_reg_cache(codec, WM8976_ADD) & 0x1f1;
-+      switch (rtd->codec_dai->dai_runtime.pcmrate) {
-+      case SNDRV_PCM_RATE_8000:
-+              adn |= 0x5 << 1;
-+              fs = 8000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_11025:
-+              adn |= 0x4 << 1;
-+              fs = 11025 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_16000:
-+              adn |= 0x3 << 1;
-+              fs = 16000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_22050:
-+              adn |= 0x2 << 1;
-+              fs = 22050 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_32000:
-+              adn |= 0x1 << 1;
-+              fs = 32000 << 7;
-+              break;
-+      case SNDRV_PCM_RATE_44100:
-+              fs = 44100 << 7;
-+              break;
-+      }
-+
-+      /* do we need to enable the PLL */
-+      if(dai->pll_in)
-+              set_pll(codec, dai->pll_in, dai->pll_out);
-+
-+      /* divide the clock to 256 fs */
-+      for(i = 0; i < ARRAY_SIZE(mclk_div); i++) {
-+              if (dai->clk_div == mclk_div[i]) {
-+                      clk |= i << 5;
-+                      clk &= 0xff;
-+                      goto set;
-+              }
-+      }
-+
-+set:
-+      /* set iface */
-+      wm8976_write(codec, WM8976_IFACE, iface);
-+      wm8976_write(codec, WM8976_CLOCK, clk);
-+
-+      return 0;
-+}
-+
-+static int wm8976_hw_free(struct snd_pcm_substream *substream)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      struct snd_soc_device *socdev = rtd->socdev;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      set_pll(codec, 0, 0);
-+      return 0;
-+}
-+
-+static int wm8976_mute(struct snd_soc_codec *codec,
-+      struct snd_soc_codec_dai *dai, int mute)
-+{
-+      u16 mute_reg = wm8976_read_reg_cache(codec, WM8976_DAC) & 0xffbf;
-+      if(mute)
-+              wm8976_write(codec, WM8976_DAC, mute_reg | 0x40);
-+      else
-+              wm8976_write(codec, WM8976_DAC, mute_reg);
-+
-+      return 0;
-+}
-+
-+/* TODO: liam need to make this lower power with dapm */
-+static int wm8976_dapm_event(struct snd_soc_codec *codec, int event)
-+{
-+
-+      switch (event) {
-+      case SNDRV_CTL_POWER_D0: /* full On */
-+              /* vref/mid, clk and osc on, dac unmute, active */
-+              wm8976_write(codec, WM8976_POWER1, 0x1ff);
-+              wm8976_write(codec, WM8976_POWER2, 0x1ff);
-+              wm8976_write(codec, WM8976_POWER3, 0x1ff);
-+              break;
-+      case SNDRV_CTL_POWER_D1: /* partial On */
-+      case SNDRV_CTL_POWER_D2: /* partial On */
-+              break;
-+      case SNDRV_CTL_POWER_D3hot: /* Off, with power */
-+              /* everything off except vref/vmid, dac mute, inactive */
-+
-+              break;
-+      case SNDRV_CTL_POWER_D3cold: /* Off, without power */
-+              /* everything off, dac mute, inactive */
-+              wm8976_write(codec, WM8976_POWER1, 0x0);
-+              wm8976_write(codec, WM8976_POWER2, 0x0);
-+              wm8976_write(codec, WM8976_POWER3, 0x0);
-+              break;
-+      }
-+      codec->dapm_state = event;
-+      return 0;
-+}
-+
-+struct snd_soc_codec_dai wm8976_dai = {
-+      .name = "WM8976 HiFi",
-+      .playback = {
-+              .stream_name = "Playback",
-+              .channels_min = 1,
-+              .channels_max = 2,
-+      },
-+      .capture = {
-+              .stream_name = "Capture",
-+              .channels_min = 1,
-+              .channels_max = 1,
-+      },
-+      .config_sysclk = wm8976_config_sysclk,
-+      .digital_mute = wm8976_mute,
-+      .ops = {
-+              .prepare = wm8976_pcm_prepare,
-+              .hw_free = wm8976_hw_free,
-+      },
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(wm8976_modes),
-+              .mode = wm8976_modes,
-+      },
-+};
-+EXPORT_SYMBOL_GPL(wm8976_dai);
-+
-+static int wm8976_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      wm8976_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+      return 0;
-+}
-+
-+static int wm8976_resume(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int i;
-+      u8 data[2];
-+      u16 *cache = codec->reg_cache;
-+
-+      /* Sync reg_cache with the hardware */
-+      for (i = 0; i < ARRAY_SIZE(wm8976_reg); i++) {
-+              data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
-+              data[1] = cache[i] & 0x00ff;
-+              codec->hw_write(codec->control_data, data, 2);
-+      }
-+      wm8976_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8976_dapm_event(codec, codec->suspend_dapm_state);
-+      return 0;
-+}
-+
-+/*
-+ * initialise the WM8976 driver
-+ * register the mixer and dsp interfaces with the kernel
-+ */
-+static int wm8976_init(struct snd_soc_device* socdev)
-+{
-+      struct snd_soc_codec *codec = socdev->codec;
-+      int ret = 0;
-+
-+      codec->name = "WM8976";
-+      codec->owner = THIS_MODULE;
-+      codec->read = wm8976_read_reg_cache;
-+      codec->write = wm8976_write;
-+      codec->dapm_event = wm8976_dapm_event;
-+      codec->dai = &wm8976_dai;
-+      codec->num_dai = 1;
-+      codec->reg_cache_size = ARRAY_SIZE(wm8976_reg);
-+      codec->reg_cache =
-+                      kzalloc(sizeof(u16) * ARRAY_SIZE(wm8976_reg), GFP_KERNEL);
-+      if (codec->reg_cache == NULL)
-+              return -ENOMEM;
-+      memcpy(codec->reg_cache, wm8976_reg,
-+              sizeof(u16) * ARRAY_SIZE(wm8976_reg));
-+      codec->reg_cache_size = sizeof(u16) * ARRAY_SIZE(wm8976_reg);
-+
-+      wm8976_reset(codec);
-+
-+      /* register pcms */
-+      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
-+      if(ret < 0) {
-+              kfree(codec->reg_cache);
-+              return ret;
-+      }
-+
-+      /* power on device */
-+      wm8976_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
-+      wm8976_add_controls(codec);
-+      wm8976_add_widgets(codec);
-+      ret = snd_soc_register_card(socdev);
-+      if(ret < 0) {
-+              snd_soc_free_pcms(socdev);
-+              snd_soc_dapm_free(socdev);
-+      }
-+
-+      return ret;
-+}
-+
-+static struct snd_soc_device *wm8976_socdev;
-+
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+
-+/*
-+ * WM8976 2 wire address is 0x1a
-+ */
-+#define I2C_DRIVERID_WM8976 0xfefe /* liam -  need a proper id */
-+
-+static unsigned short normal_i2c[] = { 0, I2C_CLIENT_END };
-+
-+/* Magic definition of all other variables and things */
-+I2C_CLIENT_INSMOD;
-+
-+static struct i2c_driver wm8976_i2c_driver;
-+static struct i2c_client client_template;
-+
-+/* If the i2c layer weren't so broken, we could pass this kind of data
-+   around */
-+
-+static int wm8976_codec_probe(struct i2c_adapter *adap, int addr, int kind)
-+{
-+      struct snd_soc_device *socdev = wm8976_socdev;
-+      struct wm8976_setup_data *setup = socdev->codec_data;
-+      struct snd_soc_codec *codec = socdev->codec;
-+      struct i2c_client *i2c;
-+      int ret;
-+
-+      if (addr != setup->i2c_address)
-+              return -ENODEV;
-+
-+      client_template.adapter = adap;
-+      client_template.addr = addr;
-+
-+      i2c = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (i2c == NULL){
-+              kfree(codec);
-+              return -ENOMEM;
-+      }
-+      memcpy(i2c, &client_template, sizeof(struct i2c_client));
-+
-+      i2c_set_clientdata(i2c, codec);
-+
-+      codec->control_data = i2c;
-+
-+      ret = i2c_attach_client(i2c);
-+      if(ret < 0) {
-+              err("failed to attach codec at addr %x\n", addr);
-+              goto err;
-+      }
-+
-+      ret = wm8976_init(socdev);
-+      if(ret < 0) {
-+              err("failed to initialise WM8976\n");
-+              goto err;
-+      }
-+      return ret;
-+
-+err:
-+      kfree(codec);
-+      kfree(i2c);
-+      return ret;
-+
-+}
-+
-+static int wm8976_i2c_detach(struct i2c_client *client)
-+{
-+      struct snd_soc_codec *codec = i2c_get_clientdata(client);
-+
-+      i2c_detach_client(client);
-+
-+      kfree(codec->reg_cache);
-+      kfree(client);
-+
-+      return 0;
-+}
-+
-+static int wm8976_i2c_attach(struct i2c_adapter *adap)
-+{
-+      return i2c_probe(adap, &addr_data, wm8976_codec_probe);
-+}
-+
-+/* corgi i2c codec control layer */
-+static struct i2c_driver wm8976_i2c_driver = {
-+      .driver = {
-+              .name = "WM8976 I2C Codec",
-+              .owner = THIS_MODULE,
-+      },
-+      .id =             I2C_DRIVERID_WM8976,
-+      .attach_adapter = wm8976_i2c_attach,
-+      .detach_client =  wm8976_i2c_detach,
-+      .command =        NULL,
-+};
-+
-+static struct i2c_client client_template = {
-+      .name =   "WM8976",
-+      .driver = &wm8976_i2c_driver,
-+};
-+#endif
-+
-+static int wm8976_probe(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct wm8976_setup_data *setup;
-+      struct snd_soc_codec *codec;
-+      int ret = 0;
-+
-+      info("WM8976 Audio Codec %s", WM8976_VERSION);
-+
-+      setup = socdev->codec_data;
-+      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
-+      if (codec == NULL)
-+              return -ENOMEM;
-+
-+      socdev->codec = codec;
-+      mutex_init(&codec->mutex);
-+      INIT_LIST_HEAD(&codec->dapm_widgets);
-+      INIT_LIST_HEAD(&codec->dapm_paths);
-+
-+      wm8976_socdev = socdev;
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      if (setup->i2c_address) {
-+              normal_i2c[0] = setup->i2c_address;
-+              codec->hw_write = (hw_write_t)i2c_master_send;
-+              ret = i2c_add_driver(&wm8976_i2c_driver);
-+              if (ret != 0)
-+                      printk(KERN_ERR "can't add i2c driver");
-+      }
-+#else
-+      /* Add other interfaces here */
-+#endif
-+      return ret;
-+}
-+
-+/* power down chip */
-+static int wm8976_remove(struct platform_device *pdev)
-+{
-+      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
-+      struct snd_soc_codec *codec = socdev->codec;
-+
-+      if (codec->control_data)
-+              wm8976_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
-+
-+      snd_soc_free_pcms(socdev);
-+      snd_soc_dapm_free(socdev);
-+#if defined (CONFIG_I2C) || defined (CONFIG_I2C_MODULE)
-+      i2c_del_driver(&wm8976_i2c_driver);
-+#endif
-+      kfree(codec);
-+
-+      return 0;
-+}
-+
-+struct snd_soc_codec_device soc_codec_dev_wm8976 = {
-+      .probe =        wm8976_probe,
-+      .remove =       wm8976_remove,
-+      .suspend =      wm8976_suspend,
-+      .resume =       wm8976_resume,
-+};
-+
-+EXPORT_SYMBOL_GPL(soc_codec_dev_wm8976);
-+
-+MODULE_DESCRIPTION("ASoC WM8976 driver");
-+MODULE_AUTHOR("Graeme Gregory");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/codecs/wm8976.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/codecs/wm8976.h
-@@ -0,0 +1,73 @@
-+/*
-+ * wm8976.h  --  WM8976 Soc Audio driver
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _WM8976_H
-+#define _WM8976_H
-+
-+/* WM8976 register space */
-+
-+#define WM8976_RESET          0x0
-+#define WM8976_POWER1         0x1
-+#define WM8976_POWER2         0x2
-+#define WM8976_POWER3         0x3
-+#define WM8976_IFACE          0x4
-+#define WM8976_COMP                   0x5
-+#define WM8976_CLOCK          0x6
-+#define WM8976_ADD                    0x7
-+#define WM8976_GPIO                   0x8
-+#define WM8976_JACK1        0x9
-+#define WM8976_DAC                    0xa
-+#define WM8976_DACVOLL            0xb
-+#define WM8976_DACVOLR      0xc
-+#define WM8976_JACK2        0xd
-+#define WM8976_ADC                    0xe
-+#define WM8976_ADCVOL         0xf
-+#define WM8976_EQ1                    0x12
-+#define WM8976_EQ2                    0x13
-+#define WM8976_EQ3                    0x14
-+#define WM8976_EQ4                    0x15
-+#define WM8976_EQ5                    0x16
-+#define WM8976_DACLIM1                0x18
-+#define WM8976_DACLIM2                0x19
-+#define WM8976_NOTCH1         0x1b
-+#define WM8976_NOTCH2         0x1c
-+#define WM8976_NOTCH3         0x1d
-+#define WM8976_NOTCH4         0x1e
-+#define WM8976_ALC1                   0x20
-+#define WM8976_ALC2                   0x21
-+#define WM8976_ALC3                   0x22
-+#define WM8976_NGATE          0x23
-+#define WM8976_PLLN                   0x24
-+#define WM8976_PLLK1          0x25
-+#define WM8976_PLLK2          0x26
-+#define WM8976_PLLK3          0x27
-+#define WM8976_3D           0x29
-+#define WM8976_BEEP         0x2b
-+#define WM8976_INPUT          0x2c
-+#define WM8976_INPPGA         0x2d
-+#define WM8976_ADCBOOST               0x2f
-+#define WM8976_OUTPUT         0x31
-+#define WM8976_MIXL           0x32
-+#define WM8976_MIXR         0x33
-+#define WM8976_HPVOLL         0x34
-+#define WM8976_HPVOLR       0x35
-+#define WM8976_SPKVOLL      0x36
-+#define WM8976_SPKVOLR      0x37
-+#define WM8976_OUT3MIX                0x38
-+#define WM8976_MONOMIX      0x39
-+
-+#define WM8976_CACHEREGNUM    58
-+
-+struct wm8976_setup_data {
-+      unsigned short i2c_address;
-+};
-+
-+extern struct snd_soc_codec_dai wm8976_dai;
-+extern struct snd_soc_codec_device soc_codec_dev_wm8976;
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/imx/imx21-pcm.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/imx/imx21-pcm.c
-@@ -0,0 +1,454 @@
-+/*
-+ * linux/sound/arm/mxc-pcm.c -- ALSA SoC interface for the Freescale i.MX CPU's
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ * Based on pxa2xx-pcm.c by   Nicolas Pitre, (C) 2004 MontaVista Software, Inc.
-+ * and on mxc-alsa-mc13783 (C) 2006 Freescale.
-+ *
-+ * 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.
-+ *
-+ *  Revision history
-+ *    29th Aug 2006   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/slab.h>
-+#include <linux/dma-mapping.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <asm/dma.h>
-+#include <asm/hardware.h>
-+
-+#include "imx-pcm.h"
-+
-+/* debug */
-+#define IMX_DEBUG 0
-+#if IMX_DEBUG
-+#define dbg(format, arg...) printk(format, ## arg)
-+#else
-+#define dbg(format, arg...)
-+#endif
-+
-+static const struct snd_pcm_hardware mxc_pcm_hardware = {
-+      .info                   = (SNDRV_PCM_INFO_INTERLEAVED |
-+                                 SNDRV_PCM_INFO_BLOCK_TRANSFER |
-+                                 SNDRV_PCM_INFO_MMAP |
-+                                 SNDRV_PCM_INFO_MMAP_VALID |
-+                                 SNDRV_PCM_INFO_PAUSE |
-+                                 SNDRV_PCM_INFO_RESUME),
-+      .formats                = SNDRV_PCM_FMTBIT_S16_LE |
-+                                      SNDRV_PCM_FMTBIT_S24_LE,
-+      .buffer_bytes_max       = 32 * 1024,
-+      .period_bytes_min       = 64,
-+      .period_bytes_max       = 8 * 1024,
-+      .periods_min            = 2,
-+      .periods_max            = 255,
-+      .fifo_size              = 0,
-+};
-+
-+struct mxc_runtime_data {
-+      int dma_ch;
-+      struct mxc_pcm_dma_param *dma_params;
-+};
-+
-+/*!
-+  * This function stops the current dma transfert for playback
-+  * and clears the dma pointers.
-+  *
-+  * @param    substream       pointer to the structure of the current stream.
-+  *
-+  */
-+static void audio_stop_dma(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+      unsigned int dma_size = frames_to_bytes(runtime, runtime->period_size);
-+      unsigned int offset  dma_size * s->periods;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&prtd->dma_lock, flags);
-+
-+      dbg("MXC : audio_stop_dma active = 0\n");
-+      prtd->active = 0;
-+      prtd->period = 0;
-+      prtd->periods = 0;
-+
-+      /* this stops the dma channel and clears the buffer ptrs */
-+      mxc_dma_stop(prtd->dma_wchannel);
-+      if(substream == SNDRV_PCM_STREAM_PLAYBACK)
-+              dma_unmap_single(NULL, runtime->dma_addr + offset, dma_size,
-+                                                      DMA_TO_DEVICE);
-+      else
-+              dma_unmap_single(NULL, runtime->dma_addr + offset, dma_size,
-+                                                      DMA_FROM_DEVICE);
-+
-+      spin_unlock_irqrestore(&prtd->dma_lock, flags);
-+}
-+
-+/*!
-+  * This function is called whenever a new audio block needs to be
-+  * transferred to mc13783. The function receives the address and the size
-+  * of the new block and start a new DMA transfer.
-+  *
-+  * @param    substream       pointer to the structure of the current stream.
-+  *
-+  */
-+static int dma_new_period(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime =  substream->runtime;
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+      unsigned int dma_size;
-+      unsigned int offset;
-+      int ret=0;
-+      dma_request_t sdma_request;
-+
-+      if (prtd->active){
-+              memset(&sdma_request, 0, sizeof(dma_request_t));
-+              dma_size = frames_to_bytes(runtime, runtime->period_size);
-+          dbg("s->period (%x) runtime->periods (%d)\n",
-+                      s->period,runtime->periods);
-+              dbg("runtime->period_size (%d) dma_size (%d)\n",
-+                      (unsigned int)runtime->period_size,
-+                      runtime->dma_bytes);
-+
-+              offset = dma_size * prtd->period;
-+              snd_assert(dma_size <= DMA_BUF_SIZE, );
-+              if(substream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      sdma_request.sourceAddr = (char*)(dma_map_single(NULL,
-+                              runtime->dma_area + offset, dma_size, DMA_TO_DEVICE));
-+              else
-+                      sdma_request.destAddr = (char*)(dma_map_single(NULL,
-+                              runtime->dma_area + offset, dma_size, DMA_FROM_DEVICE));
-+              sdma_request.count = dma_size;
-+
-+              dbg("MXC: Start DMA offset (%d) size (%d)\n", offset,
-+                                               runtime->dma_bytes);
-+
-+              mxc_dma_set_config(prtd->dma_wchannel, &sdma_request, 0);
-+              if((ret = mxc_dma_start(prtd->dma_wchannel)) < 0) {
-+                      dbg("audio_process_dma: cannot queue DMA buffer\
-+                                                      (%i)\n", ret);
-+                      return err;
-+              }
-+              prtd->tx_spin = 1; /* FGA little trick to retrieve DMA pos */
-+              prtd->period++;
-+              prtd->period %= runtime->periods;
-+    }
-+      return ret;
-+}
-+
-+
-+/*!
-+  * This is a callback which will be called
-+  * when a TX transfer finishes. The call occurs
-+  * in interrupt context.
-+  *
-+  * @param    dat     pointer to the structure of the current stream.
-+  *
-+  */
-+static void audio_dma_irq(void *data)
-+{
-+      struct snd_pcm_substream *substream;
-+      struct snd_pcm_runtime *runtime;
-+      struct mxc_runtime_data *prtd;
-+      unsigned int dma_size;
-+      unsigned int previous_period;
-+      unsigned int offset;
-+
-+      substream = data;
-+      runtime = substream->runtime;
-+      prtd = runtime->private_data;
-+      previous_period  = prtd->periods;
-+      dma_size = frames_to_bytes(runtime, runtime->period_size);
-+      offset = dma_size * previous_period;
-+
-+      prtd->tx_spin = 0;
-+      prtd->periods++;
-+      prtd->periods %= runtime->periods;
-+
-+      /*
-+        * Give back to the CPU the access to the non cached memory
-+        */
-+      if(substream == SNDRV_PCM_STREAM_PLAYBACK)
-+              dma_unmap_single(NULL, runtime->dma_addr + offset, dma_size,
-+                                                      DMA_TO_DEVICE);
-+      else
-+              dma_unmap_single(NULL, runtime->dma_addr + offset, dma_size,
-+                                                      DMA_FROM_DEVICE);
-+      /*
-+        * If we are getting a callback for an active stream then we inform
-+        * the PCM middle layer we've finished a period
-+        */
-+      if (prtd->active)
-+              snd_pcm_period_elapsed(substream);
-+
-+      /*
-+        * Trig next DMA transfer
-+        */
-+      dma_new_period(substream);
-+}
-+
-+/*!
-+  * This function configures the hardware to allow audio
-+  * playback operations. It is called by ALSA framework.
-+  *
-+  * @param    substream       pointer to the structure of the current stream.
-+  *
-+  * @return              0 on success, -1 otherwise.
-+  */
-+static int
-+snd_mxc_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      int ret = 0;
-+      prtd->period = 0;
-+      prtd->periods = 0;
-+
-+      dma_channel_params params;
-+      int channel = 0; // passed in ?
-+
-+      if ((ret  = mxc_request_dma(&channel, "ALSA TX SDMA") < 0)){
-+              dbg("error requesting a write dma channel\n");
-+              return ret;
-+      }
-+
-+      /* configure DMA params */
-+      memset(&params, 0, sizeof(dma_channel_params));
-+      params.bd_number = 1;
-+      params.arg = s;
-+      params.callback = callback;
-+      params.transfer_type = emi_2_per;
-+      params.watermark_level = SDMA_TXFIFO_WATERMARK;
-+      params.word_size = TRANSFER_16BIT;
-+      //dbg(KERN_ERR "activating connection SSI1 - SDMA\n");
-+      params.per_address = SSI1_BASE_ADDR;
-+      params.event_id = DMA_REQ_SSI1_TX1;
-+      params.peripheral_type = SSI;
-+
-+      /* set up chn with params */
-+      mxc_dma_setup_channel(channel, &params);
-+      s->dma_wchannel = channel;
-+
-+      return ret;
-+}
-+
-+static int mxc_pcm_hw_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      int ret;
-+
-+      if((ret=snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params))) < 0)
-+              return ret;
-+      runtime->dma_addr = virt_to_phys(runtime->dma_area);
-+
-+      return ret;
-+}
-+
-+static int mxc_pcm_hw_free(struct snd_pcm_substream *substream)
-+{
-+      return snd_pcm_lib_free_pages(substream);
-+}
-+
-+static int mxc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      struct mxc_runtime_data *prtd = substream->runtime->private_data;
-+      int ret = 0;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+              prtd->tx_spin = 0;
-+              /* requested stream startup */
-+              prtd->active = 1;
-+        ret = dma_new_period(substream);
-+              break;
-+      case SNDRV_PCM_TRIGGER_STOP:
-+              /* requested stream shutdown */
-+              ret = audio_stop_dma(substream);
-+              break;
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+              prtd->active = 0;
-+              prtd->periods = 0;
-+              break;
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+              prtd->active = 1;
-+              prtd->tx_spin = 0;
-+              ret = dma_new_period(substream);
-+              break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              prtd->active = 0;
-+              break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+              prtd->active = 1;
-+              if (prtd->old_offset) {
-+                      prtd->tx_spin = 0;
-+            ret = dma_new_period(substream);
-+              }
-+              break;
-+      default:
-+              ret = -EINVAL;
-+              break;
-+      }
-+
-+      return ret;
-+}
-+
-+static snd_pcm_uframes_t mxc_pcm_pointer(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+      unsigned int offset = 0;
-+
-+      /* tx_spin value is used here to check if a transfert is active */
-+      if (prtd->tx_spin){
-+              offset = (runtime->period_size * (prtd->periods)) +
-+                                              (runtime->period_size >> 1);
-+              if (offset >= runtime->buffer_size)
-+                      offset = runtime->period_size >> 1;
-+      } else {
-+              offset = (runtime->period_size * (s->periods));
-+              if (offset >= runtime->buffer_size)
-+                      offset = 0;
-+      }
-+
-+      return offset;
-+}
-+
-+
-+static int mxc_pcm_open(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct mxc_runtime_data *prtd;
-+      int ret;
-+
-+      snd_soc_set_runtime_hwparams(substream, &mxc_pcm_hardware);
-+
-+      if ((err = snd_pcm_hw_constraint_integer(runtime,
-+                                      SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
-+              return err;
-+      if ((err = snd_pcm_hw_constraint_list(runtime, 0,
-+                      SNDRV_PCM_HW_PARAM_RATE, &hw_playback_rates)) < 0)
-+              return err;
-+      msleep(10); // liam - why
-+
-+      /* setup DMA controller for playback */
-+      if((err = configure_write_channel(&mxc_mc13783->s[SNDRV_PCM_STREAM_PLAYBACK],
-+                                      audio_dma_irq)) < 0 )
-+              return err;
-+
-+      if((prtd = kzalloc(sizeof(struct mxc_runtime_data), GFP_KERNEL)) == NULL) {
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+
-+      runtime->private_data = prtd;
-+      return 0;
-+
-+ err1:
-+      kfree(prtd);
-+ out:
-+      return ret;
-+}
-+
-+static int mxc_pcm_close(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+
-+//    mxc_mc13783_t *chip;
-+      audio_stream_t *s;
-+      device_data_t* device;
-+      int ssi;
-+
-+      //chip = snd_pcm_substream_chip(substream);
-+      s = &chip->s[substream->pstr->stream];
-+      device = &s->stream_device;
-+      ssi = device->ssi;
-+
-+      //disable_stereodac();
-+
-+      ssi_transmit_enable(ssi, false);
-+      ssi_interrupt_disable(ssi, ssi_tx_dma_interrupt_enable);
-+      ssi_tx_fifo_enable(ssi, ssi_fifo_0, false);
-+      ssi_enable(ssi, false);
-+
-+      chip->s[substream->pstr->stream].stream = NULL;
-+
-+      return 0;
-+}
-+
-+static int
-+mxc_pcm_mmap(struct snd_pcm_substream *substream, struct vm_area_struct *vma)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      return dma_mmap_writecombine(substream->pcm->card->dev, vma,
-+                                   runtime->dma_area,
-+                                   runtime->dma_addr,
-+                                   runtime->dma_bytes);
-+}
-+
-+struct snd_pcm_ops mxc_pcm_ops = {
-+      .open           = mxc_pcm_open,
-+      .close          = mxc_pcm_close,
-+      .ioctl          = snd_pcm_lib_ioctl,
-+      .hw_params      = mxc_pcm_hw_params,
-+      .hw_free        = mxc_pcm_hw_free,
-+      .prepare        = mxc_pcm_prepare,
-+      .trigger        = mxc_pcm_trigger,
-+      .pointer        = mxc_pcm_pointer,
-+      .mmap           = mxc_pcm_mmap,
-+};
-+
-+static u64 mxc_pcm_dmamask = 0xffffffff;
-+
-+int mxc_pcm_new(struct snd_card *card, struct snd_soc_codec_dai *dai,
-+      struct snd_pcm *pcm)
-+{
-+      int ret = 0;
-+
-+      if (!card->dev->dma_mask)
-+              card->dev->dma_mask = &mxc_pcm_dmamask;
-+      if (!card->dev->coherent_dma_mask)
-+              card->dev->coherent_dma_mask = 0xffffffff;
-+
-+      if (dai->playback.channels_min) {
-+              ret = mxc_pcm_preallocate_dma_buffer(pcm,
-+                      SNDRV_PCM_STREAM_PLAYBACK);
-+              if (ret)
-+                      goto out;
-+      }
-+
-+      if (dai->capture.channels_min) {
-+              ret = mxc_pcm_preallocate_dma_buffer(pcm,
-+                      SNDRV_PCM_STREAM_CAPTURE);
-+              if (ret)
-+                      goto out;
-+      }
-+ out:
-+      return ret;
-+}
-+
-+struct snd_soc_platform mxc_soc_platform = {
-+      .name           = "mxc-audio",
-+      .pcm_ops        = &mxc_pcm_ops,
-+      .pcm_new        = mxc_pcm_new,
-+      .pcm_free       = mxc_pcm_free_dma_buffers,
-+};
-+
-+EXPORT_SYMBOL_GPL(mxc_soc_platform);
-+
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_DESCRIPTION("Freescale i.MX PCM DMA module");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/imx/imx21-pcm.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/imx/imx21-pcm.h
-@@ -0,0 +1,237 @@
-+/*
-+ * mxc-pcm.h :- ASoC platform header for Freescale i.MX
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _MXC_PCM_H
-+#define _MXC_PCM_H
-+
-+struct {
-+      char *name;                     /* stream identifier */
-+      dma_channel_params dma_params;
-+} mxc_pcm_dma_param;
-+
-+extern struct snd_soc_cpu_dai mxc_ssi_dai[3];
-+
-+/* platform data */
-+extern struct snd_soc_platform mxc_soc_platform;
-+extern struct snd_ac97_bus_ops mxc_ac97_ops;
-+
-+/* temp until imx-regs.h is up2date */
-+#define SSI1_STX0   __REG(IMX_SSI1_BASE + 0x00)
-+#define SSI1_STX0_PHYS   __PHYS_REG(IMX_SSI1_BASE + 0x00)
-+#define SSI1_STX1   __REG(IMX_SSI1_BASE + 0x04)
-+#define SSI1_STX1_PHYS   __PHYS_REG(IMX_SSI1_BASE + 0x04)
-+#define SSI1_SRX0   __REG(IMX_SSI1_BASE + 0x08)
-+#define SSI1_SRX0_PHYS   __PHYS_REG(IMX_SSI1_BASE + 0x08)
-+#define SSI1_SRX1   __REG(IMX_SSI1_BASE + 0x0c)
-+#define SSI1_SRX1_PHYS   __PHYS_REG(IMX_SSI1_BASE + 0x0c)
-+#define SSI1_SCR    __REG(IMX_SSI1_BASE + 0x10)
-+#define SSI1_SISR   __REG(IMX_SSI1_BASE + 0x14)
-+#define SSI1_SIER   __REG(IMX_SSI1_BASE + 0x18)
-+#define SSI1_STCR   __REG(IMX_SSI1_BASE + 0x1c)
-+#define SSI1_SRCR   __REG(IMX_SSI1_BASE + 0x20)
-+#define SSI1_STCCR  __REG(IMX_SSI1_BASE + 0x24)
-+#define SSI1_SRCCR  __REG(IMX_SSI1_BASE + 0x28)
-+#define SSI1_SFCSR  __REG(IMX_SSI1_BASE + 0x2c)
-+#define SSI1_STR    __REG(IMX_SSI1_BASE + 0x30)
-+#define SSI1_SOR    __REG(IMX_SSI1_BASE + 0x34)
-+#define SSI1_SACNT  __REG(IMX_SSI1_BASE + 0x38)
-+#define SSI1_SACADD __REG(IMX_SSI1_BASE + 0x3c)
-+#define SSI1_SACDAT __REG(IMX_SSI1_BASE + 0x40)
-+#define SSI1_SATAG  __REG(IMX_SSI1_BASE + 0x44)
-+#define SSI1_STMSK  __REG(IMX_SSI1_BASE + 0x48)
-+#define SSI1_SRMSK  __REG(IMX_SSI1_BASE + 0x4c)
-+
-+#define SSI2_STX0   __REG(IMX_SSI2_BASE + 0x00)
-+#define SSI2_STX0_PHYS   __PHYS_REG(IMX_SSI2_BASE + 0x00)
-+#define SSI2_STX1   __REG(IMX_SSI2_BASE + 0x04)
-+#define SSI2_STX1_PHYS   __PHYS_REG(IMX_SSI2_BASE + 0x04)
-+#define SSI2_SRX0   __REG(IMX_SSI2_BASE + 0x08)
-+#define SSI2_SRX0_PHYS   __PHYS_REG(IMX_SSI2_BASE + 0x08)
-+#define SSI2_SRX1   __REG(IMX_SSI2_BASE + 0x0c)
-+#define SSI2_SRX1_PHYS   __PHYS_REG(IMX_SSI2_BASE + 0x0c)
-+#define SSI2_SCR    __REG(IMX_SSI2_BASE + 0x10)
-+#define SSI2_SISR   __REG(IMX_SSI2_BASE + 0x14)
-+#define SSI2_SIER   __REG(IMX_SSI2_BASE + 0x18)
-+#define SSI2_STCR   __REG(IMX_SSI2_BASE + 0x1c)
-+#define SSI2_SRCR   __REG(IMX_SSI2_BASE + 0x20)
-+#define SSI2_STCCR  __REG(IMX_SSI2_BASE + 0x24)
-+#define SSI2_SRCCR  __REG(IMX_SSI2_BASE + 0x28)
-+#define SSI2_SFCSR  __REG(IMX_SSI2_BASE + 0x2c)
-+#define SSI2_STR    __REG(IMX_SSI2_BASE + 0x30)
-+#define SSI2_SOR    __REG(IMX_SSI2_BASE + 0x34)
-+#define SSI2_SACNT  __REG(IMX_SSI2_BASE + 0x38)
-+#define SSI2_SACADD __REG(IMX_SSI2_BASE + 0x3c)
-+#define SSI2_SACDAT __REG(IMX_SSI2_BASE + 0x40)
-+#define SSI2_SATAG  __REG(IMX_SSI2_BASE + 0x44)
-+#define SSI2_STMSK  __REG(IMX_SSI2_BASE + 0x48)
-+#define SSI2_SRMSK  __REG(IMX_SSI2_BASE + 0x4c)
-+
-+#define SSI_SCR_CLK_IST        (1 << 9)
-+#define SSI_SCR_TCH_EN         (1 << 8)
-+#define SSI_SCR_SYS_CLK_EN     (1 << 7)
-+#define SSI_SCR_I2S_MODE_NORM  (0 << 5)
-+#define SSI_SCR_I2S_MODE_MSTR  (1 << 5)
-+#define SSI_SCR_I2S_MODE_SLAVE (2 << 5)
-+#define SSI_SCR_SYN            (1 << 4)
-+#define SSI_SCR_NET            (1 << 3)
-+#define SSI_SCR_RE             (1 << 2)
-+#define SSI_SCR_TE             (1 << 1)
-+#define SSI_SCR_SSIEN          (1 << 0)
-+
-+#define SSI_SISR_CMDAU         (1 << 18)
-+#define SSI_SISR_CMDDU         (1 << 17)
-+#define SSI_SISR_RXT           (1 << 16)
-+#define SSI_SISR_RDR1          (1 << 15)
-+#define SSI_SISR_RDR0          (1 << 14)
-+#define SSI_SISR_TDE1          (1 << 13)
-+#define SSI_SISR_TDE0          (1 << 12)
-+#define SSI_SISR_ROE1          (1 << 11)
-+#define SSI_SISR_ROE0          (1 << 10)
-+#define SSI_SISR_TUE1          (1 << 9)
-+#define SSI_SISR_TUE0          (1 << 8)
-+#define SSI_SISR_TFS           (1 << 7)
-+#define SSI_SISR_RFS           (1 << 6)
-+#define SSI_SISR_TLS           (1 << 5)
-+#define SSI_SISR_RLS           (1 << 4)
-+#define SSI_SISR_RFF1          (1 << 3)
-+#define SSI_SISR_RFF0          (1 << 2)
-+#define SSI_SISR_TFE1          (1 << 1)
-+#define SSI_SISR_TFE0          (1 << 0)
-+
-+#define SSI_SIER_RDMAE         (1 << 22)
-+#define SSI_SIER_RIE           (1 << 21)
-+#define SSI_SIER_TDMAE         (1 << 20)
-+#define SSI_SIER_TIE           (1 << 19)
-+#define SSI_SIER_CMDAU_EN      (1 << 18)
-+#define SSI_SIER_CMDDU_EN      (1 << 17)
-+#define SSI_SIER_RXT_EN        (1 << 16)
-+#define SSI_SIER_RDR1_EN       (1 << 15)
-+#define SSI_SIER_RDR0_EN       (1 << 14)
-+#define SSI_SIER_TDE1_EN       (1 << 13)
-+#define SSI_SIER_TDE0_EN       (1 << 12)
-+#define SSI_SIER_ROE1_EN       (1 << 11)
-+#define SSI_SIER_ROE0_EN       (1 << 10)
-+#define SSI_SIER_TUE1_EN       (1 << 9)
-+#define SSI_SIER_TUE0_EN       (1 << 8)
-+#define SSI_SIER_TFS_EN        (1 << 7)
-+#define SSI_SIER_RFS_EN        (1 << 6)
-+#define SSI_SIER_TLS_EN        (1 << 5)
-+#define SSI_SIER_RLS_EN        (1 << 4)
-+#define SSI_SIER_RFF1_EN       (1 << 3)
-+#define SSI_SIER_RFF0_EN       (1 << 2)
-+#define SSI_SIER_TFE1_EN       (1 << 1)
-+#define SSI_SIER_TFE0_EN       (1 << 0)
-+
-+#define SSI_STCR_TXBIT0        (1 << 9)
-+#define SSI_STCR_TFEN1         (1 << 8)
-+#define SSI_STCR_TFEN0         (1 << 7)
-+#define SSI_STCR_TFDIR         (1 << 6)
-+#define SSI_STCR_TXDIR         (1 << 5)
-+#define SSI_STCR_TSHFD         (1 << 4)
-+#define SSI_STCR_TSCKP         (1 << 3)
-+#define SSI_STCR_TFSI          (1 << 2)
-+#define SSI_STCR_TFSL          (1 << 1)
-+#define SSI_STCR_TEFS          (1 << 0)
-+
-+#define SSI_SRCR_RXBIT0        (1 << 9)
-+#define SSI_SRCR_RFEN1         (1 << 8)
-+#define SSI_SRCR_RFEN0         (1 << 7)
-+#define SSI_SRCR_RFDIR         (1 << 6)
-+#define SSI_SRCR_RXDIR         (1 << 5)
-+#define SSI_SRCR_RSHFD         (1 << 4)
-+#define SSI_SRCR_RSCKP         (1 << 3)
-+#define SSI_SRCR_RFSI          (1 << 2)
-+#define SSI_SRCR_RFSL          (1 << 1)
-+#define SSI_SRCR_REFS          (1 << 0)
-+
-+#define SSI_STCCR_DIV2         (1 << 18)
-+#define SSI_STCCR_PSR          (1 << 15)
-+#define SSI_STCCR_WL(x)        ((((x) - 2) >> 1) << 13)
-+#define SSI_STCCR_DC(x)        (((x) & 0x1f) << 8)
-+#define SSI_STCCR_PM(x)        (((x) & 0xff) << 0)
-+
-+#define SSI_SRCCR_DIV2         (1 << 18)
-+#define SSI_SRCCR_PSR          (1 << 15)
-+#define SSI_SRCCR_WL(x)        ((((x) - 2) >> 1) << 13)
-+#define SSI_SRCCR_DC(x)        (((x) & 0x1f) << 8)
-+#define SSI_SRCCR_PM(x)        (((x) & 0xff) << 0)
-+
-+
-+#define SSI_SFCSR_RFCNT1(x)   (((x) & 0xf) << 28)
-+#define SSI_SFCSR_TFCNT1(x)   (((x) & 0xf) << 24)
-+#define SSI_SFCSR_RFWM1(x)    (((x) & 0xf) << 20)
-+#define SSI_SFCSR_TFWM1(x)    (((x) & 0xf) << 16)
-+#define SSI_SFCSR_RFCNT0(x)   (((x) & 0xf) << 12)
-+#define SSI_SFCSR_TFCNT0(x)   (((x) & 0xf) <<  8)
-+#define SSI_SFCSR_RFWM0(x)    (((x) & 0xf) <<  4)
-+#define SSI_SFCSR_TFWM0(x)    (((x) & 0xf) <<  0)
-+
-+#define SSI_STR_TEST          (1 << 15)
-+#define SSI_STR_RCK2TCK       (1 << 14)
-+#define SSI_STR_RFS2TFS       (1 << 13)
-+#define SSI_STR_RXSTATE(x)    (((x) & 0xf) << 8)
-+#define SSI_STR_TXD2RXD       (1 <<  7)
-+#define SSI_STR_TCK2RCK       (1 <<  6)
-+#define SSI_STR_TFS2RFS       (1 <<  5)
-+#define SSI_STR_TXSTATE(x)    (((x) & 0xf) << 0)
-+
-+#define SSI_SOR_CLKOFF        (1 << 6)
-+#define SSI_SOR_RX_CLR        (1 << 5)
-+#define SSI_SOR_TX_CLR        (1 << 4)
-+#define SSI_SOR_INIT          (1 << 3)
-+#define SSI_SOR_WAIT(x)       (((x) & 0x3) << 1)
-+#define SSI_SOR_SYNRST        (1 << 0)
-+
-+#define SSI_SACNT_FRDIV(x)    (((x) & 0x3f) << 5)
-+#define SSI_SACNT_WR          (x << 4)
-+#define SSI_SACNT_RD          (x << 3)
-+#define SSI_SACNT_TIF         (x << 2)
-+#define SSI_SACNT_FV          (x << 1)
-+#define SSI_SACNT_A97EN       (x << 0)
-+
-+
-+/* AUDMUX registers */
-+#define AUDMUX_HPCR1         __REG(IMX_AUDMUX_BASE + 0x00)
-+#define AUDMUX_HPCR2         __REG(IMX_AUDMUX_BASE + 0x04)
-+#define AUDMUX_HPCR3         __REG(IMX_AUDMUX_BASE + 0x08)
-+#define AUDMUX_PPCR1         __REG(IMX_AUDMUX_BASE + 0x10)
-+#define AUDMUX_PPCR2         __REG(IMX_AUDMUX_BASE + 0x14)
-+#define AUDMUX_PPCR3         __REG(IMX_AUDMUX_BASE + 0x18)
-+
-+#define AUDMUX_HPCR_TFSDIR         (1 << 31)
-+#define AUDMUX_HPCR_TCLKDIR        (1 << 30)
-+#define AUDMUX_HPCR_TFCSEL_TX      (0 << 26)
-+#define AUDMUX_HPCR_TFCSEL_RX      (8 << 26)
-+#define AUDMUX_HPCR_TFCSEL(x)      (((x) & 0x7) << 26)
-+#define AUDMUX_HPCR_RFSDIR         (1 << 25)
-+#define AUDMUX_HPCR_RCLKDIR        (1 << 24)
-+#define AUDMUX_HPCR_RFCSEL_TX      (0 << 20)
-+#define AUDMUX_HPCR_RFCSEL_RX      (8 << 20)
-+#define AUDMUX_HPCR_RFCSEL(x)      (((x) & 0x7) << 20)
-+#define AUDMUX_HPCR_RXDSEL(x)      (((x) & 0x7) << 13)
-+#define AUDMUX_HPCR_SYN            (1 << 12)
-+#define AUDMUX_HPCR_TXRXEN         (1 << 10)
-+#define AUDMUX_HPCR_INMEN          (1 <<  8)
-+#define AUDMUX_HPCR_INMMASK(x)     (((x) & 0xff) << 0)
-+
-+#define AUDMUX_PPCR_TFSDIR         (1 << 31)
-+#define AUDMUX_PPCR_TCLKDIR        (1 << 30)
-+#define AUDMUX_PPCR_TFCSEL_TX      (0 << 26)
-+#define AUDMUX_PPCR_TFCSEL_RX      (8 << 26)
-+#define AUDMUX_PPCR_TFCSEL(x)      (((x) & 0x7) << 26)
-+#define AUDMUX_PPCR_RFSDIR         (1 << 25)
-+#define AUDMUX_PPCR_RCLKDIR        (1 << 24)
-+#define AUDMUX_PPCR_RFCSEL_TX      (0 << 20)
-+#define AUDMUX_PPCR_RFCSEL_RX      (8 << 20)
-+#define AUDMUX_PPCR_RFCSEL(x)      (((x) & 0x7) << 20)
-+#define AUDMUX_PPCR_RXDSEL(x)      (((x) & 0x7) << 13)
-+#define AUDMUX_PPCR_SYN            (1 << 12)
-+#define AUDMUX_PPCR_TXRXEN         (1 << 10)
-+
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/imx/imx31-pcm.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/imx/imx31-pcm.c
-@@ -0,0 +1,454 @@
-+/*
-+ * linux/sound/arm/mxc-pcm.c -- ALSA SoC interface for the Freescale i.MX CPU's
-+ *
-+ * Copyright 2006 Wolfson Microelectronics PLC.
-+ * Author: Liam Girdwood
-+ *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ * Based on pxa2xx-pcm.c by   Nicolas Pitre, (C) 2004 MontaVista Software, Inc.
-+ * and on mxc-alsa-mc13783 (C) 2006 Freescale.
-+ *
-+ * 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.
-+ *
-+ *  Revision history
-+ *    29th Aug 2006   Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/slab.h>
-+#include <linux/dma-mapping.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+#include <asm/dma.h>
-+#include <asm/hardware.h>
-+
-+#include "imx-pcm.h"
-+
-+/* debug */
-+#define IMX_DEBUG 0
-+#if IMX_DEBUG
-+#define dbg(format, arg...) printk(format, ## arg)
-+#else
-+#define dbg(format, arg...)
-+#endif
-+
-+static const struct snd_pcm_hardware mxc_pcm_hardware = {
-+      .info                   = (SNDRV_PCM_INFO_INTERLEAVED |
-+                                 SNDRV_PCM_INFO_BLOCK_TRANSFER |
-+                                 SNDRV_PCM_INFO_MMAP |
-+                                 SNDRV_PCM_INFO_MMAP_VALID |
-+                                 SNDRV_PCM_INFO_PAUSE |
-+                                 SNDRV_PCM_INFO_RESUME),
-+      .formats                = SNDRV_PCM_FMTBIT_S16_LE |
-+                                      SNDRV_PCM_FMTBIT_S24_LE,
-+      .buffer_bytes_max       = 32 * 1024,
-+      .period_bytes_min       = 64,
-+      .period_bytes_max       = 8 * 1024,
-+      .periods_min            = 2,
-+      .periods_max            = 255,
-+      .fifo_size              = 0,
-+};
-+
-+struct mxc_runtime_data {
-+      int dma_ch;
-+      struct mxc_pcm_dma_param *dma_params;
-+};
-+
-+/*!
-+  * This function stops the current dma transfert for playback
-+  * and clears the dma pointers.
-+  *
-+  * @param    substream       pointer to the structure of the current stream.
-+  *
-+  */
-+static void audio_stop_dma(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+      unsigned int dma_size = frames_to_bytes(runtime, runtime->period_size);
-+      unsigned int offset  dma_size * s->periods;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&prtd->dma_lock, flags);
-+
-+      dbg("MXC : audio_stop_dma active = 0\n");
-+      prtd->active = 0;
-+      prtd->period = 0;
-+      prtd->periods = 0;
-+
-+      /* this stops the dma channel and clears the buffer ptrs */
-+      mxc_dma_stop(prtd->dma_wchannel);
-+      if(substream == SNDRV_PCM_STREAM_PLAYBACK)
-+              dma_unmap_single(NULL, runtime->dma_addr + offset, dma_size,
-+                                                      DMA_TO_DEVICE);
-+      else
-+              dma_unmap_single(NULL, runtime->dma_addr + offset, dma_size,
-+                                                      DMA_FROM_DEVICE);
-+
-+      spin_unlock_irqrestore(&prtd->dma_lock, flags);
-+}
-+
-+/*!
-+  * This function is called whenever a new audio block needs to be
-+  * transferred to mc13783. The function receives the address and the size
-+  * of the new block and start a new DMA transfer.
-+  *
-+  * @param    substream       pointer to the structure of the current stream.
-+  *
-+  */
-+static int dma_new_period(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime =  substream->runtime;
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+      unsigned int dma_size;
-+      unsigned int offset;
-+      int ret=0;
-+      dma_request_t sdma_request;
-+
-+      if (prtd->active){
-+              memset(&sdma_request, 0, sizeof(dma_request_t));
-+              dma_size = frames_to_bytes(runtime, runtime->period_size);
-+          dbg("s->period (%x) runtime->periods (%d)\n",
-+                      s->period,runtime->periods);
-+              dbg("runtime->period_size (%d) dma_size (%d)\n",
-+                      (unsigned int)runtime->period_size,
-+                      runtime->dma_bytes);
-+
-+              offset = dma_size * prtd->period;
-+              snd_assert(dma_size <= DMA_BUF_SIZE, );
-+              if(substream == SNDRV_PCM_STREAM_PLAYBACK)
-+                      sdma_request.sourceAddr = (char*)(dma_map_single(NULL,
-+                              runtime->dma_area + offset, dma_size, DMA_TO_DEVICE));
-+              else
-+                      sdma_request.destAddr = (char*)(dma_map_single(NULL,
-+                              runtime->dma_area + offset, dma_size, DMA_FROM_DEVICE));
-+              sdma_request.count = dma_size;
-+
-+              dbg("MXC: Start DMA offset (%d) size (%d)\n", offset,
-+                                               runtime->dma_bytes);
-+
-+              mxc_dma_set_config(prtd->dma_wchannel, &sdma_request, 0);
-+              if((ret = mxc_dma_start(prtd->dma_wchannel)) < 0) {
-+                      dbg("audio_process_dma: cannot queue DMA buffer\
-+                                                      (%i)\n", ret);
-+                      return err;
-+              }
-+              prtd->tx_spin = 1; /* FGA little trick to retrieve DMA pos */
-+              prtd->period++;
-+              prtd->period %= runtime->periods;
-+    }
-+      return ret;
-+}
-+
-+
-+/*!
-+  * This is a callback which will be called
-+  * when a TX transfer finishes. The call occurs
-+  * in interrupt context.
-+  *
-+  * @param    dat     pointer to the structure of the current stream.
-+  *
-+  */
-+static void audio_dma_irq(void *data)
-+{
-+      struct snd_pcm_substream *substream;
-+      struct snd_pcm_runtime *runtime;
-+      struct mxc_runtime_data *prtd;
-+      unsigned int dma_size;
-+      unsigned int previous_period;
-+      unsigned int offset;
-+
-+      substream = data;
-+      runtime = substream->runtime;
-+      prtd = runtime->private_data;
-+      previous_period  = prtd->periods;
-+      dma_size = frames_to_bytes(runtime, runtime->period_size);
-+      offset = dma_size * previous_period;
-+
-+      prtd->tx_spin = 0;
-+      prtd->periods++;
-+      prtd->periods %= runtime->periods;
-+
-+      /*
-+        * Give back to the CPU the access to the non cached memory
-+        */
-+      if(substream == SNDRV_PCM_STREAM_PLAYBACK)
-+              dma_unmap_single(NULL, runtime->dma_addr + offset, dma_size,
-+                                                      DMA_TO_DEVICE);
-+      else
-+              dma_unmap_single(NULL, runtime->dma_addr + offset, dma_size,
-+                                                      DMA_FROM_DEVICE);
-+      /*
-+        * If we are getting a callback for an active stream then we inform
-+        * the PCM middle layer we've finished a period
-+        */
-+      if (prtd->active)
-+              snd_pcm_period_elapsed(substream);
-+
-+      /*
-+        * Trig next DMA transfer
-+        */
-+      dma_new_period(substream);
-+}
-+
-+/*!
-+  * This function configures the hardware to allow audio
-+  * playback operations. It is called by ALSA framework.
-+  *
-+  * @param    substream       pointer to the structure of the current stream.
-+  *
-+  * @return              0 on success, -1 otherwise.
-+  */
-+static int
-+snd_mxc_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      int ret = 0;
-+      prtd->period = 0;
-+      prtd->periods = 0;
-+
-+      dma_channel_params params;
-+      int channel = 0; // passed in ?
-+
-+      if ((ret  = mxc_request_dma(&channel, "ALSA TX SDMA") < 0)){
-+              dbg("error requesting a write dma channel\n");
-+              return ret;
-+      }
-+
-+      /* configure DMA params */
-+      memset(&params, 0, sizeof(dma_channel_params));
-+      params.bd_number = 1;
-+      params.arg = s;
-+      params.callback = callback;
-+      params.transfer_type = emi_2_per;
-+      params.watermark_level = SDMA_TXFIFO_WATERMARK;
-+      params.word_size = TRANSFER_16BIT;
-+      //dbg(KERN_ERR "activating connection SSI1 - SDMA\n");
-+      params.per_address = SSI1_BASE_ADDR;
-+      params.event_id = DMA_REQ_SSI1_TX1;
-+      params.peripheral_type = SSI;
-+
-+      /* set up chn with params */
-+      mxc_dma_setup_channel(channel, &params);
-+      s->dma_wchannel = channel;
-+
-+      return ret;
-+}
-+
-+static int mxc_pcm_hw_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      int ret;
-+
-+      if((ret=snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params))) < 0)
-+              return ret;
-+      runtime->dma_addr = virt_to_phys(runtime->dma_area);
-+
-+      return ret;
-+}
-+
-+static int mxc_pcm_hw_free(struct snd_pcm_substream *substream)
-+{
-+      return snd_pcm_lib_free_pages(substream);
-+}
-+
-+static int mxc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      struct mxc_runtime_data *prtd = substream->runtime->private_data;
-+      int ret = 0;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+              prtd->tx_spin = 0;
-+              /* requested stream startup */
-+              prtd->active = 1;
-+        ret = dma_new_period(substream);
-+              break;
-+      case SNDRV_PCM_TRIGGER_STOP:
-+              /* requested stream shutdown */
-+              ret = audio_stop_dma(substream);
-+              break;
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+              prtd->active = 0;
-+              prtd->periods = 0;
-+              break;
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+              prtd->active = 1;
-+              prtd->tx_spin = 0;
-+              ret = dma_new_period(substream);
-+              break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              prtd->active = 0;
-+              break;
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+              prtd->active = 1;
-+              if (prtd->old_offset) {
-+                      prtd->tx_spin = 0;
-+            ret = dma_new_period(substream);
-+              }
-+              break;
-+      default:
-+              ret = -EINVAL;
-+              break;
-+      }
-+
-+      return ret;
-+}
-+
-+static snd_pcm_uframes_t mxc_pcm_pointer(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+      unsigned int offset = 0;
-+
-+      /* tx_spin value is used here to check if a transfert is active */
-+      if (prtd->tx_spin){
-+              offset = (runtime->period_size * (prtd->periods)) +
-+                                              (runtime->period_size >> 1);
-+              if (offset >= runtime->buffer_size)
-+                      offset = runtime->period_size >> 1;
-+      } else {
-+              offset = (runtime->period_size * (s->periods));
-+              if (offset >= runtime->buffer_size)
-+                      offset = 0;
-+      }
-+
-+      return offset;
-+}
-+
-+
-+static int mxc_pcm_open(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct mxc_runtime_data *prtd;
-+      int ret;
-+
-+      snd_soc_set_runtime_hwparams(substream, &mxc_pcm_hardware);
-+
-+      if ((err = snd_pcm_hw_constraint_integer(runtime,
-+                                      SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
-+              return err;
-+      if ((err = snd_pcm_hw_constraint_list(runtime, 0,
-+                      SNDRV_PCM_HW_PARAM_RATE, &hw_playback_rates)) < 0)
-+              return err;
-+      msleep(10); // liam - why
-+
-+      /* setup DMA controller for playback */
-+      if((err = configure_write_channel(&mxc_mc13783->s[SNDRV_PCM_STREAM_PLAYBACK],
-+                                      audio_dma_irq)) < 0 )
-+              return err;
-+
-+      if((prtd = kzalloc(sizeof(struct mxc_runtime_data), GFP_KERNEL)) == NULL) {
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+
-+      runtime->private_data = prtd;
-+      return 0;
-+
-+ err1:
-+      kfree(prtd);
-+ out:
-+      return ret;
-+}
-+
-+static int mxc_pcm_close(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct mxc_runtime_data *prtd = runtime->private_data;
-+
-+//    mxc_mc13783_t *chip;
-+      audio_stream_t *s;
-+      device_data_t* device;
-+      int ssi;
-+
-+      //chip = snd_pcm_substream_chip(substream);
-+      s = &chip->s[substream->pstr->stream];
-+      device = &s->stream_device;
-+      ssi = device->ssi;
-+
-+      //disable_stereodac();
-+
-+      ssi_transmit_enable(ssi, false);
-+      ssi_interrupt_disable(ssi, ssi_tx_dma_interrupt_enable);
-+      ssi_tx_fifo_enable(ssi, ssi_fifo_0, false);
-+      ssi_enable(ssi, false);
-+
-+      chip->s[substream->pstr->stream].stream = NULL;
-+
-+      return 0;
-+}
-+
-+static int
-+mxc_pcm_mmap(struct snd_pcm_substream *substream, struct vm_area_struct *vma)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      return dma_mmap_writecombine(substream->pcm->card->dev, vma,
-+                                   runtime->dma_area,
-+                                   runtime->dma_addr,
-+                                   runtime->dma_bytes);
-+}
-+
-+struct snd_pcm_ops mxc_pcm_ops = {
-+      .open           = mxc_pcm_open,
-+      .close          = mxc_pcm_close,
-+      .ioctl          = snd_pcm_lib_ioctl,
-+      .hw_params      = mxc_pcm_hw_params,
-+      .hw_free        = mxc_pcm_hw_free,
-+      .prepare        = mxc_pcm_prepare,
-+      .trigger        = mxc_pcm_trigger,
-+      .pointer        = mxc_pcm_pointer,
-+      .mmap           = mxc_pcm_mmap,
-+};
-+
-+static u64 mxc_pcm_dmamask = 0xffffffff;
-+
-+int mxc_pcm_new(struct snd_card *card, struct snd_soc_codec_dai *dai,
-+      struct snd_pcm *pcm)
-+{
-+      int ret = 0;
-+
-+      if (!card->dev->dma_mask)
-+              card->dev->dma_mask = &mxc_pcm_dmamask;
-+      if (!card->dev->coherent_dma_mask)
-+              card->dev->coherent_dma_mask = 0xffffffff;
-+
-+      if (dai->playback.channels_min) {
-+              ret = mxc_pcm_preallocate_dma_buffer(pcm,
-+                      SNDRV_PCM_STREAM_PLAYBACK);
-+              if (ret)
-+                      goto out;
-+      }
-+
-+      if (dai->capture.channels_min) {
-+              ret = mxc_pcm_preallocate_dma_buffer(pcm,
-+                      SNDRV_PCM_STREAM_CAPTURE);
-+              if (ret)
-+                      goto out;
-+      }
-+ out:
-+      return ret;
-+}
-+
-+struct snd_soc_platform mxc_soc_platform = {
-+      .name           = "mxc-audio",
-+      .pcm_ops        = &mxc_pcm_ops,
-+      .pcm_new        = mxc_pcm_new,
-+      .pcm_free       = mxc_pcm_free_dma_buffers,
-+};
-+
-+EXPORT_SYMBOL_GPL(mxc_soc_platform);
-+
-+MODULE_AUTHOR("Liam Girdwood");
-+MODULE_DESCRIPTION("Freescale i.MX PCM DMA module");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/imx/imx31-pcm.h
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/imx/imx31-pcm.h
-@@ -0,0 +1,237 @@
-+/*
-+ * mxc-pcm.h :- ASoC platform header for Freescale i.MX
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _MXC_PCM_H
-+#define _MXC_PCM_H
-+
-+struct {
-+      char *name;                     /* stream identifier */
-+      dma_channel_params dma_params;
-+} mxc_pcm_dma_param;
-+
-+extern struct snd_soc_cpu_dai mxc_ssi_dai[3];
-+
-+/* platform data */
-+extern struct snd_soc_platform mxc_soc_platform;
-+extern struct snd_ac97_bus_ops mxc_ac97_ops;
-+
-+/* temp until imx-regs.h is up2date */
-+#define SSI1_STX0   __REG(IMX_SSI1_BASE + 0x00)
-+#define SSI1_STX0_PHYS   __PHYS_REG(IMX_SSI1_BASE + 0x00)
-+#define SSI1_STX1   __REG(IMX_SSI1_BASE + 0x04)
-+#define SSI1_STX1_PHYS   __PHYS_REG(IMX_SSI1_BASE + 0x04)
-+#define SSI1_SRX0   __REG(IMX_SSI1_BASE + 0x08)
-+#define SSI1_SRX0_PHYS   __PHYS_REG(IMX_SSI1_BASE + 0x08)
-+#define SSI1_SRX1   __REG(IMX_SSI1_BASE + 0x0c)
-+#define SSI1_SRX1_PHYS   __PHYS_REG(IMX_SSI1_BASE + 0x0c)
-+#define SSI1_SCR    __REG(IMX_SSI1_BASE + 0x10)
-+#define SSI1_SISR   __REG(IMX_SSI1_BASE + 0x14)
-+#define SSI1_SIER   __REG(IMX_SSI1_BASE + 0x18)
-+#define SSI1_STCR   __REG(IMX_SSI1_BASE + 0x1c)
-+#define SSI1_SRCR   __REG(IMX_SSI1_BASE + 0x20)
-+#define SSI1_STCCR  __REG(IMX_SSI1_BASE + 0x24)
-+#define SSI1_SRCCR  __REG(IMX_SSI1_BASE + 0x28)
-+#define SSI1_SFCSR  __REG(IMX_SSI1_BASE + 0x2c)
-+#define SSI1_STR    __REG(IMX_SSI1_BASE + 0x30)
-+#define SSI1_SOR    __REG(IMX_SSI1_BASE + 0x34)
-+#define SSI1_SACNT  __REG(IMX_SSI1_BASE + 0x38)
-+#define SSI1_SACADD __REG(IMX_SSI1_BASE + 0x3c)
-+#define SSI1_SACDAT __REG(IMX_SSI1_BASE + 0x40)
-+#define SSI1_SATAG  __REG(IMX_SSI1_BASE + 0x44)
-+#define SSI1_STMSK  __REG(IMX_SSI1_BASE + 0x48)
-+#define SSI1_SRMSK  __REG(IMX_SSI1_BASE + 0x4c)
-+
-+#define SSI2_STX0   __REG(IMX_SSI2_BASE + 0x00)
-+#define SSI2_STX0_PHYS   __PHYS_REG(IMX_SSI2_BASE + 0x00)
-+#define SSI2_STX1   __REG(IMX_SSI2_BASE + 0x04)
-+#define SSI2_STX1_PHYS   __PHYS_REG(IMX_SSI2_BASE + 0x04)
-+#define SSI2_SRX0   __REG(IMX_SSI2_BASE + 0x08)
-+#define SSI2_SRX0_PHYS   __PHYS_REG(IMX_SSI2_BASE + 0x08)
-+#define SSI2_SRX1   __REG(IMX_SSI2_BASE + 0x0c)
-+#define SSI2_SRX1_PHYS   __PHYS_REG(IMX_SSI2_BASE + 0x0c)
-+#define SSI2_SCR    __REG(IMX_SSI2_BASE + 0x10)
-+#define SSI2_SISR   __REG(IMX_SSI2_BASE + 0x14)
-+#define SSI2_SIER   __REG(IMX_SSI2_BASE + 0x18)
-+#define SSI2_STCR   __REG(IMX_SSI2_BASE + 0x1c)
-+#define SSI2_SRCR   __REG(IMX_SSI2_BASE + 0x20)
-+#define SSI2_STCCR  __REG(IMX_SSI2_BASE + 0x24)
-+#define SSI2_SRCCR  __REG(IMX_SSI2_BASE + 0x28)
-+#define SSI2_SFCSR  __REG(IMX_SSI2_BASE + 0x2c)
-+#define SSI2_STR    __REG(IMX_SSI2_BASE + 0x30)
-+#define SSI2_SOR    __REG(IMX_SSI2_BASE + 0x34)
-+#define SSI2_SACNT  __REG(IMX_SSI2_BASE + 0x38)
-+#define SSI2_SACADD __REG(IMX_SSI2_BASE + 0x3c)
-+#define SSI2_SACDAT __REG(IMX_SSI2_BASE + 0x40)
-+#define SSI2_SATAG  __REG(IMX_SSI2_BASE + 0x44)
-+#define SSI2_STMSK  __REG(IMX_SSI2_BASE + 0x48)
-+#define SSI2_SRMSK  __REG(IMX_SSI2_BASE + 0x4c)
-+
-+#define SSI_SCR_CLK_IST        (1 << 9)
-+#define SSI_SCR_TCH_EN         (1 << 8)
-+#define SSI_SCR_SYS_CLK_EN     (1 << 7)
-+#define SSI_SCR_I2S_MODE_NORM  (0 << 5)
-+#define SSI_SCR_I2S_MODE_MSTR  (1 << 5)
-+#define SSI_SCR_I2S_MODE_SLAVE (2 << 5)
-+#define SSI_SCR_SYN            (1 << 4)
-+#define SSI_SCR_NET            (1 << 3)
-+#define SSI_SCR_RE             (1 << 2)
-+#define SSI_SCR_TE             (1 << 1)
-+#define SSI_SCR_SSIEN          (1 << 0)
-+
-+#define SSI_SISR_CMDAU         (1 << 18)
-+#define SSI_SISR_CMDDU         (1 << 17)
-+#define SSI_SISR_RXT           (1 << 16)
-+#define SSI_SISR_RDR1          (1 << 15)
-+#define SSI_SISR_RDR0          (1 << 14)
-+#define SSI_SISR_TDE1          (1 << 13)
-+#define SSI_SISR_TDE0          (1 << 12)
-+#define SSI_SISR_ROE1          (1 << 11)
-+#define SSI_SISR_ROE0          (1 << 10)
-+#define SSI_SISR_TUE1          (1 << 9)
-+#define SSI_SISR_TUE0          (1 << 8)
-+#define SSI_SISR_TFS           (1 << 7)
-+#define SSI_SISR_RFS           (1 << 6)
-+#define SSI_SISR_TLS           (1 << 5)
-+#define SSI_SISR_RLS           (1 << 4)
-+#define SSI_SISR_RFF1          (1 << 3)
-+#define SSI_SISR_RFF0          (1 << 2)
-+#define SSI_SISR_TFE1          (1 << 1)
-+#define SSI_SISR_TFE0          (1 << 0)
-+
-+#define SSI_SIER_RDMAE         (1 << 22)
-+#define SSI_SIER_RIE           (1 << 21)
-+#define SSI_SIER_TDMAE         (1 << 20)
-+#define SSI_SIER_TIE           (1 << 19)
-+#define SSI_SIER_CMDAU_EN      (1 << 18)
-+#define SSI_SIER_CMDDU_EN      (1 << 17)
-+#define SSI_SIER_RXT_EN        (1 << 16)
-+#define SSI_SIER_RDR1_EN       (1 << 15)
-+#define SSI_SIER_RDR0_EN       (1 << 14)
-+#define SSI_SIER_TDE1_EN       (1 << 13)
-+#define SSI_SIER_TDE0_EN       (1 << 12)
-+#define SSI_SIER_ROE1_EN       (1 << 11)
-+#define SSI_SIER_ROE0_EN       (1 << 10)
-+#define SSI_SIER_TUE1_EN       (1 << 9)
-+#define SSI_SIER_TUE0_EN       (1 << 8)
-+#define SSI_SIER_TFS_EN        (1 << 7)
-+#define SSI_SIER_RFS_EN        (1 << 6)
-+#define SSI_SIER_TLS_EN        (1 << 5)
-+#define SSI_SIER_RLS_EN        (1 << 4)
-+#define SSI_SIER_RFF1_EN       (1 << 3)
-+#define SSI_SIER_RFF0_EN       (1 << 2)
-+#define SSI_SIER_TFE1_EN       (1 << 1)
-+#define SSI_SIER_TFE0_EN       (1 << 0)
-+
-+#define SSI_STCR_TXBIT0        (1 << 9)
-+#define SSI_STCR_TFEN1         (1 << 8)
-+#define SSI_STCR_TFEN0         (1 << 7)
-+#define SSI_STCR_TFDIR         (1 << 6)
-+#define SSI_STCR_TXDIR         (1 << 5)
-+#define SSI_STCR_TSHFD         (1 << 4)
-+#define SSI_STCR_TSCKP         (1 << 3)
-+#define SSI_STCR_TFSI          (1 << 2)
-+#define SSI_STCR_TFSL          (1 << 1)
-+#define SSI_STCR_TEFS          (1 << 0)
-+
-+#define SSI_SRCR_RXBIT0        (1 << 9)
-+#define SSI_SRCR_RFEN1         (1 << 8)
-+#define SSI_SRCR_RFEN0         (1 << 7)
-+#define SSI_SRCR_RFDIR         (1 << 6)
-+#define SSI_SRCR_RXDIR         (1 << 5)
-+#define SSI_SRCR_RSHFD         (1 << 4)
-+#define SSI_SRCR_RSCKP         (1 << 3)
-+#define SSI_SRCR_RFSI          (1 << 2)
-+#define SSI_SRCR_RFSL          (1 << 1)
-+#define SSI_SRCR_REFS          (1 << 0)
-+
-+#define SSI_STCCR_DIV2         (1 << 18)
-+#define SSI_STCCR_PSR          (1 << 15)
-+#define SSI_STCCR_WL(x)        ((((x) - 2) >> 1) << 13)
-+#define SSI_STCCR_DC(x)        (((x) & 0x1f) << 8)
-+#define SSI_STCCR_PM(x)        (((x) & 0xff) << 0)
-+
-+#define SSI_SRCCR_DIV2         (1 << 18)
-+#define SSI_SRCCR_PSR          (1 << 15)
-+#define SSI_SRCCR_WL(x)        ((((x) - 2) >> 1) << 13)
-+#define SSI_SRCCR_DC(x)        (((x) & 0x1f) << 8)
-+#define SSI_SRCCR_PM(x)        (((x) & 0xff) << 0)
-+
-+
-+#define SSI_SFCSR_RFCNT1(x)   (((x) & 0xf) << 28)
-+#define SSI_SFCSR_TFCNT1(x)   (((x) & 0xf) << 24)
-+#define SSI_SFCSR_RFWM1(x)    (((x) & 0xf) << 20)
-+#define SSI_SFCSR_TFWM1(x)    (((x) & 0xf) << 16)
-+#define SSI_SFCSR_RFCNT0(x)   (((x) & 0xf) << 12)
-+#define SSI_SFCSR_TFCNT0(x)   (((x) & 0xf) <<  8)
-+#define SSI_SFCSR_RFWM0(x)    (((x) & 0xf) <<  4)
-+#define SSI_SFCSR_TFWM0(x)    (((x) & 0xf) <<  0)
-+
-+#define SSI_STR_TEST          (1 << 15)
-+#define SSI_STR_RCK2TCK       (1 << 14)
-+#define SSI_STR_RFS2TFS       (1 << 13)
-+#define SSI_STR_RXSTATE(x)    (((x) & 0xf) << 8)
-+#define SSI_STR_TXD2RXD       (1 <<  7)
-+#define SSI_STR_TCK2RCK       (1 <<  6)
-+#define SSI_STR_TFS2RFS       (1 <<  5)
-+#define SSI_STR_TXSTATE(x)    (((x) & 0xf) << 0)
-+
-+#define SSI_SOR_CLKOFF        (1 << 6)
-+#define SSI_SOR_RX_CLR        (1 << 5)
-+#define SSI_SOR_TX_CLR        (1 << 4)
-+#define SSI_SOR_INIT          (1 << 3)
-+#define SSI_SOR_WAIT(x)       (((x) & 0x3) << 1)
-+#define SSI_SOR_SYNRST        (1 << 0)
-+
-+#define SSI_SACNT_FRDIV(x)    (((x) & 0x3f) << 5)
-+#define SSI_SACNT_WR          (x << 4)
-+#define SSI_SACNT_RD          (x << 3)
-+#define SSI_SACNT_TIF         (x << 2)
-+#define SSI_SACNT_FV          (x << 1)
-+#define SSI_SACNT_A97EN       (x << 0)
-+
-+
-+/* AUDMUX registers */
-+#define AUDMUX_HPCR1         __REG(IMX_AUDMUX_BASE + 0x00)
-+#define AUDMUX_HPCR2         __REG(IMX_AUDMUX_BASE + 0x04)
-+#define AUDMUX_HPCR3         __REG(IMX_AUDMUX_BASE + 0x08)
-+#define AUDMUX_PPCR1         __REG(IMX_AUDMUX_BASE + 0x10)
-+#define AUDMUX_PPCR2         __REG(IMX_AUDMUX_BASE + 0x14)
-+#define AUDMUX_PPCR3         __REG(IMX_AUDMUX_BASE + 0x18)
-+
-+#define AUDMUX_HPCR_TFSDIR         (1 << 31)
-+#define AUDMUX_HPCR_TCLKDIR        (1 << 30)
-+#define AUDMUX_HPCR_TFCSEL_TX      (0 << 26)
-+#define AUDMUX_HPCR_TFCSEL_RX      (8 << 26)
-+#define AUDMUX_HPCR_TFCSEL(x)      (((x) & 0x7) << 26)
-+#define AUDMUX_HPCR_RFSDIR         (1 << 25)
-+#define AUDMUX_HPCR_RCLKDIR        (1 << 24)
-+#define AUDMUX_HPCR_RFCSEL_TX      (0 << 20)
-+#define AUDMUX_HPCR_RFCSEL_RX      (8 << 20)
-+#define AUDMUX_HPCR_RFCSEL(x)      (((x) & 0x7) << 20)
-+#define AUDMUX_HPCR_RXDSEL(x)      (((x) & 0x7) << 13)
-+#define AUDMUX_HPCR_SYN            (1 << 12)
-+#define AUDMUX_HPCR_TXRXEN         (1 << 10)
-+#define AUDMUX_HPCR_INMEN          (1 <<  8)
-+#define AUDMUX_HPCR_INMMASK(x)     (((x) & 0xff) << 0)
-+
-+#define AUDMUX_PPCR_TFSDIR         (1 << 31)
-+#define AUDMUX_PPCR_TCLKDIR        (1 << 30)
-+#define AUDMUX_PPCR_TFCSEL_TX      (0 << 26)
-+#define AUDMUX_PPCR_TFCSEL_RX      (8 << 26)
-+#define AUDMUX_PPCR_TFCSEL(x)      (((x) & 0x7) << 26)
-+#define AUDMUX_PPCR_RFSDIR         (1 << 25)
-+#define AUDMUX_PPCR_RCLKDIR        (1 << 24)
-+#define AUDMUX_PPCR_RFCSEL_TX      (0 << 20)
-+#define AUDMUX_PPCR_RFCSEL_RX      (8 << 20)
-+#define AUDMUX_PPCR_RFCSEL(x)      (((x) & 0x7) << 20)
-+#define AUDMUX_PPCR_RXDSEL(x)      (((x) & 0x7) << 13)
-+#define AUDMUX_PPCR_SYN            (1 << 12)
-+#define AUDMUX_PPCR_TXRXEN         (1 << 10)
-+
-+
-+#endif
-Index: linux-2.6-pxa-new/sound/soc/s3c24xx/s3c24xx-i2s.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/s3c24xx/s3c24xx-i2s.c
-@@ -0,0 +1,271 @@
-+/*
-+ * s3c24xx-i2s.c  --  ALSA Soc Audio Layer
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Graeme Gregory
-+ *         graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    10th Nov 2006   Initial version.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/device.h>
-+#include <linux/delay.h>
-+#include <linux/clk.h>
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/initval.h>
-+#include <sound/soc.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/io.h>
-+#include <asm/arch/regs-iis.h>
-+#include <asm/arch/regs-gpio.h>
-+#include <asm/arch/regs-clock.h>
-+#include <asm/arch/audio.h>
-+#include <asm/dma.h>
-+#include <asm/arch/dma.h>
-+
-+#include "s3c24xx-pcm.h"
-+
-+/* used to disable sysclk if external crystal is used */
-+static int extclk = 0;
-+module_param(extclk, int, 0);
-+MODULE_PARM_DESC(extclk, "set to 1 to disable s3c24XX i2s sysclk");
-+
-+#define S3C24XX_I2S_DAIFMT \
-+      (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF)
-+
-+#define S3C24XX_I2S_DIR \
-+      (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE)
-+
-+#define S3C24XX_I2S_RATES \
-+      (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
-+      SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
-+      SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
-+
-+/* priv is divider */
-+static struct snd_soc_dai_mode s3c24xx_i2s_modes[] =
-+{
-+      /* s3c24xx I2S frame and clock master modes */
-+      {
-+              .fmt = S3C24XX_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS,
-+              .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE,
-+              .pcmrate = SNDRV_PCM_RATE_44100,
-+              .pcmdir = S3C24XX_I2S_DIR,
-+              .flags = SND_SOC_DAI_BFS_RATE,
-+              .fs = 384,
-+              .bfs = 32,
-+              .priv = 0x00
-+      },
-+};
-+
-+static struct s3c2410_dma_client s3c24xx_dma_client_out = {
-+      .name = "I2S PCM Stereo out"
-+};
-+
-+static struct s3c2410_dma_client s3c24xx_dma_client_in = {
-+      .name = "I2S PCM Stereo in"
-+};
-+
-+static s3c24xx_pcm_dma_params_t s3c24xx_i2s_pcm_stereo_out = {
-+      .client         = &s3c24xx_dma_client_out,
-+      .channel        = DMACH_I2S_OUT,
-+      .dma_addr       = S3C2410_PA_IIS+S3C2410_IISFIFO
-+};
-+
-+static s3c24xx_pcm_dma_params_t s3c24xx_i2s_pcm_stereo_in = {
-+      .client         = &s3c24xx_dma_client_in,
-+      .channel        = DMACH_I2S_IN,
-+      .dma_addr       = S3C2410_PA_IIS+S3C2410_IISFIFO
-+};
-+
-+
-+struct s3c24xx_i2s_port {
-+      int master;
-+};
-+static struct s3c24xx_i2s_port s3c24xx_i2s;
-+
-+/* Empty for the s3c24xx platforms */
-+static int s3c24xx_i2s_startup(struct snd_pcm_substream *substream)
-+{
-+      return 0;
-+}
-+
-+static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream,
-+                              struct snd_pcm_hw_params *params)
-+{
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      unsigned long iiscon;
-+      unsigned long iismod;
-+      unsigned long iisfcon;
-+
-+      s3c24xx_i2s.master = 0;
-+      if(rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_CBS_CFS)
-+              s3c24xx_i2s.master = 1;
-+
-+      /* Configure the I2S pins in correct mode */
-+      s3c2410_gpio_cfgpin(S3C2410_GPE0,S3C2410_GPE0_I2SLRCK);
-+      if (s3c24xx_i2s.master && !extclk){
-+              printk("Setting Clock Output as we are Master\n");
-+              s3c2410_gpio_cfgpin(S3C2410_GPE1,S3C2410_GPE1_I2SSCLK);
-+      }
-+      s3c2410_gpio_cfgpin(S3C2410_GPE2,S3C2410_GPE2_CDCLK);
-+      s3c2410_gpio_cfgpin(S3C2410_GPE3,S3C2410_GPE3_I2SSDI);
-+      s3c2410_gpio_cfgpin(S3C2410_GPE4,S3C2410_GPE4_I2SSDO);
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+      {
-+              rtd->cpu_dai->dma_data = &s3c24xx_i2s_pcm_stereo_out;
-+      }
-+      else
-+      {
-+              rtd->cpu_dai->dma_data = &s3c24xx_i2s_pcm_stereo_in;
-+      }
-+
-+      /* Working copies of registers */
-+      iiscon=readl(S3C24XX_VA_IIS+S3C2410_IISCON);
-+      iismod=readl(S3C24XX_VA_IIS+S3C2410_IISMOD);
-+      iisfcon=readl(S3C24XX_VA_IIS+S3C2410_IISFCON);
-+      /* is port used by another stream */
-+      if (!(iiscon & S3C2410_IISCON_IISEN)) {
-+
-+              /* Clear the registers */
-+
-+              iismod |= S3C2410_IISMOD_32FS | S3C2410_IISMOD_384FS;
-+
-+              if (!s3c24xx_i2s.master)
-+                      iismod |= S3C2410_IISMOD_SLAVE;
-+
-+              if (rtd->cpu_dai->dai_runtime.fmt & SND_SOC_DAIFMT_LEFT_J)
-+                      iismod |= S3C2410_IISMOD_MSB;
-+      }
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+      {
-+              iismod |= S3C2410_IISMOD_TXMODE;
-+              iiscon |= S3C2410_IISCON_TXDMAEN;
-+              iisfcon |= S3C2410_IISFCON_TXDMA | S3C2410_IISFCON_TXENABLE;
-+      }
-+      else
-+      {
-+              iismod |= S3C2410_IISMOD_RXMODE;
-+              iiscon |= S3C2410_IISCON_RXDMAEN;
-+              iisfcon |= S3C2410_IISFCON_RXDMA | S3C2410_IISFCON_RXENABLE;
-+      }
-+
-+      writel(iiscon, S3C24XX_VA_IIS+S3C2410_IISCON);
-+      writel(iismod, S3C24XX_VA_IIS+S3C2410_IISMOD);
-+      writel(iisfcon, S3C24XX_VA_IIS+S3C2410_IISFCON);
-+
-+      printk("IISCON: %lx IISMOD: %lx", iiscon, iismod);
-+
-+      return 0;
-+}
-+
-+static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      int ret = 0;
-+      unsigned long iiscon;
-+
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+              /* Enable the IIS unit */
-+              iiscon = readl(S3C24XX_VA_IIS+S3C2410_IISCON);
-+              iiscon |= S3C2410_IISCON_IISEN;
-+              writel(iiscon, S3C24XX_VA_IIS+S3C2410_IISCON);
-+              break;
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+      case SNDRV_PCM_TRIGGER_STOP:
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              break;
-+      default:
-+              ret = -EINVAL;
-+      }
-+
-+      return ret;
-+}
-+
-+static void s3c24xx_i2s_shutdown(struct snd_pcm_substream *substream)
-+{
-+      unsigned long iismod, iiscon;
-+
-+      iismod=readl(S3C24XX_VA_IIS+S3C2410_IISMOD);
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+              iismod &= ~S3C2410_IISMOD_TXMODE;
-+      } else {
-+              iismod &= ~S3C2410_IISMOD_RXMODE;
-+      }
-+
-+      writel(iismod,S3C24XX_VA_IIS+S3C2410_IISMOD);
-+
-+      iiscon=readl(S3C24XX_VA_IIS+S3C2410_IISCON);
-+
-+      if (iismod & ( S3C2410_IISMOD_TXMODE | S3C2410_IISMOD_RXMODE )) {
-+              iiscon &= ! S3C2410_IISCON_IISEN;
-+              writel(iiscon,S3C24XX_VA_IIS+S3C2410_IISCON);
-+      }
-+}
-+
-+#ifdef CONFIG_PM
-+static int s3c24xx_i2s_suspend(struct platform_device *dev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+}
-+
-+static int s3c24xx_i2s_resume(struct platform_device *pdev,
-+      struct snd_soc_cpu_dai *dai)
-+{
-+}
-+
-+#else
-+#define s3c24xx_i2s_suspend   NULL
-+#define s3c24xx_i2s_resume    NULL
-+#endif
-+
-+/* s3c24xx I2S sysclock is always 384 FS */
-+static unsigned int s3c24xx_i2s_config_sysclk(struct snd_soc_cpu_dai *iface,
-+      struct snd_soc_clock_info *info, unsigned int clk)
-+{
-+      return info->rate * 384;
-+}
-+
-+struct snd_soc_cpu_dai s3c24xx_i2s_dai = {
-+      .name = "s3c24xx-i2s",
-+      .id = 0,
-+      .type = SND_SOC_DAI_I2S,
-+      .suspend = s3c24xx_i2s_suspend,
-+      .resume = s3c24xx_i2s_resume,
-+      .config_sysclk = s3c24xx_i2s_config_sysclk,
-+      .playback = {
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .capture = {
-+              .channels_min = 2,
-+              .channels_max = 2,},
-+      .ops = {
-+              .startup = s3c24xx_i2s_startup,
-+              .shutdown = s3c24xx_i2s_shutdown,
-+              .trigger = s3c24xx_i2s_trigger,
-+              .hw_params = s3c24xx_i2s_hw_params,},
-+      .caps = {
-+              .num_modes = ARRAY_SIZE(s3c24xx_i2s_modes),
-+              .mode = s3c24xx_i2s_modes,},
-+};
-+
-+EXPORT_SYMBOL_GPL(s3c24xx_i2s_dai);
-+
-+/* Module information */
-+MODULE_AUTHOR("Graeme Gregory, graeme.gregory@wolfsonmicro.com, www.wolfsonmicro.com");
-+MODULE_DESCRIPTION("s3c24xx I2S SoC Interface");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/s3c24xx/s3c24xx-pcm.c
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/s3c24xx/s3c24xx-pcm.c
-@@ -0,0 +1,362 @@
-+/*
-+ * s3c24xx-pcm.c  --  ALSA Soc Audio Layer
-+ *
-+ * Copyright 2005 Wolfson Microelectronics PLC.
-+ * Author: Graeme Gregory
-+ *         graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com
-+ *
-+ *  This program is free software; you can redistribute  it and/or modify it
-+ *  under  the terms of  the GNU General  Public License as published by the
-+ *  Free Software Foundation;  either version 2 of the  License, or (at your
-+ *  option) any later version.
-+ *
-+ *  Revision history
-+ *    10th Nov 2006   Initial version.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/slab.h>
-+#include <linux/dma-mapping.h>
-+
-+#include <sound/driver.h>
-+#include <sound/core.h>
-+#include <sound/pcm.h>
-+#include <sound/pcm_params.h>
-+#include <sound/soc.h>
-+
-+#include <asm/dma.h>
-+#include <asm/io.h>
-+#include <asm/hardware.h>
-+#include <asm/arch/dma.h>
-+#include <asm/arch/audio.h>
-+
-+#include "s3c24xx-pcm.h"
-+
-+static const struct snd_pcm_hardware s3c24xx_pcm_hardware = {
-+        .info                   = SNDRV_PCM_INFO_MMAP |
-+                                  SNDRV_PCM_INFO_MMAP_VALID |
-+                                  SNDRV_PCM_INFO_INTERLEAVED |
-+                                  SNDRV_PCM_INFO_PAUSE |
-+                                  SNDRV_PCM_INFO_RESUME,
-+        .formats                = SNDRV_PCM_FMTBIT_S16_LE,
-+        .period_bytes_min       = 32,
-+        .period_bytes_max       = 8192,
-+        .periods_min            = 1,
-+        .periods_max            = 8192,
-+        .buffer_bytes_max       = 256 * 1024,
-+              .fifo_size                              = 32,
-+};
-+
-+struct s3c24xx_runtime_data {
-+      dma_addr_t dma_buffer;
-+      dma_addr_t dma_buffer_end;
-+      size_t period_size;
-+      dma_addr_t period_ptr;
-+      s3c24xx_pcm_dma_params_t *params;
-+};
-+
-+/* Move the pointer onto the next period, dealing with wrap around.
-+ */
-+void static next_period(struct s3c24xx_runtime_data *prtd)
-+{
-+      prtd->period_ptr+=prtd->period_size;
-+      if(prtd->period_ptr>=prtd->dma_buffer_end)
-+      {
-+              prtd->period_ptr=prtd->dma_buffer;
-+      }
-+}
-+
-+void s3c24xx_audio_buffdone(struct s3c2410_dma_chan *channel,
-+                                                      void *dev_id, int size,
-+                                                      enum s3c2410_dma_buffresult result)
-+{
-+      struct snd_pcm_substream *substream = dev_id;
-+      struct s3c24xx_runtime_data *prtd = substream->runtime->private_data;
-+
-+      if(result==S3C2410_RES_OK)
-+      {
-+              next_period(prtd);
-+              s3c2410_dma_enqueue(prtd->params->channel, substream, prtd->period_ptr, prtd->period_size);
-+      }
-+      snd_pcm_period_elapsed(substream);
-+
-+}
-+
-+static int s3c24xx_pcm_hw_params(struct snd_pcm_substream *substream,
-+      struct snd_pcm_hw_params *params)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct s3c24xx_runtime_data *prtd = runtime->private_data;
-+      struct snd_soc_pcm_runtime *rtd = substream->private_data;
-+      s3c24xx_pcm_dma_params_t *dma = rtd->cpu_dai->dma_data;
-+      int ret;
-+
-+      printk("Entered s3c24xx hw_params\n");
-+
-+      snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
-+      runtime->dma_bytes = params_buffer_bytes(params);
-+
-+      prtd->params=dma;
-+      if(ret=s3c2410_dma_request(prtd->params->channel,
-+                                                              prtd->params->client,NULL))
-+      {
-+              printk("Failed to get dma channel %d for %s\n",prtd->params->channel,
-+                              prtd->params->client->name);
-+              return ret;
-+      }
-+
-+      //s3c2410_dma_setflags(prtd->params->channel,S3C2410_DMAF_AUTOSTART);
-+      if(substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+      {
-+              s3c2410_dma_devconfig(prtd->params->channel, S3C2410_DMASRC_MEM,
-+                                                              S3C2410_DISRCC_INC | S3C2410_DISRCC_APB,
-+                                                              prtd->params->dma_addr);
-+      }
-+      else
-+      {
-+              s3c2410_dma_devconfig(prtd->params->channel, S3C2410_DMASRC_HW,
-+                                                              S3C2410_DISRCC_INC | S3C2410_DISRCC_APB,
-+                                                              prtd->params->dma_addr);
-+      }
-+
-+      s3c2410_dma_config(prtd->params->channel,2,S3C2410_DCON_HANDSHAKE);
-+
-+      s3c2410_dma_set_buffdone_fn(prtd->params->channel, s3c24xx_audio_buffdone);
-+
-+      prtd->dma_buffer = runtime->dma_addr;
-+      prtd->dma_buffer_end = runtime->dma_addr + runtime->dma_bytes;
-+      prtd->period_size = params_period_bytes(params);
-+
-+      return 0;
-+}
-+
-+static int s3c24xx_pcm_hw_free(struct snd_pcm_substream *substream)
-+{
-+      struct s3c24xx_runtime_data *prtd = substream->runtime->private_data;
-+
-+      printk("Entered s3c24xx hw_free\n");
-+
-+      return 0;
-+}
-+
-+static int s3c24xx_pcm_prepare(struct snd_pcm_substream *substream)
-+{
-+      struct s3c24xx_runtime_data *prtd = substream->runtime->private_data;
-+
-+      printk("Entered s3c24xx prepare\n");
-+
-+      /* Set the period that is to be queued in DMA */
-+      prtd->period_ptr = prtd->dma_buffer;
-+
-+      /* queue the first period */
-+      s3c2410_dma_enqueue(prtd->params->channel, substream, prtd->period_ptr, prtd->period_size);
-+
-+      /* Move to next period to be queued */
-+      next_period(prtd);
-+
-+      /* queue the second buffer */
-+      s3c2410_dma_enqueue(prtd->params->channel, substream, prtd->period_ptr, prtd->period_size);
-+
-+
-+      return 0;
-+}
-+
-+static int s3c24xx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
-+{
-+      struct s3c24xx_runtime_data *prtd = substream->runtime->private_data;
-+      int ret = 0;
-+
-+      printk("Entered s3c24xx trigger\n");
-+      switch (cmd) {
-+      case SNDRV_PCM_TRIGGER_START:
-+      case SNDRV_PCM_TRIGGER_RESUME:
-+      case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-+              s3c2410_dma_ctrl(prtd->params->channel, S3C2410_DMAOP_START);
-+              break;
-+
-+      case SNDRV_PCM_TRIGGER_STOP:
-+      case SNDRV_PCM_TRIGGER_SUSPEND:
-+      case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-+              s3c2410_dma_ctrl(prtd->params->channel, S3C2410_DMAOP_STOP);
-+              break;
-+
-+      default:
-+              ret = -EINVAL;
-+      }
-+
-+      return ret;
-+}
-+
-+static snd_pcm_uframes_t s3c24xx_pcm_pointer(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct s3c24xx_runtime_data *prtd = runtime->private_data;
-+      dma_addr_t dst,src;
-+      snd_pcm_uframes_t x;
-+
-+      printk("Entered s3c24xx pointer\n");
-+
-+      s3c2410_dma_getposition(prtd->params->channel, &src, &dst);
-+
-+      printk("DMA Position: %lx, %lx\n", src, dst);
-+
-+      if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-+      {
-+              x = bytes_to_frames(runtime, src - prtd->dma_buffer);
-+      }
-+      else
-+      {
-+              x = bytes_to_frames(runtime, dst - prtd->dma_buffer);
-+      }
-+
-+      if (x == runtime->buffer_size)
-+              x=0;
-+      return x;
-+
-+}
-+
-+static int s3c24xx_pcm_open(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct s3c24xx_runtime_data *prtd;
-+      int ret;
-+
-+      printk("Entered s3c24xx open\n");
-+
-+      snd_soc_set_runtime_hwparams(substream, &s3c24xx_pcm_hardware);
-+
-+      if((prtd = kzalloc(sizeof(struct s3c24xx_runtime_data), GFP_KERNEL)) == NULL)
-+      {
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+
-+      runtime->private_data = prtd;
-+      return 0;
-+
-+out:
-+      return ret;
-+}
-+
-+static int s3c24xx_pcm_close(struct snd_pcm_substream *substream)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+      struct s3c24xx_runtime_data *prtd = runtime->private_data;
-+
-+      printk("Entered s3c24xx close\n");
-+
-+      s3c2410_dma_free(prtd->params->channel, prtd->params->client);
-+
-+      return 0;
-+}
-+
-+static int
-+s3c24xx_pcm_mmap(struct snd_pcm_substream *substream, struct vm_area_struct *vma)
-+{
-+      struct snd_pcm_runtime *runtime = substream->runtime;
-+
-+      printk("Entered s3c24xx mmap\n");
-+
-+      return dma_mmap_writecombine(substream->pcm->card->dev, vma,
-+                                     runtime->dma_area,
-+                                     runtime->dma_addr,
-+                                     runtime->dma_bytes);
-+}
-+
-+struct snd_pcm_ops s3c24xx_pcm_ops = {
-+      .open           = s3c24xx_pcm_open,
-+      .close          = s3c24xx_pcm_close,
-+      .ioctl          = snd_pcm_lib_ioctl,
-+      .hw_params      = s3c24xx_pcm_hw_params,
-+      .hw_free        = s3c24xx_pcm_hw_free,
-+      .prepare        = s3c24xx_pcm_prepare,
-+      .trigger        = s3c24xx_pcm_trigger,
-+      .pointer        = s3c24xx_pcm_pointer,
-+      .mmap           = s3c24xx_pcm_mmap,
-+};
-+
-+static int s3c24xx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
-+{
-+      struct snd_pcm_substream *substream = pcm->streams[stream].substream;
-+      struct snd_dma_buffer *buf = &substream->dma_buffer;
-+      size_t size = s3c24xx_pcm_hardware.buffer_bytes_max;
-+
-+      printk("Entered s3c24xx preaccolate_dma_buffer\n");
-+
-+      buf->dev.type = SNDRV_DMA_TYPE_DEV;
-+      buf->dev.dev = pcm->card->dev;
-+      buf->private_data = NULL;
-+      buf->area = dma_alloc_writecombine(pcm->card->dev, size,
-+                                         &buf->addr, GFP_KERNEL);
-+      if (!buf->area)
-+              return -ENOMEM;
-+      buf->bytes = size;
-+      return 0;
-+}
-+
-+static void s3c24xx_pcm_free_dma_buffers(struct snd_pcm *pcm)
-+{
-+      struct snd_pcm_substream *substream;
-+      struct snd_dma_buffer *buf;
-+      int stream;
-+
-+      printk("Entered s3c24xx free_dma_buffers\n");
-+
-+      for (stream = 0; stream < 2; stream++) {
-+              substream = pcm->streams[stream].substream;
-+              if (!substream)
-+                      continue;
-+
-+              buf = &substream->dma_buffer;
-+              if (!buf->area)
-+                      continue;
-+
-+              dma_free_writecombine(pcm->card->dev, buf->bytes,
-+                                    buf->area, buf->addr);
-+              buf->area = NULL;
-+      }
-+}
-+
-+static u64 s3c24xx_pcm_dmamask = 0xffffffff;
-+
-+int s3c24xx_pcm_new(struct snd_card *card, struct snd_soc_codec_dai *dai,
-+      struct snd_pcm *pcm)
-+{
-+      int ret = 0;
-+
-+      printk("Entered s3c24xx new\n");
-+
-+      if (!card->dev->dma_mask)
-+              card->dev->dma_mask = &s3c24xx_pcm_dmamask;
-+      if (!card->dev->coherent_dma_mask)
-+              card->dev->coherent_dma_mask = 0xffffffff;
-+
-+      if (dai->playback.channels_min) {
-+              ret = s3c24xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_PLAYBACK);
-+              if (ret)
-+                      goto out;
-+      }
-+
-+      if (dai->capture.channels_min) {
-+              ret = s3c24xx_pcm_preallocate_dma_buffer(pcm, SNDRV_PCM_STREAM_CAPTURE);
-+              if (ret)
-+                      goto out;
-+      }
-+ out:
-+      return ret;
-+}
-+
-+struct snd_soc_platform s3c24xx_soc_platform = {
-+      .name           = "s3c24xx-audio",
-+      .pcm_ops        = &s3c24xx_pcm_ops,
-+      .pcm_new        = s3c24xx_pcm_new,
-+      .pcm_free       = s3c24xx_pcm_free_dma_buffers,
-+};
-+
-+EXPORT_SYMBOL_GPL(s3c24xx_soc_platform);
-+
-+MODULE_AUTHOR("Graeme Gregory");
-+MODULE_DESCRIPTION("Samsung S3C24XX PCM DMA module");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6-pxa-new/sound/soc/s3c24xx/Kconfig
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/s3c24xx/Kconfig
-@@ -0,0 +1,26 @@
-+menu "SoC Audio for the Atmel AT91"
-+
-+config SND_S3C24XX_SOC
-+      tristate "SoC Audio for the Samsung S3C24xx System-on-Chip"
-+      depends on ARCH_S3C2410 && SND
-+      select SND_PCM
-+      help
-+        Say Y or M if you want to add support for codecs attached to
-+        the Samsung S3C24xx.
-+
-+config SND_S3C24XX_SOC_I2S
-+      tristate
-+
-+config SND_S3C24XX_SOC_AC97
-+      tristate
-+
-+# graeme - add mach dep
-+config SND_S3C24XX_SOC_SMDK2440
-+      tristate "SoC I2S Audio support for SMDK2440"
-+      depends on SND_S3C24XX_SOC
-+      select SND_S3C24XX_SOC_I2S
-+      select SND_SOC_UDA1380
-+      help
-+        Say Y if you want to add support for SoC audio on
-+
-+endmenu
-Index: linux-2.6-pxa-new/sound/soc/s3c24xx/Makefile
-===================================================================
---- /dev/null
-+++ linux-2.6-pxa-new/sound/soc/s3c24xx/Makefile
-@@ -0,0 +1,11 @@
-+# S3C24xx Platform Support
-+snd-soc-s3c24xx-objs := s3c24xx-pcm.o
-+snd-soc-at91-i2s-objs := s3c24xx-i2s.o
-+
-+obj-$(CONFIG_SND_S3C24XX_SOC) += snd-soc-s3c24xx.o
-+obj-$(CONFIG_SND_S3C24XX_SOC_I2S) += snd-soc-s3c24xx-i2s.o
-+
-+# S3C24xx Machine Support
-+snd-soc-smdk2440-uda1380-objs := smdk2440_uda1380.o
-+
-+obj-$(CONFIG_SND_S3C24XX_SOC_SMDK2440) += snd-soc-smdk2440-uda1380.o
diff --git a/meta/packages/linux/linux-rp-2.6.17/connectplus-remove-ide-HACK.patch b/meta/packages/linux/linux-rp-2.6.17/connectplus-remove-ide-HACK.patch
deleted file mode 100644 (file)
index 4414b21..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Index: linux-2.6.13/drivers/ide/legacy/ide-cs.c
-===================================================================
---- linux-2.6.13.orig/drivers/ide/legacy/ide-cs.c      2005-09-01 22:43:46.000000000 +0100
-+++ linux-2.6.13/drivers/ide/legacy/ide-cs.c   2005-09-01 22:45:46.000000000 +0100
-@@ -488,7 +488,6 @@
-       PCMCIA_DEVICE_PROD_ID123("KODAK Picture Card       ", "KODAK  ", "V100K", 0x94a0d8f3, 0xe4fc3ea0, 0xe5e7eed4),
-       PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
-       PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
--      PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
-       PCMCIA_DEVICE_NULL,
- };
- MODULE_DEVICE_TABLE(pcmcia, ide_ids);
diff --git a/meta/packages/linux/linux-rp-2.6.17/defconfig-akita b/meta/packages/linux/linux-rp-2.6.17/defconfig-akita
deleted file mode 100644 (file)
index 249466a..0000000
+++ /dev/null
@@ -1,1572 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.16
-# Thu Mar 23 22:11:12 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=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 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=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
-#
-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
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_L7200 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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# Intel PXA2xx Implementations
-#
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_ARCH_PXA_IDP is not set
-CONFIG_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-# CONFIG_PXA_SHARPSL_25x is not set
-CONFIG_PXA_SHARPSL_27x=y
-CONFIG_MACH_AKITA=y
-CONFIG_MACH_SPITZ=y
-CONFIG_MACH_BORZOI=y
-CONFIG_PXA27x=y
-# CONFIG_PXA_KEYS is not set
-CONFIG_IWMMXT=y
-CONFIG_PXA_SHARP_Cxx00=y
-CONFIG_PXA_SSP=y
-
-#
-# 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# 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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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_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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_SHARP_SL=y
-# 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_BLKMTD is not set
-# CONFIG_MTD_BLOCK2MTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_CORGI is not set
-CONFIG_KEYBOARD_SPITZ=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_SPITZ=y
-# CONFIG_LEDS_TOSA is not set
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# 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_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-CONFIG_FB_PXA=y
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_W100 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=y
-CONFIG_FONTS=y
-# CONFIG_FONT_8x8 is not set
-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
-#
-# 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_CORGI=y
-# CONFIG_BACKLIGHT_HP680 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_SEQUENCER_OSS is not set
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_AC97_CODEC=m
-CONFIG_SND_AC97_BUS=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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# PCMCIA devices
-#
-
-#
-# SoC audio support
-#
-CONFIG_SND_SOC=m
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-CONFIG_SND_PXA2xx_SOC_I2S=m
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-# CONFIG_SND_PXA2xx_SOC_CORGI is not set
-CONFIG_SND_PXA2xx_SOC_SPITZ=m
-# CONFIG_SND_PXA2xx_SOC_TOSA is not set
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC is not set
-# CONFIG_SND_SOC_WM8731 is not set
-CONFIG_SND_SOC_WM8750=m
-# CONFIG_SND_SOC_WM8753 is not set
-# CONFIG_SND_SOC_WM8772 is not set
-# CONFIG_SND_SOC_WM8971 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 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
-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=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-CONFIG_USB_MTOUCH=m
-# CONFIG_USB_ITMTOUCH is not set
-CONFIG_USB_EGALAX=m
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Multimedia devices
-#
-CONFIG_USB_DABUSB=m
-
-#
-# Video4Linux support is needed for USB Multimedia device support
-#
-
-#
-# USB Network Adapters
-#
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_USB_NET_ZAURUS=m
-# 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_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-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_KEYSPAN_MPR is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-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_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem 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_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-
-#
-# Real Time Clock
-#
-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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-CONFIG_RTC_DRV_SA1100=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=m
-# CONFIG_EXT3_FS_XATTR 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_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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT 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_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
diff --git a/meta/packages/linux/linux-rp-2.6.17/defconfig-c7x0 b/meta/packages/linux/linux-rp-2.6.17/defconfig-c7x0
deleted file mode 100644 (file)
index 1d702f6..0000000
+++ /dev/null
@@ -1,1608 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.16
-# Mon May 22 09:00:01 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=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 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=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
-#
-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
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_L7200 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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# Intel PXA2xx Implementations
-#
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_ARCH_PXA_IDP is not set
-CONFIG_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-# CONFIG_MACH_POODLE is not set
-CONFIG_MACH_CORGI=y
-CONFIG_MACH_SHEPHERD=y
-CONFIG_MACH_HUSKY=y
-# CONFIG_MACH_TOSA is not set
-CONFIG_PXA25x=y
-# CONFIG_PXA_KEYS is not set
-CONFIG_PXA_SHARP_C7xx=y
-CONFIG_PXA_SSP=y
-
-#
-# 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# CONFIG_XIP_KERNEL 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 is not set
-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=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-CONFIG_CPU_FREQ_PXA25x=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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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=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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_SHARP_SL=y
-# 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_BLKMTD is not set
-# CONFIG_MTD_BLOCK2MTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_CORGI=y
-# CONFIG_KEYBOARD_SPITZ is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# 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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_CORGI=y
-# CONFIG_LEDS_TOSA is not set
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-
-#
-# Video For Linux
-#
-
-#
-# Video Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# 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_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_AUDIO_DECODER is not set
-# CONFIG_VIDEO_DECODER is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# 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_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_PXA is not set
-CONFIG_FB_W100=y
-# 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 is not set
-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
-#
-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_HP680 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_SEQUENCER_OSS is not set
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_AC97_CODEC=m
-CONFIG_SND_AC97_BUS=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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# PCMCIA devices
-#
-
-#
-# SoC audio support
-#
-CONFIG_SND_SOC=m
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-CONFIG_SND_PXA2xx_SOC_I2S=m
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-CONFIG_SND_PXA2xx_SOC_CORGI=m
-# CONFIG_SND_PXA2xx_SOC_SPITZ is not set
-# CONFIG_SND_PXA2xx_SOC_TOSA is not set
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC is not set
-CONFIG_SND_SOC_WM8731=m
-# 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_WM9713 is not set
-# CONFIG_SND_SOC_WM9712 is not set
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-# CONFIG_USB_ARCH_HAS_OHCI is not set
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
-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=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-CONFIG_USB_MTOUCH=m
-# CONFIG_USB_ITMTOUCH is not set
-CONFIG_USB_EGALAX=m
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Multimedia devices
-#
-CONFIG_USB_DABUSB=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_DSBR=m
-# CONFIG_USB_ET61X251 is not set
-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 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=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_USB_NET_ZAURUS=m
-# 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_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-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_KEYSPAN_MPR is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-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_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST 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_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-
-#
-# Real Time Clock
-#
-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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-CONFIG_RTC_DRV_SA1100=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 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_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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-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 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_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
diff --git a/meta/packages/linux/linux-rp-2.6.17/defconfig-collie b/meta/packages/linux/linux-rp-2.6.17/defconfig-collie
deleted file mode 100644 (file)
index f488d42..0000000
+++ /dev/null
@@ -1,1641 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Tue Jul  4 16:35:35 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=y
-CONFIG_VECTORS_BASE=0xffff0000
-
-#
-# 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 is not set
-# 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=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_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_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_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX 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_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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# SA11x0 Implementations
-#
-# CONFIG_SA1100_ASSABET is not set
-# CONFIG_SA1100_CERF is not set
-CONFIG_SA1100_COLLIE=y
-# 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_JORNADA720 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
-
-#
-# 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
-
-#
-# Processor Features
-#
-CONFIG_KEXEC=y
-CONFIG_SHARP_LOCOMO=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-CONFIG_ISA=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
-
-#
-# PC-card bridges
-#
-# CONFIG_I82365 is not set
-# CONFIG_TCIC is not set
-CONFIG_PCMCIA_SA1100=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-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_LEDS is not set
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2 mem=32M fbcon=rotate:1 dyntick=enable quiet"
-# 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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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=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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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_H323 is not set
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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 is not set
-
-#
-# Old Serial dongle support
-#
-
-#
-# FIR device drivers
-#
-CONFIG_USB_IRDA=m
-# CONFIG_SIGMATEL_FIR is not set
-CONFIG_SA1100_FIR=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_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=m
-CONFIG_BT_HCIBT3C=m
-CONFIG_BT_HCIBLUECARD=m
-CONFIG_BT_HCIBTUART=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_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
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS 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_BLOCK=y
-# 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
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-CONFIG_MTD_OBSOLETE_CHIPS=y
-CONFIG_MTD_SHARP=y
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_SA1100=y
-# 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_PNP 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_UB 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_BLK_DEV_IDE=m
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
-#
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=m
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECS=m
-# 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 is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-# 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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_SATA 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_NCR53C406A is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_NET_VENDOR_SMC is not set
-# CONFIG_SMC91X is not set
-# CONFIG_DM9000 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_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 is not set
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-# CONFIG_STRIP is not set
-# CONFIG_ARLAN is not set
-# CONFIG_WAVELAN is not set
-# 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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_LOCOMO=y
-# 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 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=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_SA1100=y
-CONFIG_SERIAL_SA1100_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=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_ELEKTOR 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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-CONFIG_MCP=y
-CONFIG_MCP_SA11X0=y
-CONFIG_MCP_UCB1200=y
-# CONFIG_MCP_UCB1200_AUDIO is not set
-CONFIG_MCP_UCB1200_TS=m
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-# CONFIG_LEDS_LOCOMO is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-# CONFIG_LEDS_TRIGGER_IDE_DISK 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_VIVI is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-
-#
-# Encoders and Decoders
-#
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_USB_DSBR is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_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
-# CONFIG_USB_DABUSB 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 is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-CONFIG_FB_SA1100=y
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=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=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-# CONFIG_LOGO_OHAND_CLUT224 is not set
-CONFIG_LOGO_OZ240_CLUT224=y
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_DEVICE=y
-# CONFIG_LCD_CLASS_DEVICE is not set
-CONFIG_BACKLIGHT_LOCOMO=y
-
-#
-# 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=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-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
-#
-
-#
-# 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
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME 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=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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
-
-#
-# 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=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-CONFIG_USB_NET_CDC_SUBSET=m
-# CONFIG_USB_ALI_M5632 is not set
-# CONFIG_USB_AN2720 is not set
-CONFIG_USB_BELKIN=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_EPSON2888 is not set
-CONFIG_USB_NET_ZAURUS=m
-# 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=m
-CONFIG_USB_SERIAL_ANYDATA=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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_NAVMAN is not set
-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_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OMNINET is not set
-CONFIG_USB_EZUSB=y
-
-#
-# 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_LD is not set
-# CONFIG_USB_TEST 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 is not set
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP is not set
-# CONFIG_USB_GADGET_AT91 is not set
-CONFIG_USB_GADGET_SA1100=y
-CONFIG_USB_SA1100=y
-# 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=y
-CONFIG_USB_G_SERIAL=m
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-
-#
-# 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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 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
-
-#
-# 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_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 is not set
-# CONFIG_AUTOFS4_FS is not set
-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=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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS 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_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# 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=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT 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_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
diff --git a/meta/packages/linux/linux-rp-2.6.17/defconfig-hx2000 b/meta/packages/linux/linux-rp-2.6.17/defconfig-hx2000
deleted file mode 100644 (file)
index ea56989..0000000
+++ /dev/null
@@ -1,1028 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.15-rc1-git7
-# Sat Nov 19 23:13:51 2005
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_UID16=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-# CONFIG_CLEAN_COMPILE is not set
-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 is not set
-# CONFIG_SYSVIPC is not set
-# 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=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# 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
-#
-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 is not set
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_CAMELOT is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_L7200 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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-
-#
-# Intel PXA2xx Implementations
-#
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_ARCH_PXA_IDP is not set
-# CONFIG_PXA_SHARPSL is not set
-CONFIG_MACH_HX2750=y
-CONFIG_PXA27x=y
-CONFIG_PXA_KEYS=y
-CONFIG_PXA_SSP=y
-
-#
-# 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-
-#
-# Bus support
-#
-CONFIG_ISA_DMA_API=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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# 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
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=y
-
-#
-# 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 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=y
-# 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=m
-CONFIG_INET_TCP_DIAG=m
-# 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=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-# CONFIG_IEEE80211_CRYPT_CCMP is not set
-# CONFIG_IEEE80211_CRYPT_TKIP is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-# CONFIG_PREVENT_FIRMWARE_BUILD is not set
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_CONCAT=y
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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_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_BLKMTD 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 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=8192
-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=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=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_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=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# Fusion MPT device support
-#
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_IEEE1394 is not set
-
-#
-# 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
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=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_AIRO is not set
-CONFIG_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN 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=240
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_POWER 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=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_TSC2101=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_PXA=y
-CONFIG_SERIAL_PXA_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM is not set
-# CONFIG_SA1100_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
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multi-Function Devices
-#
-CONFIG_MFD_TSC2101=y
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-
-#
-# 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_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-CONFIG_FB_PXA=y
-# CONFIG_FB_PXA_PARAMETERS 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
-
-#
-# 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_HX2750=y
-
-#
-# 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=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-# CONFIG_MMC_WBSD is not set
-
-#
-# Real Time Clock
-#
-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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-CONFIG_RTC_DRV_SA1100=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 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_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_SYSFS=y
-# 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
-#
-# 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=y
-CONFIG_JFFS2_FS_DEBUG=0
-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
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=y
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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_EFI_PARTITION is not set
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="cp437"
-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 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=y
-
-#
-# Profiling support
-#
-# CONFIG_PROFILING is not set
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_MAGIC_SYSRQ is not set
-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_SPINLOCK is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-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_HMAC 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_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 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=y
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-CONFIG_CRYPTO_CRC32C=y
-# CONFIG_CRYPTO_TEST is not set
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-
diff --git a/meta/packages/linux/linux-rp-2.6.17/defconfig-poodle b/meta/packages/linux/linux-rp-2.6.17/defconfig-poodle
deleted file mode 100644 (file)
index deacd17..0000000
+++ /dev/null
@@ -1,1655 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Mon Jul 10 23:38:56 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=y
-CONFIG_VECTORS_BASE=0xffff0000
-
-#
-# 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 is not set
-# 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=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_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_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_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX 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_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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 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_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-CONFIG_MACH_POODLE=y
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-# CONFIG_MACH_TOSA is not set
-CONFIG_PXA25x=y
-# CONFIG_PXA_KEYS is not set
-CONFIG_PXA_SSP=y
-
-#
-# 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_LOCOMO=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2  fbcon=rotate:1 dyntick=enable debug"
-# CONFIG_XIP_KERNEL 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 is not set
-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=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-CONFIG_CPU_FREQ_PXA25x=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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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_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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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_H323 is not set
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# 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_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_LOCOMO=y
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_CORGI is not set
-# CONFIG_KEYBOARD_SPITZ is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# 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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_LOCOMO=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# 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_VIVI is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-
-#
-# Encoders and Decoders
-#
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_EM28XX is not set
-CONFIG_USB_DSBR=m
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-# CONFIG_USB_ET61X251 is not set
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-CONFIG_FB_PXA=y
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_W100 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=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=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-# CONFIG_LOGO_OHAND_CLUT224 is not set
-CONFIG_LOGO_OZ240_CLUT224=y
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-# CONFIG_BACKLIGHT_CORGI is not set
-CONFIG_BACKLIGHT_LOCOMO=y
-
-#
-# 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=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
-
-#
-# 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=m
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8731 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8974 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_MAINSTONE_BASEBAND is not set
-# CONFIG_SND_MAINSTONE_BLUETOOTH is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-# CONFIG_SND_PXA2xx_SOC_CORGI is not set
-# CONFIG_SND_PXA2xx_SOC_SPITZ is not set
-CONFIG_SND_PXA2xx_SOC_POODLE=m
-# CONFIG_SND_PXA2xx_SOC_TOSA is not set
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC is not set
-CONFIG_SND_SOC_WM8731=m
-# 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_WM8974 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 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-# CONFIG_USB_ARCH_HAS_OHCI 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=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Network Adapters
-#
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_USB_NET_ZAURUS=m
-# 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 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_NAVMAN is not set
-CONFIG_USB_SERIAL_PL2303=m
-# CONFIG_USB_SERIAL_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST 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_LH7A40X 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-
-#
-# 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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 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
-
-#
-# 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_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 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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-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 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_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
diff --git a/meta/packages/linux/linux-rp-2.6.17/defconfig-qemuarm b/meta/packages/linux/linux-rp-2.6.17/defconfig-qemuarm
deleted file mode 100644 (file)
index e34fe5c..0000000
+++ /dev/null
@@ -1,1190 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Sat Aug 26 22:45:02 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_VECTORS_BASE=0xffff0000
-
-#
-# 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 is not set
-# 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=y
-# 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=y
-
-#
-# 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_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# System Type
-#
-# CONFIG_ARCH_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_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX 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_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_OMAP is not set
-CONFIG_ARCH_VERSATILE=y
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# Versatile platform type
-#
-CONFIG_ARCH_VERSATILE_PB=y
-# CONFIG_MACH_VERSATILE_AB is not set
-
-#
-# Processor Type
-#
-CONFIG_CPU_32=y
-CONFIG_CPU_ARM926T=y
-CONFIG_CPU_32v5=y
-CONFIG_CPU_ABRT_EV5TJ=y
-CONFIG_CPU_CACHE_VIVT=y
-CONFIG_CPU_COPY_V4WB=y
-CONFIG_CPU_TLB_V4WBI=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_CPU_CACHE_ROUND_ROBIN is not set
-# CONFIG_KEXEC is not set
-CONFIG_ARM_VIC=y
-CONFIG_ICST307=y
-
-#
-# Bus support
-#
-CONFIG_ARM_AMBA=y
-CONFIG_PCI=y
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# Kernel Features
-#
-# CONFIG_PREEMPT is not set
-# CONFIG_NO_IDLE_HZ is not set
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_LEDS=y
-CONFIG_LEDS_TIMER=y
-CONFIG_LEDS_CPU=y
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable debug"
-# CONFIG_XIP_KERNEL is not set
-
-#
-# Floating point emulation
-#
-
-#
-# At least one emulation must be selected
-#
-CONFIG_FPE_NWFPE=y
-# CONFIG_FPE_NWFPE_XP is not set
-# CONFIG_FPE_FASTFPE is not set
-CONFIG_VFP=y
-
-#
-# Userspace binary formats
-#
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_AOUT is not set
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_APM 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_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 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_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 is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_AFS_PARTS=y
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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 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_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
-
-#
-# 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_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 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_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=8192
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH 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 is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-# 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=y
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-# 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=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-CONFIG_SMC91X=y
-# CONFIG_DM9000 is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_PCI 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_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_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
-
-#
-# 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=y
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_POWER 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=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL 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 is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-# CONFIG_SERIO_SERPORT is not set
-CONFIG_SERIO_AMBAKMI=y
-# 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
-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_AMBA_PL011=y
-CONFIG_SERIAL_AMBA_PL011_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_NVRAM 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
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-# CONFIG_LEDS_CLASS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-# CONFIG_LEDS_TRIGGERS is not set
-
-#
-# 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=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=y
-CONFIG_FB_TILEBLITTING=y
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-CONFIG_FB_ARMCLCD=y
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT 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 is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-# CONFIG_USB_DEVICEFS is not set
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_EHCI_HCD 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 is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-
-#
-# 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=y
-# 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_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_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_LD is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-
-#
-# 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_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 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_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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS 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_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=y
-# CONFIG_SQUASHFS 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 is not set
-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=y
-# 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 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-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_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_BUGVERBOSE=y
-CONFIG_DEBUG_INFO=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
diff --git a/meta/packages/linux/linux-rp-2.6.17/defconfig-qemux86 b/meta/packages/linux/linux-rp-2.6.17/defconfig-qemux86
deleted file mode 100644 (file)
index 6fe2809..0000000
+++ /dev/null
@@ -1,1562 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Mon Oct 16 19:42:42 2006
-#
-CONFIG_X86_32=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_X86=y
-CONFIG_MMU=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=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 is not set
-CONFIG_SYSCTL=y
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_UID16=y
-CONFIG_VM86=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 is not set
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-CONFIG_LBD=y
-# 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"
-
-#
-# Processor type and features
-#
-CONFIG_SMP=y
-CONFIG_X86_PC=y
-# CONFIG_X86_ELAN is not set
-# CONFIG_X86_VOYAGER is not set
-# CONFIG_X86_NUMAQ is not set
-# CONFIG_X86_SUMMIT is not set
-# CONFIG_X86_BIGSMP is not set
-# CONFIG_X86_VISWS is not set
-# CONFIG_X86_GENERICARCH is not set
-# CONFIG_X86_ES7000 is not set
-CONFIG_M386=y
-# CONFIG_M486 is not set
-# CONFIG_M586 is not set
-# CONFIG_M586TSC is not set
-# CONFIG_M586MMX is not set
-# CONFIG_M686 is not set
-# CONFIG_MPENTIUMII is not set
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUMM is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK6 is not set
-# CONFIG_MK7 is not set
-# CONFIG_MK8 is not set
-# CONFIG_MCRUSOE is not set
-# CONFIG_MEFFICEON is not set
-# CONFIG_MWINCHIPC6 is not set
-# CONFIG_MWINCHIP2 is not set
-# CONFIG_MWINCHIP3D is not set
-# CONFIG_MGEODEGX1 is not set
-# CONFIG_MGEODE_LX is not set
-# CONFIG_MCYRIXIII is not set
-# CONFIG_MVIAC3_2 is not set
-CONFIG_X86_GENERIC=y
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_PPRO_FENCE=y
-CONFIG_X86_F00F_BUG=y
-CONFIG_X86_INTEL_USERCOPY=y
-# CONFIG_HPET_TIMER is not set
-CONFIG_NR_CPUS=8
-CONFIG_SCHED_SMT=y
-CONFIG_SCHED_MC=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_X86_IO_APIC=y
-CONFIG_X86_MCE=y
-CONFIG_X86_MCE_NONFATAL=y
-CONFIG_X86_MCE_P4THERMAL=y
-# CONFIG_TOSHIBA is not set
-# CONFIG_I8K is not set
-# CONFIG_X86_REBOOTFIXUPS is not set
-# CONFIG_MICROCODE is not set
-# CONFIG_X86_MSR is not set
-# CONFIG_X86_CPUID is not set
-
-#
-# Firmware Drivers
-#
-# CONFIG_EDD is not set
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-CONFIG_NOHIGHMEM=y
-# CONFIG_HIGHMEM4G is not set
-# CONFIG_HIGHMEM64G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=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=y
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_MATH_EMULATION is not set
-CONFIG_MTRR=y
-# CONFIG_EFI is not set
-CONFIG_IRQBALANCE=y
-# CONFIG_REGPARM is not set
-CONFIG_SECCOMP=y
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-# CONFIG_KEXEC is not set
-CONFIG_PHYSICAL_START=0x100000
-# CONFIG_HOTPLUG_CPU is not set
-
-#
-# Power management options (ACPI, APM)
-#
-CONFIG_PM=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_AC=y
-CONFIG_ACPI_BATTERY=y
-CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_VIDEO=m
-# CONFIG_ACPI_HOTKEY is not set
-CONFIG_ACPI_FAN=y
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_THERMAL=y
-# CONFIG_ACPI_ASUS is not set
-CONFIG_ACPI_IBM=m
-# CONFIG_ACPI_IBM_DOCK is not set
-# CONFIG_ACPI_TOSHIBA is not set
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_X86_PM_TIMER=y
-# CONFIG_ACPI_CONTAINER is not set
-
-#
-# APM (Advanced Power Management) BIOS Support
-#
-# CONFIG_APM is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-#
-CONFIG_PCI=y
-# CONFIG_PCI_GOBIOS is not set
-# CONFIG_PCI_GOMMCONFIG is not set
-# CONFIG_PCI_GODIRECT is not set
-CONFIG_PCI_GOANY=y
-CONFIG_PCI_BIOS=y
-CONFIG_PCI_DIRECT=y
-CONFIG_PCI_MMCONFIG=y
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_MSI is not set
-CONFIG_ISA_DMA_API=y
-CONFIG_ISA=y
-# CONFIG_EISA is not set
-# CONFIG_MCA is not set
-# CONFIG_SCx200 is not set
-
-#
-# 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_AOUT=y
-CONFIG_BINFMT_MISC=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_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 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_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_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=y
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-# CONFIG_IP_NF_FTP is not set
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_H323 is not set
-CONFIG_IP_NF_QUEUE=y
-
-#
-# 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 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=y
-CONFIG_PARPORT_PC=y
-# CONFIG_PARPORT_SERIAL is not set
-# CONFIG_PARPORT_PC_FIFO is not set
-# CONFIG_PARPORT_PC_SUPERIO is not set
-# CONFIG_PARPORT_GSC is not set
-# CONFIG_PARPORT_1284 is not set
-
-#
-# Plug and Play support
-#
-CONFIG_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-# CONFIG_ISAPNP is not set
-# CONFIG_PNPBIOS is not set
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=y
-# CONFIG_BLK_DEV_XD is not set
-# CONFIG_PARIDE 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
-# 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_UB 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_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_HD_IDE is not set
-CONFIG_BLK_DEV_IDEDISK=y
-CONFIG_IDEDISK_MULTI_MODE=y
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-CONFIG_BLK_DEV_CMD640=y
-# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-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_RZ1000=y
-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 is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP 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_CS5535 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=y
-# 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_SIS5513 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_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=y
-# 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_7000FASST is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 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=m
-# CONFIG_SCSI_ADVANSYS 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=y
-# CONFIG_SCSI_SATA_AHCI is not set
-# CONFIG_SCSI_SATA_SVW is not set
-CONFIG_SCSI_ATA_PIIX=y
-# CONFIG_SCSI_SATA_MV is not set
-# CONFIG_SCSI_SATA_NV is not set
-# CONFIG_SCSI_PDC_ADMA is not set
-# CONFIG_SCSI_SATA_QSTOR is not set
-# CONFIG_SCSI_SATA_PROMISE is not set
-CONFIG_SCSI_SATA_SX4=m
-# CONFIG_SCSI_SATA_SIL is not set
-# CONFIG_SCSI_SATA_SIL24 is not set
-CONFIG_SCSI_SATA_SIS=m
-# CONFIG_SCSI_SATA_ULI is not set
-# CONFIG_SCSI_SATA_VIA is not set
-# CONFIG_SCSI_SATA_VITESSE is not set
-CONFIG_SCSI_SATA_INTEL_COMBINED=y
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH 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_PPA is not set
-# CONFIG_SCSI_IMM is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-CONFIG_SCSI_IPR=m
-# CONFIG_SCSI_IPR_TRACE is not set
-# CONFIG_SCSI_IPR_DUMP 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_1280 is not set
-# CONFIG_SCSI_QLA_FC 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_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG 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_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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=y
-
-#
-# Subsystem Options
-#
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_OUI_DB is not set
-# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
-# CONFIG_IEEE1394_EXPORT_FULL_API is not set
-
-#
-# Device Drivers
-#
-
-#
-# Texas Instruments PCILynx requires I2C
-#
-CONFIG_IEEE1394_OHCI1394=y
-
-#
-# Protocol Drivers
-#
-# CONFIG_IEEE1394_VIDEO1394 is not set
-# CONFIG_IEEE1394_SBP2 is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-# CONFIG_IEEE1394_DV1394 is not set
-CONFIG_IEEE1394_RAWIO=y
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-# 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_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_LANCE is not set
-# CONFIG_NET_VENDOR_SMC 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=y
-# CONFIG_E2100 is not set
-# CONFIG_EWRK3 is not set
-# CONFIG_EEXPRESS is not set
-# CONFIG_EEXPRESS_PRO is not set
-# CONFIG_HPLAN_PLUS is not set
-# CONFIG_HPLAN is not set
-# CONFIG_LP486E is not set
-# CONFIG_ETH16I is not set
-CONFIG_NE2000=y
-# CONFIG_ZNET is not set
-# CONFIG_SEEQ8005 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=y
-# CONFIG_8139CP is not set
-CONFIG_8139TOO=y
-CONFIG_8139TOO_PIO=y
-# 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
-# CONFIG_NET_POCKET 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=m
-# CONFIG_S2IO_NAPI 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_PLIP 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 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_POWER 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_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_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=y
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PARKBD 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
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-# CONFIG_SERIAL_8250_CONSOLE is not set
-CONFIG_SERIAL_8250_PCI=y
-CONFIG_SERIAL_8250_PNP=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_JSM is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-CONFIG_PRINTER=y
-# CONFIG_LP_CONSOLE is not set
-# CONFIG_PPDEV is not set
-# CONFIG_TIPAR is not set
-
-#
-# 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_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
-# CONFIG_SONYPI is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=y
-# CONFIG_AGP_ALI is not set
-# CONFIG_AGP_ATI is not set
-# CONFIG_AGP_AMD is not set
-# CONFIG_AGP_AMD64 is not set
-CONFIG_AGP_INTEL=y
-# CONFIG_AGP_NVIDIA is not set
-# CONFIG_AGP_SIS is not set
-# CONFIG_AGP_SWORKS is not set
-# CONFIG_AGP_VIA is not set
-# CONFIG_AGP_EFFICEON is not set
-CONFIG_DRM=y
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_R128 is not set
-# CONFIG_DRM_RADEON is not set
-# CONFIG_DRM_I810 is not set
-# CONFIG_DRM_I830 is not set
-# CONFIG_DRM_I915 is not set
-# CONFIG_DRM_MGA is not set
-# CONFIG_DRM_SIS is not set
-# CONFIG_DRM_VIA is not set
-# CONFIG_DRM_SAVAGE is not set
-# CONFIG_MWAVE is not set
-# CONFIG_CS5535_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER 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_SENSORS_HDAPS is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-# CONFIG_IBM_ASM is not set
-
-#
-# Multi-Function 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=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=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-CONFIG_FB_VGA16=y
-CONFIG_FB_VESA=y
-# CONFIG_FB_VESA_STD is not set
-CONFIG_FB_VESA_TNG=y
-CONFIG_FB_VESA_DEFAULT_MODE="640x480-32@60"
-CONFIG_VIDEO_SELECT=y
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_I810 is not set
-# CONFIG_FB_INTEL is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# 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_GEODE is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-CONFIG_FONTS=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
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_SEQUENCER=y
-# CONFIG_SND_SEQ_DUMMY 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_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=y
-CONFIG_SND_AC97_BUS=y
-# 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
-
-#
-# ISA devices
-#
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_WAVEFRONT is not set
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-CONFIG_SND_INTEL8X0=y
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-
-#
-# USB devices
-#
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_USX2Y is not set
-
-#
-# SoC audio support
-#
-# CONFIG_SND_SOC is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=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_SUSPEND 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_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-CONFIG_USB_PRINTER=y
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_WACOM=y
-# 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_MON=y
-
-#
-# USB port drivers
-#
-# CONFIG_USB_USS720 is not set
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_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=m
-# CONFIG_USB_PHIDGETKIT is not set
-CONFIG_USB_PHIDGETSERVO=m
-# 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)
-#
-# CONFIG_EDAC is not set
-
-#
-# 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 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 is not set
-CONFIG_AUTOFS4_FS=y
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-CONFIG_UDF_FS=y
-CONFIG_UDF_NLS=y
-
-#
-# 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_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_SQUASHFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-# CONFIG_NFS_V3 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=y
-# CONFIG_NFSD_V3 is not set
-CONFIG_NFSD_TCP=y
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=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 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 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Instrumentation Support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-# CONFIG_KPROBES 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=15
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_UNWIND_INFO is not set
-CONFIG_EARLY_PRINTK=y
-CONFIG_STACK_BACKTRACE_COLS=2
-CONFIG_X86_FIND_SMP_CONFIG=y
-CONFIG_X86_MPPARSE=y
-CONFIG_DOUBLEFAULT=y
-
-#
-# 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=m
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_X86_SMP=y
-CONFIG_X86_HT=y
-CONFIG_X86_BIOS_REBOOT=y
-CONFIG_X86_TRAMPOLINE=y
-CONFIG_KTIME_SCALAR=y
diff --git a/meta/packages/linux/linux-rp-2.6.17/defconfig-spitz b/meta/packages/linux/linux-rp-2.6.17/defconfig-spitz
deleted file mode 100644 (file)
index 824fd57..0000000
+++ /dev/null
@@ -1,1603 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Sun Sep  3 23:29:17 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=y
-CONFIG_VECTORS_BASE=0xffff0000
-
-#
-# 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 is not set
-# 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=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_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_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_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX 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_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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 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_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-# CONFIG_PXA_SHARPSL_25x is not set
-CONFIG_PXA_SHARPSL_27x=y
-CONFIG_MACH_AKITA=y
-CONFIG_MACH_SPITZ=y
-CONFIG_MACH_BORZOI=y
-CONFIG_PXA27x=y
-# CONFIG_PXA_KEYS is not set
-CONFIG_IWMMXT=y
-CONFIG_PXA_SHARP_Cxx00=y
-CONFIG_PXA_SSP=y
-
-#
-# 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/hda1 rootfstype=ext3 rw  fbcon=rotate:1 dyntick=enable debug"
-# 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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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_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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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_H323 is not set
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_CORGI is not set
-CONFIG_KEYBOARD_SPITZ=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_SPITZ=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# Multimedia devices
-#
-# CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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_S1D13XXX is not set
-CONFIG_FB_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-CONFIG_FB_PXA_OVERLAY=y
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_W100 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=y
-CONFIG_FONTS=y
-# CONFIG_FONT_8x8 is not set
-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
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-# CONFIG_LOGO_OHAND_CLUT224 is not set
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-CONFIG_LOGO_OZ640_CLUT224=y
-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_CORGI=y
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_AC97_CODEC=m
-CONFIG_SND_AC97_BUS=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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# 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 Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-CONFIG_SND_PXA2xx_SOC_I2S=m
-CONFIG_SND_PXA2xx_SOC_SPITZ=m
-
-#
-# SoC Audio for the Atmel AT91
-#
-
-#
-# SoC Audio for the Freescale i.MX
-#
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC is not set
-# CONFIG_SND_SOC_WM8731 is not set
-CONFIG_SND_SOC_WM8750=m
-# CONFIG_SND_SOC_WM8753 is not set
-# CONFIG_SND_SOC_WM8772 is not set
-# CONFIG_SND_SOC_WM8971 is not set
-# CONFIG_SND_SOC_WM8974 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 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Network Adapters
-#
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_USB_NET_ZAURUS=m
-# 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 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_NAVMAN is not set
-CONFIG_USB_SERIAL_PL2303=m
-# CONFIG_USB_SERIAL_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem 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_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-
-#
-# 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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 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
-
-#
-# 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 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 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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=m
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT 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_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
diff --git a/meta/packages/linux/linux-rp-2.6.17/defconfig-tosa b/meta/packages/linux/linux-rp-2.6.17/defconfig-tosa
deleted file mode 100644 (file)
index b2ac915..0000000
+++ /dev/null
@@ -1,1609 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.16-rc5-git5
-# Tue Mar 14 09:05:26 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=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 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=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
-#
-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
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_L7200 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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# Intel PXA2xx Implementations
-#
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_ARCH_PXA_IDP is not set
-CONFIG_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-# CONFIG_MACH_POODLE is not set
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-CONFIG_MACH_TOSA=y
-CONFIG_PXA25x=y
-# CONFIG_PXA_KEYS 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-CONFIG_TOSHIBA_TC6393XB=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# 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=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_PXA25x=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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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=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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS 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_BLOCK=y
-# 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
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_SHARP_SL=y
-# 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_BLKMTD is not set
-# CONFIG_MTD_BLOCK2MTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_TMIO=y
-CONFIG_MTD_NAND_IDS=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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-# 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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_CORGI is not set
-# CONFIG_KEYBOARD_SPITZ is not set
-CONFIG_KEYBOARD_TOSA=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-# CONFIG_TOUCHSCREEN_CORGI 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_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=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TOSA=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-
-#
-# Video For Linux
-#
-
-#
-# Video Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# 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_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_AUDIO_DECODER is not set
-# CONFIG_VIDEO_DECODER is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# 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_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_W100 is not set
-CONFIG_FB_TMIO=y
-# 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 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
-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_HP680 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=m
-# CONFIG_SND_SEQUENCER is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_AC97_BUS=y
-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_AC97 is not set
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# PCMCIA devices
-#
-
-#
-# SoC audio support
-#
-CONFIG_SND_SOC=y
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=y
-CONFIG_SND_PXA2xx_SOC_AC97=y
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-# CONFIG_SND_PXA2xx_SOC_CORGI is not set
-# CONFIG_SND_PXA2xx_SOC_SPITZ is not set
-CONFIG_SND_PXA2xx_SOC_TOSA=y
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC 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_WM9713 is not set
-CONFIG_SND_SOC_WM9712=y
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
-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=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-CONFIG_USB_MTOUCH=m
-# CONFIG_USB_ITMTOUCH is not set
-CONFIG_USB_EGALAX=m
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Multimedia devices
-#
-CONFIG_USB_DABUSB=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_DSBR=m
-# CONFIG_USB_ET61X251 is not set
-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 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=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-CONFIG_USB_NET_GL620A=m
-CONFIG_USB_NET_NET1080=m
-CONFIG_USB_NET_PLUSB=m
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_ZAURUS 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_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-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_KEYSPAN_MPR is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-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_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST 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_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-
-#
-# Real Time Clock
-#
-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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-CONFIG_RTC_DRV_SA1100=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 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_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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# 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=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT 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_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_GENERIC_ALLOCATOR=y
diff --git a/meta/packages/linux/linux-rp-2.6.17/hrw-pcmcia-ids-r5.patch b/meta/packages/linux/linux-rp-2.6.17/hrw-pcmcia-ids-r5.patch
deleted file mode 100644 (file)
index b09acac..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-From: Marcin Juszkiewicz <openembedded@hrw.one.pl>
-
-Few cards informations submitted by OpenZaurus users.
-
-Seagate 8GB microdrive:
- product info: "SEAGATE", "ST1"
- manfid 0x0111, 0x0000
-
-One CF card:
- product info: "SAMSUNG", "04/05/06", "", ""
- manfid : 0x0000, 0x0000
-
-Ridata 8GB Pro 150X Compact Flash Card:
- product info: "SMI VENDOR", "SMI PRODUCT", ""
- manfid: 0x000a, 0x0000
-
- product info: "M-Systems", "CF500", ""
- manfid: 0x000a, 0x0000
-
- product info: "TRANSCEND", "TS4GCF120", ""
- manfid: 0x000a, 0x0000
-
-Signed-off-by: Marcin Juszkiewicz <openembedded@hrw.one.pl>
-
- drivers/ide/legacy/ide-cs.c   |    5 +++++
- drivers/net/pcmcia/pcnet_cs.c |    2 ++
- 2 files changed, 7 insertions(+)
-
-Index: linux-2.6.18/drivers/ide/legacy/ide-cs.c
-===================================================================
---- linux-2.6.18.orig/drivers/ide/legacy/ide-cs.c      2006-12-06 00:55:51.000000000 +0000
-+++ linux-2.6.18/drivers/ide/legacy/ide-cs.c   2006-12-06 00:55:55.000000000 +0000
-@@ -398,12 +398,17 @@ static struct pcmcia_device_id ide_ids[]
-       PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDE", 0x547e66dc, 0x5c5ab149),
-       PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674),
-       PCMCIA_DEVICE_PROD_ID12("LOOKMEET", "CBIDE2      ", 0xe37be2b5, 0x8671043b),
-+      PCMCIA_DEVICE_PROD_ID12("M-Systems", "CF500", 0x7ed2ad87, 0x7a13045c),
-       PCMCIA_DEVICE_PROD_ID2("NinjaATA-", 0xebe0bd79),
-       PCMCIA_DEVICE_PROD_ID12("PCMCIA", "CD-ROM", 0x281f1c5d, 0x66536591),
-       PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728),
-       PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1),
-+      PCMCIA_DEVICE_PROD_ID12("SEAGATE", "ST1", 0x87c1b330, 0xe1f30883),
-+      PCMCIA_DEVICE_PROD_ID12("SAMSUNG", "04/05/06", 0x43d74cb4, 0x6a22777d),
-+      PCMCIA_DEVICE_PROD_ID12("SMI VENDOR", "SMI PRODUCT", 0x30896c92, 0x703cc5f6),
-       PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
-       PCMCIA_DEVICE_PROD_ID1("TRANSCEND    512M   ", 0xd0909443),
-+      PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF120", 0x709b1bf1, 0xf54a91c8),
-       PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
-       PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
-       PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
-Index: linux-2.6.18/drivers/net/pcmcia/pcnet_cs.c
-===================================================================
---- linux-2.6.18.orig/drivers/net/pcmcia/pcnet_cs.c    2006-09-20 04:42:06.000000000 +0100
-+++ linux-2.6.18/drivers/net/pcmcia/pcnet_cs.c 2006-12-06 00:57:27.000000000 +0000
-@@ -1770,6 +1770,8 @@ static struct pcmcia_device_id pcnet_ids
-       PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "tamarack.cis"),
-       PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0",
-               0xb4be14e3, 0x43ac239b, 0x0877b627),
-+      PCMCIA_DEVICE_PROD_ID123("Ethernet", "CF Size PC Card", "1.0",
-+              0x00b2e941, 0x43ac239b, 0x0877b627),
-       PCMCIA_DEVICE_NULL
- };
- MODULE_DEVICE_TABLE(pcmcia, pcnet_ids);
diff --git a/meta/packages/linux/linux-rp-2.6.17/orinoco-remove-all-which-are-in-hostap-HACK.patch b/meta/packages/linux/linux-rp-2.6.17/orinoco-remove-all-which-are-in-hostap-HACK.patch
deleted file mode 100644 (file)
index 380349f..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-This patch should resolve problem when people get eth0 (orinoco_cs) instead of wlan0 (hostap_cs)
-with their WiFi cards.
-
-Patch will NEVER been accepted upstream.
-
-Signed-off-by: Marcin Juszkiewicz <openembedded@hrw.one.pl>
-
-Index: linux/drivers/net/wireless/orinoco_cs.c
-===================================================================
---- linux.orig/drivers/net/wireless/orinoco_cs.c       2006-08-23 16:04:10.000000000 +0200
-+++ linux/drivers/net/wireless/orinoco_cs.c    2006-08-23 16:17:43.000000000 +0200
-@@ -453,33 +453,21 @@
-       "Pavel Roskin <proski@gnu.org>, et al)";
- static struct pcmcia_device_id orinoco_cs_ids[] = {
--      PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7100), /* SonicWALL Long Range Wireless Card */
--      PCMCIA_DEVICE_MANF_CARD(0x000b, 0x7300), /* Sohoware NCP110, Philips 802.11b */
-       PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0002), /* AnyPoint(TM) Wireless II PC Card */
--      PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0777), /* 3Com AirConnect PCI 777A */
--      PCMCIA_DEVICE_MANF_CARD(0x0126, 0x8000), /* PROXIM RangeLAN-DS/LAN PC CARD */
-       PCMCIA_DEVICE_MANF_CARD(0x0138, 0x0002), /* Compaq WL100 11 Mbps Wireless Adapter */
-       PCMCIA_DEVICE_MANF_CARD(0x0156, 0x0002), /* Lucent Orinoco and old Intersil */
-       PCMCIA_DEVICE_MANF_CARD(0x016b, 0x0001), /* Ericsson WLAN Card C11 */
-       PCMCIA_DEVICE_MANF_CARD(0x01eb, 0x080a), /* Nortel Networks eMobility 802.11 Wireless Adapter */
-       PCMCIA_DEVICE_MANF_CARD(0x01ff, 0x0008), /* Intermec MobileLAN 11Mbps 802.11b WLAN Card */
--      PCMCIA_DEVICE_MANF_CARD(0x0250, 0x0002), /* Samsung SWL2000-N 11Mb/s WLAN Card */
-       PCMCIA_DEVICE_MANF_CARD(0x0261, 0x0002), /* AirWay 802.11 Adapter (PCMCIA) */
-       PCMCIA_DEVICE_MANF_CARD(0x0268, 0x0001), /* ARtem Onair */
-       PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0305), /* Buffalo WLI-PCM-S11 */
--      PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1612), /* Linksys WPC11 Version 2.5 */
--      PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1613), /* Linksys WPC11 Version 3 */
--      PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0002), /* Compaq HNW-100 11 Mbps Wireless Adapter */
-       PCMCIA_DEVICE_MANF_CARD(0x028a, 0x0673), /* Linksys WCF12 Wireless CompactFlash Card */
--      PCMCIA_DEVICE_MANF_CARD(0x02aa, 0x0002), /* ASUS SpaceLink WL-100 */
-       PCMCIA_DEVICE_MANF_CARD(0x02ac, 0x0002), /* SpeedStream SS1021 Wireless Adapter */
-       PCMCIA_DEVICE_MANF_CARD(0x14ea, 0xb001), /* PLANEX RoadLannerWave GW-NS11H */
--      PCMCIA_DEVICE_MANF_CARD(0x50c2, 0x7300), /* Airvast WN-100 */
-       PCMCIA_DEVICE_MANF_CARD(0x9005, 0x0021), /* Adaptec Ultra Wireless ANW-8030 */
-       PCMCIA_DEVICE_MANF_CARD(0xc001, 0x0008), /* CONTEC FLEXSCAN/FX-DDS110-PCC */
-       PCMCIA_DEVICE_MANF_CARD(0xc250, 0x0002), /* Conceptronic CON11Cpro, EMTAC A2424i */
--      PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0002), /* Safeway 802.11b, ZCOMAX AirRunner/XI-300 */
--      PCMCIA_DEVICE_MANF_CARD(0xd601, 0x0005), /* D-Link DCF660, Sandisk Connect SDWCFB-000 */
-       PCMCIA_DEVICE_PROD_ID12(" ", "IEEE 802.11 Wireless LAN/PC Card", 0x3b6e20c8, 0xefccafe9),
-       PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3),
-       PCMCIA_DEVICE_PROD_ID12("ACTIONTEC", "PRISM Wireless LAN PC Card", 0x393089da, 0xa71e69d5),
-@@ -487,31 +475,25 @@
-       PCMCIA_DEVICE_PROD_ID123("AIRVAST", "IEEE 802.11b Wireless PCMCIA Card", "HFA3863", 0xea569531, 0x4bcb9645, 0x355cb092),
-       PCMCIA_DEVICE_PROD_ID12("Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", 0x5cd01705, 0x4271660f),
-       PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11b_PC_CARD_25", 0x78fc06ee, 0xdb9aa842),
--      PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11B_CF_CARD_25", 0x78fc06ee, 0x45a50c1e),
-       PCMCIA_DEVICE_PROD_ID12("Avaya Communication", "Avaya Wireless PC Card", 0xd8a43b78, 0x0d341169),
-       PCMCIA_DEVICE_PROD_ID12("BENQ", "AWL100 PCMCIA ADAPTER", 0x35dadc74, 0x01f7fedb),
-       PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-PCM-L11G", 0x2decece3, 0xf57ca4b3),
--      PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G", 0x2decece3, 0x82067c18),
-       PCMCIA_DEVICE_PROD_ID12("Cabletron", "RoamAbout 802.11 DS", 0x32d445f5, 0xedeffd90),
--      PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", 0x54f7c49c, 0x15a75e5b),
-       PCMCIA_DEVICE_PROD_ID123("corega", "WL PCCL-11", "ISL37300P", 0x0a21501a, 0x59868926, 0xc9049a39),
-       PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCC-11", 0x5261440f, 0xa6405584),
-       PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCCA-11", 0x5261440f, 0xdf6115f9),
-       PCMCIA_DEVICE_PROD_ID12("corega_K.K.", "Wireless_LAN_PCCB-11", 0x29e33311, 0xee7a27ae),
-       PCMCIA_DEVICE_PROD_ID12("D", "Link DRC-650 11Mbps WLAN Card", 0x71b18589, 0xf144e3ac),
--      PCMCIA_DEVICE_PROD_ID12("D", "Link DWL-650 11Mbps WLAN Card", 0x71b18589, 0xb6f1b0ab),
-       PCMCIA_DEVICE_PROD_ID12("D-Link Corporation", "D-Link DWL-650H 11Mbps WLAN Adapter", 0xef544d24, 0xcd8ea916),
-       PCMCIA_DEVICE_PROD_ID12("Digital Data Communications", "WPC-0100", 0xfdd73470, 0xe0b6f146),
-       PCMCIA_DEVICE_PROD_ID12("ELSA", "AirLancer MC-11", 0x4507a33a, 0xef54f0e3),
-       PCMCIA_DEVICE_PROD_ID12("HyperLink", "Wireless PC Card 11Mbps", 0x56cc3f1a, 0x0bcf220c),
-       PCMCIA_DEVICE_PROD_ID123("Instant Wireless ", " Network PC CARD", "Version 01.02", 0x11d901af, 0x6e9bd926, 0x4b74baa0),
-       PCMCIA_DEVICE_PROD_ID12("Intel", "PRO/Wireless 2011 LAN PC Card", 0x816cc815, 0x07f58077),
--      PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18),
-       PCMCIA_DEVICE_PROD_ID12("INTERSIL", "I-GATE 11M PC Card / PC Card plus", 0x74c5e40d, 0x8304ff77),
-       PCMCIA_DEVICE_PROD_ID12("Intersil", "PRISM 2_5 PCMCIA ADAPTER", 0x4b801a17, 0x6345a0bf),
-       PCMCIA_DEVICE_PROD_ID123("Intersil", "PRISM Freedom PCMCIA Adapter", "ISL37100P", 0x4b801a17, 0xf222ec2d, 0x630d52b2),
-       PCMCIA_DEVICE_PROD_ID12("LeArtery", "SYNCBYAIR 11Mbps Wireless LAN PC Card", 0x7e3b326a, 0x49893e92),
--      PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", 0x0733cc81, 0x0c52f395),
-       PCMCIA_DEVICE_PROD_ID12("Lucent Technologies", "WaveLAN/IEEE", 0x23eb9949, 0xc562e72a),
-       PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11", 0x481e0094, 0x7360e410),
-       PCMCIA_DEVICE_PROD_ID12("MELCO", "WLI-PCM-L11G", 0x481e0094, 0xf57ca4b3),
-@@ -529,10 +511,8 @@
-       PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PCI CARD HARMONY 80211B", 0xc6536a5e, 0x9f494e26),
-       PCMCIA_DEVICE_PROD_ID12("SAMSUNG", "11Mbps WLAN Card", 0x43d74cb4, 0x579bd91b),
-       PCMCIA_DEVICE_PROD_ID12("SMC", "SMC2532W-B EliteConnect Wireless Adapter", 0xc4f8b18b, 0x196bd757),
--      PCMCIA_DEVICE_PROD_ID12("SMC", "SMC2632W", 0xc4f8b18b, 0x474a1f2a),
-       PCMCIA_DEVICE_PROD_ID12("Symbol Technologies", "LA4111 Spectrum24 Wireless LAN PC Card", 0x3f02b4d6, 0x3663cb0e),
-       PCMCIA_DEVICE_PROD_ID123("The Linksys Group, Inc.", "Instant Wireless Network PC Card", "ISL37300P", 0xa5f472c2, 0x590eb502, 0xc9049a39),
--      PCMCIA_DEVICE_PROD_ID12("ZoomAir 11Mbps High", "Rate wireless Networking", 0x273fe3db, 0x32a1eaee),
-       PCMCIA_DEVICE_NULL,
- };
- MODULE_DEVICE_TABLE(pcmcia, orinoco_cs_ids);
diff --git a/meta/packages/linux/linux-rp-2.6.17/pxa-serial-hack.patch b/meta/packages/linux/linux-rp-2.6.17/pxa-serial-hack.patch
deleted file mode 100644 (file)
index b3a7f78..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-Index: linux-2.6.14/drivers/serial/8250.c
-===================================================================
---- linux-2.6.14.orig/drivers/serial/8250.c    2005-11-07 18:10:50.000000000 +0000
-+++ linux-2.6.14/drivers/serial/8250.c 2005-11-07 19:01:21.000000000 +0000
-@@ -2333,7 +2333,12 @@
-       .devfs_name             = "tts/",
-       .dev_name               = "ttyS",
-       .major                  = TTY_MAJOR,
-+#ifdef CONFIG_SERIAL_PXA
-+      .minor                  = 64 + 3,
-+      .name_base              = 3,
-+#else
-       .minor                  = 64,
-+#endif
-       .nr                     = UART_NR,
-       .cons                   = SERIAL8250_CONSOLE,
- };
-Index: linux-2.6.14/drivers/serial/serial_core.c
-===================================================================
---- linux-2.6.14.orig/drivers/serial/serial_core.c     2005-11-07 18:10:50.000000000 +0000
-+++ linux-2.6.14/drivers/serial/serial_core.c  2005-11-07 19:01:21.000000000 +0000
-@@ -2126,6 +2126,7 @@
-       normal->driver_name     = drv->driver_name;
-       normal->devfs_name      = drv->devfs_name;
-       normal->name            = drv->dev_name;
-+      normal->name_base       = drv->name_base;
-       normal->major           = drv->major;
-       normal->minor_start     = drv->minor;
-       normal->type            = TTY_DRIVER_TYPE_SERIAL;
-Index: linux-2.6.14/include/linux/serial_core.h
-===================================================================
---- linux-2.6.14.orig/include/linux/serial_core.h      2005-11-07 18:10:56.000000000 +0000
-+++ linux-2.6.14/include/linux/serial_core.h   2005-11-07 19:01:21.000000000 +0000
-@@ -322,6 +322,7 @@
-       const char              *driver_name;
-       const char              *dev_name;
-       const char              *devfs_name;
-+      int                      name_base;
-       int                      major;
-       int                      minor;
-       int                      nr;
-Index: linux-2.6.14/drivers/serial/serial_cs.c
-===================================================================
---- linux-2.6.14.orig/drivers/serial/serial_cs.c       2005-10-28 01:02:08.000000000 +0100
-+++ linux-2.6.14/drivers/serial/serial_cs.c    2005-11-07 19:01:21.000000000 +0000
-@@ -294,7 +294,7 @@
-                       kio_addr_t iobase, int irq)
- {
-       struct uart_port port;
--      int line;
-+      int line, linestart;
-       memset(&port, 0, sizeof (struct uart_port));
-       port.iobase = iobase;
-@@ -311,10 +311,16 @@
-               return -EINVAL;
-       }
-+#if CONFIG_SERIAL_PXA
-+      linestart = 3;
-+#else
-+      linestart = 0;
-+#endif
-+
-       info->line[info->ndev] = line;
--      sprintf(info->node[info->ndev].dev_name, "ttyS%d", line);
-+      sprintf(info->node[info->ndev].dev_name, "ttyS%d", line+linestart);
-       info->node[info->ndev].major = TTY_MAJOR;
--      info->node[info->ndev].minor = 0x40 + line;
-+      info->node[info->ndev].minor = 0x40 + line + linestart;
-       if (info->ndev > 0)
-               info->node[info->ndev - 1].next = &info->node[info->ndev];
-       info->ndev++;
diff --git a/meta/packages/linux/linux-rp-2.6.17/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch b/meta/packages/linux/linux-rp-2.6.17/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch
deleted file mode 100644 (file)
index 18bf426..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-
-From: Petr Vandrovec <vandrove@vc.cvut.cz>
-
-Patch below adds support for using different prescaler than 16 for 16c950
-chips.  This is needed for using Fujitsu-Siemens Connect2Air compact-flash
-card, which comes (apparently) with 806kHz clocks, and so you have to
-program prescaler for division by 7, and DLAB to 1, to get 115200Bd.  
-
-To get card properly running you also have to add lines below to
-/etc/pcmcia/serial.opts so kernel knows that base speed is not 115200 but
-50400 (50400 * 16 = 806400; 806400 / 7 = 115200).  As I've found no code
-specifying baud_rate in serial_cs, I assume that specifying it in
-serial.opts is right way to do this type of things.
-
-Patch also fixes problem that for UPF_MAGIC_MULTIPLIER maximum possible
-baud rate passed to uart code was uartclk / 16 while correct value for
-these devices (and for 16c950) is uartclk / 4.
-
-Patch also fixes problem that for UPF_MAGIC_MULTIPLIER devices with
-baud_rate 19200 or 9600 spd_cust did not work correctly.  Not that such
-devices exist, but we should not ignore spd_cust, user probably knows why
-he asked for spd_cust.
-
-serial.opts:
-
-case "$MANFID-$FUNCID-$PRODID_1-$PRODID_2-$PRODID_3-$PRODID_4" in
-'0279,950b-2-GPRS Modem---')
-    SERIAL_OPTS="baud_base 50400"
-    ;;
-esac
-
-Cc: David Woodhouse <dwmw2@infradead.org>
-Signed-off-by: Andrew Morton <akpm@osdl.org>
----
-
- drivers/serial/8250.c |   82 +++++++++++++++++++++++++++++++++++++++-----------
- 1 files changed, 64 insertions(+), 18 deletions(-)
-
-diff -puN drivers/serial/8250.c~serial-add-support-for-non-standard-xtals-to-16c950-driver drivers/serial/8250.c
---- devel/drivers/serial/8250.c~serial-add-support-for-non-standard-xtals-to-16c950-driver     2005-09-12 03:34:57.000000000 -0700
-+++ devel-akpm/drivers/serial/8250.c   2005-09-12 03:34:57.000000000 -0700
-@@ -1653,24 +1653,58 @@ static void serial8250_shutdown(struct u
-               serial_unlink_irq_chain(up);
- }
--static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
-+static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud,
-+                                         unsigned int *prescaler)
- {
--      unsigned int quot;
--
--      /*
--       * Handle magic divisors for baud rates above baud_base on
--       * SMSC SuperIO chips.
-+        /*
-+       * Use special handling only if user did not supply its own divider.
-+       * spd_cust is defined in terms of baud_base, so always use default
-+       * prescaler when spd_cust is requested.
-        */
--      if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
--          baud == (port->uartclk/4))
--              quot = 0x8001;
--      else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
--               baud == (port->uartclk/8))
--              quot = 0x8002;
--      else
--              quot = uart_get_divisor(port, baud);
--      return quot;
-+      *prescaler = 16;
-+        if (baud != 38400 || (port->flags & UPF_SPD_MASK) != UPF_SPD_CUST) {
-+              unsigned int quot = port->uartclk / baud;
-+
-+              /*
-+               * Handle magic divisors for baud rates above baud_base on
-+               * SMSC SuperIO chips.
-+               */
-+              if (port->flags & UPF_MAGIC_MULTIPLIER) {
-+                      if (quot == 4) {
-+                              return 0x8001;
-+                      } else if (quot == 8) {
-+                              return 0x8002;
-+                      }
-+              }
-+              if (port->type == PORT_16C950) {
-+                      /*
-+                       * This computes TCR value (4 to 16), not CPR value (which can
-+                       * be between 1.000 and 31.875) - chip I have uses XTAL of
-+                       * 806400Hz, and so a division by 7 is required to get 115200Bd.
-+                       * I'm leaving CPR disabled for now, until someone will
-+                       * hit even more exotic XTAL (it is needed to get 500kbps
-+                       * or 1000kbps from 18.432MHz XTAL, but I have no device
-+                       * which would benefit from doing that).
-+                       *
-+                       * If we can use divide by 16, use it.  Otherwise look for
-+                       * better prescaler, from 15 to 4.  If quotient cannot
-+                       * be divided by any integer value between 4 and 15, use 4.
-+                       */
-+                      if (quot & 0x0F) {
-+                              unsigned int div;
-+
-+                              for (div = 15; div > 4; div--) {
-+                                      if (quot % div == 0) {
-+                                              break;
-+                                      }
-+                              }
-+                              *prescaler = div;
-+                              return quot / div;
-+                      }
-+              }
-+      }
-+      return uart_get_divisor(port, baud);
- }
- static void
-@@ -1680,7 +1714,7 @@ serial8250_set_termios(struct uart_port 
-       struct uart_8250_port *up = (struct uart_8250_port *)port;
-       unsigned char cval, fcr = 0;
-       unsigned long flags;
--      unsigned int baud, quot;
-+      unsigned int baud, quot, prescaler;
-       switch (termios->c_cflag & CSIZE) {
-       case CS5:
-@@ -1712,8 +1746,13 @@ serial8250_set_termios(struct uart_port 
-       /*
-        * Ask the core to calculate the divisor for us.
-        */
--      baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); 
--      quot = serial8250_get_divisor(port, baud);
-+
-+      if (port->type == PORT_16C950 || (port->flags & UPF_MAGIC_MULTIPLIER)) {
-+              baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/4);
-+      } else {
-+              baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
-+      }
-+      quot = serial8250_get_divisor(port, baud, &prescaler);
-       /*
-        * Oxford Semi 952 rev B workaround
-@@ -1817,6 +1856,13 @@ serial8250_set_termios(struct uart_port 
-       serial_outp(up, UART_DLM, quot >> 8);           /* MS of divisor */
-       /*
-+       * Program prescaler for 16C950 chips.
-+       */
-+      if (up->port.type == PORT_16C950) {
-+              serial_icr_write(up, UART_TCR, prescaler == 16 ? 0 : prescaler);
-+      }
-+
-+      /*
-        * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
-        * is written without DLAB set, this mode will be disabled.
-        */
-_
diff --git a/meta/packages/linux/linux-rp-2.6.17/squashfs3.0-2.6.15.patch b/meta/packages/linux/linux-rp-2.6.17/squashfs3.0-2.6.15.patch
deleted file mode 100644 (file)
index 6fec9eb..0000000
+++ /dev/null
@@ -1,4174 +0,0 @@
-diff --new-file -urp linux-2.6.15/fs/Kconfig linux-2.6.15-squashfs3.0/fs/Kconfig
---- linux-2.6.15/fs/Kconfig    2006-03-01 22:37:27.000000000 +0000
-+++ linux-2.6.15-squashfs3.0/fs/Kconfig        2006-03-07 21:12:37.000000000 +0000
-@@ -1151,6 +1151,71 @@ config CRAMFS
-         If unsure, say N.
-+config SQUASHFS
-+      tristate "SquashFS 3.0 - Squashed file system support"
-+      select ZLIB_INFLATE
-+      help
-+        Saying Y here includes support for SquashFS 3.0 (a Compressed Read-Only File
-+        System).  Squashfs is a highly compressed read-only filesystem for Linux.
-+        It uses zlib compression to compress both files, inodes and directories.
-+        Inodes in the system are very small and all blocks are packed to minimise
-+        data overhead. Block sizes greater than 4K are supported up to a maximum of 64K.
-+        SquashFS 3.0 supports 64 bit filesystems and files (larger than 4GB), full
-+        uid/gid information, hard links and timestamps.
-+
-+        Squashfs is intended for general read-only filesystem use, for archival
-+        use (i.e. in cases where a .tar.gz file may be used), and in embedded
-+        systems where low overhead is needed.  Further information and filesystem tools
-+        are available from http://squashfs.sourceforge.net.
-+
-+        If you want to compile this as a module ( = code which can be
-+        inserted in and removed from the running kernel whenever you want),
-+        say M here and read <file:Documentation/modules.txt>.  The module
-+        will be called squashfs.  Note that the root file system (the one
-+        containing the directory /) cannot be compiled as a module.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_EMBEDDED
-+
-+      bool "Additional options for memory-constrained systems" 
-+      depends on SQUASHFS
-+      default n
-+      help
-+        Saying Y here allows you to specify cache sizes and how Squashfs
-+        allocates memory.  This is only intended for memory constrained
-+        systems.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_FRAGMENT_CACHE_SIZE
-+      int "Number of fragments cached" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default "3"
-+      help
-+        By default SquashFS caches the last 3 fragments read from
-+        the filesystem.  Increasing this amount may mean SquashFS
-+        has to re-read fragments less often from disk, at the expense
-+        of extra system memory.  Decreasing this amount will mean
-+        SquashFS uses less memory at the expense of extra reads from disk.
-+
-+        Note there must be at least one cached fragment.  Anything
-+        much more than three will probably not make much difference.
-+
-+config SQUASHFS_VMALLOC
-+      bool "Use Vmalloc rather than Kmalloc" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default n
-+      help
-+        By default SquashFS uses kmalloc to obtain fragment cache memory.
-+        Kmalloc memory is the standard kernel allocator, but it can fail
-+        on memory constrained systems.  Because of the way Vmalloc works,
-+        Vmalloc can succeed when kmalloc fails.  Specifying this option
-+        will make SquashFS always use Vmalloc to allocate the
-+        fragment cache memory.
-+
-+        If unsure, say N.
-+
- config VXFS_FS
-       tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
-       help
-diff --new-file -urp linux-2.6.15/fs/Makefile linux-2.6.15-squashfs3.0/fs/Makefile
---- linux-2.6.15/fs/Makefile   2006-03-01 22:37:27.000000000 +0000
-+++ linux-2.6.15-squashfs3.0/fs/Makefile       2006-03-07 21:12:37.000000000 +0000
-@@ -55,6 +55,7 @@ obj-$(CONFIG_EXT3_FS)                += ext3/ # Before
- obj-$(CONFIG_JBD)             += jbd/
- obj-$(CONFIG_EXT2_FS)         += ext2/
- obj-$(CONFIG_CRAMFS)          += cramfs/
-+obj-$(CONFIG_SQUASHFS)                += squashfs/
- obj-$(CONFIG_RAMFS)           += ramfs/
- obj-$(CONFIG_HUGETLBFS)               += hugetlbfs/
- obj-$(CONFIG_CODA_FS)         += coda/
-diff --new-file -urp linux-2.6.15/fs/squashfs/inode.c linux-2.6.15-squashfs3.0/fs/squashfs/inode.c
---- linux-2.6.15/fs/squashfs/inode.c   1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15-squashfs3.0/fs/squashfs/inode.c       2006-03-07 21:12:37.000000000 +0000
-@@ -0,0 +1,2127 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * inode.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+
-+static void squashfs_put_super(struct super_block *);
-+static int squashfs_statfs(struct super_block *, struct kstatfs *);
-+static int squashfs_symlink_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage4K(struct file *file, struct page *page);
-+static int squashfs_readdir(struct file *, void *, filldir_t);
-+static struct inode *squashfs_alloc_inode(struct super_block *sb);
-+static void squashfs_destroy_inode(struct inode *inode);
-+static int init_inodecache(void);
-+static void destroy_inodecache(void);
-+static struct dentry *squashfs_lookup(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode);
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize);
-+static struct super_block *squashfs_get_sb(struct file_system_type *, int,
-+                              const char *, void *);
-+
-+
-+static z_stream stream;
-+
-+static struct file_system_type squashfs_fs_type = {
-+      .owner = THIS_MODULE,
-+      .name = "squashfs",
-+      .get_sb = squashfs_get_sb,
-+      .kill_sb = kill_block_super,
-+      .fs_flags = FS_REQUIRES_DEV
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static struct super_operations squashfs_ops = {
-+      .alloc_inode = squashfs_alloc_inode,
-+      .destroy_inode = squashfs_destroy_inode,
-+      .statfs = squashfs_statfs,
-+      .put_super = squashfs_put_super,
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = {
-+      .readpage = squashfs_symlink_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops = {
-+      .readpage = squashfs_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops_4K = {
-+      .readpage = squashfs_readpage4K
-+};
-+
-+static struct file_operations squashfs_dir_ops = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir
-+};
-+
-+SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = {
-+      .lookup = squashfs_lookup
-+};
-+
-+
-+static struct buffer_head *get_block_length(struct super_block *s,
-+                              int *cur_index, int *offset, int *c_byte)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned short temp;
-+      struct buffer_head *bh;
-+
-+      if (!(bh = sb_bread(s, *cur_index)))
-+              goto out;
-+
-+      if (msblk->devblksize - *offset == 1) {
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              else
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              brelse(bh);
-+              if (!(bh = sb_bread(s, ++(*cur_index))))
-+                      goto out;
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              bh->b_data); 
-+              else
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              bh->b_data); 
-+              *c_byte = temp;
-+              *offset = 1;
-+      } else {
-+              if (msblk->swap) {
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1)); 
-+              } else {
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1)); 
-+              }
-+              *c_byte = temp;
-+              *offset += 2;
-+      }
-+
-+      if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) {
-+              if (*offset == msblk->devblksize) {
-+                      brelse(bh);
-+                      if (!(bh = sb_bread(s, ++(*cur_index))))
-+                              goto out;
-+                      *offset = 0;
-+              }
-+              if (*((unsigned char *) (bh->b_data + *offset)) !=
-+                                              SQUASHFS_MARKER_BYTE) {
-+                      ERROR("Metadata block marker corrupt @ %x\n",
-+                                              *cur_index);
-+                      brelse(bh);
-+                      goto out;
-+              }
-+              (*offset)++;
-+      }
-+      return bh;
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+SQSH_EXTERN unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                      long long index, unsigned int length,
-+                      long long *next_index)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >>
-+                      msblk->devblksize_log2) + 2];
-+      unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1);
-+      unsigned int cur_index = index >> msblk->devblksize_log2;
-+      int bytes, avail_bytes, b = 0, k;
-+      char *c_buffer;
-+      unsigned int compressed;
-+      unsigned int c_byte = length;
-+
-+      if (c_byte) {
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              if (!(bh[0] = sb_getblk(s, cur_index)))
-+                      goto block_release;
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b, bh);
-+      } else {
-+              if (!(bh[0] = get_block_length(s, &cur_index, &offset,
-+                                                              &c_byte)))
-+                      goto read_failure;
-+
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b - 1, bh + 1);
-+      }
-+
-+      if (compressed)
-+              down(&msblk->read_data_mutex);
-+
-+      for (bytes = 0, k = 0; k < b; k++) {
-+              avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ?
-+                                      msblk->devblksize - offset :
-+                                      c_byte - bytes;
-+              wait_on_buffer(bh[k]);
-+              if (!buffer_uptodate(bh[k]))
-+                      goto block_release;
-+              memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes);
-+              bytes += avail_bytes;
-+              offset = 0;
-+              brelse(bh[k]);
-+      }
-+
-+      /*
-+       * uncompress block
-+       */
-+      if (compressed) {
-+              int zlib_err;
-+
-+              stream.next_in = c_buffer;
-+              stream.avail_in = c_byte;
-+              stream.next_out = buffer;
-+              stream.avail_out = msblk->read_size;
-+
-+              if (((zlib_err = zlib_inflateInit(&stream)) != Z_OK) ||
-+                              ((zlib_err = zlib_inflate(&stream, Z_FINISH))
-+                               != Z_STREAM_END) || ((zlib_err =
-+                              zlib_inflateEnd(&stream)) != Z_OK)) {
-+                      ERROR("zlib_fs returned unexpected result 0x%x\n",
-+                              zlib_err);
-+                      bytes = 0;
-+              } else
-+                      bytes = stream.total_out;
-+              
-+              up(&msblk->read_data_mutex);
-+      }
-+
-+      if (next_index)
-+              *next_index = index + c_byte + (length ? 0 :
-+                              (SQUASHFS_CHECK_DATA(msblk->sblk.flags)
-+                               ? 3 : 2));
-+      return bytes;
-+
-+block_release:
-+      while (--b >= 0)
-+              brelse(bh[b]);
-+
-+read_failure:
-+      ERROR("sb_bread failed reading block 0x%x\n", cur_index);
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      int n, i, bytes, return_length = length;
-+      long long next_index;
-+
-+      TRACE("Entered squashfs_get_cached_block [%llx:%x]\n", block, offset);
-+
-+      while ( 1 ) {
-+              for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) 
-+                      if (msblk->block_cache[i].block == block)
-+                              break; 
-+              
-+              down(&msblk->block_cache_mutex);
-+
-+              if (i == SQUASHFS_CACHED_BLKS) {
-+                      /* read inode header block */
-+                      for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS;
-+                                      n ; n --, i = (i + 1) %
-+                                      SQUASHFS_CACHED_BLKS)
-+                              if (msblk->block_cache[i].block !=
-+                                                      SQUASHFS_USED_BLK)
-+                                      break;
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->waitq, &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->block_cache_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->waitq, &wait);
-+                              continue;
-+                      }
-+                      msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS;
-+
-+                      if (msblk->block_cache[i].block ==
-+                                                      SQUASHFS_INVALID_BLK) {
-+                              if (!(msblk->block_cache[i].data =
-+                                              kmalloc(SQUASHFS_METADATA_SIZE,
-+                                              GFP_KERNEL))) {
-+                                      ERROR("Failed to allocate cache"
-+                                                      "block\n");
-+                                      up(&msblk->block_cache_mutex);
-+                                      goto out;
-+                              }
-+                      }
-+      
-+                      msblk->block_cache[i].block = SQUASHFS_USED_BLK;
-+                      up(&msblk->block_cache_mutex);
-+
-+                      if (!(msblk->block_cache[i].length =
-+                                              squashfs_read_data(s,
-+                                              msblk->block_cache[i].data,
-+                                              block, 0, &next_index))) {
-+                              ERROR("Unable to read cache block [%llx:%x]\n",
-+                                              block, offset);
-+                              goto out;
-+                      }
-+
-+                      down(&msblk->block_cache_mutex);
-+                      wake_up(&msblk->waitq);
-+                      msblk->block_cache[i].block = block;
-+                      msblk->block_cache[i].next_index = next_index;
-+                      TRACE("Read cache block [%llx:%x]\n", block, offset);
-+              }
-+
-+              if (msblk->block_cache[i].block != block) {
-+                      up(&msblk->block_cache_mutex);
-+                      continue;
-+              }
-+
-+              if ((bytes = msblk->block_cache[i].length - offset) >= length) {
-+                      if (buffer)
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, length);
-+                      if (msblk->block_cache[i].length - offset == length) {
-+                              *next_block = msblk->block_cache[i].next_index;
-+                              *next_offset = 0;
-+                      } else {
-+                              *next_block = block;
-+                              *next_offset = offset + length;
-+                      }
-+                      up(&msblk->block_cache_mutex);
-+                      goto finish;
-+              } else {
-+                      if (buffer) {
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, bytes);
-+                              buffer += bytes;
-+                      }
-+                      block = msblk->block_cache[i].next_index;
-+                      up(&msblk->block_cache_mutex);
-+                      length -= bytes;
-+                      offset = 0;
-+              }
-+      }
-+
-+finish:
-+      return return_length;
-+out:
-+      return 0;
-+}
-+
-+
-+static int get_fragment_location(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET(fragment);
-+      struct squashfs_fragment_entry fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment)
-+{
-+      down(&msblk->fragment_mutex);
-+      fragment->locked --;
-+      wake_up(&msblk->fragment_wait_queue);
-+      up(&msblk->fragment_mutex);
-+}
-+
-+
-+SQSH_EXTERN struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length)
-+{
-+      int i, n, nf;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+
-+      while ( 1 ) {
-+              down(&msblk->fragment_mutex);
-+
-+              for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS &&
-+                              msblk->fragment[i].block != start_block; i++);
-+
-+              if (i == SQUASHFS_CACHED_FRAGMENTS) {
-+                      nf = (msblk->next_fragment + 1) % 
-+                              SQUASHFS_CACHED_FRAGMENTS;
-+                      for (i = msblk->next_fragment, n =
-+                              SQUASHFS_CACHED_FRAGMENTS; n &&
-+                              msblk->fragment[i].locked; n--, i = (i + 1) %
-+                              SQUASHFS_CACHED_FRAGMENTS);
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->fragment_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              continue;
-+                      }
-+                      msblk->next_fragment = nf;
-+                      
-+                      if (msblk->fragment[i].data == NULL)
-+                              if (!(msblk->fragment[i].data = SQUASHFS_ALLOC
-+                                              (SQUASHFS_FILE_MAX_SIZE))) {
-+                                      ERROR("Failed to allocate fragment "
-+                                                      "cache block\n");
-+                                      up(&msblk->fragment_mutex);
-+                                      goto out;
-+                              }
-+
-+                      msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+                      msblk->fragment[i].locked = 1;
-+                      up(&msblk->fragment_mutex);
-+
-+                      if (!(msblk->fragment[i].length = squashfs_read_data(s,
-+                                              msblk->fragment[i].data,
-+                                              start_block, length, NULL))) {
-+                              ERROR("Unable to read fragment cache block "
-+                                                      "[%llx]\n", start_block);
-+                              msblk->fragment[i].locked = 0;
-+                              goto out;
-+                      }
-+
-+                      msblk->fragment[i].block = start_block;
-+                      TRACE("New fragment %d, start block %lld, locked %d\n",
-+                                              i, msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+                      break;
-+              }
-+
-+              msblk->fragment[i].locked++;
-+              up(&msblk->fragment_mutex);
-+              TRACE("Got fragment %d, start block %lld, locked %d\n", i,
-+                                              msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+              break;
-+      }
-+
-+      return &msblk->fragment[i];
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header *inodeb)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = inodeb->inode_number;
-+              i->i_mtime.tv_sec = inodeb->mtime;
-+              i->i_atime.tv_sec = inodeb->mtime;
-+              i->i_ctime.tv_sec = inodeb->mtime;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header id, sid;
-+      struct squashfs_base_inode_header *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_reg_inode_header *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header *sinodep = &sid.reg;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = 1;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      i->i_blksize = PAGE_CACHE_SIZE;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_LREG_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_lreg_inode_header *inodep = &id.lreg;
-+                      struct squashfs_lreg_inode_header *sinodep = &sid.lreg;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LREG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      i->i_blksize = PAGE_CACHE_SIZE;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header *sinodep =
-+                                                              &sid.symlink;
-+      
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      struct squashfs_ipc_inode_header *inodep = &id.ipc;
-+                      struct squashfs_ipc_inode_header *sinodep = &sid.ipc;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_IPC_INODE_HEADER(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+      
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%llx:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int read_fragment_index_table(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      /* Allocate fragment index table */
-+      if (!(msblk->fragment_index = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+   
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              long long fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment),
-+                                              &msblk->fragment_index[i], 1);
-+                      msblk->fragment_index[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int supported_squashfs_filesystem(struct squashfs_sb_info *msblk, int silent)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget;
-+      msblk->read_blocklist = read_blocklist;
-+      msblk->read_fragment_index_table = read_fragment_index_table;
-+
-+      if (sblk->s_major == 1) {
-+              if (!squashfs_1_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 1.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if (sblk->s_major == 2) {
-+              if (!squashfs_2_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 2.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor >
-+                      SQUASHFS_MINOR) {
-+              SERROR("Major/Minor mismatch, trying to mount newer %d.%d "
-+                              "filesystem\n", sblk->s_major, sblk->s_minor);
-+              SERROR("Please update your kernel\n");
-+              return 0;
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int squashfs_fill_super(struct super_block *s, void *data, int silent)
-+{
-+      struct squashfs_sb_info *msblk;
-+      struct squashfs_super_block *sblk;
-+      int i;
-+      char b[BDEVNAME_SIZE];
-+      struct inode *root;
-+
-+      TRACE("Entered squashfs_read_superblock\n");
-+
-+      if (!(s->s_fs_info = kmalloc(sizeof(struct squashfs_sb_info),
-+                                              GFP_KERNEL))) {
-+              ERROR("Failed to allocate superblock\n");
-+              goto failure;
-+      }
-+      memset(s->s_fs_info, 0, sizeof(struct squashfs_sb_info));
-+      msblk = s->s_fs_info;
-+      sblk = &msblk->sblk;
-+      
-+      msblk->devblksize = sb_min_blocksize(s, BLOCK_SIZE);
-+      msblk->devblksize_log2 = ffz(~msblk->devblksize);
-+
-+      init_MUTEX(&msblk->read_data_mutex);
-+      init_MUTEX(&msblk->read_page_mutex);
-+      init_MUTEX(&msblk->block_cache_mutex);
-+      init_MUTEX(&msblk->fragment_mutex);
-+      init_MUTEX(&msblk->meta_index_mutex);
-+      
-+      init_waitqueue_head(&msblk->waitq);
-+      init_waitqueue_head(&msblk->fragment_wait_queue);
-+
-+      if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START,
-+                                      sizeof(struct squashfs_super_block) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              SERROR("unable to read superblock\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Check it is a SQUASHFS superblock */
-+      msblk->swap = 0;
-+      if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) {
-+              if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) {
-+                      struct squashfs_super_block ssblk;
-+
-+                      WARNING("Mounting a different endian SQUASHFS "
-+                              "filesystem on %s\n", bdevname(s->s_bdev, b));
-+
-+                      SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk);
-+                      memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block));
-+                      msblk->swap = 1;
-+              } else  {
-+                      SERROR("Can't find a SQUASHFS superblock on %s\n",
-+                                                      bdevname(s->s_bdev, b));
-+                      goto failed_mount;
-+              }
-+      }
-+
-+      /* Check the MAJOR & MINOR versions */
-+      if(!supported_squashfs_filesystem(msblk, silent))
-+              goto failed_mount;
-+
-+      TRACE("Found valid superblock on %s\n", bdevname(s->s_bdev, b));
-+      TRACE("Inodes are %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_INODES
-+                                      (sblk->flags) ? "un" : "");
-+      TRACE("Data is %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_DATA(sblk->flags)
-+                                      ? "un" : "");
-+      TRACE("Check data is %s present in the filesystem\n",
-+                                      SQUASHFS_CHECK_DATA(sblk->flags) ?
-+                                      "" : "not");
-+      TRACE("Filesystem size %lld bytes\n", sblk->bytes_used);
-+      TRACE("Block size %d\n", sblk->block_size);
-+      TRACE("Number of inodes %d\n", sblk->inodes);
-+      if (sblk->s_major > 1)
-+              TRACE("Number of fragments %d\n", sblk->fragments);
-+      TRACE("Number of uids %d\n", sblk->no_uids);
-+      TRACE("Number of gids %d\n", sblk->no_guids);
-+      TRACE("sblk->inode_table_start %llx\n", sblk->inode_table_start);
-+      TRACE("sblk->directory_table_start %llx\n", sblk->directory_table_start);
-+      if (sblk->s_major > 1)
-+              TRACE("sblk->fragment_table_start %llx\n",
-+                                      sblk->fragment_table_start);
-+      TRACE("sblk->uid_start %llx\n", sblk->uid_start);
-+
-+      s->s_flags |= MS_RDONLY;
-+      s->s_op = &squashfs_ops;
-+
-+      /* Init inode_table block pointer array */
-+      if (!(msblk->block_cache = kmalloc(sizeof(struct squashfs_cache) *
-+                                      SQUASHFS_CACHED_BLKS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+              msblk->block_cache[i].block = SQUASHFS_INVALID_BLK;
-+
-+      msblk->next_cache = 0;
-+
-+      /* Allocate read_data block */
-+      msblk->read_size = (sblk->block_size < SQUASHFS_METADATA_SIZE) ?
-+                                      SQUASHFS_METADATA_SIZE :
-+                                      sblk->block_size;
-+
-+      if (!(msblk->read_data = kmalloc(msblk->read_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_data block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate read_page block */
-+      if (!(msblk->read_page = kmalloc(sblk->block_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_page block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate uid and gid tables */
-+      if (!(msblk->uid = kmalloc((sblk->no_uids + sblk->no_guids) *
-+                                      sizeof(unsigned int), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              goto failed_mount;
-+      }
-+      msblk->guid = msblk->uid + sblk->no_uids;
-+   
-+      if (msblk->swap) {
-+              unsigned int suid[sblk->no_uids + sblk->no_guids];
-+
-+              if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+              SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids +
-+                      sblk->no_guids), (sizeof(unsigned int) * 8));
-+      } else
-+              if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+
-+      if (sblk->s_major == 1 && squashfs_1_0_supported(msblk))
-+              goto allocate_root;
-+
-+      if (!(msblk->fragment = kmalloc(sizeof(struct squashfs_fragment_cache) *
-+                              SQUASHFS_CACHED_FRAGMENTS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate fragment block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) {
-+              msblk->fragment[i].locked = 0;
-+              msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+              msblk->fragment[i].data = NULL;
-+      }
-+
-+      msblk->next_fragment = 0;
-+
-+      /* Allocate fragment index table */
-+      if (msblk->read_fragment_index_table(s) == 0)
-+              goto failed_mount;
-+
-+allocate_root:
-+      if ((root = (msblk->iget)(s, sblk->root_inode)) == NULL)
-+              goto failed_mount;
-+
-+      if ((s->s_root = d_alloc_root(root)) == NULL) {
-+              ERROR("Root inode create failed\n");
-+              iput(root);
-+              goto failed_mount;
-+      }
-+
-+      TRACE("Leaving squashfs_read_super\n");
-+      return 0;
-+
-+failed_mount:
-+      kfree(msblk->fragment_index);
-+      kfree(msblk->fragment);
-+      kfree(msblk->uid);
-+      kfree(msblk->read_page);
-+      kfree(msblk->read_data);
-+      kfree(msblk->block_cache);
-+      kfree(msblk->fragment_index_2);
-+      kfree(s->s_fs_info);
-+      s->s_fs_info = NULL;
-+      return -EINVAL;
-+
-+failure:
-+      return -ENOMEM;
-+}
-+
-+
-+static int squashfs_statfs(struct super_block *s, struct kstatfs *buf)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      TRACE("Entered squashfs_statfs\n");
-+
-+      buf->f_type = SQUASHFS_MAGIC;
-+      buf->f_bsize = sblk->block_size;
-+      buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1;
-+      buf->f_bfree = buf->f_bavail = 0;
-+      buf->f_files = sblk->inodes;
-+      buf->f_ffree = 0;
-+      buf->f_namelen = SQUASHFS_NAME_LEN;
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_symlink_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      int index = page->index << PAGE_CACHE_SHIFT, length, bytes;
-+      long long block = SQUASHFS_I(inode)->start_block;
-+      int offset = SQUASHFS_I(inode)->offset;
-+      void *pageaddr = kmap(page);
-+
-+      TRACE("Entered squashfs_symlink_readpage, page index %ld, start block "
-+                              "%llx, offset %x\n", page->index,
-+                              SQUASHFS_I(inode)->start_block,
-+                              SQUASHFS_I(inode)->offset);
-+
-+      for (length = 0; length < index; length += bytes) {
-+              if (!(bytes = squashfs_get_cached_block(inode->i_sb, NULL,
-+                              block, offset, PAGE_CACHE_SIZE, &block,
-+                              &offset))) {
-+                      ERROR("Unable to read symbolic link [%llx:%x]\n", block,
-+                                      offset);
-+                      goto skip_read;
-+              }
-+      }
-+
-+      if (length != index) {
-+              ERROR("(squashfs_symlink_readpage) length != index\n");
-+              bytes = 0;
-+              goto skip_read;
-+      }
-+
-+      bytes = (i_size_read(inode) - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE :
-+                                      i_size_read(inode) - length;
-+
-+      if (!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block,
-+                                      offset, bytes, &block, &offset)))
-+              ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset);
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+struct meta_index *locate_meta_index(struct inode *inode, int index, int offset)
-+{
-+      struct meta_index *meta = NULL;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("locate_meta_index: index %d, offset %d\n", index, offset);
-+
-+      if(msblk->meta_index == NULL)
-+              goto not_allocated;
-+
-+      for (i = 0; i < SQUASHFS_META_NUMBER; i ++)
-+              if (msblk->meta_index[i].inode_number == inode->i_ino &&
-+                              msblk->meta_index[i].offset >= offset &&
-+                              msblk->meta_index[i].offset <= index &&
-+                              msblk->meta_index[i].locked == 0) {
-+                      TRACE("locate_meta_index: entry %d, offset %d\n", i,
-+                                      msblk->meta_index[i].offset);
-+                      meta = &msblk->meta_index[i];
-+                      offset = meta->offset;
-+              }
-+
-+      if (meta)
-+              meta->locked = 1;
-+
-+not_allocated:
-+      up(&msblk->meta_index_mutex);
-+
-+      return meta;
-+}
-+
-+
-+struct meta_index *empty_meta_index(struct inode *inode, int offset, int skip)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct meta_index *meta = NULL;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("empty_meta_index: offset %d, skip %d\n", offset, skip);
-+
-+      if(msblk->meta_index == NULL) {
-+              if (!(msblk->meta_index = kmalloc(sizeof(struct meta_index) *
-+                                      SQUASHFS_META_NUMBER, GFP_KERNEL))) {
-+                      ERROR("Failed to allocate meta_index\n");
-+                      goto failed;
-+              }
-+              for(i = 0; i < SQUASHFS_META_NUMBER; i++) {
-+                      msblk->meta_index[i].inode_number = 0;
-+                      msblk->meta_index[i].locked = 0;
-+              }
-+              msblk->next_meta_index = 0;
-+      }
-+
-+      for(i = SQUASHFS_META_NUMBER; i &&
-+                      msblk->meta_index[msblk->next_meta_index].locked; i --)
-+              msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      if(i == 0) {
-+              TRACE("empty_meta_index: failed!\n");
-+              goto failed;
-+      }
-+
-+      TRACE("empty_meta_index: returned meta entry %d, %p\n",
-+                      msblk->next_meta_index,
-+                      &msblk->meta_index[msblk->next_meta_index]);
-+
-+      meta = &msblk->meta_index[msblk->next_meta_index];
-+      msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      meta->inode_number = inode->i_ino;
-+      meta->offset = offset;
-+      meta->skip = skip;
-+      meta->entries = 0;
-+      meta->locked = 1;
-+
-+failed:
-+      up(&msblk->meta_index_mutex);
-+      return meta;
-+}
-+
-+
-+void release_meta_index(struct inode *inode, struct meta_index *meta)
-+{
-+      meta->locked = 0;
-+}
-+
-+
-+static int read_block_index(struct super_block *s, int blocks, char *block_list,
-+              long long *start_block, int *offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned int *block_listp;
-+      int block = 0;
-+      
-+      if (msblk->swap) {
-+              char sblock_list[blocks << 2];
-+
-+              if (!squashfs_get_cached_block(s, sblock_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+              SQUASHFS_SWAP_INTS(((unsigned int *)block_list),
-+                              ((unsigned int *)sblock_list), blocks);
-+      } else
-+              if (!squashfs_get_cached_block(s, block_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+
-+      for (block_listp = (unsigned int *) block_list; blocks;
-+                              block_listp++, blocks --)
-+              block += SQUASHFS_COMPRESSED_SIZE_BLOCK(*block_listp);
-+
-+      return block;
-+
-+failure:
-+      return -1;
-+}
-+
-+
-+#define SIZE 256
-+
-+static inline int calculate_skip(int blocks) {
-+      int skip = (blocks - 1) / ((SQUASHFS_SLOTS * SQUASHFS_META_ENTRIES + 1) * SQUASHFS_META_INDEXES);
-+      return skip >= 7 ? 7 : skip + 1;
-+}
-+
-+
-+static int get_meta_index(struct inode *inode, int index,
-+              long long *index_block, int *index_offset,
-+              long long *data_block, char *block_list)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int skip = calculate_skip(i_size_read(inode) >> sblk->block_log);
-+      int offset = 0;
-+      struct meta_index *meta;
-+      struct meta_entry *meta_entry;
-+      long long cur_index_block = SQUASHFS_I(inode)->u.s1.block_list_start;
-+      int cur_offset = SQUASHFS_I(inode)->offset;
-+      long long cur_data_block = SQUASHFS_I(inode)->start_block;
-+      int i;
-+ 
-+      index /= SQUASHFS_META_INDEXES * skip;
-+
-+      while ( offset < index ) {
-+              meta = locate_meta_index(inode, index, offset + 1);
-+
-+              if (meta == NULL) {
-+                      if ((meta = empty_meta_index(inode, offset + 1,
-+                                                      skip)) == NULL)
-+                              goto all_done;
-+              } else {
-+                      offset = index < meta->offset + meta->entries ? index :
-+                              meta->offset + meta->entries - 1;
-+                      meta_entry = &meta->meta_entry[offset - meta->offset];
-+                      cur_index_block = meta_entry->index_block + sblk->inode_table_start;
-+                      cur_offset = meta_entry->offset;
-+                      cur_data_block = meta_entry->data_block;
-+                      TRACE("get_meta_index: offset %d, meta->offset %d, "
-+                              "meta->entries %d\n", offset, meta->offset,
-+                              meta->entries);
-+                      TRACE("get_meta_index: index_block 0x%llx, offset 0x%x"
-+                              " data_block 0x%llx\n", cur_index_block,
-+                              cur_offset, cur_data_block);
-+              }
-+
-+              for (i = meta->offset + meta->entries; i <= index &&
-+                              i < meta->offset + SQUASHFS_META_ENTRIES; i++) {
-+                      int blocks = skip * SQUASHFS_META_INDEXES;
-+
-+                      while (blocks) {
-+                              int block = blocks > (SIZE >> 2) ? (SIZE >> 2) :
-+                                      blocks;
-+                              int res = read_block_index(inode->i_sb, block,
-+                                      block_list, &cur_index_block,
-+                                      &cur_offset);
-+
-+                              if (res == -1)
-+                                      goto failed;
-+
-+                              cur_data_block += res;
-+                              blocks -= block;
-+                      }
-+
-+                      meta_entry = &meta->meta_entry[i - meta->offset];
-+                      meta_entry->index_block = cur_index_block - sblk->inode_table_start;
-+                      meta_entry->offset = cur_offset;
-+                      meta_entry->data_block = cur_data_block;
-+                      meta->entries ++;
-+                      offset ++;
-+              }
-+
-+              TRACE("get_meta_index: meta->offset %d, meta->entries %d\n",
-+                              meta->offset, meta->entries);
-+
-+              release_meta_index(inode, meta);
-+      }
-+
-+all_done:
-+      *index_block = cur_index_block;
-+      *index_offset = cur_offset;
-+      *data_block = cur_data_block;
-+
-+      return offset * SQUASHFS_META_INDEXES * skip;
-+
-+failed:
-+      release_meta_index(inode, meta);
-+      return -1;
-+}
-+
-+
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize)
-+{
-+      long long block_ptr;
-+      int offset;
-+      long long block;
-+      int res = get_meta_index(inode, index, &block_ptr, &offset, &block,
-+              block_list);
-+
-+      TRACE("read_blocklist: res %d, index %d, block_ptr 0x%llx, offset"
-+                     " 0x%x, block 0x%llx\n", res, index, block_ptr, offset,
-+                     block);
-+
-+      if(res == -1)
-+              goto failure;
-+
-+      index -= res;
-+
-+      while ( index ) {
-+              int blocks = index > (SIZE >> 2) ? (SIZE >> 2) : index;
-+              int res = read_block_index(inode->i_sb, blocks, block_list,
-+                      &block_ptr, &offset);
-+              if (res == -1)
-+                      goto failure;
-+              block += res;
-+              index -= blocks;
-+      }
-+
-+      if (read_block_index(inode->i_sb, 1, block_list,
-+                      &block_ptr, &offset) == -1)
-+              goto failure;
-+      *bsize = *((unsigned int *) block_list);
-+
-+      return block;
-+
-+failure:
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, i = 0, bytes = 0, byte_offset = 0;
-+      int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT);
-+      void *pageaddr;
-+      struct squashfs_fragment_cache *fragment = NULL;
-+      char *data_ptr = msblk->read_page;
-+      
-+      int mask = (1 << (sblk->block_log - PAGE_CACHE_SHIFT)) - 1;
-+      int start_index = page->index & ~mask;
-+      int end_index = start_index | mask;
-+
-+      TRACE("Entered squashfs_readpage, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT))
-+              goto skip_read;
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              if ((block = (msblk->read_blocklist)(inode, index, 1,
-+                                      block_list, NULL, &bsize)) == 0)
-+                      goto skip_read;
-+
-+              down(&msblk->read_page_mutex);
-+              
-+              if (!(bytes = squashfs_read_data(inode->i_sb, msblk->read_page,
-+                                      block, bsize, NULL))) {
-+                      ERROR("Unable to read page, block %llx, size %x\n", block,
-+                                      bsize);
-+                      up(&msblk->read_page_mutex);
-+                      goto skip_read;
-+              }
-+      } else {
-+              if ((fragment = get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)->u.s1.fragment_size))
-+                                      == NULL) {
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      (int) SQUASHFS_I(inode)->
-+                                      u.s1.fragment_size);
-+                      goto skip_read;
-+              }
-+              bytes = SQUASHFS_I(inode)->u.s1.fragment_offset +
-+                                      (i_size_read(inode) & (sblk->block_size
-+                                      - 1));
-+              byte_offset = SQUASHFS_I(inode)->u.s1.fragment_offset;
-+              data_ptr = fragment->data;
-+      }
-+
-+      for (i = start_index; i <= end_index && byte_offset < bytes;
-+                                      i++, byte_offset += PAGE_CACHE_SIZE) {
-+              struct page *push_page;
-+              int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ?
-+                                      PAGE_CACHE_SIZE : bytes - byte_offset;
-+
-+              TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n",
-+                                      bytes, i, byte_offset, available_bytes);
-+
-+              if (i == page->index)  {
-+                      pageaddr = kmap_atomic(page, KM_USER0);
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(page);
-+                      SetPageUptodate(page);
-+                      unlock_page(page);
-+              } else if ((push_page =
-+                              grab_cache_page_nowait(page->mapping, i))) {
-+                      pageaddr = kmap_atomic(push_page, KM_USER0);
-+
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(push_page);
-+                      SetPageUptodate(push_page);
-+                      unlock_page(push_page);
-+                      page_cache_release(push_page);
-+              }
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log))
-+              up(&msblk->read_page_mutex);
-+      else
-+              release_cached_fragment(msblk, fragment);
-+
-+      return 0;
-+
-+skip_read:
-+      pageaddr = kmap_atomic(page, KM_USER0);
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage4K(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, bytes = 0;
-+      void *pageaddr;
-+      
-+      TRACE("Entered squashfs_readpage4K, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT)) {
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              goto skip_read;
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || page->index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              block = (msblk->read_blocklist)(inode, page->index, 1,
-+                                      block_list, NULL, &bsize);
-+
-+              down(&msblk->read_page_mutex);
-+              bytes = squashfs_read_data(inode->i_sb, msblk->read_page, block,
-+                                      bsize, NULL);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (bytes)
-+                      memcpy(pageaddr, msblk->read_page, bytes);
-+              else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      block, bsize);
-+              up(&msblk->read_page_mutex);
-+      } else {
-+              struct squashfs_fragment_cache *fragment =
-+                      get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (fragment) {
-+                      bytes = i_size_read(inode) & (sblk->block_size - 1);
-+                      memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)->
-+                                      u.s1.fragment_offset, bytes);
-+                      release_cached_fragment(msblk, fragment);
-+              } else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block, (int)
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+      }
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long 
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      f_pos =- 3;
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length + 3;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index *index = (struct squashfs_dir_index *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length + 3;
-+}
-+
-+              
-+static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_readdir [%llx:%x]\n", next_block, next_offset);
-+
-+      while(file->f_pos < 3) {
-+              char *name;
-+              int size, i_ino;
-+
-+              if(file->f_pos == 0) {
-+                      name = ".";
-+                      size = 1;
-+                      i_ino = i->i_ino;
-+              } else {
-+                      name = "..";
-+                      size = 2;
-+                      i_ino = SQUASHFS_I(i)->u.s2.parent_inode;
-+              }
-+              TRACE("Calling filldir(%x, %s, %d, %d, %d, %d)\n",
-+                              (unsigned int) dirent, name, size, (int)
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]);
-+
-+              if (filldir(dirent, name, size,
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]) < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+              }
-+              file->f_pos += size;
-+              dirs_read++;
-+      }
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+                      
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %d\n", name,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+static void squashfs_put_super(struct super_block *s)
-+{
-+      int i;
-+
-+      if (s->s_fs_info) {
-+              struct squashfs_sb_info *sbi = s->s_fs_info;
-+              if (sbi->block_cache)
-+                      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+                              if (sbi->block_cache[i].block !=
-+                                                      SQUASHFS_INVALID_BLK)
-+                                      kfree(sbi->block_cache[i].data);
-+              if (sbi->fragment)
-+                      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) 
-+                              SQUASHFS_FREE(sbi->fragment[i].data);
-+              kfree(sbi->fragment);
-+              kfree(sbi->block_cache);
-+              kfree(sbi->read_data);
-+              kfree(sbi->read_page);
-+              kfree(sbi->uid);
-+              kfree(sbi->fragment_index);
-+              kfree(sbi->fragment_index_2);
-+              kfree(sbi->meta_index);
-+              kfree(s->s_fs_info);
-+              s->s_fs_info = NULL;
-+      }
-+}
-+
-+
-+static struct super_block *squashfs_get_sb(struct file_system_type *fs_type,
-+                              int flags, const char *dev_name, void *data)
-+{
-+      return get_sb_bdev(fs_type, flags, dev_name, data, squashfs_fill_super);
-+}
-+
-+
-+static int __init init_squashfs_fs(void)
-+{
-+      int err = init_inodecache();
-+      if (err)
-+              goto out;
-+
-+      printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
-+              "Phillip Lougher\n");
-+
-+      if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
-+              ERROR("Failed to allocate zlib workspace\n");
-+              destroy_inodecache();
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      if ((err = register_filesystem(&squashfs_fs_type))) {
-+              vfree(stream.workspace);
-+              destroy_inodecache();
-+      }
-+
-+out:
-+      return err;
-+}
-+
-+
-+static void __exit exit_squashfs_fs(void)
-+{
-+      vfree(stream.workspace);
-+      unregister_filesystem(&squashfs_fs_type);
-+      destroy_inodecache();
-+}
-+
-+
-+static kmem_cache_t * squashfs_inode_cachep;
-+
-+
-+static struct inode *squashfs_alloc_inode(struct super_block *sb)
-+{
-+      struct squashfs_inode_info *ei;
-+      ei = kmem_cache_alloc(squashfs_inode_cachep, SLAB_KERNEL);
-+      if (!ei)
-+              return NULL;
-+      return &ei->vfs_inode;
-+}
-+
-+
-+static void squashfs_destroy_inode(struct inode *inode)
-+{
-+      kmem_cache_free(squashfs_inode_cachep, SQUASHFS_I(inode));
-+}
-+
-+
-+static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
-+{
-+      struct squashfs_inode_info *ei = foo;
-+
-+      if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
-+                                                      SLAB_CTOR_CONSTRUCTOR)
-+              inode_init_once(&ei->vfs_inode);
-+}
-+ 
-+
-+static int __init init_inodecache(void)
-+{
-+      squashfs_inode_cachep = kmem_cache_create("squashfs_inode_cache",
-+           sizeof(struct squashfs_inode_info),
-+           0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT,
-+           init_once, NULL);
-+      if (squashfs_inode_cachep == NULL)
-+              return -ENOMEM;
-+      return 0;
-+}
-+
-+
-+static void destroy_inodecache(void)
-+{
-+      if (kmem_cache_destroy(squashfs_inode_cachep))
-+              printk(KERN_INFO "squashfs_inode_cache: not all structures "
-+                      "were freed\n");
-+}
-+
-+
-+module_init(init_squashfs_fs);
-+module_exit(exit_squashfs_fs);
-+MODULE_DESCRIPTION("squashfs, a compressed read-only filesystem");
-+MODULE_AUTHOR("Phillip Lougher <phillip@lougher.org.uk>");
-+MODULE_LICENSE("GPL");
-diff --new-file -urp linux-2.6.15/fs/squashfs/Makefile linux-2.6.15-squashfs3.0/fs/squashfs/Makefile
---- linux-2.6.15/fs/squashfs/Makefile  1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15-squashfs3.0/fs/squashfs/Makefile      2006-03-07 21:12:37.000000000 +0000
-@@ -0,0 +1,7 @@
-+#
-+# Makefile for the linux squashfs routines.
-+#
-+
-+obj-$(CONFIG_SQUASHFS) += squashfs.o
-+squashfs-y += inode.o
-+squashfs-y += squashfs2_0.o
-diff --new-file -urp linux-2.6.15/fs/squashfs/squashfs2_0.c linux-2.6.15-squashfs3.0/fs/squashfs/squashfs2_0.c
---- linux-2.6.15/fs/squashfs/squashfs2_0.c     1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15-squashfs3.0/fs/squashfs/squashfs2_0.c 2006-03-07 21:12:37.000000000 +0000
-@@ -0,0 +1,758 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs2_0.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir);
-+static struct dentry *squashfs_lookup_2(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+
-+static struct file_operations squashfs_dir_ops_2 = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir_2
-+};
-+
-+static struct inode_operations squashfs_dir_inode_ops_2 = {
-+      .lookup = squashfs_lookup_2
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static int read_fragment_index_table_2(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      if (!(msblk->fragment_index_2 = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+   
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES_2(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index_2,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              unsigned int fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES_2(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES_2((&fragment),
-+                                              &msblk->fragment_index_2[i], 1);
-+                      msblk->fragment_index_2[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int get_fragment_location_2(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index_2[SQUASHFS_FRAGMENT_INDEX_2(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET_2(fragment);
-+      struct squashfs_fragment_entry_2 fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry_2 sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY_2(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header_2 *inodeb, unsigned int ino)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = ino;
-+              i->i_mtime.tv_sec = sblk->mkfs_time;
-+              i->i_atime.tv_sec = sblk->mkfs_time;
-+              i->i_ctime.tv_sec = sblk->mkfs_time;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_nlink = 1;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget_2(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned int block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      unsigned int ino = SQUASHFS_MK_VFS_INODE(block
-+              - sblk->inode_table_start, offset);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header_2 id, sid;
-+      struct squashfs_base_inode_header_2 *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER_2(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      struct squashfs_reg_inode_header_2 *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header_2 *sinodep = &sid.reg;
-+                      long long frag_blk;
-+                      unsigned int frag_size;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location_2(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      i->i_blksize = PAGE_CACHE_SIZE;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %x, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header_2 *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header_2 *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header_2 *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header_2 *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER_2(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header_2 *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header_2 *sinodep =
-+                                                              &sid.symlink;
-+      
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header_2 *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header_2 *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER_2(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+      
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%x:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long 
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index_2 index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index_2 *index = (struct squashfs_dir_index_2 *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index_2),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length;
-+}
-+
-+              
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+
-+      TRACE("Entered squashfs_readdir_2 [%llx:%x]\n", next_block, next_offset);
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+                      
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos, SQUASHFS_MK_VFS_INODE(
-+                                      dirh.start_block, dire->offset),
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup_2(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+      int sorted = sblk->s_major == 2 && sblk->s_minor >= 1;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (sorted && name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %lld\n", name,
-+                                      dirh.start_block, dire->offset, ino);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget_2;
-+      msblk->read_fragment_index_table = read_fragment_index_table_2;
-+
-+      sblk->bytes_used = sblk->bytes_used_2;
-+      sblk->uid_start = sblk->uid_start_2;
-+      sblk->guid_start = sblk->guid_start_2;
-+      sblk->inode_table_start = sblk->inode_table_start_2;
-+      sblk->directory_table_start = sblk->directory_table_start_2;
-+      sblk->fragment_table_start = sblk->fragment_table_start_2;
-+
-+      return 1;
-+}
-diff --new-file -urp linux-2.6.15/fs/squashfs/squashfs.h linux-2.6.15-squashfs3.0/fs/squashfs/squashfs.h
---- linux-2.6.15/fs/squashfs/squashfs.h        1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15-squashfs3.0/fs/squashfs/squashfs.h    2006-03-07 21:12:37.000000000 +0000
-@@ -0,0 +1,86 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs.h
-+ */
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#undef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#endif
-+
-+#ifdef SQUASHFS_TRACE
-+#define TRACE(s, args...)     printk(KERN_NOTICE "SQUASHFS: "s, ## args)
-+#else
-+#define TRACE(s, args...)     {}
-+#endif
-+
-+#define ERROR(s, args...)     printk(KERN_ERR "SQUASHFS error: "s, ## args)
-+
-+#define SERROR(s, args...)    do { \
-+                              if (!silent) \
-+                              printk(KERN_ERR "SQUASHFS error: "s, ## args);\
-+                              } while(0)
-+
-+#define WARNING(s, args...)   printk(KERN_WARNING "SQUASHFS: "s, ## args)
-+
-+static inline struct squashfs_inode_info *SQUASHFS_I(struct inode *inode)
-+{
-+      return list_entry(inode, struct squashfs_inode_info, vfs_inode);
-+}
-+
-+#if defined(CONFIG_SQUASHFS_1_0_COMPATIBILITY ) || defined(CONFIG_SQUASHFS_2_0_COMPATIBILITY)
-+#define SQSH_EXTERN
-+extern unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                              long long index, unsigned int length,
-+                              long long *next_index);
-+extern int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset);
-+extern void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment);
-+extern struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length);
-+extern struct address_space_operations squashfs_symlink_aops;
-+extern struct address_space_operations squashfs_aops;
-+extern struct address_space_operations squashfs_aops_4K;
-+extern struct inode_operations squashfs_dir_inode_ops;
-+#else
-+#define SQSH_EXTERN static
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+extern int squashfs_1_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_1_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+extern int squashfs_2_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
-diff --new-file -urp linux-2.6.15/include/linux/squashfs_fs.h linux-2.6.15-squashfs3.0/include/linux/squashfs_fs.h
---- linux-2.6.15/include/linux/squashfs_fs.h   1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15-squashfs3.0/include/linux/squashfs_fs.h       2006-03-07 21:12:37.000000000 +0000
-@@ -0,0 +1,911 @@
-+#ifndef SQUASHFS_FS
-+#define SQUASHFS_FS
-+
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs.h
-+ */
-+
-+#ifndef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#define CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#endif
-+
-+#ifdef        CONFIG_SQUASHFS_VMALLOC
-+#define SQUASHFS_ALLOC(a)             vmalloc(a)
-+#define SQUASHFS_FREE(a)              vfree(a)
-+#else
-+#define SQUASHFS_ALLOC(a)             kmalloc(a, GFP_KERNEL)
-+#define SQUASHFS_FREE(a)              kfree(a)
-+#endif
-+#define SQUASHFS_CACHED_FRAGMENTS     CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE     
-+#define SQUASHFS_MAJOR                        3
-+#define SQUASHFS_MINOR                        0
-+#define SQUASHFS_MAGIC                        0x73717368
-+#define SQUASHFS_MAGIC_SWAP           0x68737173
-+#define SQUASHFS_START                        0
-+
-+/* size of metadata (inode and directory) blocks */
-+#define SQUASHFS_METADATA_SIZE                8192
-+#define SQUASHFS_METADATA_LOG         13
-+
-+/* default size of data blocks */
-+#define SQUASHFS_FILE_SIZE            65536
-+#define SQUASHFS_FILE_LOG             16
-+
-+#define SQUASHFS_FILE_MAX_SIZE                65536
-+
-+/* Max number of uids and gids */
-+#define SQUASHFS_UIDS                 256
-+#define SQUASHFS_GUIDS                        255
-+
-+/* Max length of filename (not 255) */
-+#define SQUASHFS_NAME_LEN             256
-+
-+#define SQUASHFS_INVALID              ((long long) 0xffffffffffff)
-+#define SQUASHFS_INVALID_FRAG         ((unsigned int) 0xffffffff)
-+#define SQUASHFS_INVALID_BLK          ((long long) -1)
-+#define SQUASHFS_USED_BLK             ((long long) -2)
-+
-+/* Filesystem flags */
-+#define SQUASHFS_NOI                  0
-+#define SQUASHFS_NOD                  1
-+#define SQUASHFS_CHECK                        2
-+#define SQUASHFS_NOF                  3
-+#define SQUASHFS_NO_FRAG              4
-+#define SQUASHFS_ALWAYS_FRAG          5
-+#define SQUASHFS_DUPLICATE            6
-+
-+#define SQUASHFS_BIT(flag, bit)               ((flag >> bit) & 1)
-+
-+#define SQUASHFS_UNCOMPRESSED_INODES(flags)   SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOI)
-+
-+#define SQUASHFS_UNCOMPRESSED_DATA(flags)     SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOD)
-+
-+#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags)        SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOF)
-+
-+#define SQUASHFS_NO_FRAGMENTS(flags)          SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NO_FRAG)
-+
-+#define SQUASHFS_ALWAYS_FRAGMENTS(flags)      SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_ALWAYS_FRAG)
-+
-+#define SQUASHFS_DUPLICATES(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_DUPLICATE)
-+
-+#define SQUASHFS_CHECK_DATA(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_CHECK)
-+
-+#define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, \
-+              duplicate_checking)     (noi | (nod << 1) | (check_data << 2) \
-+              | (nof << 3) | (no_frag << 4) | (always_frag << 5) | \
-+              (duplicate_checking << 6))
-+
-+/* Max number of types and file types */
-+#define SQUASHFS_DIR_TYPE             1
-+#define SQUASHFS_FILE_TYPE            2
-+#define SQUASHFS_SYMLINK_TYPE         3
-+#define SQUASHFS_BLKDEV_TYPE          4
-+#define SQUASHFS_CHRDEV_TYPE          5
-+#define SQUASHFS_FIFO_TYPE            6
-+#define SQUASHFS_SOCKET_TYPE          7
-+#define SQUASHFS_LDIR_TYPE            8
-+#define SQUASHFS_LREG_TYPE            9
-+
-+/* 1.0 filesystem type definitions */
-+#define SQUASHFS_TYPES                        5
-+#define SQUASHFS_IPC_TYPE             0
-+
-+/* Flag whether block is compressed or uncompressed, bit is set if block is
-+ * uncompressed */
-+#define SQUASHFS_COMPRESSED_BIT               (1 << 15)
-+
-+#define SQUASHFS_COMPRESSED_SIZE(B)   (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \
-+              (B) & ~SQUASHFS_COMPRESSED_BIT :  SQUASHFS_COMPRESSED_BIT)
-+
-+#define SQUASHFS_COMPRESSED(B)                (!((B) & SQUASHFS_COMPRESSED_BIT))
-+
-+#define SQUASHFS_COMPRESSED_BIT_BLOCK         (1 << 24)
-+
-+#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B)     (((B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? (B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK)
-+
-+#define SQUASHFS_COMPRESSED_BLOCK(B)  (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))
-+
-+/*
-+ * Inode number ops.  Inodes consist of a compressed block number, and an
-+ * uncompressed  offset within that block
-+ */
-+#define SQUASHFS_INODE_BLK(a)         ((unsigned int) ((a) >> 16))
-+
-+#define SQUASHFS_INODE_OFFSET(a)      ((unsigned int) ((a) & 0xffff))
-+
-+#define SQUASHFS_MKINODE(A, B)                ((squashfs_inode_t)(((squashfs_inode_t) (A)\
-+                                      << 16) + (B)))
-+
-+/* Compute 32 bit VFS inode number from squashfs inode number */
-+#define SQUASHFS_MK_VFS_INODE(a, b)   ((unsigned int) (((a) << 8) + \
-+                                      ((b) >> 2) + 1))
-+/* XXX */
-+
-+/* Translate between VFS mode and squashfs mode */
-+#define SQUASHFS_MODE(a)              ((a) & 0xfff)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES(A)    (A * sizeof(struct squashfs_fragment_entry))
-+
-+#define SQUASHFS_FRAGMENT_INDEX(A)    (SQUASHFS_FRAGMENT_BYTES(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A)     (SQUASHFS_FRAGMENT_BYTES(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES(A)  ((SQUASHFS_FRAGMENT_BYTES(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES(A)      (SQUASHFS_FRAGMENT_INDEXES(A) *\
-+                                              sizeof(long long))
-+
-+/* cached data constants for filesystem */
-+#define SQUASHFS_CACHED_BLKS          8
-+
-+#define SQUASHFS_MAX_FILE_SIZE_LOG    64
-+
-+#define SQUASHFS_MAX_FILE_SIZE                ((long long) 1 << \
-+                                      (SQUASHFS_MAX_FILE_SIZE_LOG - 2))
-+
-+#define SQUASHFS_MARKER_BYTE          0xff
-+
-+/* meta index cache */
-+#define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int))
-+#define SQUASHFS_META_ENTRIES 31
-+#define SQUASHFS_META_NUMBER  8
-+#define SQUASHFS_SLOTS                4
-+
-+struct meta_entry {
-+      long long               data_block;
-+      unsigned int            index_block;
-+      unsigned short          offset;
-+      unsigned short          pad;
-+};
-+
-+struct meta_index {
-+      unsigned int            inode_number;
-+      unsigned int            offset;
-+      unsigned short          entries;
-+      unsigned short          skip;
-+      unsigned short          locked;
-+      unsigned short          pad;
-+      struct meta_entry       meta_entry[SQUASHFS_META_ENTRIES];
-+};
-+
-+
-+/*
-+ * definitions for structures on disk
-+ */
-+
-+typedef long long             squashfs_block_t;
-+typedef long long             squashfs_inode_t;
-+
-+struct squashfs_super_block {
-+      unsigned int            s_magic;
-+      unsigned int            inodes;
-+      unsigned int            bytes_used_2;
-+      unsigned int            uid_start_2;
-+      unsigned int            guid_start_2;
-+      unsigned int            inode_table_start_2;
-+      unsigned int            directory_table_start_2;
-+      unsigned int            s_major:16;
-+      unsigned int            s_minor:16;
-+      unsigned int            block_size_1:16;
-+      unsigned int            block_log:16;
-+      unsigned int            flags:8;
-+      unsigned int            no_uids:8;
-+      unsigned int            no_guids:8;
-+      unsigned int            mkfs_time /* time of filesystem creation */;
-+      squashfs_inode_t        root_inode;
-+      unsigned int            block_size;
-+      unsigned int            fragments;
-+      unsigned int            fragment_table_start_2;
-+      long long               bytes_used;
-+      long long               uid_start;
-+      long long               guid_start;
-+      long long               inode_table_start;
-+      long long               directory_table_start;
-+      long long               fragment_table_start;
-+      long long               unused;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_index {
-+      unsigned int            index;
-+      unsigned int            start_block;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_BASE_INODE_HEADER            \
-+      unsigned int            inode_type:4;   \
-+      unsigned int            mode:12;        \
-+      unsigned int            uid:8;          \
-+      unsigned int            guid:8;         \
-+      unsigned int            mtime;          \
-+      unsigned int            inode_number;
-+
-+struct squashfs_base_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_lreg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      long long               file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            parent_inode;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            i_count:16;
-+      unsigned int            parent_inode;
-+      struct squashfs_dir_index       index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header {
-+      struct squashfs_base_inode_header       base;
-+      struct squashfs_dev_inode_header        dev;
-+      struct squashfs_symlink_inode_header    symlink;
-+      struct squashfs_reg_inode_header        reg;
-+      struct squashfs_lreg_inode_header       lreg;
-+      struct squashfs_dir_inode_header        dir;
-+      struct squashfs_ldir_inode_header       ldir;
-+      struct squashfs_ipc_inode_header        ipc;
-+};
-+      
-+struct squashfs_dir_entry {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      int                     inode_number:16;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_header {
-+      unsigned int            count:8;
-+      unsigned int            start_block;
-+      unsigned int            inode_number;
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry {
-+      long long               start_block;
-+      unsigned int            size;
-+      unsigned int            unused;
-+} __attribute__ ((packed));
-+
-+extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen);
-+extern int squashfs_uncompress_init(void);
-+extern int squashfs_uncompress_exit(void);
-+
-+/*
-+ * macros to convert each packed bitfield structure from little endian to big
-+ * endian and vice versa.  These are needed when creating or using a filesystem
-+ * on a machine with different byte ordering to the target architecture.
-+ *
-+ */
-+
-+#define SQUASHFS_SWAP_START \
-+      int bits;\
-+      int b_pos;\
-+      unsigned long long val;\
-+      unsigned char *s;\
-+      unsigned char *d;
-+
-+#define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_super_block));\
-+      SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->inodes, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used_2, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->uid_start_2, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->guid_start_2, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->inode_table_start_2, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->directory_table_start_2, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->s_major, d, 224, 16);\
-+      SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\
-+      SQUASHFS_SWAP((s)->block_size_1, d, 256, 16);\
-+      SQUASHFS_SWAP((s)->block_log, d, 272, 16);\
-+      SQUASHFS_SWAP((s)->flags, d, 288, 8);\
-+      SQUASHFS_SWAP((s)->no_uids, d, 296, 8);\
-+      SQUASHFS_SWAP((s)->no_guids, d, 304, 8);\
-+      SQUASHFS_SWAP((s)->mkfs_time, d, 312, 32);\
-+      SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\
-+      SQUASHFS_SWAP((s)->block_size, d, 408, 32);\
-+      SQUASHFS_SWAP((s)->fragments, d, 440, 32);\
-+      SQUASHFS_SWAP((s)->fragment_table_start_2, d, 472, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used, d, 504, 64);\
-+      SQUASHFS_SWAP((s)->uid_start, d, 568, 64);\
-+      SQUASHFS_SWAP((s)->guid_start, d, 632, 64);\
-+      SQUASHFS_SWAP((s)->inode_table_start, d, 696, 64);\
-+      SQUASHFS_SWAP((s)->directory_table_start, d, 760, 64);\
-+      SQUASHFS_SWAP((s)->fragment_table_start, d, 824, 64);\
-+      SQUASHFS_SWAP((s)->unused, d, 888, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 64, 32);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header))\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header)); \
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->rdev, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header));\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 224, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_lreg_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 128, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 224, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 256, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 147, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 192, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 155, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 168, 32);\
-+      SQUASHFS_SWAP((s)->i_count, d, 200, 16);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 216, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 64);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_SHORTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 2);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      16)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_INTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 4);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      32)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LONG_LONGS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      64)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DATA(s, d, n, bits) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * bits / 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      bits)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, bits);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+
-+struct squashfs_base_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            type:4;
-+      unsigned int            offset:4;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n) \
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 4);\
-+      SQUASHFS_SWAP((s)->guid, d, 20, 4);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header_1));\
-+      SQUASHFS_SWAP((s)->type, d, 24, 4);\
-+      SQUASHFS_SWAP((s)->offset, d, 28, 4);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_1));\
-+      SQUASHFS_SWAP((s)->rdev, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_1));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_1));\
-+      SQUASHFS_SWAP((s)->mtime, d, 24, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 88, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_1));\
-+      SQUASHFS_SWAP((s)->file_size, d, 24, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 43, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 88, 24);\
-+}
-+
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+
-+struct squashfs_dir_index_2 {
-+      unsigned int            index:27;
-+      unsigned int            start_block:29;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_base_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+      unsigned int            i_count:16;
-+      struct squashfs_dir_index_2     index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header_2 {
-+      struct squashfs_base_inode_header_2     base;
-+      struct squashfs_dev_inode_header_2      dev;
-+      struct squashfs_symlink_inode_header_2  symlink;
-+      struct squashfs_reg_inode_header_2      reg;
-+      struct squashfs_dir_inode_header_2      dir;
-+      struct squashfs_ldir_inode_header_2     ldir;
-+      struct squashfs_ipc_inode_header_2      ipc;
-+};
-+      
-+struct squashfs_dir_header_2 {
-+      unsigned int            count:8;
-+      unsigned int            start_block:24;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_entry_2 {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry_2 {
-+      unsigned int            start_block;
-+      unsigned int            size;
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_2(s, d) \
-+      SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, sizeof(struct squashfs_ipc_inode_header_2))
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_2)); \
-+      SQUASHFS_SWAP((s)->rdev, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_2));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_2));\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->fragment, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 160, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 51, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 59, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 72, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 104, 24);\
-+      SQUASHFS_SWAP((s)->i_count, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index_2));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 27);\
-+      SQUASHFS_SWAP((s)->start_block, d, 27, 29);\
-+      SQUASHFS_SWAP((s)->size, d, 56, 8);\
-+}
-+#define SQUASHFS_SWAP_DIR_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header_2));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry_2));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry_2));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 32, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES_2(s, d, n) SQUASHFS_SWAP_INTS(s, d, n)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES_2(A)  (A * sizeof(struct squashfs_fragment_entry_2))
-+
-+#define SQUASHFS_FRAGMENT_INDEX_2(A)  (SQUASHFS_FRAGMENT_BYTES_2(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET_2(A)   (SQUASHFS_FRAGMENT_BYTES_2(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES_2(A)        ((SQUASHFS_FRAGMENT_BYTES_2(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES_2(A)    (SQUASHFS_FRAGMENT_INDEXES_2(A) *\
-+                                              sizeof(int))
-+
-+#endif
-+
-+#ifdef __KERNEL__
-+
-+/*
-+ * macros used to swap each structure entry, taking into account
-+ * bitfields and different bitfield placing conventions on differing
-+ * architectures
-+ */
-+
-+#include <asm/byteorder.h>
-+
-+#ifdef __BIG_ENDIAN
-+      /* convert from little endian to big endian */
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, b_pos)
-+#else
-+      /* convert from big endian to little endian */ 
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, 64 - tbits - b_pos)
-+#endif
-+
-+#define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\
-+      b_pos = pos % 8;\
-+      val = 0;\
-+      s = (unsigned char *)p + (pos / 8);\
-+      d = ((unsigned char *) &val) + 7;\
-+      for(bits = 0; bits < (tbits + b_pos); bits += 8) \
-+              *d-- = *s++;\
-+      value = (val >> (SHIFT))/* & ((1 << tbits) - 1)*/;\
-+}
-+
-+#define SQUASHFS_MEMSET(s, d, n)      memset(s, 0, n);
-+
-+#endif
-+#endif
-diff --new-file -urp linux-2.6.15/include/linux/squashfs_fs_i.h linux-2.6.15-squashfs3.0/include/linux/squashfs_fs_i.h
---- linux-2.6.15/include/linux/squashfs_fs_i.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15-squashfs3.0/include/linux/squashfs_fs_i.h     2006-03-07 21:12:37.000000000 +0000
-@@ -0,0 +1,45 @@
-+#ifndef SQUASHFS_FS_I
-+#define SQUASHFS_FS_I
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_i.h
-+ */
-+
-+struct squashfs_inode_info {
-+      long long       start_block;
-+      unsigned int    offset;
-+      union {
-+              struct {
-+                      long long       fragment_start_block;
-+                      unsigned int    fragment_size;
-+                      unsigned int    fragment_offset;
-+                      long long       block_list_start;
-+              } s1;
-+              struct {
-+                      long long       directory_index_start;
-+                      unsigned int    directory_index_offset;
-+                      unsigned int    directory_index_count;
-+                      unsigned int    parent_inode;
-+              } s2;
-+      } u;
-+      struct inode    vfs_inode;
-+};
-+#endif
-diff --new-file -urp linux-2.6.15/include/linux/squashfs_fs_sb.h linux-2.6.15-squashfs3.0/include/linux/squashfs_fs_sb.h
---- linux-2.6.15/include/linux/squashfs_fs_sb.h        1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.15-squashfs3.0/include/linux/squashfs_fs_sb.h    2006-03-07 21:12:37.000000000 +0000
-@@ -0,0 +1,74 @@
-+#ifndef SQUASHFS_FS_SB
-+#define SQUASHFS_FS_SB
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_sb.h
-+ */
-+
-+#include <linux/squashfs_fs.h>
-+
-+struct squashfs_cache {
-+      long long       block;
-+      int             length;
-+      long long       next_index;
-+      char            *data;
-+};
-+
-+struct squashfs_fragment_cache {
-+      long long       block;
-+      int             length;
-+      unsigned int    locked;
-+      char            *data;
-+};
-+
-+struct squashfs_sb_info {
-+      struct squashfs_super_block     sblk;
-+      int                     devblksize;
-+      int                     devblksize_log2;
-+      int                     swap;
-+      struct squashfs_cache   *block_cache;
-+      struct squashfs_fragment_cache  *fragment;
-+      int                     next_cache;
-+      int                     next_fragment;
-+      int                     next_meta_index;
-+      unsigned int            *uid;
-+      unsigned int            *guid;
-+      long long               *fragment_index;
-+      unsigned int            *fragment_index_2;
-+      unsigned int            read_size;
-+      char                    *read_data;
-+      char                    *read_page;
-+      struct semaphore        read_data_mutex;
-+      struct semaphore        read_page_mutex;
-+      struct semaphore        block_cache_mutex;
-+      struct semaphore        fragment_mutex;
-+      struct semaphore        meta_index_mutex;
-+      wait_queue_head_t       waitq;
-+      wait_queue_head_t       fragment_wait_queue;
-+      struct meta_index       *meta_index;
-+      struct inode            *(*iget)(struct super_block *s,  squashfs_inode_t \
-+                              inode);
-+      long long               (*read_blocklist)(struct inode *inode, int \
-+                              index, int readahead_blks, char *block_list, \
-+                              unsigned short **block_p, unsigned int *bsize);
-+      int                     (*read_fragment_index_table)(struct super_block *s);
-+};
-+#endif
-diff --new-file -urp linux-2.6.15/init/do_mounts_rd.c linux-2.6.15-squashfs3.0/init/do_mounts_rd.c
---- linux-2.6.15/init/do_mounts_rd.c   2006-03-01 22:37:27.000000000 +0000
-+++ linux-2.6.15-squashfs3.0/init/do_mounts_rd.c       2006-03-07 21:12:37.000000000 +0000
-@@ -5,6 +5,7 @@
- #include <linux/ext2_fs.h>
- #include <linux/romfs_fs.h>
- #include <linux/cramfs_fs.h>
-+#include <linux/squashfs_fs.h>
- #include <linux/initrd.h>
- #include <linux/string.h>
-@@ -39,6 +40,7 @@ static int __init crd_load(int in_fd, in
-  * numbers could not be found.
-  *
-  * We currently check for the following magic numbers:
-+ *      squashfs
-  *    minix
-  *    ext2
-  *    romfs
-@@ -53,6 +55,7 @@ identify_ramdisk_image(int fd, int start
-       struct ext2_super_block *ext2sb;
-       struct romfs_super_block *romfsb;
-       struct cramfs_super *cramfsb;
-+      struct squashfs_super_block *squashfsb;
-       int nblocks = -1;
-       unsigned char *buf;
-@@ -64,6 +67,7 @@ identify_ramdisk_image(int fd, int start
-       ext2sb = (struct ext2_super_block *) buf;
-       romfsb = (struct romfs_super_block *) buf;
-       cramfsb = (struct cramfs_super *) buf;
-+      squashfsb = (struct squashfs_super_block *) buf;
-       memset(buf, 0xe5, size);
-       /*
-@@ -101,6 +105,15 @@ identify_ramdisk_image(int fd, int start
-               goto done;
-       }
-+      /* squashfs is at block zero too */
-+      if (squashfsb->s_magic == SQUASHFS_MAGIC) {
-+              printk(KERN_NOTICE
-+                     "RAMDISK: squashfs filesystem found at block %d\n",
-+                     start_block);
-+              nblocks = (squashfsb->bytes_used+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
-+              goto done;
-+      }
-+
-       /*
-        * Read block 1 to test for minix and ext2 superblock
-        */
diff --git a/meta/packages/linux/linux-rp-2.6.17/tosa-lcdnoise-r0.patch b/meta/packages/linux/linux-rp-2.6.17/tosa-lcdnoise-r0.patch
deleted file mode 100644 (file)
index cb014fb..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-Index: linux-tosa/arch/arm/mach-pxa/tosa.c
-===================================================================
---- linux-tosa.orig/arch/arm/mach-pxa/tosa.c   2006-08-29 16:52:59.000000000 +0100
-+++ linux-tosa/arch/arm/mach-pxa/tosa.c        2006-08-29 16:55:25.959706776 +0100
-@@ -2,6 +2,7 @@
-  *  Support for Sharp SL-C6000x PDAs
-  *  Model: (Tosa)
-  *
-+ *  Copyright (c) 2006 Wolfson Microelectronics PLC.
-  *  Copyright (c) 2005 Dirk Opfer
-  *
-  *    Based on code written by Sharp/Lineo for 2.4 kernels
-@@ -46,6 +47,8 @@
- #include <asm/hardware/tmio.h>
- #include <asm/mach/sharpsl_param.h>
-+#include <linux/wm97xx.h>
-+
- #include "generic.h"
- /*
-@@ -428,6 +431,16 @@
-     },
- };
-+
-+/*
-+ * Tosa Touchscreen device
-+ */
-+
-+static struct wm97xx_machinfo tosa_ts_machinfo = {
-+    .get_hsync_time   = tosa_get_hsync_time,
-+    .wait_hsync       = tosa_wait_hsync,
-+};
-+
- /*
-  * Tosa Blueooth
-  */
-@@ -457,6 +470,7 @@
-       GPSR(TOSA_GPIO_ON_RESET) = GPIO_bit(TOSA_GPIO_ON_RESET);
-       mdelay(1000);
-+    wm97xx_unset_machinfo();
- }
- static void tosa_restart(void)
-@@ -501,6 +515,8 @@
-       platform_scoop_config = &tosa_pcmcia_config;
-       platform_add_devices(devices, ARRAY_SIZE(devices));
-+
-+    wm97xx_set_machinfo(&tosa_ts_machinfo);
- }
- static void __init fixup_tosa(struct machine_desc *desc,
-Index: linux-tosa/arch/arm/mach-pxa/tosa_lcd.c
-===================================================================
---- linux-tosa.orig/arch/arm/mach-pxa/tosa_lcd.c       2006-08-29 16:52:59.000000000 +0100
-+++ linux-tosa/arch/arm/mach-pxa/tosa_lcd.c    2006-08-29 16:55:32.818664056 +0100
-@@ -1,6 +1,7 @@
- /*
-  *  LCD / Backlight control code for Sharp SL-6000x (tosa)
-  *
-+ *  Copyright (c) 2006      Wolfson Microelectronics PLC.
-  *  Copyright (c) 2005                Dirk Opfer
-  *
-  *  This program is free software; you can redistribute it and/or modify
-@@ -59,6 +60,8 @@
- static struct ssp_dev tosa_nssp_dev;
- static struct ssp_state tosa_nssp_state;
- static spinlock_t tosa_nssp_lock;
-+static int blanked;
-+static unsigned long hsync_time;
- static unsigned short normal_i2c[] = {
-       DAC_BASE,
-@@ -130,6 +133,17 @@
-       pxa_nssp_output(TG_GPOSR,0x02);         /* GPOS0=powercontrol, GPOS1=GPIO, GPOS2=TCTL */
- }
-+static unsigned long calc_hsync_time(const struct fb_videomode *mode) {
-+    /* The 25 and 44 'magic numbers' are from Sharp's 2.4 patches */
-+    if (mode->yres == 640) {
-+        return 25;
-+    }
-+    if (mode->yres == 320) {
-+        return 44;
-+    }
-+    return 0;
-+}
-+
- static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode)
- {
-       const int value = TG_REG0_COLOR | TG_REG0_UD | TG_REG0_LR;
-@@ -154,6 +168,8 @@
-               /* set common voltage */
-               i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH1, comadj);
-+    blanked = 0;
-+    hsync_time = calc_hsync_time(mode);
- }
- static void tosa_lcd_tg_off(struct device *dev)
-@@ -172,6 +188,8 @@
-       
-       /* L3V Off */
-       reset_scoop_gpio( &tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); 
-+
-+    blanked = 1;
- }
- static int tosa_detect_client(struct i2c_adapter* adapter, int address, int kind) {
-@@ -238,6 +256,23 @@
-       return 0;
- }
-+unsigned long tosa_get_hsync_time(void)
-+{
-+/* This method should eventually contain the correct algorithm for calculating
-+   the hsync_time */
-+    if (blanked)
-+        return 0;
-+    else
-+        return hsync_time;
-+}
-+
-+void tosa_wait_hsync(void)
-+{
-+    /* Waits for a rising edge on the VGA line */
-+    while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) == 0);
-+    while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) != 0);
-+}
-+
- static struct i2c_driver tosa_driver={
-       .id             = TOSA_LCD_I2C_DEVICEID,
-       .attach_adapter = tosa_attach_adapter,
-Index: linux-tosa/include/asm-arm/arch-pxa/tosa.h
-===================================================================
---- linux-tosa.orig/include/asm-arm/arch-pxa/tosa.h    2006-08-29 16:52:59.000000000 +0100
-+++ linux-tosa/include/asm-arm/arch-pxa/tosa.h 2006-08-29 16:55:12.442761664 +0100
-@@ -1,6 +1,7 @@
- /*
-  * Hardware specific definitions for Sharp SL-C6000x series of PDAs
-  *
-+ * Copyright (c) 2006 Wolfson Microelectronics PLC.
-  * Copyright (c) 2005 Dirk Opfer
-  *
-  * Based on Sharp's 2.4 kernel patches
-@@ -187,4 +188,8 @@
- extern struct platform_device tosascoop_jc_device;
- extern struct platform_device tosascoop_device;
- extern struct platform_device tc6393_device;
-+
-+unsigned long tosa_get_hsync_time(void);
-+void tosa_wait_hsync(void);
-+
- #endif /* _ASM_ARCH_TOSA_H_ */
diff --git a/meta/packages/linux/linux-rp-2.6.17/vesafb-tng-1.0-rc2-git-20060629.patch b/meta/packages/linux/linux-rp-2.6.17/vesafb-tng-1.0-rc2-git-20060629.patch
deleted file mode 100644 (file)
index 188ce60..0000000
+++ /dev/null
@@ -1,3089 +0,0 @@
-# Patch generated against a6047eef1c465c38aacfbdab193161b3f0cd144
----
-# Documentation/fb/vesafb.txt   |  250 ++++--
-# arch/i386/boot/video.S        |   12 
-# drivers/video/Kconfig         |   56 +
-# drivers/video/Makefile        |    6 
-# drivers/video/fbmem.c         |    1 
-# drivers/video/modedb.c        |    1 
-# drivers/video/vesafb-thread.c |  727 +++++++++++++++++++
-# drivers/video/vesafb-tng.c    | 1598 ++++++++++++++++++++++++++++++++++++++++++
-# include/linux/sched.h         |    2 
-# include/video/vesa.h          |  150 +++
-# kernel/fork.c                 |   35 
-# mm/memory.c                   |    1 
-# mm/mmap.c                     |    1 
-# 13 files changed, 2748 insertions(+), 92 deletions(-)
-#
---- linux-2.6.17.orig/Documentation/fb/vesafb.txt
-+++ linux-2.6.17/Documentation/fb/vesafb.txt
-@@ -2,16 +2,18 @@
- What is vesafb?
- ===============
--This is a generic driver for a graphic framebuffer on intel boxes.
-+Vesafb is a generic framebuffer driver for x86 and x86_64 boxes.
--The idea is simple:  Turn on graphics mode at boot time with the help
--of the BIOS, and use this as framebuffer device /dev/fb0, like the m68k
--(and other) ports do.
-+VESA BIOS Extensions Version 2.0 are required, because we need access to
-+a linear frame buffer. VBE 3.0 is required if you want to use modes with a
-+higher (than the standard 60 Hz) refresh rate.
--This means we decide at boot time whenever we want to run in text or
--graphics mode.  Switching mode later on (in protected mode) is
--impossible; BIOS calls work in real mode only.  VESA BIOS Extensions
--Version 2.0 are required, because we need a linear frame buffer.
-+The VESA framebuffer driver comes in two flavors - the standard 'vesafb'
-+and 'vesafb-tng'. Vesafb-tng is available only on 32-bit x86 due to the
-+technology it uses (vm86). Vesafb-tng has more features than vesafb
-+(adjusting the refresh rate on VBE 3.0 compliant boards, switching the
-+video mode without rebooting, selecting a mode by providing its
-+modedb name, and more).
- Advantages:
-@@ -29,26 +31,35 @@ Disadvantages:
- How to use it?
- ==============
--Switching modes is done using the vga=... boot parameter.  Read
--Documentation/svga.txt for details.
-+If you are running a 32-bit x86 system and you decide to use vesafb-tng,
-+you can either compile the driver into the kernel or use it as a module.
-+The graphics mode you want to use is in both cases specified using the
-+standard modedb format.
--You should compile in both vgacon (for text mode) and vesafb (for
--graphics mode). Which of them takes over the console depends on
--whenever the specified mode is text or graphics.
-+If your system doesn't support vm86 calls, things get a little more tricky.
-+Since on such systems you can't do BIOS calls from protected mode in which
-+kernel runs, you have to decide at boot time whenever you want to run in text
-+or in graphics mode. Switching mode later on is impossible. Switching modes
-+is done using the vga=... boot parameter.  Read Documentation/svga.txt for
-+details. Below is a more detailed description of what to do on systems using
-+the standard vesafb driver.
--The graphic modes are NOT in the list which you get if you boot with
--vga=ask and hit return. The mode you wish to use is derived from the
--VESA mode number. Here are those VESA mode numbers:
-+You should compile in both vgacon (for text mode) and vesafb (for graphics
-+mode). Which of them takes over the console depends on whenever the
-+specified mode is text or graphics.
-+
-+The graphic modes are NOT in the list which you get if you boot with vga=ask
-+and hit return. The mode you wish to use is derived from the VESA mode number.
-+Here are those VESA mode numbers:
-     | 640x480  800x600  1024x768 1280x1024
- ----+-------------------------------------
--256 |  0x101    0x103    0x105    0x107   
--32k |  0x110    0x113    0x116    0x119   
--64k |  0x111    0x114    0x117    0x11A   
--16M |  0x112    0x115    0x118    0x11B   
-+256 |  0x101    0x103    0x105    0x107
-+32k |  0x110    0x113    0x116    0x119
-+64k |  0x111    0x114    0x117    0x11A
-+16M |  0x112    0x115    0x118    0x11B
--The video mode number of the Linux kernel is the VESA mode number plus
--0x200.
-+The video mode number of the Linux kernel is the VESA mode number plus 0x200.
-  
-  Linux_kernel_mode_number = VESA_mode_number + 0x200
-@@ -56,15 +67,15 @@ So the table for the Kernel mode numbers
-     | 640x480  800x600  1024x768 1280x1024
- ----+-------------------------------------
--256 |  0x301    0x303    0x305    0x307   
--32k |  0x310    0x313    0x316    0x319   
--64k |  0x311    0x314    0x317    0x31A   
--16M |  0x312    0x315    0x318    0x31B   
-+256 |  0x301    0x303    0x305    0x307
-+32k |  0x310    0x313    0x316    0x319
-+64k |  0x311    0x314    0x317    0x31A
-+16M |  0x312    0x315    0x318    0x31B
--To enable one of those modes you have to specify "vga=ask" in the
--lilo.conf file and rerun LILO. Then you can type in the desired
--mode at the "vga=ask" prompt. For example if you like to use 
--1024x768x256 colors you have to say "305" at this prompt.
-+To enable one of those modes you have to specify "vga=ask" in the lilo.conf
-+file and rerun LILO. Then you can type in the desired mode at the "vga=ask"
-+prompt. For example if you like to use 1024x768x256 colors you have to say
-+"305" at this prompt.
- If this does not work, this might be because your BIOS does not support
- linear framebuffers or because it does not support this mode at all.
-@@ -72,11 +83,12 @@ Even if your board does, it might be the
- Extensions v2.0 are required, 1.2 is NOT sufficient.  You will get a
- "bad mode number" message if something goes wrong.
--1. Note: LILO cannot handle hex, for booting directly with 
-+1. Note: LILO cannot handle hex, for booting directly with
-          "vga=mode-number" you have to transform the numbers to decimal.
- 2. Note: Some newer versions of LILO appear to work with those hex values,
-          if you set the 0x in front of the numbers.
-+
- X11
- ===
-@@ -84,98 +96,164 @@ XF68_FBDev should work just fine, but it
- another (accelerated) X-Server like XF86_SVGA might or might not work.
- It depends on X-Server and graphics board.
--The X-Server must restore the video mode correctly, else you end up
-+The X-Server must restore the video mode correctly, or else you end up
- with a broken console (and vesafb cannot do anything about this).
-+With vesafb-tng chances are that the console will be restored properly
-+even if the X server messes up the video mode.
- Refresh rates
- =============
--There is no way to change the vesafb video mode and/or timings after
--booting linux.  If you are not happy with the 60 Hz refresh rate, you
--have these options:
-+With VBE 3.0 compatible BIOSes and vesafb-tng it is possible to change
-+the refresh rate either at boot time (by specifying the @<rr> part of
-+the mode name) or later, using the fbset utility.
-- * configure and load the DOS-Tools for your the graphics board (if
--   available) and boot linux with loadlin.
-- * use a native driver (matroxfb/atyfb) instead if vesafb.  If none
-+If you want to use the default BIOS refresh rate while switching modes
-+on a running system, set pixclock to 0.
-+
-+With VBE 2.0 there is no way to change the mode timings after booting
-+Linux. If you are not happy with the 60 Hz refresh rate, you have
-+the following options:
-+
-+ * Configure and load the DOS tools for your the graphics board (if
-+   available) and boot Linux with loadlin.
-+ * Use a native driver (matroxfb/atyfb) instead of vesafb.  If none
-    is available, write a new one!
-- * VBE 3.0 might work too.  I have neither a gfx board with VBE 3.0
--   support nor the specs, so I have not checked this yet.
-+ * Use a BIOS editor to change the default refresh rate (such an
-+   editor does exist at least for ATI Radeon BIOSes).
-+ * If you're running a non-vm86 and VBE 3.0 compatible system, you can
-+   use a kernel patch (vesafb-rrc) to hard-code some mode timings in
-+   the kernel and use these while setting the video mode at boot time.
-+
-+Note that there are some boards (nVidia 59**, 57** and newer models)
-+claiming that their Video BIOS is VBE 3.0 compliant, while ignoring the
-+CRTC values provided by software such as vesafb-tng. You'll not be able
-+to adjust the refresh rate if you're using one of these boards.
- Configuration
- =============
--The VESA BIOS provides protected mode interface for changing
--some parameters.  vesafb can use it for palette changes and
--to pan the display.  It is turned off by default because it
--seems not to work with some BIOS versions, but there are options
--to turn it on.
-+The VESA BIOS provides protected mode interface for changing some parameters.
-+vesafb can use it for palette changes and to pan the display. It is turned
-+off by default because it seems not to work with some BIOS versions, but
-+there are options to turn it on.
--You can pass options to vesafb using "video=vesafb:option" on
--the kernel command line.  Multiple options should be separated
--by comma, like this: "video=vesafb:ypan,invers"
-+You can pass options to vesafb using "video=vesafb:option" on the kernel
-+command line. Multiple options should be separated by a comma, like this:
-+"video=vesafb:ypan,1024x768-32@85"
--Accepted options:
-+Note that vesafb-tng still uses the "video=vesafb:option" format of the
-+kernel command line video parameter. "video=vesafb-tng:xxx" is incorrect.
--invers        no comment...
-+Accepted options (both vesafb and vesafb-tng):
--ypan  enable display panning using the VESA protected mode 
--      interface.  The visible screen is just a window of the
--      video memory, console scrolling is done by changing the
--      start of the window.
--      pro:    * scrolling (fullscreen) is fast, because there is
--                no need to copy around data.
--              * You'll get scrollback (the Shift-PgUp thing),
--                the video memory can be used as scrollback buffer
--      kontra: * scrolling only parts of the screen causes some
--                ugly flicker effects (boot logo flickers for
--                example).
-+ypan    Enable display panning using the VESA protected mode interface
-+        The visible screen is just a window of the video memory,
-+        console scrolling is done by changing the start of the window.
-+        pro:    * scrolling (fullscreen) is fast, because there is
-+                  no need to copy around data.
-+                * you'll get scrollback (the Shift-PgUp thing),
-+                  the video memory can be used as scrollback buffer
-+        con:    * scrolling only parts of the screen causes some
-+                  ugly flicker effects (boot logo flickers for
-+                  example).
--ywrap Same as ypan, but assumes your gfx board can wrap-around 
--      the video memory (i.e. starts reading from top if it
--      reaches the end of video memory).  Faster than ypan.
-+ywrap   Same as ypan, but assumes your gfx board can wrap-around the video
-+        memory (i.e. starts reading from top if it reaches the end of
-+        video memory). Faster than ypan.
--redraw        scroll by redrawing the affected part of the screen, this
--      is the safe (and slow) default.
-+redraw  Scroll by redrawing the affected part of the screen, this is the
-+        safe (and slow) default.
-+vgapal  Use the standard VGA registers for palette changes.
--vgapal        Use the standard vga registers for palette changes.
--      This is the default.
--pmipal        Use the protected mode interface for palette changes.
-+pmipal  Use the protected mode interface for palette changes.
-+        This is the default is the protected mode interface is available.
--mtrr:n        setup memory type range registers for the vesafb framebuffer
--      where n:
--            0 - disabled (equivalent to nomtrr) (default)
--            1 - uncachable
--            2 - write-back
--            3 - write-combining
--            4 - write-through
-+mtrr:n  Setup memory type range registers for the vesafb framebuffer
-+        where n:
-+              0 - disabled (equivalent to nomtrr) (default)
-+              1 - uncachable
-+              2 - write-back
-+              3 - write-combining
-+              4 - write-through
--      If you see the following in dmesg, choose the type that matches the
--      old one. In this example, use "mtrr:2".
-+        If you see the following in dmesg, choose the type that matches
-+        the old one. In this example, use "mtrr:2".
- ...
- mtrr: type mismatch for e0000000,8000000 old: write-back new: write-combining
- ...
--nomtrr  disable mtrr
-+nomtrr  Do not use memory type range registers for vesafb.
- vremap:n
-         remap 'n' MiB of video RAM. If 0 or not specified, remap memory
--      according to video mode. (2.5.66 patch/idea by Antonino Daplas
--      reversed to give override possibility (allocate more fb memory
--      than the kernel would) to 2.4 by tmb@iki.fi)
-+        according to video mode. (2.5.66 patch/idea by Antonino Daplas
-+        reversed to give override possibility (allocate more fb memory
-+        than the kernel would) to 2.4 by tmb@iki.fi)
- vtotal:n
-         if the video BIOS of your card incorrectly determines the total
-         amount of video RAM, use this option to override the BIOS (in MiB).
--Have fun!
-+Options accepted only by vesafb-tng:
--  Gerd
-+<mode>  The mode you want to set, in the standard modedb format. Refer to
-+        modedb.txt for a detailed description. If you specify a mode that is
-+        not supported by your board's BIOS, vesafb-tng will attempt to set a
-+        similar mode. The list of supported modes can be found in
-+        /proc/fbx/modes, where x is the framebuffer number (usually 0).
-+        When vesafb-tng is compiled as a module, the mode string should be
-+        provided as a value of the parameter 'mode'.
-+
-+vbemode:x
-+        Force the use of VBE mode x. The mode will only be set if it's
-+        found in the VBE-provided list of supported modes.
-+        NOTE: The mode number 'x' should be specified in VESA mode number
-+        notation, not the Linux kernel one (eg. 257 instead of 769).
-+        HINT: If you use this option because normal <mode> parameter does
-+        not work for you and you use a X server, you'll probably want to
-+        set the 'nocrtc' option to ensure that the video mode is properly
-+        restored after console <-> X switches.
-+
-+nocrtc  Do not use CRTC timings while setting the video mode. This option
-+        makes sence only with VBE 3.0 compliant systems. Use it if you have
-+        problems with modes set in the standard way. Note that using this
-+              option means that any refresh rate adjustments will be ignored
-+              and the refresh rate will stay at your BIOS default (60 Hz).
-+
-+noedid  Do not try to fetch and use EDID-provided modes.
-+
-+noblank Disable hardware blanking.
-+
-+gtf     Force the use of VESA's GTF (Generalized Timing Formula). Specifying
-+        this will cause vesafb to skip its internal modedb and EDID-modedb
-+        and jump straight to the GTF part of the code (normally used only if
-+        everything else failed). This can be useful if you want to get as
-+        much as possible from your graphics board but your BIOS doesn't
-+        support modes with the refresh rates you require. Note that you may 
-+              need to specify the maxhf, maxvf and maxclk parameters if they are not
-+        provided by the EDID block.
-+
-+Additionally, the following parameters may be provided. They all override the
-+EDID-provided values and BIOS defaults. Refer to your monitor's specs to get
-+the correct values for maxhf, maxvf and maxclk for your hardware.
-+
-+maxhf:n     Maximum horizontal frequency (in kHz).
-+maxvf:n     Maximum vertical frequency (in Hz).
-+maxclk:n    Maximum pixel clock (in MHz).
-+
-+Have fun!
- --
-+Original document for the vesafb driver by
- Gerd Knorr <kraxel@goldbach.in-berlin.de>
--Minor (mostly typo) changes 
--by Nico Schmoigl <schmoigl@rumms.uni-mannheim.de>
-+Minor (mostly typo) changes by
-+Nico Schmoigl <schmoigl@rumms.uni-mannheim.de>
-+
-+Extended documentation for vm86, VBE 3.0 and vesafb-tng by
-+Michal Januszewski <spock@gentoo.org>
-+
---- linux-2.6.17.orig/arch/i386/boot/video.S
-+++ linux-2.6.17/arch/i386/boot/video.S
-@@ -165,10 +165,12 @@ basret:  ret
- # parameters in the default 80x25 mode -- these are set directly,
- # because some very obscure BIOSes supply insane values.
- mode_params:
-+#ifdef CONFIG_FB_VESA_STD
- #ifdef CONFIG_VIDEO_SELECT
-       cmpb    $0, graphic_mode
-       jnz     mopar_gr
- #endif
-+#endif
-       movb    $0x03, %ah                      # Read cursor position
-       xorb    %bh, %bh
-       int     $0x10
-@@ -201,6 +203,7 @@ mopar2: movb       %al, %fs:(PARAM_VIDEO_LINES
-       ret
- #ifdef CONFIG_VIDEO_SELECT
-+#ifdef CONFIG_FB_VESA_STD
- # Fetching of VESA frame buffer parameters
- mopar_gr:
-       leaw    modelist+1024, %di
-@@ -283,6 +286,7 @@ dac_done:
-       movw    %es, %fs:(PARAM_VESAPM_SEG)
-       movw    %di, %fs:(PARAM_VESAPM_OFF)
- no_pm:        ret
-+#endif
- # The video mode menu
- mode_menu:
-@@ -497,10 +501,12 @@ mode_set:
-       
-       cmpb    $VIDEO_FIRST_V7>>8, %ah
-       jz      setv7
--      
-+
-+#ifdef CONFIG_FB_VESA_STD
-       cmpb    $VIDEO_FIRST_VESA>>8, %ah
-       jnc     check_vesa
--      
-+#endif        
-+
-       orb     %ah, %ah
-       jz      setmenu
-       
-@@ -572,6 +578,7 @@ setr1:     lodsw
-       movw    -4(%si), %ax                    # Fetch mode ID
-       jmp     _m_s
-+#ifdef CONFIG_FB_VESA_STD
- check_vesa:
-       leaw    modelist+1024, %di
-       subb    $VIDEO_FIRST_VESA>>8, %bh
-@@ -605,6 +612,7 @@ check_vesa:
-       ret
- _setbad:      jmp     setbad                  # Ugly...
-+#endif
- # Recalculate vertical display end registers -- this fixes various
- # inconsistencies of extended modes on many adapters. Called when
---- linux-2.6.17.orig/drivers/video/Kconfig
-+++ linux-2.6.17/drivers/video/Kconfig
-@@ -472,8 +472,22 @@ config FB_TGA
-         cards. Say Y if you have one of those.
- config FB_VESA
--      bool "VESA VGA graphics support"
--      depends on (FB = y) && X86
-+      tristate "VESA VGA graphics support"
-+      depends on (FB = y) && (X86 || X86_64)
-+      help
-+        This is the frame buffer device driver for generic VESA 2.0
-+        compliant graphic cards. The older VESA 1.2 cards are not supported.
-+        You will get a boot time penguin logo at no additional cost. Please
-+        read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-+
-+choice 
-+      prompt "VESA driver type"
-+      depends on FB_VESA
-+      default FB_VESA_STD if X86_64
-+      default FB_VESA_TNG if X86
-+
-+config FB_VESA_STD
-+      bool "vesafb"
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-@@ -481,7 +495,43 @@ config FB_VESA
-         This is the frame buffer device driver for generic VESA 2.0
-         compliant graphic cards. The older VESA 1.2 cards are not supported.
-         You will get a boot time penguin logo at no additional cost. Please
--        read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-+        read <file:Documentation/fb/vesafb.txt>. Choose this driver if you
-+        are experiencing problems with vesafb-tng or if you own a 64-bit system.
-+
-+        Note that this driver cannot be compiled as a module.
-+
-+config FB_VESA_TNG
-+      bool "vesafb-tng"
-+      depends on !X86_64
-+      select FB_MODE_HELPERS
-+      select FB_CFB_FILLRECT
-+      select FB_CFB_COPYAREA
-+      select FB_CFB_IMAGEBLIT
-+      help
-+        This is the frame buffer device driver for generic VESA 2.0 
-+        compliant graphic cards. It is capable of taking advantage of 
-+        VBE 3.0 features. With this driver you will be able to adjust
-+        the refresh rate (VBE 3.0 compliant boards only) and change
-+        the graphic mode on-the-fly.
-+        
-+        You will also get a boot time penguin logo at no additional cost. Please
-+        read <file:Documentation/fb/vesafb.txt>.
-+
-+endchoice
-+
-+config FB_VESA_DEFAULT_MODE
-+      string "VESA default mode"
-+      depends on FB_VESA_TNG
-+      default "640x480@60"
-+      help 
-+        This option is used to determine the default mode vesafb is
-+        supposed to switch to in case no mode is provided as a kernel
-+        command line parameter.
-+
-+config VIDEO_SELECT
-+      bool
-+      depends on FB_VESA
-+      default y
- config VIDEO_SELECT
-       bool
---- linux-2.6.17.orig/drivers/video/Makefile
-+++ linux-2.6.17/drivers/video/Makefile
-@@ -97,7 +97,11 @@ obj-$(CONFIG_FB_IMX)              += imx
- obj-$(CONFIG_FB_S3C2410)        += s3c2410fb.o
- # Platform or fallback drivers go here
--obj-$(CONFIG_FB_VESA)             += vesafb.o
-+ifeq ($(CONFIG_FB_VESA_STD),y)
-+  obj-y                                 += vesafb.o
-+else
-+  obj-$(CONFIG_FB_VESA)                 += vesafb-thread.o vesafb-tng.o
-+endif
- obj-$(CONFIG_FB_VGA16)            += vga16fb.o vgastate.o
- obj-$(CONFIG_FB_OF)               += offb.o
---- linux-2.6.17.orig/drivers/video/fbmem.c
-+++ linux-2.6.17/drivers/video/fbmem.c
-@@ -1438,6 +1438,7 @@ fbmem_init(void)
-               printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
-               fb_class = NULL;
-       }
-+
-       return 0;
- }
---- linux-2.6.17.orig/drivers/video/modedb.c
-+++ linux-2.6.17/drivers/video/modedb.c
-@@ -671,6 +671,7 @@ void fb_var_to_videomode(struct fb_video
- {
-       u32 pixclock, hfreq, htotal, vtotal;
-+      mode->refresh = 0;
-       mode->name = NULL;
-       mode->xres = var->xres;
-       mode->yres = var->yres;
---- /dev/null
-+++ linux-2.6.17/drivers/video/vesafb-thread.c
-@@ -0,0 +1,727 @@
-+/*
-+ * Framebuffer driver for VBE 2.0+ compliant graphic boards.
-+ * Kernel thread and vm86 routines.
-+ *
-+ * (c) 2004-2006 Michal Januszewski <spock@gentoo.org>
-+ *
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/slab.h>
-+#include <linux/workqueue.h>
-+#include <linux/completion.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/delay.h>
-+#include <linux/signal.h>
-+#include <linux/suspend.h>
-+#include <linux/unistd.h>
-+#include <video/vesa.h>
-+#include <video/edid.h>
-+#include <asm/mman.h>
-+#include <asm/page.h>
-+#include <asm/vm86.h>
-+#include <asm/thread_info.h>
-+#include <asm/uaccess.h>
-+#include <asm/mmu_context.h>
-+#include "edid.h"
-+
-+#ifdef MODULE
-+int errno;
-+#endif
-+
-+static DECLARE_COMPLETION(vesafb_th_completion);
-+static DECLARE_MUTEX(vesafb_task_list_sem);
-+static LIST_HEAD(vesafb_task_list);
-+static DECLARE_WAIT_QUEUE_HEAD(vesafb_wait);
-+
-+static struct vm86_struct vm86;
-+static int vesafb_pid = 0;
-+
-+_syscall3(int,ioperm,unsigned long, a, unsigned long, b, unsigned long, c);
-+_syscall1(int,vm86old,struct vm86_struct __user*, v86);
-+
-+#define DEFAULT_VM86_FLAGS (IF_MASK | IOPL_MASK)
-+#define VM86_PUSHW(x)                                 \
-+do {                                                  \
-+      vm86.regs.esp -= 2;                             \
-+      *(u16*)(STACK_ADDR + vm86.regs.esp) = x;        \
-+} while(0);
-+
-+/* Stack, the return code and buffers will be put into
-+ * one contiguous memory chunk:
-+ *
-+ * [ STACK | RET_CODE | BUFFER ]
-+ *
-+ * Some video BIOSes (sis6326) try to store data somewhere
-+ * in 0x7000-0x7fff, so we zeromap more memory to be safe.
-+ */
-+#define IVTBDA_SIZE   PAGE_SIZE
-+#define RET_CODE_SIZE 0x0010
-+#define STACK_SIZE    0x0500
-+#define BUFFER_SIZE   0x10000
-+
-+/* The amount of memory that will be allocated should be a multiple
-+ * of PAGE_SIZE. */
-+#define __MEM_SIZE    (RET_CODE_SIZE + STACK_SIZE + BUFFER_SIZE)
-+#define REAL_MEM_SIZE (((__MEM_SIZE / PAGE_SIZE) + 1) * PAGE_SIZE)
-+
-+#define IVTBDA_ADDR   0x00000
-+#define STACK_ADDR    (IVTBDA_ADDR + IVTBDA_SIZE)
-+#define RET_CODE_ADDR (STACK_ADDR + STACK_SIZE)
-+#define BUF_ADDR      (RET_CODE_ADDR + RET_CODE_SIZE)
-+
-+#define FLAG_D                (1 << 10)
-+
-+/* Segment prefix opcodes */
-+enum {
-+      P_CS = 0x2e,
-+      P_SS = 0x36,
-+      P_DS = 0x3e,
-+      P_ES = 0x26,
-+      P_FS = 0x64,
-+      P_GS = 0x65
-+};
-+
-+/* Emulated vm86 ins instruction */
-+static void vm86_ins(int size)
-+{
-+      u32 edx, edi;
-+      edx = vm86.regs.edx & 0xffff;
-+      edi = (vm86.regs.edi & 0xffff) + (u32)(vm86.regs.es << 4);
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("std\n");
-+      else
-+              asm volatile ("cld\n");
-+
-+      switch (size) {
-+      case 4:
-+              asm volatile ("insl\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      case 2:
-+              asm volatile ("insw\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      case 1:
-+              asm volatile ("insb\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      }
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("cld\n");
-+
-+      edi -= (u32)(vm86.regs.es << 4);
-+
-+      vm86.regs.edi &= 0xffff0000;
-+      vm86.regs.edi |= edi & 0xffff;
-+}
-+
-+static void vm86_rep_ins(int size)
-+{
-+      u16 cx = vm86.regs.ecx;
-+      while (cx--)
-+              vm86_ins(size);
-+
-+      vm86.regs.ecx &= 0xffff0000;
-+}
-+
-+/* Emulated vm86 outs instruction */
-+static void vm86_outs(int size, int segment)
-+{
-+      u32 edx, esi, base;
-+
-+      edx = vm86.regs.edx & 0xffff;
-+      esi = vm86.regs.esi & 0xffff;
-+
-+      switch (segment) {
-+      case P_CS: base = vm86.regs.cs; break;
-+      case P_SS: base = vm86.regs.ss; break;
-+      case P_ES: base = vm86.regs.es; break;
-+      case P_FS: base = vm86.regs.fs; break;
-+      case P_GS: base = vm86.regs.gs; break;
-+      default:   base = vm86.regs.ds; break;
-+      }
-+
-+      esi += base << 4;
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("std\n");
-+      else
-+              asm volatile ("cld\n");
-+
-+      switch (size) {
-+      case 4:
-+              asm volatile ("outsl\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      case 2:
-+              asm volatile ("outsw\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      case 1:
-+              asm volatile ("outsb\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      }
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("cld");
-+
-+      esi -= base << 4;
-+      vm86.regs.esi &= 0xffff0000;
-+      vm86.regs.esi |= (esi & 0xffff);
-+}
-+
-+static void vm86_rep_outs(int size, int segment)
-+{
-+      u16 cx = vm86.regs.ecx;
-+      while (cx--)
-+              vm86_outs(size, segment);
-+
-+      vm86.regs.ecx &= 0xffff0000;
-+}
-+
-+static int vm86_do_unknown(void)
-+{
-+      u8 data32 = 0, segment = P_DS, rep = 0;
-+      u8 *instr;
-+      int ret = 0, i = 0;
-+
-+      instr = (u8*)((vm86.regs.cs << 4) + vm86.regs.eip);
-+
-+      while (1) {
-+              switch(instr[i]) {
-+              case 0x66:      /* operand size prefix */
-+                      data32 = 1 - data32;
-+                      i++;
-+                      break;
-+              case 0xf2:      /* repnz */
-+              case 0xf3:      /* rep */
-+                      rep = 1;
-+                      i++;
-+                      break;
-+              case P_CS:      /* segment prefix */
-+              case P_SS:
-+              case P_DS:
-+              case P_ES:
-+              case P_FS:
-+              case P_GS:
-+                      segment = instr[i];
-+                      i++;
-+                      break;
-+              case 0xf0:      /* LOCK - ignored */
-+              case 0x67:      /* address size prefix - ignored */
-+                      i++;
-+                      break;
-+              case 0x6c:      /* insb */
-+                      if (rep)
-+                              vm86_rep_ins(1);
-+                      else
-+                              vm86_ins(1);
-+                      i++;
-+                      goto out;
-+              case 0x6d:      /* insw / insd */
-+                      if (rep) {
-+                              if (data32)
-+                                      vm86_rep_ins(4);
-+                              else
-+                                      vm86_rep_ins(2);
-+                      } else {
-+                              if (data32)
-+                                      vm86_ins(4);
-+                              else
-+                                      vm86_ins(2);
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0x6e:      /* outsb */
-+                      if (rep)
-+                              vm86_rep_outs(1, segment);
-+                      else
-+                              vm86_outs(1, segment);
-+                      i++;
-+                      goto out;
-+              case 0x6f:      /* outsw / outsd */
-+                      if (rep) {
-+                              if (data32)
-+                                      vm86_rep_outs(4, segment);
-+                              else
-+                                      vm86_rep_outs(2, segment);
-+                      } else {
-+                              if (data32)
-+                                      vm86_outs(4, segment);
-+                              else
-+                                      vm86_outs(2, segment);
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0xe4:      /* inb xx */
-+                      asm volatile (
-+                              "inb %w1, %b0"
-+                              : "=a" (vm86.regs.eax)
-+                              : "d" (instr[i+1]), "0" (vm86.regs.eax));
-+                      i += 2;
-+                      goto out;
-+              case 0xe5:      /* inw xx / ind xx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "inl %w1, %0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (instr[i+1]),
-+                                        "0" (vm86.regs.eax));
-+                      } else {
-+                              asm volatile (
-+                                      "inw %w1, %w0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (instr[i+1]),
-+                                        "0" (vm86.regs.eax));
-+                      }
-+                      i += 2;
-+                      goto out;
-+
-+              case 0xec:      /* inb dx */
-+                      asm volatile (
-+                              "inb %w1, %b0"
-+                              : "=a" (vm86.regs.eax)
-+                              : "d" (vm86.regs.edx), "0" (vm86.regs.eax));
-+                      i++;
-+                      goto out;
-+              case 0xed:      /* inw dx / ind dx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "inl %w1, %0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (vm86.regs.edx));
-+                      } else {
-+                              asm volatile (
-+                                      "inw %w1, %w0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (vm86.regs.edx));
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0xe6:      /* outb xx */
-+                      asm volatile (
-+                              "outb %b0, %w1"
-+                              : /* no return value */
-+                              : "a" (vm86.regs.eax), "d" (instr[i+1]));
-+                      i += 2;
-+                      goto out;
-+              case 0xe7:      /* outw xx / outd xx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "outl %0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (instr[i+1]));
-+                      } else {
-+                              asm volatile (
-+                                      "outw %w0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (instr[i+1]));
-+                      }
-+                      i += 2;
-+                      goto out;
-+              case 0xee:      /* outb dx */
-+                      asm volatile (
-+                              "outb %b0, %w1"
-+                              : /* no return value */
-+                              : "a" (vm86.regs.eax), "d" (vm86.regs.edx));
-+                      i++;
-+                      goto out;
-+              case 0xef:      /* outw dx / outd dx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "outl %0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (vm86.regs.edx));
-+                      } else {
-+                              asm volatile (
-+                                      "outw %w0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (vm86.regs.edx));
-+                      }
-+                      i++;
-+                      goto out;
-+              default:
-+                      printk(KERN_ERR "vesafb: BUG, opcode 0x%x emulation "
-+                                      "not supported (EIP: 0x%lx)\n",
-+                                      instr[i], (u32)(vm86.regs.cs << 4) +
-+                                      vm86.regs.eip);
-+                      ret = 1;
-+                      goto out;
-+              }
-+      }
-+out:  vm86.regs.eip += i;
-+      return ret;
-+}
-+
-+void vesafb_do_vm86(struct vm86_regs *regs)
-+{
-+      unsigned int ret;
-+      u8 *retcode = (void*)RET_CODE_ADDR;
-+
-+      memset(&vm86,0,sizeof(vm86));
-+      memcpy(&vm86.regs, regs, sizeof(struct vm86_regs));
-+
-+      /* The return code */
-+      retcode[0] = 0xcd;              /* int opcode */
-+      retcode[1] = 0xff;              /* int number (255) */
-+
-+        /* We use int 0xff to get back to protected mode */
-+      memset(&vm86.int_revectored, 0, sizeof(vm86.int_revectored));
-+        ((unsigned char *)&vm86.int_revectored)[0xff / 8] |= (1 << (0xff % 8));
-+
-+      /*
-+       * We want to call int 0x10, so we set:
-+       *   CS = 0x42 = 0x10 * 4 + 2
-+       *   IP = 0x40 = 0x10 * 4
-+       * and SS:ESP. It's up to the caller to set the rest of the registers.
-+       */
-+      vm86.regs.eflags = DEFAULT_VM86_FLAGS;
-+      vm86.regs.cs = *(unsigned short *)0x42;
-+      vm86.regs.eip = *(unsigned short *)0x40;
-+      vm86.regs.ss = (STACK_ADDR >> 4);
-+      vm86.regs.esp = ((STACK_ADDR & 0x0000f) + STACK_SIZE);
-+
-+      /* These will be fetched off the stack when we come to an iret in the
-+       * int's 0x10 code. */
-+      VM86_PUSHW(DEFAULT_VM86_FLAGS);
-+      VM86_PUSHW((RET_CODE_ADDR >> 4));       /* return code segment */
-+      VM86_PUSHW((RET_CODE_ADDR & 0x0000f));  /* return code offset */
-+
-+      while(1) {
-+              ret = vm86old(&vm86);
-+
-+              if (VM86_TYPE(ret) == VM86_INTx) {
-+                      int vint = VM86_ARG(ret);
-+
-+                      /* If exit from vm86 was caused by int 0xff, then
-+                       * we're done.. */
-+                      if (vint == 0xff)
-+                              goto out;
-+
-+                      /* .. otherwise, we have to call the int handler
-+                       * manually */
-+                      VM86_PUSHW(vm86.regs.eflags);
-+                      VM86_PUSHW(vm86.regs.cs);
-+                      VM86_PUSHW(vm86.regs.eip);
-+
-+                      vm86.regs.cs = *(u16 *)((vint << 2) + 2);
-+                      vm86.regs.eip = *(u16 *)(vint << 2);
-+                      vm86.regs.eflags &= ~(VIF_MASK | TF_MASK);
-+              } else if (VM86_TYPE(ret) == VM86_UNKNOWN) {
-+                      if (vm86_do_unknown())
-+                              goto out;
-+              } else {
-+                      printk(KERN_ERR "vesafb: BUG, returned from "
-+                                      "vm86 with %x (EIP: 0x%lx)\n",
-+                                      ret, (u32)(vm86.regs.cs << 4) +
-+                                      vm86.regs.eip);
-+                      goto out;
-+              }
-+      }
-+
-+out:  /* copy the registers' state back to the caller's struct */
-+      memcpy(regs, &vm86.regs, sizeof(struct vm86_regs));
-+}
-+
-+static int vesafb_remap_pfn_range(unsigned long start, unsigned long end,
-+                                unsigned long pgoff, unsigned long prot,
-+                                int type)
-+{
-+      struct vm_area_struct *vma;
-+      struct mm_struct *mm = current->mm;
-+      int ret = 0;
-+
-+      vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-+      if (!vma)
-+              return -ENOMEM;
-+      memset(vma, 0, sizeof(*vma));
-+      down_write(&mm->mmap_sem);
-+      vma->vm_mm = mm;
-+      vma->vm_start = start;
-+      vma->vm_end = end;
-+      vma->vm_flags = VM_READ | VM_WRITE | VM_EXEC;
-+      vma->vm_flags |= mm->def_flags;
-+      vma->vm_page_prot.pgprot = prot;
-+      vma->vm_pgoff = pgoff;
-+
-+      if ((ret = insert_vm_struct(mm, vma))) {
-+              up_write(&mm->mmap_sem);
-+              kmem_cache_free(vm_area_cachep, vma);
-+              return ret;
-+      }
-+
-+      if (type) {
-+              ret = zeromap_page_range(vma,
-+                                       vma->vm_start,
-+                                       vma->vm_end - vma->vm_start,
-+                                       vma->vm_page_prot);
-+      } else {
-+              vma->vm_flags |= VM_SHARED;
-+              ret = remap_pfn_range(vma,
-+                                    vma->vm_start,
-+                                    vma->vm_pgoff,
-+                                    vma->vm_end - vma->vm_start,
-+                                    vma->vm_page_prot);
-+      }
-+      up_write(&mm->mmap_sem);
-+      return ret;
-+}
-+
-+static inline int vesafb_init_mem(void)
-+{
-+      int ret = 0;
-+
-+      /* The memory chunks we're remapping here should be multiples
-+       * of PAGE_SIZE. */
-+      ret += vesafb_remap_pfn_range(0x00000, IVTBDA_SIZE, 0,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 0);
-+      ret += vesafb_remap_pfn_range(IVTBDA_SIZE, REAL_MEM_SIZE, 0,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 1);
-+      ret += vesafb_remap_pfn_range(0x9f000, 0x100000, 
-+                                    0x9f000 >> PAGE_SHIFT,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 0);
-+      if (ret)
-+              printk(KERN_ERR "vesafb thread: memory remapping failed\n");
-+
-+      return ret;
-+}
-+
-+#define vesafb_get_string(str) \
-+{                                                                     \
-+      /* The address is in the form ssssoooo, where oooo = offset,    \
-+       * ssss = segment */                                            \
-+      addr = ((p_vbe(tsk->buf)->str & 0xffff0000) >> 12) +            \
-+              (p_vbe(tsk->buf)->str & 0x0000ffff);                    \
-+                                                                      \
-+      /* The data is in ROM which is shared between processes, so we  \
-+       * just translate the real mode address into one visible from   \
-+       * kernel space */                                              \
-+      if (addr >= 0xa0000) {                                          \
-+              p_vbe(tsk->buf)->str = (u32) __va(addr);                \
-+                                                                      \
-+      /* The data is in the buffer, we just have to convert the       \
-+       * address so that it points into the buffer user provided. */  \
-+      } else if (addr > BUF_ADDR && addr < BUF_ADDR +                 \
-+                 sizeof(struct vesafb_vbe_ib)) {                      \
-+              addr -= BUF_ADDR;                                       \
-+              p_vbe(tsk->buf)->str = (u32) (tsk->buf + addr);         \
-+                                                                      \
-+      /* This should never happen: someone was insane enough to put   \
-+       * the data somewhere in RAM.. */                               \
-+      } else {                                                        \
-+              p_vbe(tsk->buf)->str = (u32) "";                        \
-+      }                                                               \
-+}
-+
-+void vesafb_handle_getvbeib(struct vesafb_task *tsk)
-+{
-+      int addr, res;
-+
-+      tsk->regs.es  = (BUF_ADDR >> 4);
-+      tsk->regs.edi = (BUF_ADDR & 0x000f);
-+      strncpy(p_vbe(BUF_ADDR)->vbe_signature, "VBE2", 4);
-+
-+      vesafb_do_vm86(&tsk->regs);
-+      memcpy(tsk->buf, (void*)(BUF_ADDR), sizeof(struct vesafb_vbe_ib));
-+
-+      /* The OEM fields were not defined prior to VBE 2.0 */
-+      if (p_vbe(tsk->buf)->vbe_version >= 0x200) {
-+              vesafb_get_string(oem_string_ptr);
-+              vesafb_get_string(oem_vendor_name_ptr);
-+              vesafb_get_string(oem_product_name_ptr);
-+              vesafb_get_string(oem_product_rev_ptr);
-+      }
-+
-+      /* This is basically the same as vesafb_get_string() */
-+      addr = ((p_vbe(tsk->buf)->mode_list_ptr & 0xffff0000) >> 12) +
-+              (p_vbe(tsk->buf)->mode_list_ptr & 0x0000ffff);
-+
-+      if (addr >= 0xa0000) {
-+              p_vbe(tsk->buf)->mode_list_ptr = (u32) __va(addr);
-+      } else if (addr > BUF_ADDR && addr < BUF_ADDR +
-+                 sizeof(struct vesafb_vbe_ib)) {
-+              addr -= BUF_ADDR;
-+              p_vbe(tsk->buf)->mode_list_ptr = (u32) (tsk->buf + addr);
-+      } else {
-+              res = 0;
-+              printk(KERN_WARNING "vesafb: warning, copying modelist "
-+                                  "from somewhere in RAM!\n");
-+              while (*(u16*)(addr+res) != 0xffff &&
-+                     res < (sizeof(p_vbe(tsk->buf)->reserved) - 2)) {
-+                      *(u16*) ((u32)&(p_vbe(tsk->buf)->reserved) + res) =
-+                              *(u16*)(addr+res);
-+                      res += 2;
-+              }
-+              *(u16*) ((u32)&(p_vbe(tsk->buf)->reserved) + res) = 0xffff;
-+      }
-+}
-+
-+int vesafb_handle_tasks(void)
-+{
-+      struct vesafb_task *tsk;
-+      struct list_head *curr, *next;
-+      int ret = 0;
-+
-+      down(&vesafb_task_list_sem);
-+      list_for_each_safe(curr, next, &vesafb_task_list) {
-+              tsk = list_entry(curr, struct vesafb_task, node);
-+
-+              if (tsk->flags & TF_EXIT) {
-+                      ret = 1;
-+                      goto task_done;
-+              }
-+              if (tsk->flags & TF_GETVBEIB) {
-+                      vesafb_handle_getvbeib(tsk);
-+                      goto task_done;
-+              }
-+              /* Do we need to store a pointer to the buffer in ES:EDI? */
-+              if (tsk->flags & TF_BUF_DI) {
-+                      tsk->regs.es  = (BUF_ADDR >> 4);
-+                      tsk->regs.edi = (BUF_ADDR & 0x000f);
-+              }
-+              /* Sometimes the pointer has to be in ES:EBX. */
-+              if (tsk->flags & TF_BUF_BX) {
-+                      tsk->regs.es  = (BUF_ADDR >> 4);
-+                      tsk->regs.ebx = (BUF_ADDR & 0x000f);
-+              }
-+              if (tsk->flags & (TF_BUF_DI | TF_BUF_BX))
-+                      memcpy((void*)BUF_ADDR, tsk->buf, tsk->buf_len);
-+
-+              vesafb_do_vm86(&tsk->regs);
-+
-+              if (tsk->flags & TF_RETURN_BUF)
-+                      memcpy(tsk->buf, (void*)BUF_ADDR, tsk->buf_len);
-+
-+task_done:    list_del(curr);
-+              complete(&tsk->done);
-+      }
-+
-+      /* If we're going to kill this thread, don't allow any elements
-+       * to be added to the task list. */
-+      if (!ret)
-+              up(&vesafb_task_list_sem);
-+
-+      return ret;
-+}
-+
-+/*
-+ * This 'hybrid' thread serves as a backend for vesafb-tng, handling all vm86
-+ * calls. It is started as a kernel thread. It then creates its own mm struct,
-+ * thus separating itself from any userspace processes. At this moment, it
-+ * stops being a kernel thread (kernel threads have mm = NULL) and becomes
-+ * a 'hybrid' thread -- one that has full access to kernel space, yet runs
-+ * with its own address space.
-+ *
-+ * This is necessary because in order to make vm86 calls some parts of the
-+ * first 1MB of RAM have to be setup to mimic the real mode. These are:
-+ *  - interrupt vector table  [0x00000-0x003ff]
-+ *  - BIOS data area          [0x00400-0x004ff]
-+ *  - Extended BIOS data area [0x9fc00-0x9ffff]
-+ *  - the video RAM           [0xa0000-0xbffff]
-+ *  - video BIOS              [0xc0000-0xcffff]
-+ *  - motherboard BIOS                [0xf0000-0xfffff]
-+ */
-+int vesafb_thread(void *unused)
-+{
-+      int err = 0;
-+
-+      set_fs(KERNEL_DS);
-+      daemonize("vesafb");
-+
-+      if (set_new_mm()) {
-+              err = -ENOMEM;
-+              goto thr_end;
-+      }
-+      if (vesafb_init_mem()) {
-+              err = -ENOMEM;
-+              goto thr_end;
-+      }
-+
-+      DPRINTK("started vesafb thread\n");
-+
-+      /* Having an IO bitmap makes things faster as we avoid GPFs
-+       * when running vm86 code. We can live if it fails, though,
-+       * so don't bother checking for errors. */
-+      ioperm(0,1024,1);
-+      set_user_nice(current, -10);
-+
-+      complete(&vesafb_th_completion);
-+
-+      while (1) {
-+              if (vesafb_handle_tasks())
-+                      break;
-+              wait_event_interruptible(vesafb_wait,
-+                                       !list_empty(&vesafb_task_list));
-+              try_to_freeze();
-+      }
-+
-+out:  DPRINTK("exiting the vesafb thread\n");
-+      vesafb_pid = -1;
-+
-+      /* Now that all callers know this thread is no longer running
-+       * (pid < 0), allow them to continue. */
-+      up(&vesafb_task_list_sem);
-+      return err;
-+thr_end:
-+      down(&vesafb_task_list_sem);
-+      complete(&vesafb_th_completion);
-+      goto out;       
-+}
-+
-+int vesafb_queue_task(struct vesafb_task *tsk)
-+{
-+      down(&vesafb_task_list_sem);
-+      if (vesafb_pid < 0)
-+              return -1;
-+      list_add_tail(&tsk->node, &vesafb_task_list);
-+      up(&vesafb_task_list_sem);
-+      wake_up(&vesafb_wait);
-+      return 0;
-+}
-+
-+int vesafb_wait_for_thread(void)
-+{
-+      /* PID 0 means that the thread is still initializing. */
-+      if (vesafb_pid < 0)
-+              return -1;
-+      wait_for_completion(&vesafb_th_completion);
-+      return 0;
-+}
-+
-+int __init vesafb_init_thread(void)
-+{
-+      vesafb_pid = kernel_thread(vesafb_thread,NULL,0);
-+      return 0;
-+}
-+
-+#ifdef MODULE
-+void __exit vesafb_kill_thread(void)
-+{
-+      struct vesafb_task *tsk;
-+      if (vesafb_pid <= 0)
-+              return;
-+
-+      vesafb_create_task(tsk);
-+      if (!tsk)
-+              return;
-+      tsk->flags |= TF_EXIT;
-+      vesafb_queue_task(tsk);
-+      vesafb_wait_for_task(tsk);
-+      kfree(tsk);
-+      return;
-+}
-+module_exit(vesafb_kill_thread);
-+#endif
-+module_init(vesafb_init_thread);
-+
-+EXPORT_SYMBOL_GPL(vesafb_queue_task);
-+EXPORT_SYMBOL_GPL(vesafb_wait_for_thread);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Michal Januszewski");
-+
---- /dev/null
-+++ linux-2.6.17/drivers/video/vesafb-tng.c
-@@ -0,0 +1,1598 @@
-+/*
-+ * Framebuffer driver for VBE 2.0+ compliant graphic boards
-+ *
-+ * (c) 2004-2006 Michal Januszewski <spock@gentoo.org>
-+ *     Based upon vesafb code by Gerd Knorr <kraxel@goldbach.in-berlin.de>
-+ *
-+ */
-+
-+#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/delay.h>
-+#include <linux/fb.h>
-+#include <linux/ioport.h>
-+#include <linux/init.h>
-+#include <linux/proc_fs.h>
-+#include <linux/completion.h>
-+#include <linux/platform_device.h>
-+#include <video/edid.h>
-+#include <video/vesa.h>
-+#include <video/vga.h>
-+#include <asm/io.h>
-+#include <asm/mtrr.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include "edid.h"
-+
-+#define dac_reg       (0x3c8)
-+#define dac_val       (0x3c9)
-+
-+#define VESAFB_NEED_EXACT_RES         1
-+#define VESAFB_NEED_EXACT_DEPTH 2
-+
-+/* --------------------------------------------------------------------- */
-+
-+static struct fb_var_screeninfo vesafb_defined __initdata = {
-+      .activate       = FB_ACTIVATE_NOW,
-+      .height         = 0,
-+      .width          = 0,
-+      .right_margin   = 32,
-+      .upper_margin   = 16,
-+      .lower_margin   = 4,
-+      .vsync_len      = 4,
-+      .vmode          = FB_VMODE_NONINTERLACED,
-+};
-+
-+static struct fb_fix_screeninfo vesafb_fix __initdata = {
-+      .id     = "VESA VGA",
-+      .type   = FB_TYPE_PACKED_PIXELS,
-+      .accel  = FB_ACCEL_NONE,
-+};
-+
-+static int  mtrr       = 0;   /* disable mtrr by default */
-+static int  blank      = 1;     /* enable blanking by default */
-+static int  ypan       = 0;   /* 0 - nothing, 1 - ypan, 2 - ywrap */
-+static int  pmi_setpal = 1;   /* pmi for palette changes */
-+static u16  *pmi_base  = NULL;  /* protected mode interface location */
-+static void (*pmi_start)(void) = NULL;
-+static void (*pmi_pal)(void)   = NULL;
-+static struct vesafb_vbe_ib  vbe_ib;
-+static struct vesafb_mode_ib *vbe_modes;
-+static int                   vbe_modes_cnt = 0;
-+static struct fb_info      *vesafb_info = NULL;
-+static int  nocrtc                = 0; /* ignore CRTC settings */
-+static int  noedid       __initdata = 0; /* don't try DDC transfers */
-+static int  vram_remap   __initdata = 0; /* set amount of memory to be used */
-+static int  vram_total   __initdata = 0; /* set total amount of memory */
-+static u16  maxclk       __initdata = 0; /* maximum pixel clock */
-+static u16  maxvf        __initdata = 0; /* maximum vertical frequency */
-+static u16  maxhf        __initdata = 0; /* maximum horizontal frequency */
-+static int  gtf          __initdata = 0; /* forces use of the GTF */
-+static char *mode_option __initdata = NULL;
-+static u16  vbemode      __initdata = 0;
-+
-+/* --------------------------------------------------------------------- */
-+
-+static int vesafb_find_vbe_mode(int xres, int yres, int depth,
-+                              unsigned char flags)
-+{
-+      int i, match = -1, h = 0, d = 0x7fffffff;
-+
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              h = abs(vbe_modes[i].x_res - xres) +
-+                  abs(vbe_modes[i].y_res - yres) +
-+                  abs(depth - vbe_modes[i].depth);
-+              if (h == 0)
-+                      return i;
-+              if (h < d || (h == d && vbe_modes[i].depth > depth)) {
-+                      d = h;
-+                      match = i;
-+              }
-+      }
-+      i = 1;
-+
-+      if (flags & VESAFB_NEED_EXACT_DEPTH && vbe_modes[match].depth != depth)
-+              i = 0;
-+      if (flags & VESAFB_NEED_EXACT_RES && d > 24)
-+              i = 0;
-+      if (i != 0)
-+              return match;
-+      else
-+              return -1;
-+}
-+
-+static int vesafb_pan_display(struct fb_var_screeninfo *var,
-+                              struct fb_info *info)
-+{
-+      int offset;
-+
-+      offset = (var->yoffset * info->fix.line_length + var->xoffset) / 4;
-+
-+      /* It turns out it's not the best idea to do panning via vm86,
-+       * so we only allow it if we have a PMI. */
-+      if (pmi_start) {
-+              __asm__ __volatile__(
-+                      "call *(%%edi)"
-+                      : /* no return value */
-+                      : "a" (0x4f07),         /* EAX */
-+                        "b" (0),              /* EBX */
-+                        "c" (offset),         /* ECX */
-+                        "d" (offset >> 16),   /* EDX */
-+                        "D" (&pmi_start));    /* EDI */
-+      }
-+      return 0;
-+}
-+
-+static int vesafb_blank(int blank, struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int err = 1;
-+
-+      if (vbe_ib.capabilities & VBE_CAP_VGACOMPAT) {
-+              int loop = 10000;
-+              u8 seq = 0, crtc17 = 0;
-+
-+              if (blank == FB_BLANK_POWERDOWN) {
-+                      seq = 0x20;
-+                      crtc17 = 0x00;
-+                      err = 0;
-+              } else {
-+                      seq = 0x00;
-+                      crtc17 = 0x80;
-+                      err = (blank == FB_BLANK_UNBLANK) ? 0 : -EINVAL;
-+              }
-+
-+              vga_wseq(NULL, 0x00, 0x01);
-+              seq |= vga_rseq(NULL, 0x01) & ~0x20;
-+              vga_wseq(NULL, 0x00, seq);
-+
-+              crtc17 |= vga_rcrt(NULL, 0x17) & ~0x80;
-+              while (loop--);
-+              vga_wcrt(NULL, 0x17, crtc17);
-+              vga_wseq(NULL, 0x00, 0x03);
-+      } else {
-+              vesafb_create_task (tsk);
-+              if (!tsk)
-+                      return -ENOMEM;
-+              tsk->regs.eax = 0x4f10;
-+              switch (blank) {
-+              case FB_BLANK_UNBLANK:
-+                      tsk->regs.ebx = 0x0001;
-+                      break;
-+              case FB_BLANK_NORMAL:
-+                      tsk->regs.ebx = 0x0101; /* standby */
-+                      break;
-+              case FB_BLANK_POWERDOWN:
-+                      tsk->regs.ebx = 0x0401; /* powerdown */
-+                      break;
-+              default:
-+                      goto out;
-+              }
-+              tsk->flags = TF_CALL;
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) == 0x004f)
-+                      err = 0;
-+out:          kfree(tsk);
-+      }
-+      return err;
-+}
-+
-+static int vesafb_setpalette(struct vesafb_pal_entry *entries, int count,
-+                           int start, struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int i = ((struct vesafb_par*)info->par)->mode_idx;
-+      int ret = 0;
-+
-+      /* We support palette modifications for 8 bpp modes only, so
-+       * there can never be more than 256 entries. */
-+      if (start + count > 256)
-+              return -EINVAL;
-+
-+      /* Use VGA registers if mode is VGA-compatible. */
-+      if (i >= 0 && i < vbe_modes_cnt &&
-+          vbe_modes[i].mode_attr & VBE_MODE_VGACOMPAT) {
-+              for (i = 0; i < count; i++) {
-+                      outb_p(start + i,        dac_reg);
-+                      outb_p(entries[i].red,   dac_val);
-+                      outb_p(entries[i].green, dac_val);
-+                      outb_p(entries[i].blue,  dac_val);
-+              }
-+      } else if (pmi_setpal) {
-+              __asm__ __volatile__(
-+              "call *(%%esi)"
-+              : /* no return value */
-+              : "a" (0x4f09),         /* EAX */
-+                "b" (0),              /* EBX */
-+                "c" (count),          /* ECX */
-+                "d" (start),          /* EDX */
-+                "D" (entries),        /* EDI */
-+                "S" (&pmi_pal));      /* ESI */
-+      } else {
-+              vesafb_create_task (tsk);
-+              if (!tsk)
-+                      return -ENOMEM;
-+              tsk->regs.eax = 0x4f09;
-+              tsk->regs.ebx = 0x0;
-+              tsk->regs.ecx = count;
-+              tsk->regs.edx = start;
-+              tsk->buf = entries;
-+              tsk->buf_len = sizeof(struct vesafb_pal_entry) * count;
-+              tsk->flags = TF_CALL | TF_BUF_DI;
-+
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+              if ((tsk->regs.eax & 0xffff) != 0x004f)
-+                      ret = 1;
-+              kfree(tsk);
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_setcolreg(unsigned regno, unsigned red, unsigned green,
-+                          unsigned blue, unsigned transp,
-+                          struct fb_info *info)
-+{
-+      struct vesafb_pal_entry entry;
-+      int shift = 16 - info->var.green.length;
-+      int ret = 0;
-+
-+      if (regno >= info->cmap.len)
-+              return -EINVAL;
-+
-+      if (info->var.bits_per_pixel == 8) {
-+              entry.red   = red   >> shift;
-+              entry.green = green >> shift;
-+              entry.blue  = blue  >> shift;
-+              entry.pad   = 0;
-+
-+              ret = vesafb_setpalette(&entry, 1, regno, info);
-+      } else if (regno < 16) {
-+              switch (info->var.bits_per_pixel) {
-+              case 16:
-+                      if (info->var.red.offset == 10) {
-+                              /* 1:5:5:5 */
-+                              ((u32*) (info->pseudo_palette))[regno] =
-+                                              ((red   & 0xf800) >>  1) |
-+                                              ((green & 0xf800) >>  6) |
-+                                              ((blue  & 0xf800) >> 11);
-+                      } else {
-+                              /* 0:5:6:5 */
-+                              ((u32*) (info->pseudo_palette))[regno] =
-+                                              ((red   & 0xf800)      ) |
-+                                              ((green & 0xfc00) >>  5) |
-+                                              ((blue  & 0xf800) >> 11);
-+                      }
-+                      break;
-+
-+              case 24:
-+              case 32:
-+                      red   >>= 8;
-+                      green >>= 8;
-+                      blue  >>= 8;
-+                      ((u32 *)(info->pseudo_palette))[regno] =
-+                              (red   << info->var.red.offset)   |
-+                              (green << info->var.green.offset) |
-+                              (blue  << info->var.blue.offset);
-+                      break;
-+              }
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
-+{
-+      struct vesafb_pal_entry *entries;
-+      int shift = 16 - info->var.green.length;
-+      int i, ret = 0;
-+
-+      if (info->var.bits_per_pixel == 8) {
-+              if (cmap->start + cmap->len > info->cmap.start +
-+                  info->cmap.len || cmap->start < info->cmap.start)
-+                      return -EINVAL;
-+
-+              entries = vmalloc(sizeof(struct vesafb_pal_entry) * cmap->len);
-+              if (!entries)
-+                      return -ENOMEM;
-+              for (i = 0; i < cmap->len; i++) {
-+                      entries[i].red   = cmap->red[i]   >> shift;
-+                      entries[i].green = cmap->green[i] >> shift;
-+                      entries[i].blue  = cmap->blue[i]  >> shift;
-+                      entries[i].pad   = 0;
-+              }
-+              ret = vesafb_setpalette(entries, cmap->len, cmap->start, info);
-+              vfree(entries);
-+      } else {
-+              /* For modes with bpp > 8, we only set the pseudo palette in
-+               * the fb_info struct. We rely on vesafb_setcolreg to do all
-+               * sanity checking. */
-+              for (i = 0; i < cmap->len; i++) {
-+                      ret += vesafb_setcolreg(cmap->start + i, cmap->red[i],
-+                                              cmap->green[i], cmap->blue[i],
-+                                              0, info);
-+              }
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_set_par(struct fb_info *info)
-+{
-+      struct vesafb_par *par = (struct vesafb_par *) info->par;
-+      struct vesafb_task *tsk;
-+      struct vesafb_crtc_ib *crtc = NULL;
-+      struct vesafb_mode_ib *mode = NULL;
-+      int i, err = 0, depth = info->var.bits_per_pixel;
-+
-+      if (depth > 8 && depth != 32)
-+              depth = info->var.red.length + info->var.green.length +
-+                      info->var.blue.length;
-+
-+      i = vesafb_find_vbe_mode(info->var.xres, info->var.yres, depth,
-+                               VESAFB_NEED_EXACT_RES |
-+                               VESAFB_NEED_EXACT_DEPTH);
-+      if (i >= 0)
-+              mode = &vbe_modes[i];
-+      else
-+              return -EINVAL;
-+
-+      vesafb_create_task (tsk);
-+      if (!tsk)
-+              return -ENOMEM;
-+      tsk->regs.eax = 0x4f02;
-+      tsk->regs.ebx = mode->mode_id | 0x4000;         /* use LFB */
-+      tsk->flags = TF_CALL;
-+
-+      if (vbe_ib.vbe_version >= 0x0300 && !nocrtc &&
-+          info->var.pixclock != 0) {
-+              tsk->regs.ebx |= 0x0800;                /* use CRTC data */
-+              tsk->flags |= TF_BUF_DI;
-+              crtc = kmalloc(sizeof(struct vesafb_crtc_ib), GFP_KERNEL);
-+              if (!crtc) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+              crtc->horiz_start = info->var.xres + info->var.right_margin;
-+              crtc->horiz_end   = crtc->horiz_start + info->var.hsync_len;
-+              crtc->horiz_total = crtc->horiz_end + info->var.left_margin;
-+
-+              crtc->vert_start  = info->var.yres + info->var.lower_margin;
-+              crtc->vert_end    = crtc->vert_start + info->var.vsync_len;
-+              crtc->vert_total  = crtc->vert_end + info->var.upper_margin;
-+
-+              crtc->pixel_clock = PICOS2KHZ(info->var.pixclock) * 1000;
-+              crtc->refresh_rate = (u16)(100 * (crtc->pixel_clock /
-+                                   (crtc->vert_total * crtc->horiz_total)));
-+              crtc->flags = 0;
-+
-+              if (info->var.vmode & FB_VMODE_DOUBLE)
-+                      crtc->flags |= 0x1;
-+              if (info->var.vmode & FB_VMODE_INTERLACED)
-+                      crtc->flags |= 0x2;
-+              if (!(info->var.sync & FB_SYNC_HOR_HIGH_ACT))
-+                      crtc->flags |= 0x4;
-+              if (!(info->var.sync & FB_SYNC_VERT_HIGH_ACT))
-+                      crtc->flags |= 0x8;
-+              memcpy(&par->crtc, crtc, sizeof(struct vesafb_crtc_ib));
-+      } else
-+              memset(&par->crtc, 0, sizeof(struct vesafb_crtc_ib));
-+
-+      tsk->buf = (void*)crtc;
-+      tsk->buf_len = sizeof(struct vesafb_crtc_ib);
-+
-+      if (vesafb_queue_task (tsk)) {
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+              printk(KERN_ERR "vesafb: mode switch failed (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      par->mode_idx = i;
-+
-+      /* For 8bpp modes, always try to set the DAC to 8 bits. */
-+      if (vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC &&
-+          mode->bits_per_pixel <= 8) {
-+              vesafb_reset_task(tsk);
-+              tsk->flags = TF_CALL;
-+              tsk->regs.eax = 0x4f08;
-+              tsk->regs.ebx = 0x0800;
-+
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f ||
-+                  ((tsk->regs.ebx & 0xff00) >> 8) != 8) {
-+                      /* We've failed to set the DAC palette format -
-+                       * time to correct var. */
-+                      info->var.red.length    = 6;
-+                      info->var.green.length  = 6;
-+                      info->var.blue.length   = 6;
-+              }
-+      }
-+
-+      info->fix.visual = (info->var.bits_per_pixel == 8) ?
-+                         FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
-+      info->fix.line_length = mode->bytes_per_scan_line;
-+
-+      DPRINTK("set new mode %dx%d-%d (0x%x)\n",
-+              info->var.xres, info->var.yres, info->var.bits_per_pixel,
-+              mode->mode_id);
-+
-+out:  if (crtc != NULL)
-+              kfree(crtc);
-+      kfree(tsk);
-+
-+      return err;
-+}
-+
-+static void vesafb_setup_var(struct fb_var_screeninfo *var, struct fb_info *info,
-+                           struct vesafb_mode_ib *mode)
-+{
-+      var->xres = mode->x_res;
-+      var->yres = mode->y_res;
-+      var->xres_virtual = mode->x_res;
-+      var->yres_virtual = (ypan) ?
-+                            info->fix.smem_len / mode->bytes_per_scan_line :
-+                            mode->y_res;
-+      var->xoffset = 0;
-+      var->yoffset = 0;
-+      var->bits_per_pixel = mode->bits_per_pixel;
-+
-+      if (var->bits_per_pixel == 15)
-+              var->bits_per_pixel = 16;
-+
-+      if (var->bits_per_pixel > 8) {
-+              var->red.offset    = mode->red_off;
-+              var->red.length    = mode->red_len;
-+              var->green.offset  = mode->green_off;
-+              var->green.length  = mode->green_len;
-+              var->blue.offset   = mode->blue_off;
-+              var->blue.length   = mode->blue_len;
-+              var->transp.offset = mode->rsvd_off;
-+              var->transp.length = mode->rsvd_len;
-+
-+              DPRINTK("directcolor: size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n",
-+                      mode->rsvd_len,
-+                      mode->red_len,
-+                      mode->green_len,
-+                      mode->blue_len,
-+                      mode->rsvd_off,
-+                      mode->red_off,
-+                      mode->green_off,
-+                      mode->blue_off);
-+      } else {
-+              var->red.offset    = 0;
-+              var->green.offset  = 0;
-+              var->blue.offset   = 0;
-+              var->transp.offset = 0;
-+
-+              /* We're assuming that we can switch the DAC to 8 bits. If
-+               * this proves to be incorrect, we'll update the fields
-+               * later in set_par(). */
-+              if (vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC) {
-+                      var->red.length    = 8;
-+                      var->green.length  = 8;
-+                      var->blue.length   = 8;
-+                      var->transp.length = 0;
-+              } else {
-+                      var->red.length    = 6;
-+                      var->green.length  = 6;
-+                      var->blue.length   = 6;
-+                      var->transp.length = 0;
-+              }
-+      }
-+}
-+
-+static void inline vesafb_check_limits(struct fb_var_screeninfo *var,
-+                                     struct fb_info *info)
-+{
-+      struct fb_videomode *mode;
-+
-+      if (!var->pixclock)
-+              return;
-+      if (vbe_ib.vbe_version < 0x0300) {
-+              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60, var, info);
-+              return;
-+      }
-+      if (!fb_validate_mode(var, info))
-+              return;
-+      mode = fb_find_best_mode(var, &info->modelist);
-+      if (mode) {
-+              DPRINTK("find_best_mode: %d %d @ %d (vmode: %d)\n",
-+                      mode->xres, mode->yres, mode->refresh, mode->vmode);
-+              if (mode->xres == var->xres && mode->yres == var->yres &&
-+                  !(mode->vmode & (FB_VMODE_INTERLACED | FB_VMODE_DOUBLE))) {
-+                      fb_videomode_to_var(var, mode);
-+                      return;
-+              }
-+      }
-+      if (info->monspecs.gtf && !fb_get_mode(FB_MAXTIMINGS, 0, var, info))
-+              return;
-+      /* Use default refresh rate */
-+      var->pixclock = 0;
-+}
-+
-+static int vesafb_check_var(struct fb_var_screeninfo *var,
-+                          struct fb_info *info)
-+{
-+      int match = -1;
-+      int depth = var->red.length + var->green.length + var->blue.length;
-+
-+      /* Various apps will use bits_per_pixel to set the color depth,
-+       * which is theoretically incorrect, but which we'll try to handle
-+       * here. */
-+      if (depth == 0 || abs(depth - var->bits_per_pixel) >= 8)
-+              depth = var->bits_per_pixel;
-+      match = vesafb_find_vbe_mode(var->xres, var->yres, depth,
-+                                   VESAFB_NEED_EXACT_RES);
-+
-+      if (match == -1) {
-+              DPRINTK("vesafb: mode %dx%d-%d not found\n", var->xres,
-+                      var->yres, depth);
-+              return -EINVAL;
-+      }
-+
-+      vesafb_setup_var(var, info, &vbe_modes[match]);
-+      DPRINTK("found mode 0x%x (%dx%d-%dbpp)\n",
-+              vbe_modes[match].mode_id, vbe_modes[match].x_res,
-+              vbe_modes[match].y_res, vbe_modes[match].depth);
-+
-+      /* Check whether we have remapped enough memory for this mode. */
-+      if (var->yres * vbe_modes[match].bytes_per_scan_line >
-+          info->fix.smem_len) {
-+              return -EINVAL;
-+      }
-+
-+      if ((var->vmode & FB_VMODE_DOUBLE) &&
-+          !(vbe_modes[match].mode_attr & 0x100))
-+              var->vmode &= ~FB_VMODE_DOUBLE;
-+      if ((var->vmode & FB_VMODE_INTERLACED) &&
-+          !(vbe_modes[match].mode_attr & 0x200))
-+              var->vmode &= ~FB_VMODE_INTERLACED;
-+      vesafb_check_limits(var, info);
-+      return 0;
-+}
-+
-+static int vesafb_open(struct fb_info *info, int user)
-+{
-+      struct vesafb_task *tsk = NULL;
-+      struct vesafb_par *par = info->par;
-+      int cnt = atomic_read(&par->ref_count);
-+
-+      if (!cnt) {
-+              vesafb_create_task(tsk);
-+              if (!tsk)
-+                      goto out;
-+
-+              /* Get the VBE state buffer size. We want all available
-+               * hardware state data (CL = 0x0f). */
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0000;
-+              tsk->flags = TF_CALL;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+              
-+              if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+                      printk(KERN_WARNING "vesafb: VBE state buffer size "
-+                              "cannot be determined (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+                      goto out;
-+              }
-+
-+              par->vbe_state_size = 64 * (tsk->regs.ebx & 0xffff);
-+              par->vbe_state = kzalloc(par->vbe_state_size, GFP_KERNEL);
-+              if (!par->vbe_state) 
-+                      goto out;
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0001;
-+              tsk->flags = TF_CALL | TF_BUF_BX | TF_RETURN_BUF;
-+              tsk->buf = (void*)(par->vbe_state);
-+              tsk->buf_len = par->vbe_state_size;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto getstate_failed;
-+              vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+                      printk(KERN_WARNING "vesafb: VBE get state call "
-+                              "failed (eax: 0x%lx)\n", tsk->regs.eax);
-+                      goto getstate_failed;
-+              }
-+      }
-+out:
-+      atomic_inc(&par->ref_count);
-+      if (tsk)
-+              kfree(tsk);
-+      return 0;
-+
-+getstate_failed:
-+      kfree(par->vbe_state);
-+      par->vbe_state = NULL;
-+      par->vbe_state_size = 0;
-+      goto out;
-+}
-+
-+static int vesafb_release(struct fb_info *info, int user)
-+{
-+      struct vesafb_task *tsk = NULL;
-+      struct vesafb_par *par = info->par;
-+      int cnt = atomic_read(&par->ref_count);
-+
-+      if (!cnt)
-+              return -EINVAL;
-+      
-+      if (cnt == 1 && par->vbe_state && par->vbe_state_size) {
-+              vesafb_create_task(tsk);
-+              if (!tsk)
-+                      goto out;
-+
-+              tsk->regs.eax = 0x0003;
-+              tsk->regs.ebx = 0x0000;
-+              tsk->flags = TF_CALL;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0002;
-+              tsk->buf = (void*)(par->vbe_state);
-+              tsk->buf_len = par->vbe_state_size;
-+              tsk->flags = TF_CALL | TF_BUF_BX;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f)
-+                      printk(KERN_WARNING "vesafb: VBE state restore call "
-+                              "failed (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+      }
-+out:
-+      atomic_dec(&par->ref_count);
-+      if (tsk)
-+              kfree(tsk);
-+      return 0;
-+}
-+
-+static int __init vesafb_probe(struct platform_device *device);
-+
-+static struct fb_ops vesafb_ops = {
-+      .owner          = THIS_MODULE,
-+      .fb_open        = vesafb_open,
-+      .fb_release     = vesafb_release,
-+      .fb_setcolreg   = vesafb_setcolreg,
-+      .fb_setcmap     = vesafb_setcmap,
-+      .fb_pan_display = vesafb_pan_display,
-+      .fb_blank       = vesafb_blank,
-+      .fb_fillrect    = cfb_fillrect,
-+      .fb_copyarea    = cfb_copyarea,
-+      .fb_imageblit   = cfb_imageblit,
-+      .fb_check_var   = vesafb_check_var,
-+      .fb_set_par     = vesafb_set_par
-+};
-+
-+static struct platform_driver vesafb_driver = {
-+      .probe  = vesafb_probe,
-+      .driver = {
-+              .name   = "vesafb",
-+      },
-+};
-+
-+static struct platform_device *vesafb_device;
-+ 
-+#ifndef MODULE
-+int __init vesafb_setup(char *options)
-+{
-+      char *this_opt;
-+
-+      if (!options || !*options)
-+              return 0;
-+
-+      DPRINTK("options %s\n",options);
-+
-+      while ((this_opt = strsep(&options, ",")) != NULL) {
-+              if (!*this_opt) continue;
-+
-+              DPRINTK("this_opt: %s\n",this_opt);
-+
-+              if (! strcmp(this_opt, "redraw"))
-+                      ypan=0;
-+              else if (! strcmp(this_opt, "ypan"))
-+                      ypan=1;
-+              else if (! strcmp(this_opt, "ywrap"))
-+                      ypan=2;
-+              else if (! strcmp(this_opt, "vgapal"))
-+                      pmi_setpal=0;
-+              else if (! strcmp(this_opt, "pmipal"))
-+                      pmi_setpal=1;
-+              else if (! strncmp(this_opt, "mtrr:", 5))
-+                      mtrr = simple_strtoul(this_opt+5, NULL, 0);
-+              else if (! strcmp(this_opt, "nomtrr"))
-+                      mtrr=0;
-+              else if (! strcmp(this_opt, "nocrtc"))
-+                      nocrtc=1;
-+              else if (! strcmp(this_opt, "noedid"))
-+                      noedid=1;
-+              else if (! strcmp(this_opt, "noblank"))
-+                      blank=0;
-+              else if (! strcmp(this_opt, "gtf"))
-+                      gtf=1;
-+              else if (! strncmp(this_opt, "vtotal:", 7))
-+                      vram_total = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "vremap:", 7))
-+                      vram_remap = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "maxhf:", 6))
-+                      maxhf = simple_strtoul(this_opt + 6, NULL, 0);
-+              else if (! strncmp(this_opt, "maxvf:", 6))
-+                      maxvf = simple_strtoul(this_opt + 6, NULL, 0);
-+              else if (! strncmp(this_opt, "maxclk:", 7))
-+                      maxclk = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "vbemode:", 8))
-+                      vbemode = simple_strtoul(this_opt + 8, NULL,0);
-+              else if (this_opt[0] >= '0' && this_opt[0] <= '9') {
-+                      DPRINTK("mode_option: %s\n",this_opt);
-+                      mode_option = this_opt;
-+              } else {
-+                      printk(KERN_WARNING
-+                             "vesafb: unrecognized option %s\n", this_opt);
-+              }
-+      }
-+
-+      return 0;
-+}
-+#endif /* !MODULE */
-+
-+static int vesafb_read_proc_modes(char *buf, char **start, off_t offset,
-+                                int len, int *eof, void *private)
-+{
-+      int clen = 0, i;
-+
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              clen += sprintf(buf + clen, "%dx%d-%d\n", vbe_modes[i].x_res,
-+                              vbe_modes[i].y_res, vbe_modes[i].depth);
-+      }
-+      *start = buf + offset;
-+
-+      if (clen > offset) {
-+              clen -= offset;
-+      } else {
-+              clen = 0;
-+      }
-+      return clen;
-+}
-+
-+static int vesafb_read_proc_vbe_info(char *buf, char **start, off_t offset,
-+                                   int len, int *eof, void *private)
-+{
-+      int clen = 0;
-+
-+      clen += sprintf(buf + clen, "Version:    %d.%d\n",
-+                      ((vbe_ib.vbe_version & 0xff00) >> 8),
-+                      vbe_ib.vbe_version & 0xff);
-+      clen += sprintf(buf + clen, "Vendor:     %s\n",
-+                      (char*)vbe_ib.oem_vendor_name_ptr);
-+      clen += sprintf(buf + clen, "Product:    %s\n",
-+                      (char*)vbe_ib.oem_product_name_ptr);
-+      clen += sprintf(buf + clen, "OEM rev:    %s\n",
-+                      (char*)vbe_ib.oem_product_rev_ptr);
-+      clen += sprintf(buf + clen, "OEM string: %s\n",
-+                      (char*)vbe_ib.oem_string_ptr);
-+
-+      *start = buf + offset;
-+
-+      if (clen > offset) {
-+              clen -= offset;
-+      } else {
-+              clen = 0;
-+      }
-+      return clen;
-+}
-+
-+static int __init inline vesafb_vbe_getinfo(struct vesafb_task *tsk)
-+{
-+      tsk->regs.eax = 0x4f00;
-+      tsk->flags = TF_CALL | TF_GETVBEIB;
-+      tsk->buf = &vbe_ib;
-+      tsk->buf_len = sizeof(vbe_ib);
-+      if (vesafb_queue_task (tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if (vbe_ib.vbe_version < 0x0200) {
-+              printk(KERN_ERR "vesafb: Sorry, pre-VBE 2.0 cards are "
-+                              "not supported.\n");
-+              return -EINVAL;
-+      }
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+              printk(KERN_ERR "vesafb: Getting mode info block failed "
-+                              "(eax=0x%x)\n", (u32)tsk->regs.eax);
-+              return -EINVAL;
-+      }
-+
-+      printk(KERN_INFO "vesafb: %s, %s, %s (OEM: %s)\n",
-+              (char*)vbe_ib.oem_vendor_name_ptr,
-+              (char*)vbe_ib.oem_product_name_ptr,
-+              (char*)vbe_ib.oem_product_rev_ptr,
-+              (char*)vbe_ib.oem_string_ptr);
-+
-+      printk(KERN_INFO "vesafb: VBE version: %d.%d\n",
-+                       ((vbe_ib.vbe_version & 0xff00) >> 8),
-+                       vbe_ib.vbe_version & 0xff);
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getmodes(struct vesafb_task *tsk)
-+{
-+      u16 *mode = 0;
-+      int off = 0;
-+
-+      /* Count available modes. */
-+      mode = (u16*)vbe_ib.mode_list_ptr;
-+      while (*mode != 0xffff) {
-+              vbe_modes_cnt++;
-+              mode++;
-+      }
-+
-+      vbe_modes = kmalloc(sizeof(struct vesafb_mode_ib)*
-+                          vbe_modes_cnt, GFP_KERNEL);
-+      if (!vbe_modes)
-+              return -ENOMEM;
-+
-+      /* Get mode info for all available modes. */
-+      mode = (u16*)vbe_ib.mode_list_ptr;
-+
-+      while (*mode != 0xffff) {
-+              struct vesafb_mode_ib *mib;
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f01;
-+              tsk->regs.ecx = (u32) *mode;
-+              tsk->flags = TF_CALL | TF_RETURN_BUF | TF_BUF_DI;
-+              tsk->buf = vbe_modes+off;
-+              tsk->buf_len = sizeof(struct vesafb_mode_ib);
-+              if (vesafb_queue_task(tsk))
-+                      return -EINVAL;
-+              vesafb_wait_for_task(tsk);
-+              mib = p_mode(tsk->buf);
-+              mib->mode_id = *mode;
-+
-+              /* We only want modes that are supported with the currennt
-+               * hardware configuration (D0), color (D3), graphics (D4)
-+               * and that have support for the LFB (D7). */
-+              if ((mib->mode_attr & 0x99) == 0x99 &&
-+                  mib->bits_per_pixel >= 8) {
-+                      off++;
-+              } else {
-+                      vbe_modes_cnt--;
-+              }
-+              mode++;
-+              mib->depth = mib->red_len + mib->green_len + mib->blue_len;
-+              /* Handle 8bpp modes and modes with broken color component
-+               * lengths. */
-+              if (mib->depth == 0 ||
-+                  (mib->depth == 24 && mib->bits_per_pixel == 32))
-+                      mib->depth = mib->bits_per_pixel;
-+      }
-+
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getpmi(struct vesafb_task *tsk)
-+{
-+      int i;
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f0a;
-+      tsk->regs.ebx = 0x0;
-+      tsk->flags = TF_CALL;
-+      if (vesafb_queue_task(tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f || tsk->regs.es < 0xc000) {
-+              pmi_setpal = ypan = 0;
-+      } else {
-+              pmi_base  = (u16*)phys_to_virt(((u32)tsk->regs.es << 4) +
-+                           tsk->regs.edi);
-+              pmi_start = (void*)((char*)pmi_base + pmi_base[1]);
-+              pmi_pal   = (void*)((char*)pmi_base + pmi_base[2]);
-+              printk(KERN_INFO "vesafb: protected mode interface info at "
-+                               "%04x:%04x\n",
-+                               (u16)tsk->regs.es, (u16)tsk->regs.edi);
-+              printk(KERN_INFO "vesafb: pmi: set display start = %p, "
-+                               "set palette = %p\n", pmi_start, pmi_pal);
-+
-+              if (pmi_base[3]) {
-+                      printk(KERN_INFO "vesafb: pmi: ports = ");
-+                      for (i = pmi_base[3]/2; pmi_base[i] != 0xffff; i++)
-+                              printk("%x ",pmi_base[i]);
-+                      printk("\n");
-+
-+                      /*
-+                       * memory areas not supported (yet?)
-+                       *
-+                       * Rules are: we have to set up a descriptor for the
-+                       * requested memory area and pass it in the ES register
-+                       * to the BIOS function.
-+                       */
-+                      if (pmi_base[i] != 0xffff) {
-+                              printk(KERN_INFO "vesafb: can't handle memory "
-+                                               "requests, pmi disabled\n");
-+                              ypan = pmi_setpal = 0;
-+                      }
-+              }
-+      }
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getedid(struct vesafb_task *tsk,
-+                                          struct fb_info *info)
-+{
-+      int res = 0;
-+
-+      if (noedid || vbe_ib.vbe_version < 0x0300)
-+              return -EINVAL;
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f15;
-+      tsk->regs.ebx = 0;
-+      tsk->regs.ecx = 0;
-+      if (vesafb_queue_task(tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f)
-+              return -EINVAL;
-+
-+      if ((tsk->regs.ebx & 0x3) == 3) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports both "
-+                               "DDC1 and DDC2 transfers\n");
-+      } else if ((tsk->regs.ebx & 0x3) == 2) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports DDC2 "
-+                               "transfers\n");
-+      } else if ((tsk->regs.ebx & 0x3) == 1) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports DDC1 "
-+                               "transfers\n");
-+      } else {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware doesn't support "
-+                               "DDC transfers\n");
-+              return -EINVAL;
-+      }
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f15;
-+      tsk->regs.ebx = 1;
-+      tsk->regs.ecx = tsk->regs.edx = 0;
-+      tsk->flags = TF_CALL | TF_RETURN_BUF | TF_BUF_DI;
-+      tsk->buf = kmalloc(EDID_LENGTH, GFP_KERNEL);
-+      tsk->buf_len = EDID_LENGTH;
-+
-+      if (vesafb_queue_task(tsk)) {
-+              res = -EINVAL;
-+              goto out;
-+      }
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) == 0x004f) {
-+              fb_edid_to_monspecs(tsk->buf, &info->monspecs);
-+              fb_videomode_to_modelist(info->monspecs.modedb,
-+                              info->monspecs.modedb_len, &info->modelist);
-+              if (info->monspecs.vfmax && info->monspecs.hfmax) {
-+                      /* If the maximum pixel clock wasn't specified in
-+                       * the EDID block, set it to 300 MHz. */
-+                      if (info->monspecs.dclkmax == 0)
-+                              info->monspecs.dclkmax = 300 * 1000000;
-+                      info->monspecs.gtf = 1;
-+              } else {
-+                      res = -EINVAL;
-+              }
-+      }
-+
-+out:  kfree(tsk->buf);
-+      return res;
-+}
-+
-+static void __init inline vesafb_vbe_getmonspecs(struct vesafb_task *tsk,
-+                                               struct fb_info *info)
-+{
-+      struct fb_var_screeninfo var;
-+      int i;
-+      memset(&info->monspecs, 0, sizeof(struct fb_monspecs));
-+
-+      /* If we didn't get all necessary data from the EDID block,
-+       * mark it as incompatible with the GTF. */
-+      if (vesafb_vbe_getedid(tsk, info))
-+              info->monspecs.gtf = 0;
-+
-+      /* Kernel command line overrides. */
-+      if (maxclk)
-+              info->monspecs.dclkmax = maxclk * 1000000;
-+      if (maxvf)
-+              info->monspecs.vfmax = maxvf;
-+      if (maxhf)
-+              info->monspecs.hfmax = maxhf * 1000;
-+
-+      /* In case DDC transfers are not supported the user can provide
-+       * monitor limits manually. Lower limits are set to "safe" values. */
-+      if (info->monspecs.gtf == 0 && maxclk && maxvf && maxhf) {
-+              info->monspecs.dclkmin = 0;
-+              info->monspecs.vfmin = 60;
-+              info->monspecs.hfmin = 29000;
-+              info->monspecs.gtf = 1;
-+      }
-+
-+      if (info->monspecs.gtf) {
-+              printk(KERN_INFO
-+                      "vesafb: monitor limits: vf = %d Hz, hf = %d kHz, "
-+                      "clk = %d MHz\n", info->monspecs.vfmax,
-+                      (int)(info->monspecs.hfmax / 1000),
-+                      (int)(info->monspecs.dclkmax / 1000000));
-+              /* Add valid VESA video modes to our modelist. */
-+              for (i = 0; i < VESA_MODEDB_SIZE; i++) {
-+                      fb_videomode_to_var(&var, (struct fb_videomode *)
-+                                          &vesa_modes[i]);
-+                      if (!fb_validate_mode(&var, info))
-+                              fb_add_videomode((struct fb_videomode *)
-+                                               &vesa_modes[i],
-+                                               &info->modelist);
-+              }
-+      } else {
-+              /* Add all VESA video modes to our modelist. */
-+              fb_videomode_to_modelist((struct fb_videomode *)vesa_modes,
-+                                       VESA_MODEDB_SIZE, &info->modelist);
-+              printk(KERN_INFO "vesafb: no monitor limits have been set\n");
-+      }
-+      return;
-+}
-+
-+static int __init inline vesafb_vbe_init(struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int res = 0;
-+
-+      vesafb_create_task(tsk);
-+      if (!tsk)
-+              return -EINVAL;
-+      if ((res = vesafb_vbe_getinfo(tsk)) != 0)
-+              goto out;
-+      if ((res = vesafb_vbe_getmodes(tsk)) != 0)
-+              goto out;
-+      if (pmi_setpal || ypan)
-+              vesafb_vbe_getpmi(tsk);
-+
-+      INIT_LIST_HEAD(&info->modelist);
-+      vesafb_vbe_getmonspecs(tsk, info);
-+
-+out:  kfree(tsk);
-+      return res;
-+}
-+
-+static int __init decode_mode(u32 *xres, u32 *yres, u32 *bpp, u32 *refresh)
-+{
-+      int len = strlen(mode_option), i, err = 0;
-+      u8 res_specified = 0, bpp_specified = 0, refresh_specified = 0,
-+         yres_specified = 0;
-+
-+      for (i = len-1; i >= 0; i--) {
-+              switch (mode_option[i]) {
-+              case '@':
-+                      len = i;
-+                      if (!refresh_specified && !bpp_specified &&
-+                          !yres_specified) {
-+                              *refresh = simple_strtoul(&mode_option[i+1],
-+                                                        NULL, 0);
-+                              refresh_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case '-':
-+                      len = i;
-+                      if (!bpp_specified && !yres_specified) {
-+                              *bpp = simple_strtoul(&mode_option[i+1],
-+                                                    NULL, 0);
-+                              bpp_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case 'x':
-+                      if (!yres_specified) {
-+                              *yres = simple_strtoul(&mode_option[i+1],
-+                                                     NULL, 0);
-+                              yres_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case '0'...'9':
-+                      break;
-+              default:
-+                      goto out;
-+              }
-+      }
-+
-+      if (i < 0 && yres_specified) {
-+              *xres = simple_strtoul(mode_option, NULL, 0);
-+              res_specified = 1;
-+      }
-+
-+out:  if (!res_specified || !yres_specified) {
-+              printk(KERN_ERR "vesafb: invalid resolution, "
-+                              "%s not specified\n",
-+                              (!res_specified) ? "width" : "height");
-+              err = -EINVAL;
-+      }
-+
-+      return err;
-+}
-+
-+static int __init vesafb_init_set_mode(struct fb_info *info)
-+{
-+      struct fb_videomode *fbmode;
-+      struct fb_videomode mode;
-+      int i, modeid, refresh = 0;
-+      u8 refresh_specified = 0;
-+
-+      if (!mode_option)
-+              mode_option = CONFIG_FB_VESA_DEFAULT_MODE;
-+
-+      if (vbemode > 0) {
-+              for (i = 0; i < vbe_modes_cnt; i++) {
-+                      if (vbe_modes[i].mode_id == vbemode) {
-+                              info->var.vmode = FB_VMODE_NONINTERLACED;
-+                              info->var.sync = FB_SYNC_VERT_HIGH_ACT;
-+                              vesafb_setup_var(&info->var, info,
-+                                               &vbe_modes[i]);
-+                              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON,
-+                                          60, &info->var, info);
-+                              /* With pixclock set to 0, the default BIOS
-+                               * timings will be used in set_par(). */
-+                              info->var.pixclock = 0;
-+                              modeid = i;
-+                              goto out;
-+                      }
-+              }
-+              printk(KERN_INFO "specified VBE mode %d not found\n",
-+                               vbemode);
-+              vbemode = 0;
-+      }
-+
-+      /* Decode the mode specified on the kernel command line. We save
-+       * the depth into bits_per_pixel, which is wrong, but will work
-+       * anyway. */
-+      if (decode_mode(&info->var.xres, &info->var.yres,
-+                      &info->var.bits_per_pixel, &refresh))
-+              return -EINVAL;
-+      if (refresh)
-+              refresh_specified = 1;
-+      else
-+              refresh = 60;
-+
-+      /* Look for a matching VBE mode. We can live if an exact match
-+       * cannot be found. */
-+      modeid = vesafb_find_vbe_mode(info->var.xres, info->var.yres,
-+                                    info->var.bits_per_pixel, 0);
-+
-+      if (modeid == -1) {
-+              return -EINVAL;
-+      } else {
-+              info->var.vmode = FB_VMODE_NONINTERLACED;
-+              info->var.sync = FB_SYNC_VERT_HIGH_ACT;
-+              vesafb_setup_var(&info->var, info, &vbe_modes[modeid]);
-+      }
-+      if (vbe_ib.vbe_version < 0x0300) {
-+              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60,
-+                          &info->var, info);
-+              goto out;
-+      }
-+      if (!gtf) {
-+              struct fb_videomode tmode;
-+
-+              if (refresh_specified) {
-+                      fb_var_to_videomode(&tmode, &info->var);
-+                      tmode.refresh = refresh;
-+                      fbmode = fb_find_nearest_mode(&tmode, 
-+                                                    &info->modelist);
-+              } else
-+                      fbmode = fb_find_best_mode(&info->var, 
-+                                                 &info->modelist);
-+
-+              if (fbmode->xres == info->var.xres &&
-+                  fbmode->yres == info->var.yres &&
-+                  !(fbmode->vmode & (FB_VMODE_INTERLACED | FB_VMODE_DOUBLE))
-+                  && (!refresh_specified || 
-+                  abs(refresh - fbmode->refresh) <= 5)) {
-+                      fb_videomode_to_var(&info->var, fbmode);
-+                      return modeid;
-+              }
-+      }
-+      i = FB_MAXTIMINGS;
-+      if (!info->monspecs.gtf)
-+              i = FB_IGNOREMON | FB_VSYNCTIMINGS;
-+      else if (refresh_specified)
-+              i = FB_VSYNCTIMINGS;
-+      if (!fb_get_mode(i, refresh, &info->var, info))
-+              goto out;
-+      if (info->monspecs.gtf &&
-+          !fb_get_mode(FB_MAXTIMINGS, 0, &info->var, info))
-+              goto out;
-+      /* Use default refresh rate */
-+      printk(KERN_WARNING "vesafb: using default BIOS refresh rate\n");
-+      info->var.pixclock = 0;
-+
-+out:
-+      fb_var_to_videomode(&mode, &info->var);
-+      fb_add_videomode(&mode, &info->modelist);
-+      return modeid;
-+}
-+
-+static int __init vesafb_probe(struct platform_device *dev)
-+{
-+      char entry[16];
-+      struct fb_info *info;
-+      struct vesafb_mode_ib *mode = NULL;
-+      int err = 0, i, h;
-+      unsigned int size_vmode;
-+      unsigned int size_remap;
-+      unsigned int size_total;
-+
-+      vesafb_info = info = framebuffer_alloc(sizeof(struct vesafb_par) +
-+                                             sizeof(u32) * 256, &dev->dev);
-+      if (!info)
-+              return -ENOMEM;
-+
-+      if (vesafb_wait_for_thread()) {
-+              printk(KERN_ERR "vesafb: vesafb thread not running\n");
-+              framebuffer_release(info);
-+              return -EINVAL;
-+      }
-+
-+      if (vesafb_vbe_init(info)) {
-+              printk(KERN_ERR "vesafb: vbe_init failed\n");
-+              err = -EINVAL;
-+              goto out;
-+      }
-+
-+      vesafb_fix.ypanstep  = ypan     ? 1 : 0;
-+      vesafb_fix.ywrapstep = (ypan>1) ? 1 : 0;
-+
-+      info->pseudo_palette = ((u8*)info->par + sizeof(struct vesafb_par));
-+      info->fbops = &vesafb_ops;
-+      info->var = vesafb_defined;
-+      info->fix = vesafb_fix;
-+
-+      if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
-+              err = -ENXIO;
-+              goto out;
-+      }
-+
-+      i = vesafb_init_set_mode(info);
-+      if (i < 0) {
-+              err = -EINVAL;
-+              goto out_cmap;
-+      } else
-+              mode = &vbe_modes[i];
-+
-+      /* Disable blanking if the user requested so. */
-+      if (!blank) {
-+              info->fbops->fb_blank = NULL;
-+      }
-+
-+      /* Find out how much IO memory is required for the mode with
-+       * the highest resolution. */
-+      size_remap = 0;
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              h = vbe_modes[i].bytes_per_scan_line * vbe_modes[i].y_res;
-+              if (h > size_remap)
-+                      size_remap = h;
-+      }
-+      size_remap *= 2;
-+
-+      /*   size_vmode -- that is the amount of memory needed for the
-+       *                 used video mode, i.e. the minimum amount of
-+       *                 memory we need. */
-+      if (mode != NULL) {
-+              size_vmode = info->var.yres * mode->bytes_per_scan_line;
-+      } else {
-+              size_vmode = info->var.yres * info->var.xres *
-+                           ((info->var.bits_per_pixel + 7) >> 3);
-+      }
-+
-+      /*   size_total -- all video memory we have. Used for mtrr
-+       *                 entries, ressource allocation and bounds
-+       *                 checking. */
-+      size_total = vbe_ib.total_memory * 65536;
-+      if (vram_total)
-+              size_total = vram_total * 1024 * 1024;
-+      if (size_total < size_vmode)
-+              size_total = size_vmode;
-+      ((struct vesafb_par*)(info->par))->mem_total = size_total;
-+
-+      /*   size_remap -- the amount of video memory we are going to
-+       *                 use for vesafb.  With modern cards it is no
-+       *                 option to simply use size_total as th
-+       *                 wastes plenty of kernel address space. */
-+      if (vram_remap)
-+              size_remap = vram_remap * 1024 * 1024;
-+      if (size_remap < size_vmode)
-+              size_remap = size_vmode;
-+      if (size_remap > size_total)
-+              size_remap = size_total;
-+
-+      info->fix.smem_len = size_remap;
-+      info->fix.smem_start = mode->phys_base_ptr;
-+
-+      /* We have to set it here, because when setup_var() was called,
-+       * smem_len wasn't defined yet. */
-+      info->var.yres_virtual = info->fix.smem_len /
-+                               mode->bytes_per_scan_line;
-+
-+      if (ypan && info->var.yres_virtual > info->var.yres) {
-+              printk(KERN_INFO "vesafb: scrolling: %s "
-+                     "using protected mode interface, "
-+                     "yres_virtual=%d\n",
-+                     (ypan > 1) ? "ywrap" : "ypan",info->var.yres_virtual);
-+      } else {
-+              printk(KERN_INFO "vesafb: scrolling: redraw\n");
-+              info->var.yres_virtual = info->var.yres;
-+              ypan = 0;
-+      }
-+
-+      info->flags = FBINFO_FLAG_DEFAULT |
-+              (ypan) ? FBINFO_HWACCEL_YPAN : 0;
-+
-+      if (!ypan)
-+              info->fbops->fb_pan_display = NULL;
-+
-+      if (!request_mem_region(info->fix.smem_start, size_total, "vesafb")) {
-+              printk(KERN_WARNING "vesafb: cannot reserve video memory at "
-+                     "0x%lx\n", info->fix.smem_start);
-+              /* We cannot make this fatal. Sometimes this comes from magic
-+                 spaces our resource handlers simply don't know about. */
-+      }
-+
-+      info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len);
-+
-+      if (!info->screen_base) {
-+              printk(KERN_ERR
-+                     "vesafb: abort, cannot ioremap video memory "
-+                     "0x%x @ 0x%lx\n",
-+                     info->fix.smem_len, info->fix.smem_start);
-+              err = -EIO;
-+              goto out_mem;
-+      }
-+
-+      /* Request failure does not faze us, as vgacon probably has this
-+         region already (FIXME) */
-+      request_region(0x3c0, 32, "vesafb");
-+
-+#ifdef CONFIG_MTRR
-+      if (mtrr && !(info->fix.smem_start & (PAGE_SIZE - 1))) {
-+              int temp_size = size_total;
-+              unsigned int type = 0;
-+
-+              switch (mtrr) {
-+              case 1:
-+                      type = MTRR_TYPE_UNCACHABLE;
-+                      break;
-+              case 2:
-+                      type = MTRR_TYPE_WRBACK;
-+                      break;
-+              case 3:
-+                      type = MTRR_TYPE_WRCOMB;
-+                      break;
-+              case 4:
-+                      type = MTRR_TYPE_WRTHROUGH;
-+                      break;
-+              default:
-+                      type = 0;
-+                      break;
-+              }
-+
-+              if (type) {
-+                      int rc;
-+
-+                      /* Find the largest power-of-two */
-+                      while (temp_size & (temp_size - 1))
-+                              temp_size &= (temp_size - 1);
-+
-+                      /* Try and find a power of two to add */
-+                      do {
-+                              rc = mtrr_add(info->fix.smem_start,
-+                                            temp_size, type, 1);
-+                              temp_size >>= 1;
-+                      } while (temp_size >= PAGE_SIZE && rc == -EINVAL);
-+              }
-+      }
-+#endif /* CONFIG_MTRR */
-+
-+      if (register_framebuffer(info) < 0) {
-+              printk(KERN_ERR
-+                     "vesafb: failed to register framebuffer device\n");
-+              err = -EINVAL;
-+              goto out_mem;
-+      }
-+
-+      printk(KERN_INFO "vesafb: framebuffer at 0x%lx, mapped to 0x%p, "
-+             "using %dk, total %dk\n", info->fix.smem_start,
-+             info->screen_base, size_remap/1024, size_total/1024);
-+      printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node,
-+             info->fix.id);
-+
-+      sprintf(entry, "fb%d", info->node);
-+      proc_mkdir(entry, 0);
-+
-+      sprintf(entry, "fb%d/modes", info->node);
-+      create_proc_read_entry(entry, 0, 0, vesafb_read_proc_modes, NULL);
-+
-+      sprintf(entry, "fb%d/vbe_info", info->node);
-+      create_proc_read_entry(entry, 0, 0, vesafb_read_proc_vbe_info, NULL);
-+      return 0;
-+
-+out_mem:
-+      release_mem_region(info->fix.smem_start, size_total);
-+      if (!list_empty(&info->modelist))
-+              fb_destroy_modelist(&info->modelist);
-+      fb_destroy_modedb(info->monspecs.modedb);
-+out_cmap:
-+      fb_dealloc_cmap(&info->cmap);
-+out:
-+      framebuffer_release(info);
-+      vesafb_info = NULL;
-+      kfree(vbe_modes);
-+      vbe_modes = NULL;
-+      return err;
-+}
-+
-+int __init vesafb_init(void)
-+{
-+      int ret;
-+#ifndef MODULE
-+      char *option = NULL;
-+
-+      if (fb_get_options("vesafb", &option))
-+              return -ENODEV;
-+      vesafb_setup(option);
-+#endif
-+      ret = platform_driver_register(&vesafb_driver);
-+
-+      if (!ret) {
-+              vesafb_device = platform_device_alloc("vesafb", 0);
-+
-+              if (vesafb_device)
-+                      ret = platform_device_add(vesafb_device);
-+              else
-+                      ret = -ENOMEM;
-+
-+              if (ret) {
-+                      platform_device_put(vesafb_device);
-+                      platform_driver_unregister(&vesafb_driver);
-+              }
-+      }
-+      return ret;
-+}
-+
-+module_init(vesafb_init);
-+
-+#ifdef MODULE
-+void __exit vesafb_exit(void)
-+{
-+      char entry[16];
-+
-+      if (vesafb_info)
-+              unregister_framebuffer(vesafb_info);
-+
-+      platform_device_unregister(vesafb_device);
-+      platform_driver_unregister(&vesafb_driver);
-+
-+      if (vesafb_info) {
-+              struct vesafb_par *par = (struct vesafb_par*)vesafb_info->par;
-+
-+              sprintf(entry, "fb%d/modes", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              sprintf(entry, "fb%d/vbe_info", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              sprintf(entry, "fb%d", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              iounmap(vesafb_info->screen_base);
-+              release_mem_region(vesafb_info->fix.smem_start,
-+                                 par->mem_total);
-+              fb_dealloc_cmap(&vesafb_info->cmap);
-+              if (!list_empty(&vesafb_info->modelist))
-+                      fb_destroy_modelist(&vesafb_info->modelist);
-+              fb_destroy_modedb(vesafb_info->monspecs.modedb);
-+              framebuffer_release(vesafb_info);
-+      }
-+
-+      if (vbe_modes != NULL)
-+              kfree(vbe_modes);
-+}
-+
-+module_exit(vesafb_exit);
-+
-+static inline int param_get_scroll(char *buffer, struct kernel_param *kp)
-+{
-+      return 0;
-+}
-+static inline int param_set_scroll(const char *val, struct kernel_param *kp)
-+{
-+      ypan = 0;
-+
-+      if (! strcmp(val, "redraw"))
-+              ypan = 0;
-+      else if (! strcmp(val, "ypan"))
-+              ypan = 1;
-+      else if (! strcmp(val, "ywrap"))
-+              ypan = 2;
-+
-+      return 0;
-+}
-+
-+#define param_check_scroll(name, p) __param_check(name, p, void);
-+
-+module_param_named(scroll, ypan, scroll, 0);
-+MODULE_PARM_DESC(scroll,"Scrolling mode, set to 'redraw', 'ypan' or 'ywrap'");
-+module_param_named(vgapal, pmi_setpal, invbool, 0);
-+MODULE_PARM_DESC(vgapal,"bool: set palette using VGA registers");
-+module_param_named(pmipal, pmi_setpal, bool, 0);
-+MODULE_PARM_DESC(pmipal,"bool: set palette using PMI calls");
-+module_param_named(nomtrr, mtrr, invbool, 0);
-+MODULE_PARM_DESC(nomtrr,"bool: disable use of MTRR registers");
-+module_param(blank, bool, 1);
-+MODULE_PARM_DESC(blank,"bool: enable hardware blanking");
-+module_param(nocrtc, bool, 0);
-+MODULE_PARM_DESC(nocrtc,"bool: ignore CRTC timings when setting modes");
-+module_param(noedid, bool, 0);
-+MODULE_PARM_DESC(noedid,"bool: ignore EDID-provided monitor limits "
-+                      "when setting modes");
-+module_param(gtf, bool, 0);
-+MODULE_PARM_DESC(gtf,"bool: force use of VESA GTF to calculate mode timings");
-+module_param(vram_remap, uint, 0);
-+MODULE_PARM_DESC(vram_remap,"Set amount of video memory to be used [MiB]");
-+module_param(vram_total, uint, 0);
-+MODULE_PARM_DESC(vram_total,"Set total amount of video memoery [MiB]");
-+module_param(maxclk, ushort, 0);
-+MODULE_PARM_DESC(maxclk,"Maximum pixelclock [MHz], overrides EDID data");
-+module_param(maxhf, ushort, 0);
-+MODULE_PARM_DESC(maxhf,"Maximum horizontal frequency [kHz], "
-+                     "overrides EDID data");
-+module_param(maxvf, ushort, 0);
-+MODULE_PARM_DESC(maxvf,"Maximum vertical frequency [Hz], "
-+                     "overrides EDID data");
-+module_param_named(mode, mode_option, charp, 0);
-+MODULE_PARM_DESC(mode, "Specify resolution as "
-+                     "\"<xres>x<yres>[-<bpp>][@<refresh>]\"");
-+module_param(vbemode, ushort, 0);
-+MODULE_PARM_DESC(vbemode,"VBE mode number to set, overrides 'mode' setting");
-+
-+#endif /* MODULE */
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Michal Januszewski");
-+MODULE_DESCRIPTION("Framebuffer driver for VBE2.0+ compliant graphics boards");
-+
---- linux-2.6.17.orig/include/linux/sched.h
-+++ linux-2.6.17/include/linux/sched.h
-@@ -1159,6 +1159,8 @@ extern void mmput(struct mm_struct *);
- extern struct mm_struct *get_task_mm(struct task_struct *task);
- /* Remove the current tasks stale references to the old mm_struct */
- extern void mm_release(struct task_struct *, struct mm_struct *);
-+/* Create a new mm for a kernel thread */
-+extern int set_new_mm(void);
- extern int  copy_thread(int, unsigned long, unsigned long, unsigned long, struct task_struct *, struct pt_regs *);
- extern void flush_thread(void);
---- /dev/null
-+++ linux-2.6.17/include/video/vesa.h
-@@ -0,0 +1,150 @@
-+#if 0
-+#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , \
-+                                                ## args)
-+#else
-+#define DPRINTK(fmt, args...)
-+#endif
-+
-+#define p_crtc(arg) ((struct vesafb_crtc_ib*)(arg))
-+#define p_vbe(arg)  ((struct vesafb_vbe_ib*)(arg))
-+#define p_mode(arg) ((struct vesafb_mode_ib*)(arg))
-+
-+struct vesafb_task {
-+      u8 flags;
-+      void *buf;
-+      int buf_len;
-+      struct vm86_regs regs;
-+      struct list_head node;
-+      struct completion done;
-+};
-+
-+/* Vesafb task flags and masks */
-+#define TF_CALL               0x00
-+#define TF_EXIT               0x01
-+#define TF_GETVBEIB   0x02
-+#define TF_BUF_DI     0x04
-+#define TF_BUF_BX     0x08
-+#define TF_RETURN_BUF 0x10
-+
-+/* Macros and functions for manipulating vesafb tasks */
-+#define vesafb_create_task(task)                              \
-+do {                                                          \
-+      task = kmalloc(sizeof(struct vesafb_task), GFP_ATOMIC); \
-+      if (task)                                               \
-+              memset(task, 0, sizeof(struct vesafb_task));    \
-+      init_completion(&task->done);                           \
-+} while (0)
-+
-+#define vesafb_wait_for_task(task)    wait_for_completion(&task->done);
-+#define vesafb_reset_task(task)               init_completion(&task->done);
-+int vesafb_queue_task(struct vesafb_task *task);
-+
-+/* Functions for controlling the vesafb thread */
-+int vesafb_wait_for_thread(void);
-+
-+#define VBE_CAP_CAN_SWITCH_DAC        0x01
-+#define VBE_CAP_VGACOMPAT     0x02
-+
-+/* This struct is 512 bytes long */
-+struct vesafb_vbe_ib {
-+      char vbe_signature[4];
-+      u16  vbe_version;
-+      u32  oem_string_ptr;
-+      u32  capabilities;
-+      u32  mode_list_ptr;
-+      u16  total_memory;
-+      u16  oem_software_rev;
-+      u32  oem_vendor_name_ptr;
-+      u32  oem_product_name_ptr;
-+      u32  oem_product_rev_ptr;
-+      u8   reserved[222];
-+      char oem_data[256];
-+} __attribute__ ((packed));
-+
-+struct vesafb_crtc_ib {
-+      u16 horiz_total;
-+      u16 horiz_start;
-+      u16 horiz_end;
-+      u16 vert_total;
-+      u16 vert_start;
-+      u16 vert_end;
-+      u8  flags;
-+      u32 pixel_clock;
-+      u16 refresh_rate;
-+      u8  reserved[40];
-+} __attribute__ ((packed));
-+
-+#define VBE_MODE_VGACOMPAT    0x20
-+
-+struct vesafb_mode_ib {
-+      /* for all VBE revisions */
-+      u16 mode_attr;
-+      u8  winA_attr;
-+      u8  winB_attr;
-+      u16 win_granularity;
-+      u16 win_size;
-+      u16 winA_seg;
-+      u16 winB_seg;
-+      u32 win_func_ptr;
-+      u16 bytes_per_scan_line;
-+
-+      /* for VBE 1.2+ */
-+      u16 x_res;
-+      u16 y_res;
-+      u8  x_char_size;
-+      u8  y_char_size;
-+      u8  planes;
-+      u8  bits_per_pixel;
-+      u8  banks;
-+      u8  memory_model;
-+      u8  bank_size;
-+      u8  image_pages;
-+      u8  reserved1;
-+
-+      /* Direct color fields for direct/6 and YUV/7 memory models. */
-+      /* Offsets are bit positions of lsb in the mask. */
-+      u8  red_len;
-+      u8  red_off;
-+      u8  green_len;
-+      u8  green_off;
-+      u8  blue_len;
-+      u8  blue_off;
-+      u8  rsvd_len;
-+      u8  rsvd_off;
-+      u8  direct_color_info;  /* direct color mode attributes */
-+
-+      /* for VBE 2.0+ */
-+      u32 phys_base_ptr;
-+      u8  reserved2[6];
-+
-+      /* for VBE 3.0+ */
-+      u16 lin_bytes_per_scan_line;
-+      u8  bnk_image_pages;
-+      u8  lin_image_pages;
-+      u8  lin_red_len;
-+      u8  lin_red_off;
-+      u8  lin_green_len;
-+      u8  lin_green_off;
-+      u8  lin_blue_len;
-+      u8  lin_blue_off;
-+      u8  lin_rsvd_len;
-+      u8  lin_rsvd_off;
-+      u32 max_pixel_clock;
-+      u16 mode_id;
-+      u8  depth;
-+} __attribute__ ((packed));
-+
-+struct vesafb_pal_entry {
-+      u_char blue, green, red, pad;
-+} __attribute__ ((packed));
-+
-+struct vesafb_par {
-+      u8 *vbe_state;
-+      int vbe_state_size;
-+      atomic_t ref_count;
-+      
-+      u32 mem_total;
-+      int mode_idx;
-+      struct vesafb_crtc_ib crtc;
-+};
-+
---- linux-2.6.17.orig/kernel/fork.c
-+++ linux-2.6.17/kernel/fork.c
-@@ -97,6 +97,7 @@ kmem_cache_t *fs_cachep;
- /* SLAB cache for vm_area_struct structures */
- kmem_cache_t *vm_area_cachep;
-+EXPORT_SYMBOL_GPL(vm_area_cachep);
- /* SLAB cache for mm_struct structures (tsk->mm) */
- static kmem_cache_t *mm_cachep;
-@@ -383,6 +384,40 @@ void mmput(struct mm_struct *mm)
- EXPORT_SYMBOL_GPL(mmput);
- /**
-+ * set_new_mm - allocate, init and activate a new mm for a kernel thread
-+ */
-+int set_new_mm(void)
-+{
-+      struct mm_struct *mm;
-+      struct task_struct *tsk = current;
-+      struct mm_struct *active_mm;
-+
-+      mm = mm_alloc();
-+      if (!mm)
-+              goto fail_nomem;
-+      if (init_new_context(current,mm))
-+              goto fail_nocontext;
-+
-+      task_lock(tsk);
-+      tsk->flags |= PF_BORROWED_MM;   
-+      active_mm = tsk->active_mm;
-+      current->mm = mm;
-+      current->active_mm = mm;
-+      activate_mm(active_mm, mm);
-+      task_unlock(current);
-+
-+      /* Drop the previous active_mm */
-+      mmdrop(active_mm);
-+      return 0;
-+      
-+fail_nocontext:
-+      mmdrop(mm);
-+fail_nomem:
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL_GPL(set_new_mm);
-+
-+/**
-  * get_task_mm - acquire a reference to the task's mm
-  *
-  * Returns %NULL if the task has no mm.  Checks PF_BORROWED_MM (meaning
---- linux-2.6.17.orig/mm/memory.c
-+++ linux-2.6.17/mm/memory.c
-@@ -1162,6 +1162,7 @@ int zeromap_page_range(struct vm_area_st
-       } while (pgd++, addr = next, addr != end);
-       return err;
- }
-+EXPORT_SYMBOL_GPL(zeromap_page_range);
- pte_t * fastcall get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)
- {
---- linux-2.6.17.orig/mm/mmap.c
-+++ linux-2.6.17/mm/mmap.c
-@@ -1996,6 +1996,7 @@ int insert_vm_struct(struct mm_struct * 
-       vma_link(mm, vma, prev, rb_link, rb_parent);
-       return 0;
- }
-+EXPORT_SYMBOL_GPL(insert_vm_struct);
- /*
-  * Copy the vma structure to a new location in the same mm,
diff --git a/meta/packages/linux/linux-rp-2.6.17/wm9712-reset-loop-r2.patch b/meta/packages/linux/linux-rp-2.6.17/wm9712-reset-loop-r2.patch
deleted file mode 100644 (file)
index 96919b6..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
- sound/soc/codecs/wm9712.c |   28 ++++++++++++++++++----------
- 1 file changed, 18 insertions(+), 10 deletions(-)
-
-Index: linux-2.6.18/sound/soc/codecs/wm9712.c
-===================================================================
---- linux-2.6.18.orig/sound/soc/codecs/wm9712.c        2006-12-05 23:25:33.000000000 +0000
-+++ linux-2.6.18/sound/soc/codecs/wm9712.c     2006-12-05 23:27:20.000000000 +0000
-@@ -618,18 +618,26 @@ static int wm9712_dapm_event(struct snd_
- static int wm9712_reset(struct snd_soc_codec *codec, int try_warm)
- {
--      if (try_warm && soc_ac97_ops.warm_reset) {
--              soc_ac97_ops.warm_reset(codec->ac97);
--              if (!(ac97_read(codec, 0) & 0x8000))
--                      return 1;
--      }
-+      int retry = 3;
-+ 
-+      while (retry--)
-+      {
-+              if(try_warm && soc_ac97_ops.warm_reset) {
-+                      soc_ac97_ops.warm_reset(codec->ac97);
-+                      if(ac97_read(codec, 0) & 0x8000)
-+                              continue;
-+                      else
-+                              return 1;
-+              }
--      soc_ac97_ops.reset(codec->ac97);
--      if (ac97_read(codec, 0) & 0x8000)
--              goto err;
--      return 0;
-+              soc_ac97_ops.reset(codec->ac97);
-+              if(ac97_read(codec, 0) & 0x8000)
-+                      continue;
-+              else
-+                      return 0;
-+
-+      }
--err:
-       printk(KERN_ERR "WM9712 AC97 reset failed\n");
-       return -EIO;
- }
diff --git a/meta/packages/linux/linux-rp-2.6.17/wm9712-suspend-cold-res-r2.patch b/meta/packages/linux/linux-rp-2.6.17/wm9712-suspend-cold-res-r2.patch
deleted file mode 100644 (file)
index e91e54f..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
- sound/soc/codecs/wm9712.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-Index: linux-2.6.18/sound/soc/codecs/wm9712.c
-===================================================================
---- linux-2.6.18.orig/sound/soc/codecs/wm9712.c        2006-12-05 23:19:53.000000000 +0000
-+++ linux-2.6.18/sound/soc/codecs/wm9712.c     2006-12-05 23:22:04.000000000 +0000
-@@ -651,7 +651,7 @@ static int wm9712_soc_resume(struct plat
-       int i, ret;
-       u16 *cache = codec->reg_cache;
--      ret = wm9712_reset(codec, 1);
-+      ret = wm9712_reset(codec, 0);
-       if (ret < 0){
-               printk(KERN_ERR "could not reset AC97 codec\n");
-               return ret;
diff --git a/meta/packages/linux/linux-rp-2.6.17/wm97xx-lcdnoise-r0.patch b/meta/packages/linux/linux-rp-2.6.17/wm97xx-lcdnoise-r0.patch
deleted file mode 100644 (file)
index 191de3a..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-Index: linux-tosa/drivers/input/touchscreen/wm9712.c
-===================================================================
---- linux-tosa.orig/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/drivers/input/touchscreen/wm9712.c      2006-08-29 16:52:50.923275896 +0100
-@@ -1,7 +1,7 @@
- /*
-  * wm9712.c  --  Codec driver for Wolfson WM9712 AC97 Codecs.
-  *
-- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC.
-  * Author: Liam Girdwood
-  *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-  * Parts Copyright : Ian Molton <spyro@f2s.com>
-@@ -13,6 +13,12 @@
-  *  Free Software Foundation;  either version 2 of the  License, or (at your
-  *  option) any later version.
-  *
-+ *  Revision history
-+ *     4th Jul 2005  Initial version.
-+ *    29th Aug 2006  Mike Arthur <mike@mikearthur.co.uk>
-+ *                   Added fixes for Sharp SL-6000 (Tosa) LCD noise causing
-+ *                   touchscreen interference.
-+ *
-  */
- #include <linux/module.h>
-@@ -28,6 +34,10 @@
- #define WM9705_VERSION                "0.60"
- #define DEFAULT_PRESSURE      0xb0c0
-+#define CCNT(a)     asm volatile ("mrc p14, 0, %0, C1, C1, 0" : "=r"(a))
-+#define CCNT_ON()   asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1))
-+#define CCNT_OFF()  asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1))
-+
- /*
-  * Debug
-  */
-@@ -243,6 +253,36 @@
-       return wm->dig[2] & WM9712_PDEN;
- }
-+
-+#ifdef CONFIG_MACH_TOSA
-+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait
-+ * before sampling the Y axis of the touchscreen */
-+static inline void wm9712_lcd_sync_on(struct wm97xx* wm, int adcsel) {
-+    unsigned long timer1 = 0, timer2 = 0, wait_time = 0;
-+    if (adcsel == WM97XX_ADCSEL_Y) {
-+        wait_time = wm97xx_calc_lcd_waittime(wm);
-+
-+        CCNT_ON();
-+
-+        if (wait_time) {
-+            /* wait for LCD rising edge */
-+            wm_machinfo->wait_hsync();
-+            /* get clock */
-+            CCNT(timer1);
-+            CCNT(timer2);
-+
-+            while ((timer2 - timer1) < wait_time) {
-+                CCNT(timer2);
-+            }
-+        }
-+    }
-+}
-+
-+static inline void wm9712_lcd_sync_off(void) {
-+    CCNT_OFF();
-+}
-+#endif
-+
- /*
-  * Read a sample from the WM9712 adc in polling mode.
-  */
-@@ -260,6 +300,9 @@
-       /* set up digitiser */
-       if (adcsel & 0x8000)
-               adcsel = ((adcsel & 0x7fff) + 3) << 12;
-+    #ifdef CONFIG_MACH_TOSA
-+    wm9712_lcd_sync_on(wm, adcsel);
-+    #endif
-       wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay));
-       
-       /* wait 3 AC97 time slots + delay for conversion */
-@@ -282,6 +325,10 @@
-       
-       *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD);
-       
-+    #ifdef CONFIG_MACH_TOSA
-+    wm9712_lcd_sync_off();
-+    #endif
-+
-       /* check we have correct sample */
-       if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) {
-               dbg ("adc wrong sample, read %x got %x", adcsel,
-@@ -303,11 +350,12 @@
- static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data)
- {
-       int rc;
--      
-       if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID)
-               return rc;
-+
-       if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID)
-               return rc;
-+
-       if (pil && !five_wire) {
-               if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID)
-                       return rc;
-Index: linux-tosa/drivers/input/touchscreen/wm97xx-core.c
-===================================================================
---- linux-tosa.orig/drivers/input/touchscreen/wm97xx-core.c    2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:50.924275744 +0100
-@@ -2,7 +2,7 @@
-  * wm97xx-core.c  --  Touch screen driver core for Wolfson WM9705, WM9712
-  *                           and WM9713 AC97 Codecs.
-  *
-- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC.
-  * Author: Liam Girdwood
-  *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-  * Parts Copyright : Ian Molton <spyro@f2s.com>
-@@ -67,6 +67,9 @@
-  *                   GPIOs) and 2.6 power management. 
-  *    29th Nov 2004  Added WM9713 support.
-  *     4th Jul 2005  Moved codec specific code out to seperate files.
-+ *    29th Aug 2006  Mike Arthur <mike@mikearthur.co.uk>
-+ *                   Added fixes for Sharp SL-6000 (Tosa) LCD noise causing
-+ *                   touchscreen interference.
-  */  
-     
- #include <linux/module.h>
-@@ -94,6 +97,7 @@
- static DECLARE_MUTEX(gpio_sem);
- static LIST_HEAD(wm97xx_misc_list);
- static struct wm97xx* wm_codec = NULL;
-+struct wm97xx_machinfo *wm_machinfo;
- /*
-  * WM97xx - enable/disable AUX ADC sysfs 
-@@ -832,6 +836,23 @@
-               mdev->remove(wm_codec);
- }
-+#ifdef CONFIG_MACH_TOSA
-+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait
-+ * before sampling the Y axis of the touchscreen */
-+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm) {
-+    unsigned long hsync_time = wm_machinfo->get_hsync_time();
-+    return hsync_time;
-+}
-+
-+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo) {
-+    wm_machinfo = machinfo;
-+}
-+
-+void wm97xx_unset_machinfo() {
-+    wm_machinfo = NULL;
-+}
-+#endif
-+
- static struct device_driver wm97xx_driver = {
-       .name =         "ac97", 
-       .bus =          &ac97_bus_type, 
-@@ -861,6 +882,9 @@
- EXPORT_SYMBOL_GPL(wm97xx_reg_write);
- EXPORT_SYMBOL_GPL(wm97xx_register_misc_dev);
- EXPORT_SYMBOL_GPL(wm97xx_unregister_misc_dev);
-+EXPORT_SYMBOL_GPL(wm97xx_calc_lcd_waittime);
-+EXPORT_SYMBOL_GPL(wm97xx_set_machinfo);
-+EXPORT_SYMBOL_GPL(wm97xx_unset_machinfo);
- module_init(wm97xx_init); 
- module_exit(wm97xx_exit);
-Index: linux-tosa/include/linux/wm97xx.h
-===================================================================
---- linux-tosa.orig/include/linux/wm97xx.h     2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/include/linux/wm97xx.h  2006-08-29 16:52:50.924275744 +0100
-@@ -207,6 +207,7 @@
- struct wm97xx;
- extern struct wm97xx_codec_drv wm97xx_codec;
-+extern struct wm97xx_machinfo *wm_machinfo;
- /*
-  * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs
-@@ -253,6 +254,11 @@
-       struct list_head list;
- };
-+struct wm97xx_machinfo {
-+    unsigned long (*get_hsync_time)(void);
-+    void (*wait_hsync)(void);
-+};
-+
- int wm97xx_register_misc_dev(struct wm97xx_misc_dev* mdev);
- void wm97xx_unregister_misc_dev(struct wm97xx_misc_dev* mdev);
-@@ -281,4 +287,9 @@
- int wm97xx_acc_startup(struct wm97xx* wm);
- void wm97xx_acc_shutdown(struct wm97xx* wm);
-+
-+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm);
-+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo);
-+void wm97xx_unset_machinfo(void);
-+
- #endif
diff --git a/meta/packages/linux/linux-rp-2.6.20/connectplus-remove-ide-HACK.patch b/meta/packages/linux/linux-rp-2.6.20/connectplus-remove-ide-HACK.patch
deleted file mode 100644 (file)
index 4414b21..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Index: linux-2.6.13/drivers/ide/legacy/ide-cs.c
-===================================================================
---- linux-2.6.13.orig/drivers/ide/legacy/ide-cs.c      2005-09-01 22:43:46.000000000 +0100
-+++ linux-2.6.13/drivers/ide/legacy/ide-cs.c   2005-09-01 22:45:46.000000000 +0100
-@@ -488,7 +488,6 @@
-       PCMCIA_DEVICE_PROD_ID123("KODAK Picture Card       ", "KODAK  ", "V100K", 0x94a0d8f3, 0xe4fc3ea0, 0xe5e7eed4),
-       PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
-       PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
--      PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
-       PCMCIA_DEVICE_NULL,
- };
- MODULE_DEVICE_TABLE(pcmcia, ide_ids);
diff --git a/meta/packages/linux/linux-rp-2.6.20/defconfig-akita b/meta/packages/linux/linux-rp-2.6.20/defconfig-akita
deleted file mode 100644 (file)
index c89d954..0000000
+++ /dev/null
@@ -1,1739 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20
-# Thu Mar 29 12:24:24 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_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_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_SYSFS_DEPRECATED=y
-# CONFIG_RELAY is not set
-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_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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL=y
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-# CONFIG_PXA_SHARPSL_25x is not set
-CONFIG_PXA_SHARPSL_27x=y
-CONFIG_MACH_AKITA=y
-CONFIG_MACH_SPITZ=y
-CONFIG_MACH_BORZOI=y
-CONFIG_PXA27x=y
-CONFIG_PXA_SHARP_Cxx00=y
-CONFIG_PXA_SSP=y
-# CONFIG_PXA_KEYS 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_XSCALE_PMU=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2  fbcon=rotate:1 dyntick=enable quiet"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=y
-
-#
-# 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=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=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_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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Dongle support
-#
-
-#
-# 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=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_KEYBOARD_CORGI is not set
-CONFIG_KEYBOARD_SPITZ=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_SPITZ=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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_S1D13XXX is not set
-CONFIG_FB_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-# CONFIG_FB_PXA_OVERLAY is not set
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX is not set
-# CONFIG_FB_W100 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=y
-CONFIG_FONTS=y
-# CONFIG_FONT_8x8 is not set
-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
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 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_CORGI=y
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# 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 Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-CONFIG_SND_PXA2xx_SOC_I2S=m
-CONFIG_SND_PXA2xx_SOC_SPITZ=m
-# CONFIG_SND_PXA2xx_SOC_MAGICIAN is not set
-
-#
-# SoC Audio for the Atmel AT91
-#
-
-#
-# SoC Audio for the Freescale i.MX
-#
-
-#
-# SoC Audio for the Samsung S3C24XX
-#
-
-#
-# Soc Codecs
-#
-# 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=m
-# 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_WM9713 is not set
-# CONFIG_SND_SOC_WM9712 is not set
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 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=y
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# 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_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-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 is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 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=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=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_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X 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
-
-#
-# 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
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_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 is not set
-# CONFIG_EXT4DEV_FS is not set
-CONFIG_JBD=m
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-# 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=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_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_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-CONFIG_SHARPSL_RC=m
diff --git a/meta/packages/linux/linux-rp-2.6.20/defconfig-c7x0 b/meta/packages/linux/linux-rp-2.6.20/defconfig-c7x0
deleted file mode 100644 (file)
index 452e0a6..0000000
+++ /dev/null
@@ -1,1786 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20
-# Thu Mar 29 13:32:11 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_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_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_SYSFS_DEPRECATED=y
-# CONFIG_RELAY is not set
-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_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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL=y
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-# CONFIG_MACH_POODLE is not set
-CONFIG_MACH_CORGI=y
-CONFIG_MACH_SHEPHERD=y
-CONFIG_MACH_HUSKY=y
-# CONFIG_MACH_TOSA is not set
-CONFIG_PXA25x=y
-CONFIG_PXA_SHARP_C7xx=y
-CONFIG_PXA_SSP=y
-# CONFIG_PXA_KEYS 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_XSCALE_PMU=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable quiet"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_CPU_FREQ_PXA25x=y
-CONFIG_KEXEC=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 is not set
-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=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=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=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-# 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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Dongle support
-#
-
-#
-# 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=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_KEYBOARD_CORGI=y
-# CONFIG_KEYBOARD_SPITZ is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# 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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_CORGI=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT 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_VIVI is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_USBVISION is not set
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-CONFIG_USB_DSBR=m
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-# CONFIG_FB_DDC is not set
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_MBX is not set
-CONFIG_FB_W100=y
-# 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 is not set
-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
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-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
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# 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 Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-CONFIG_SND_PXA2xx_SOC_I2S=m
-CONFIG_SND_PXA2xx_SOC_CORGI=m
-# CONFIG_SND_PXA2xx_SOC_MAGICIAN is not set
-
-#
-# SoC Audio for the Atmel AT91
-#
-
-#
-# SoC Audio for the Freescale i.MX
-#
-
-#
-# SoC Audio for the Samsung S3C24XX
-#
-
-#
-# Soc Codecs
-#
-# 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=m
-# 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_WM9713 is not set
-# CONFIG_SND_SOC_WM9712 is not set
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 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=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# 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_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-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 is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 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=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=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_LH7A40X 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
-
-#
-# 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
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_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 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=y
-# 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=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_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_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK 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 is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.20/defconfig-collie b/meta/packages/linux/linux-rp-2.6.20/defconfig-collie
deleted file mode 100644 (file)
index 422ed94..0000000
+++ /dev/null
@@ -1,1739 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20.4
-# Fri Apr  6 23:20:59 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_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_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_SYSFS_DEPRECATED is not set
-# CONFIG_RELAY is not set
-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_ALL is not set
-# 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=m
-CONFIG_IOSCHED_CFQ=m
-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 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
-
-#
-# SA11x0 Implementations
-#
-# CONFIG_SA1100_ASSABET is not set
-# CONFIG_SA1100_CERF is not set
-CONFIG_SA1100_COLLIE=y
-# 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_JORNADA720 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
-
-#
-# 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_SHARP_LOCOMO=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-CONFIG_ISA=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
-
-#
-# PC-card bridges
-#
-# CONFIG_I82365 is not set
-# CONFIG_TCIC is not set
-CONFIG_PCMCIA_SA1100=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-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_LEDS is not set
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=y
-
-#
-# 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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=m
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-# 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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Old Serial dongle support
-#
-
-#
-# FIR device drivers
-#
-CONFIG_USB_IRDA=m
-# CONFIG_SIGMATEL_FIR is not set
-CONFIG_SA1100_FIR=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=m
-CONFIG_BT_HCIBT3C=m
-CONFIG_BT_HCIBLUECARD=m
-CONFIG_BT_HCIBTUART=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_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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS 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=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=y
-# CONFIG_MTD_ABSENT is not set
-CONFIG_MTD_OBSOLETE_CHIPS=y
-CONFIG_MTD_SHARP=y
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SA1100=y
-# 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_PNP 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_UB 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=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 is not set
-CONFIG_BLK_DEV_IDEDISK=m
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECS=m
-# 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 is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-# 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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# 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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_NET_VENDOR_SMC is not set
-# CONFIG_SMC91X is not set
-# CONFIG_DM9000 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_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 is not set
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-# CONFIG_STRIP is not set
-# CONFIG_ARLAN is not set
-# CONFIG_WAVELAN is not set
-# 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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_LOCOMO=y
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY 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_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_SA1100=y
-CONFIG_SERIAL_SA1100_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=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_ELEKTOR 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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-CONFIG_SPI=y
-# CONFIG_SPI_DEBUG is not set
-CONFIG_SPI_MASTER=y
-
-#
-# SPI Master Controller Drivers
-#
-# CONFIG_SPI_BITBANG is not set
-CONFIG_SPI_LOCOMO=m
-
-#
-# SPI Protocol Masters
-#
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multimedia Capabilities Port drivers
-#
-CONFIG_MCP=y
-CONFIG_MCP_SA11X0=y
-CONFIG_MCP_UCB1200=y
-CONFIG_MCP_UCB1200_TS=m
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=m
-
-#
-# LED drivers
-#
-CONFIG_LEDS_LOCOMO=m
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=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_VIVI is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_USBVISION is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_USB_DSBR is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-CONFIG_FB_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_SA1100=y
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=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
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-CONFIG_BACKLIGHT_LOCOMO=y
-
-#
-# 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=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-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
-#
-
-#
-# 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
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# 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=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-CONFIG_USB_USBNET_MII=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-CONFIG_USB_NET_CDC_SUBSET=m
-# CONFIG_USB_ALI_M5632 is not set
-# CONFIG_USB_AN2720 is not set
-CONFIG_USB_BELKIN=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_EPSON2888 is not set
-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 is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
-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 is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-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_LED is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGET is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-# 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_LH7A40X 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=m
-CONFIG_MMC_DEBUG=y
-CONFIG_MMC_BLOCK=m
-# CONFIG_MMC_TIFM_SD is not set
-CONFIG_MMC_SPI=m
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-CONFIG_RTC_DRV_SA1100=y
-# 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=m
-# 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=m
-
-#
-# 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_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 is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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=m
-
-#
-# 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=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK 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 is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=m
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=m
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=m
-CONFIG_CRC16=m
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.20/defconfig-hx2000 b/meta/packages/linux/linux-rp-2.6.20/defconfig-hx2000
deleted file mode 100644 (file)
index 2a67a2d..0000000
+++ /dev/null
@@ -1,1165 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc2
-# Mon Jan  1 01:49:04 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_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-# CONFIG_SWAP is not set
-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=""
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_SYSCTL=y
-CONFIG_EMBEDDED=y
-CONFIG_UID16=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODVERSIONS 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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL is not set
-# CONFIG_MACH_TRIZEPS4 is not set
-CONFIG_MACH_HX2750=y
-CONFIG_PXA27x=y
-CONFIG_PXA_SSP=y
-CONFIG_PXA_KEYS=y
-
-#
-# 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_XSCALE_PMU=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable debug"
-# 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 is not set
-# CONFIG_BINFMT_MISC is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-CONFIG_PM_DEBUG=y
-# CONFIG_DISABLE_CONSOLE_SUSPEND is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=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=y
-# 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 is not set
-# CONFIG_BT is not set
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-# CONFIG_IEEE80211_CRYPT_CCMP is not set
-# CONFIG_IEEE80211_CRYPT_TKIP is not set
-# CONFIG_IEEE80211_SOFTMAC is not set
-CONFIG_WIRELESS_EXT=y
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-# CONFIG_PREVENT_FIRMWARE_BUILD is not set
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_CONCAT=y
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_SSFDC is not set
-
-#
-# RAM/ROM/Flash chip drivers
-#
-CONFIG_MTD_CFI=y
-# CONFIG_MTD_JEDECPROBE 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_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 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=8192
-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=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_IDEDMA_AUTO is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_NETLINK is not set
-
-#
-# 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 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# 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_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD 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_UCB1400 is not set
-CONFIG_TOUCHSCREEN_TSC2101=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-CONFIG_MFD_TSC2101=y
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# 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_S1D13XXX is not set
-CONFIG_FB_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-# CONFIG_FB_PXA_OVERLAY is not set
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX 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
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 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_HX2750=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# HID Devices
-#
-CONFIG_HID=y
-
-#
-# 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 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
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_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=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_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_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_SUMMARY is not set
-# CONFIG_JFFS2_FS_XATTR is not set
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=y
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="cp437"
-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 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=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_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_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-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=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 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 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=y
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-CONFIG_CRYPTO_CRC32C=y
-# 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=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.20/defconfig-poodle b/meta/packages/linux/linux-rp-2.6.20/defconfig-poodle
deleted file mode 100644 (file)
index 13616c0..0000000
+++ /dev/null
@@ -1,1656 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Mon Jul 10 23:38:56 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=y
-CONFIG_VECTORS_BASE=0xffff0000
-
-#
-# 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 is not set
-# 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=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_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_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_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX 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_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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 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_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-CONFIG_MACH_POODLE=y
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-# CONFIG_MACH_TOSA is not set
-CONFIG_PXA25x=y
-# CONFIG_PXA_KEYS is not set
-CONFIG_PXA_SSP=y
-
-#
-# 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_LOCOMO=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2  fbcon=rotate:1 dyntick=enable debug"
-# CONFIG_XIP_KERNEL 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 is not set
-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=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-CONFIG_CPU_FREQ_PXA25x=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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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_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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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_H323 is not set
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# 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_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_LOCOMO=y
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_CORGI is not set
-# CONFIG_KEYBOARD_SPITZ is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# 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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_LOCOMO=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# 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_VIVI is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-
-#
-# Encoders and Decoders
-#
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_EM28XX is not set
-CONFIG_USB_DSBR=m
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-# CONFIG_USB_ET61X251 is not set
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-CONFIG_FB_PXA=y
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_W100 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=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=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-# CONFIG_LOGO_OHAND_CLUT224 is not set
-CONFIG_LOGO_OZ240_CLUT224=y
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-# CONFIG_BACKLIGHT_CORGI is not set
-CONFIG_BACKLIGHT_LOCOMO=y
-
-#
-# 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=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
-
-#
-# 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=m
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8731 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8974 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_MAINSTONE_BASEBAND is not set
-# CONFIG_SND_MAINSTONE_BLUETOOTH is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-# CONFIG_SND_PXA2xx_SOC_CORGI is not set
-# CONFIG_SND_PXA2xx_SOC_SPITZ is not set
-CONFIG_SND_PXA2xx_SOC_POODLE=m
-# CONFIG_SND_PXA2xx_SOC_TOSA is not set
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC is not set
-CONFIG_SND_SOC_WM8731=m
-# 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_WM8974 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 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-# CONFIG_USB_ARCH_HAS_OHCI 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=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Network Adapters
-#
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_USB_NET_ZAURUS=m
-# 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 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_NAVMAN is not set
-CONFIG_USB_SERIAL_PL2303=m
-# CONFIG_USB_SERIAL_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST 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_LH7A40X 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-
-#
-# 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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 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
-
-#
-# 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_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 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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-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 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_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.20/defconfig-qemuarm b/meta/packages/linux/linux-rp-2.6.20/defconfig-qemuarm
deleted file mode 100644 (file)
index f70b6db..0000000
+++ /dev/null
@@ -1,1193 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Sat Aug 26 22:45:02 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_VECTORS_BASE=0xffff0000
-
-#
-# 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 is not set
-# 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=y
-# 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=y
-
-#
-# 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_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# System Type
-#
-# CONFIG_ARCH_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_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX 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_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_OMAP is not set
-CONFIG_ARCH_VERSATILE=y
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# Versatile platform type
-#
-CONFIG_ARCH_VERSATILE_PB=y
-# CONFIG_MACH_VERSATILE_AB is not set
-
-#
-# Processor Type
-#
-CONFIG_CPU_32=y
-CONFIG_CPU_ARM926T=y
-CONFIG_CPU_32v5=y
-CONFIG_CPU_ABRT_EV5TJ=y
-CONFIG_CPU_CACHE_VIVT=y
-CONFIG_CPU_COPY_V4WB=y
-CONFIG_CPU_TLB_V4WBI=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_CPU_CACHE_ROUND_ROBIN is not set
-# CONFIG_KEXEC is not set
-CONFIG_ARM_VIC=y
-CONFIG_ICST307=y
-
-#
-# Bus support
-#
-CONFIG_ARM_AMBA=y
-CONFIG_PCI=y
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# Kernel Features
-#
-# CONFIG_PREEMPT is not set
-# CONFIG_NO_IDLE_HZ is not set
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_LEDS=y
-CONFIG_LEDS_TIMER=y
-CONFIG_LEDS_CPU=y
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable debug"
-# CONFIG_XIP_KERNEL is not set
-
-#
-# Floating point emulation
-#
-
-#
-# At least one emulation must be selected
-#
-CONFIG_FPE_NWFPE=y
-# CONFIG_FPE_NWFPE_XP is not set
-# CONFIG_FPE_FASTFPE is not set
-CONFIG_VFP=y
-
-#
-# Userspace binary formats
-#
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_AOUT is not set
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_APM 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_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 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_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 is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_AFS_PARTS=y
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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 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_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
-
-#
-# 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_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 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_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=51200
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH 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 is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-# 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=y
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-# 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=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-CONFIG_SMC91X=y
-# CONFIG_DM9000 is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_PCI 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_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_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
-
-#
-# 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=y
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_POWER 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=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL 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 is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-# CONFIG_SERIO_SERPORT is not set
-CONFIG_SERIO_AMBAKMI=y
-# 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
-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_AMBA_PL011=y
-CONFIG_SERIAL_AMBA_PL011_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_NVRAM 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
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-# CONFIG_LEDS_CLASS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-# CONFIG_LEDS_TRIGGERS is not set
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB 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=y
-CONFIG_FB_TILEBLITTING=y
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-CONFIG_FB_ARMCLCD=y
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT 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 is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-# CONFIG_USB_DEVICEFS is not set
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_EHCI_HCD 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 is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-
-#
-# 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=y
-# 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_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_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_LD is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-
-#
-# 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_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 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_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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS 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_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=y
-# CONFIG_SQUASHFS 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 is not set
-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=y
-# 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 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-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_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_BUGVERBOSE=y
-CONFIG_DEBUG_INFO=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.20/defconfig-qemux86 b/meta/packages/linux/linux-rp-2.6.20/defconfig-qemux86
deleted file mode 100644 (file)
index 08e0a0c..0000000
+++ /dev/null
@@ -1,1567 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Mon Oct 16 19:42:42 2006
-#
-CONFIG_X86_32=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_X86=y
-CONFIG_MMU=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=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 is not set
-CONFIG_SYSCTL=y
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_UID16=y
-CONFIG_VM86=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 is not set
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-CONFIG_LBD=y
-# 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"
-
-#
-# Processor type and features
-#
-CONFIG_SMP=y
-CONFIG_X86_PC=y
-# CONFIG_X86_ELAN is not set
-# CONFIG_X86_VOYAGER is not set
-# CONFIG_X86_NUMAQ is not set
-# CONFIG_X86_SUMMIT is not set
-# CONFIG_X86_BIGSMP is not set
-# CONFIG_X86_VISWS is not set
-# CONFIG_X86_GENERICARCH is not set
-# CONFIG_X86_ES7000 is not set
-CONFIG_M386=y
-# CONFIG_M486 is not set
-# CONFIG_M586 is not set
-# CONFIG_M586TSC is not set
-# CONFIG_M586MMX is not set
-# CONFIG_M686 is not set
-# CONFIG_MPENTIUMII is not set
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUMM is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK6 is not set
-# CONFIG_MK7 is not set
-# CONFIG_MK8 is not set
-# CONFIG_MCRUSOE is not set
-# CONFIG_MEFFICEON is not set
-# CONFIG_MWINCHIPC6 is not set
-# CONFIG_MWINCHIP2 is not set
-# CONFIG_MWINCHIP3D is not set
-# CONFIG_MGEODEGX1 is not set
-# CONFIG_MGEODE_LX is not set
-# CONFIG_MCYRIXIII is not set
-# CONFIG_MVIAC3_2 is not set
-CONFIG_X86_GENERIC=y
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_PPRO_FENCE=y
-CONFIG_X86_F00F_BUG=y
-CONFIG_X86_INTEL_USERCOPY=y
-# CONFIG_HPET_TIMER is not set
-CONFIG_NR_CPUS=8
-CONFIG_SCHED_SMT=y
-CONFIG_SCHED_MC=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_X86_IO_APIC=y
-CONFIG_X86_MCE=y
-CONFIG_X86_MCE_NONFATAL=y
-CONFIG_X86_MCE_P4THERMAL=y
-# CONFIG_TOSHIBA is not set
-# CONFIG_I8K is not set
-# CONFIG_X86_REBOOTFIXUPS is not set
-# CONFIG_MICROCODE is not set
-# CONFIG_X86_MSR is not set
-# CONFIG_X86_CPUID is not set
-
-#
-# Firmware Drivers
-#
-# CONFIG_EDD is not set
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-CONFIG_NOHIGHMEM=y
-# CONFIG_HIGHMEM4G is not set
-# CONFIG_HIGHMEM64G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=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=y
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_MATH_EMULATION is not set
-CONFIG_MTRR=y
-# CONFIG_EFI is not set
-CONFIG_IRQBALANCE=y
-# CONFIG_REGPARM is not set
-CONFIG_SECCOMP=y
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-# CONFIG_KEXEC is not set
-CONFIG_PHYSICAL_START=0x100000
-# CONFIG_HOTPLUG_CPU is not set
-
-#
-# Power management options (ACPI, APM)
-#
-CONFIG_PM=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_AC=y
-CONFIG_ACPI_BATTERY=y
-CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_VIDEO=m
-# CONFIG_ACPI_HOTKEY is not set
-CONFIG_ACPI_FAN=y
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_THERMAL=y
-# CONFIG_ACPI_ASUS is not set
-CONFIG_ACPI_IBM=m
-# CONFIG_ACPI_IBM_DOCK is not set
-# CONFIG_ACPI_TOSHIBA is not set
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_X86_PM_TIMER=y
-# CONFIG_ACPI_CONTAINER is not set
-
-#
-# APM (Advanced Power Management) BIOS Support
-#
-# CONFIG_APM is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-#
-CONFIG_PCI=y
-# CONFIG_PCI_GOBIOS is not set
-# CONFIG_PCI_GOMMCONFIG is not set
-# CONFIG_PCI_GODIRECT is not set
-CONFIG_PCI_GOANY=y
-CONFIG_PCI_BIOS=y
-CONFIG_PCI_DIRECT=y
-CONFIG_PCI_MMCONFIG=y
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_MSI is not set
-CONFIG_ISA_DMA_API=y
-CONFIG_ISA=y
-# CONFIG_EISA is not set
-# CONFIG_MCA is not set
-# CONFIG_SCx200 is not set
-
-#
-# 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_AOUT=y
-CONFIG_BINFMT_MISC=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_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 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_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_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=y
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-# CONFIG_IP_NF_FTP is not set
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_H323 is not set
-CONFIG_IP_NF_QUEUE=y
-
-#
-# 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 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=y
-CONFIG_PARPORT_PC=y
-# CONFIG_PARPORT_SERIAL is not set
-# CONFIG_PARPORT_PC_FIFO is not set
-# CONFIG_PARPORT_PC_SUPERIO is not set
-# CONFIG_PARPORT_GSC is not set
-# CONFIG_PARPORT_1284 is not set
-
-#
-# Plug and Play support
-#
-CONFIG_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-# CONFIG_ISAPNP is not set
-# CONFIG_PNPBIOS is not set
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=y
-# CONFIG_BLK_DEV_XD is not set
-# CONFIG_PARIDE 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
-# 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_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=51200
-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=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_HD_IDE is not set
-CONFIG_BLK_DEV_IDEDISK=y
-CONFIG_IDEDISK_MULTI_MODE=y
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-CONFIG_BLK_DEV_CMD640=y
-# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-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_RZ1000=y
-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 is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP 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_CS5535 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=y
-# 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_SIS5513 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_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=y
-# 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_7000FASST is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 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=m
-# CONFIG_SCSI_ADVANSYS 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=y
-# CONFIG_SCSI_SATA_AHCI is not set
-# CONFIG_SCSI_SATA_SVW is not set
-CONFIG_SCSI_ATA_PIIX=y
-# CONFIG_SCSI_SATA_MV is not set
-# CONFIG_SCSI_SATA_NV is not set
-# CONFIG_SCSI_PDC_ADMA is not set
-# CONFIG_SCSI_SATA_QSTOR is not set
-# CONFIG_SCSI_SATA_PROMISE is not set
-CONFIG_SCSI_SATA_SX4=m
-# CONFIG_SCSI_SATA_SIL is not set
-# CONFIG_SCSI_SATA_SIL24 is not set
-CONFIG_SCSI_SATA_SIS=m
-# CONFIG_SCSI_SATA_ULI is not set
-# CONFIG_SCSI_SATA_VIA is not set
-# CONFIG_SCSI_SATA_VITESSE is not set
-CONFIG_SCSI_SATA_INTEL_COMBINED=y
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH 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_PPA is not set
-# CONFIG_SCSI_IMM is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-CONFIG_SCSI_IPR=m
-# CONFIG_SCSI_IPR_TRACE is not set
-# CONFIG_SCSI_IPR_DUMP 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_1280 is not set
-# CONFIG_SCSI_QLA_FC 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_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG 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_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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=y
-
-#
-# Subsystem Options
-#
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_OUI_DB is not set
-# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
-# CONFIG_IEEE1394_EXPORT_FULL_API is not set
-
-#
-# Device Drivers
-#
-
-#
-# Texas Instruments PCILynx requires I2C
-#
-CONFIG_IEEE1394_OHCI1394=y
-
-#
-# Protocol Drivers
-#
-# CONFIG_IEEE1394_VIDEO1394 is not set
-# CONFIG_IEEE1394_SBP2 is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-# CONFIG_IEEE1394_DV1394 is not set
-CONFIG_IEEE1394_RAWIO=y
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-# 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_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_LANCE is not set
-# CONFIG_NET_VENDOR_SMC 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=y
-# CONFIG_E2100 is not set
-# CONFIG_EWRK3 is not set
-# CONFIG_EEXPRESS is not set
-# CONFIG_EEXPRESS_PRO is not set
-# CONFIG_HPLAN_PLUS is not set
-# CONFIG_HPLAN is not set
-# CONFIG_LP486E is not set
-# CONFIG_ETH16I is not set
-CONFIG_NE2000=y
-# CONFIG_ZNET is not set
-# CONFIG_SEEQ8005 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=y
-# CONFIG_8139CP is not set
-CONFIG_8139TOO=y
-CONFIG_8139TOO_PIO=y
-# 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
-# CONFIG_NET_POCKET 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=m
-# CONFIG_S2IO_NAPI 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_PLIP 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 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_POWER 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_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_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=y
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PARKBD 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
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-# CONFIG_SERIAL_8250_CONSOLE is not set
-CONFIG_SERIAL_8250_PCI=y
-CONFIG_SERIAL_8250_PNP=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_JSM is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-CONFIG_PRINTER=y
-# CONFIG_LP_CONSOLE is not set
-# CONFIG_PPDEV is not set
-# CONFIG_TIPAR is not set
-
-#
-# 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_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
-# CONFIG_SONYPI is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=y
-# CONFIG_AGP_ALI is not set
-# CONFIG_AGP_ATI is not set
-# CONFIG_AGP_AMD is not set
-# CONFIG_AGP_AMD64 is not set
-CONFIG_AGP_INTEL=y
-# CONFIG_AGP_NVIDIA is not set
-# CONFIG_AGP_SIS is not set
-# CONFIG_AGP_SWORKS is not set
-# CONFIG_AGP_VIA is not set
-# CONFIG_AGP_EFFICEON is not set
-CONFIG_DRM=y
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_R128 is not set
-# CONFIG_DRM_RADEON is not set
-# CONFIG_DRM_I810 is not set
-# CONFIG_DRM_I830 is not set
-# CONFIG_DRM_I915 is not set
-# CONFIG_DRM_MGA is not set
-# CONFIG_DRM_SIS is not set
-# CONFIG_DRM_VIA is not set
-# CONFIG_DRM_SAVAGE is not set
-# CONFIG_MWAVE is not set
-# CONFIG_CS5535_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER 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_SENSORS_HDAPS is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-# CONFIG_IBM_ASM is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB 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=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-CONFIG_FB_VGA16=y
-CONFIG_FB_VESA=y
-# CONFIG_FB_VESA_STD is not set
-CONFIG_FB_VESA_TNG=y
-CONFIG_FB_VESA_DEFAULT_MODE="640x480-32@60"
-CONFIG_VIDEO_SELECT=y
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_I810 is not set
-# CONFIG_FB_INTEL is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# 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_GEODE is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-CONFIG_FONTS=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
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_SEQUENCER=y
-# CONFIG_SND_SEQ_DUMMY 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_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=y
-CONFIG_SND_AC97_BUS=y
-# 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
-
-#
-# ISA devices
-#
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_WAVEFRONT is not set
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-CONFIG_SND_INTEL8X0=y
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-
-#
-# USB devices
-#
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_USX2Y is not set
-
-#
-# SoC audio support
-#
-# CONFIG_SND_SOC is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=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_SUSPEND 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_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-CONFIG_USB_PRINTER=y
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_WACOM=y
-# 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_MON=y
-
-#
-# USB port drivers
-#
-# CONFIG_USB_USS720 is not set
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_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=m
-# CONFIG_USB_PHIDGETKIT is not set
-CONFIG_USB_PHIDGETSERVO=m
-# 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)
-#
-# CONFIG_EDAC is not set
-
-#
-# 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 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 is not set
-CONFIG_AUTOFS4_FS=y
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-CONFIG_UDF_FS=y
-CONFIG_UDF_NLS=y
-
-#
-# 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_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_SQUASHFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-# CONFIG_NFS_V3 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=y
-# CONFIG_NFSD_V3 is not set
-CONFIG_NFSD_TCP=y
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=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 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 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Instrumentation Support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-# CONFIG_KPROBES 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=15
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_UNWIND_INFO is not set
-CONFIG_EARLY_PRINTK=y
-CONFIG_STACK_BACKTRACE_COLS=2
-CONFIG_X86_FIND_SMP_CONFIG=y
-CONFIG_X86_MPPARSE=y
-CONFIG_DOUBLEFAULT=y
-
-#
-# 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=m
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_X86_SMP=y
-CONFIG_X86_HT=y
-CONFIG_X86_BIOS_REBOOT=y
-CONFIG_X86_TRAMPOLINE=y
-CONFIG_KTIME_SCALAR=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.20/defconfig-spitz b/meta/packages/linux/linux-rp-2.6.20/defconfig-spitz
deleted file mode 100644 (file)
index 4ee5b81..0000000
+++ /dev/null
@@ -1,1739 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20
-# Tue Jun 26 23:12:35 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_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_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_SYSFS_DEPRECATED=y
-# CONFIG_RELAY is not set
-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_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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL=y
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-# CONFIG_PXA_SHARPSL_25x is not set
-CONFIG_PXA_SHARPSL_27x=y
-CONFIG_MACH_AKITA=y
-CONFIG_MACH_SPITZ=y
-CONFIG_MACH_BORZOI=y
-CONFIG_PXA27x=y
-CONFIG_PXA_SHARP_Cxx00=y
-CONFIG_PXA_SSP=y
-# CONFIG_PXA_KEYS 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_XSCALE_PMU=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/hda1 rootfstype=ext3 rootdelay=1 rw  fbcon=rotate:1 dyntick=enable quiet"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=y
-
-#
-# 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=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=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_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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Dongle support
-#
-
-#
-# 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=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_KEYBOARD_CORGI is not set
-CONFIG_KEYBOARD_SPITZ=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_SPITZ=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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_S1D13XXX is not set
-CONFIG_FB_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-CONFIG_FB_PXA_OVERLAY=y
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX is not set
-# CONFIG_FB_W100 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=y
-CONFIG_FONTS=y
-# CONFIG_FONT_8x8 is not set
-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
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 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_CORGI=y
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# 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 Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-CONFIG_SND_PXA2xx_SOC_I2S=m
-CONFIG_SND_PXA2xx_SOC_SPITZ=m
-# CONFIG_SND_PXA2xx_SOC_MAGICIAN is not set
-
-#
-# SoC Audio for the Atmel AT91
-#
-
-#
-# SoC Audio for the Freescale i.MX
-#
-
-#
-# SoC Audio for the Samsung S3C24XX
-#
-
-#
-# Soc Codecs
-#
-# 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=m
-# 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_WM9713 is not set
-# CONFIG_SND_SOC_WM9712 is not set
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 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=y
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# 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_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-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 is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 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=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=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_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X 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
-
-#
-# 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
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_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 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=y
-# 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=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_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_JFFS2_FS=m
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=m
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-CONFIG_SHARPSL_RC=m
diff --git a/meta/packages/linux/linux-rp-2.6.20/defconfig-tosa b/meta/packages/linux/linux-rp-2.6.20/defconfig-tosa
deleted file mode 100644 (file)
index 4360f7a..0000000
+++ /dev/null
@@ -1,1612 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.16-rc5-git5
-# Tue Mar 14 09:05:26 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=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 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=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
-#
-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
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_L7200 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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# Intel PXA2xx Implementations
-#
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_ARCH_PXA_IDP is not set
-CONFIG_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-# CONFIG_MACH_POODLE is not set
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-CONFIG_MACH_TOSA=y
-CONFIG_PXA25x=y
-# CONFIG_PXA_KEYS 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-CONFIG_TOSHIBA_TC6393XB=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# 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=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_PXA25x=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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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=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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS 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_BLOCK=y
-# 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
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_SHARP_SL=y
-# 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_BLKMTD is not set
-# CONFIG_MTD_BLOCK2MTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_TMIO=y
-CONFIG_MTD_NAND_IDS=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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-# 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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_CORGI is not set
-# CONFIG_KEYBOARD_SPITZ is not set
-CONFIG_KEYBOARD_TOSA=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-# CONFIG_TOUCHSCREEN_CORGI 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_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 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=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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TOSA=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Video For Linux
-#
-
-#
-# Video Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# 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_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_AUDIO_DECODER is not set
-# CONFIG_VIDEO_DECODER is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# 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_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_W100 is not set
-CONFIG_FB_TMIO=y
-# 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 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
-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_HP680 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=m
-# CONFIG_SND_SEQUENCER is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_AC97_BUS=y
-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_AC97 is not set
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# PCMCIA devices
-#
-
-#
-# SoC audio support
-#
-CONFIG_SND_SOC=y
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=y
-CONFIG_SND_PXA2xx_SOC_AC97=y
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-# CONFIG_SND_PXA2xx_SOC_CORGI is not set
-# CONFIG_SND_PXA2xx_SOC_SPITZ is not set
-CONFIG_SND_PXA2xx_SOC_TOSA=y
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC 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_WM9713 is not set
-CONFIG_SND_SOC_WM9712=y
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
-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=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-CONFIG_USB_MTOUCH=m
-# CONFIG_USB_ITMTOUCH is not set
-CONFIG_USB_EGALAX=m
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Multimedia devices
-#
-CONFIG_USB_DABUSB=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_DSBR=m
-# CONFIG_USB_ET61X251 is not set
-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 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=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-CONFIG_USB_NET_GL620A=m
-CONFIG_USB_NET_NET1080=m
-CONFIG_USB_NET_PLUSB=m
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_ZAURUS 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_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-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_KEYSPAN_MPR is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-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_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST 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_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-
-#
-# Real Time Clock
-#
-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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-CONFIG_RTC_DRV_SA1100=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 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_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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# 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=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT 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_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_GENERIC_ALLOCATOR=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.20/hostap-monitor-mode.patch b/meta/packages/linux/linux-rp-2.6.20/hostap-monitor-mode.patch
deleted file mode 100644 (file)
index 641fd19..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-This is a patch that I've been maintaining for a few years, and I'd 
-really like to see it added to the mainstream zaurus kernel so I can 
-finally stop distributing my own.
-
-This patch only effects the card while in monitor mode, and does not 
-cause any known stability issues.
-
-http://patches.aircrack-ng.org/hostap-kernel-2.6.18.patch
-
-Rick Farina (Zero_Chaos)
-
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c  2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c    2006-09-21 01:30:18.000000000 -0400
-@@ -69,6 +69,9 @@
-       iface = netdev_priv(dev);
-       local = iface->local;
-+      if (local->iw_mode == IW_MODE_MONITOR)
-+              goto xmit;
-+
-       if (skb->len < ETH_HLEN) {
-               printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb "
-                      "(len=%d)\n", dev->name, skb->len);
-@@ -234,6 +237,7 @@
-               memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN);
-       }
-+xmit:
-       iface->stats.tx_packets++;
-       iface->stats.tx_bytes += skb->len;
-@@ -404,8 +408,6 @@
-       }
-       if (skb->len < 24) {
--              printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb "
--                     "(len=%d)\n", dev->name, skb->len);
-               ret = 0;
-               iface->stats.tx_dropped++;
-               goto fail;
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.orig
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.rej
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c        2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c  2006-09-21 01:30:18.000000000 -0400
-@@ -1005,6 +1005,35 @@
-       return fid;
- }
-+static int prism2_monitor_enable(struct net_device *dev)
-+{
-+      if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) {
-+              printk(KERN_DEBUG "Port type setting for monitor mode "
-+                      "failed\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8),
-+                           0, NULL, NULL)) {
-+              printk(KERN_DEBUG "Could not enter testmode 0x0a\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS,
-+                          HFA384X_WEPFLAGS_PRIVACYINVOKED |
-+                          HFA384X_WEPFLAGS_HOSTENCRYPT |
-+                          HFA384X_WEPFLAGS_HOSTDECRYPT)) {
-+              printk(KERN_DEBUG "WEP flags setting failed\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) {
-+              printk(KERN_DEBUG "Could not set promiscuous mode\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      return 0;
-+}
- static int prism2_reset_port(struct net_device *dev)
- {
-@@ -1031,6 +1060,10 @@
-                              "port\n", dev->name);
-       }
-+      if (local->iw_mode == IW_MODE_MONITOR)
-+              /* force mode 0x0a after port 0 reset */
-+              return prism2_monitor_enable(dev);
-+
-       /* It looks like at least some STA firmware versions reset
-        * fragmentation threshold back to 2346 after enable command. Restore
-        * the configured value, if it differs from this default. */
-@@ -1466,6 +1499,10 @@
-               return 1;
-       }
-+      if (local->iw_mode == IW_MODE_MONITOR)
-+              /* force mode 0x0a after port 0 reset */
-+              prism2_monitor_enable(dev);
-+
-       local->hw_ready = 1;
-       local->hw_reset_tries = 0;
-       local->hw_resetting = 0;
-@@ -3156,6 +3193,7 @@
-       local->func->hw_config = prism2_hw_config;
-       local->func->hw_reset = prism2_hw_reset;
-       local->func->hw_shutdown = prism2_hw_shutdown;
-+      local->func->monitor_enable = prism2_monitor_enable;
-       local->func->reset_port = prism2_reset_port;
-       local->func->schedule_reset = prism2_schedule_reset;
- #ifdef PRISM2_DOWNLOAD_SUPPORT
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_hw.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c     2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c       2006-09-21 01:30:18.000000000 -0400
-@@ -1104,33 +1104,7 @@
-       printk(KERN_DEBUG "Enabling monitor mode\n");
-       hostap_monitor_set_type(local);
--
--      if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE,
--                          HFA384X_PORTTYPE_PSEUDO_IBSS)) {
--              printk(KERN_DEBUG "Port type setting for monitor mode "
--                     "failed\n");
--              return -EOPNOTSUPP;
--      }
--
--      /* Host decrypt is needed to get the IV and ICV fields;
--       * however, monitor mode seems to remove WEP flag from frame
--       * control field */
--      if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS,
--                          HFA384X_WEPFLAGS_HOSTENCRYPT |
--                          HFA384X_WEPFLAGS_HOSTDECRYPT)) {
--              printk(KERN_DEBUG "WEP flags setting failed\n");
--              return -EOPNOTSUPP;
--      }
--
--      if (local->func->reset_port(dev) ||
--          local->func->cmd(dev, HFA384X_CMDCODE_TEST |
--                           (HFA384X_TEST_MONITOR << 8),
--                           0, NULL, NULL)) {
--              printk(KERN_DEBUG "Setting monitor mode failed\n");
--              return -EOPNOTSUPP;
--      }
--
--      return 0;
-+      return local->func->reset_port(dev);
- }
-@@ -1199,7 +1173,7 @@
-       local->iw_mode = *mode;
-       if (local->iw_mode == IW_MODE_MONITOR)
--              hostap_monitor_mode_enable(local);
-+              return hostap_monitor_mode_enable(local);
-       else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt &&
-                !local->fw_encrypt_ok) {
-               printk(KERN_DEBUG "%s: defaulting to host-based encryption as "
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c      2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c        2006-09-21 01:30:18.000000000 -0400
-@@ -331,7 +331,7 @@
-       if (local->iw_mode == IW_MODE_REPEAT)
-               return HFA384X_PORTTYPE_WDS;
-       if (local->iw_mode == IW_MODE_MONITOR)
--              return HFA384X_PORTTYPE_PSEUDO_IBSS;
-+              return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/
-       return HFA384X_PORTTYPE_HOSTAP;
- }
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_main.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c       2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c 2006-09-21 01:30:18.000000000 -0400
-@@ -48,6 +48,8 @@
-       { 0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID },
-       /* Samsung MagicLAN SWL-2210P */
-       { 0x167d, 0xa000, PCI_ANY_ID, PCI_ANY_ID },
-+      /* NETGEAR MA311 */
-+      { 0x1385, 0x3872, PCI_ANY_ID, PCI_ANY_ID },
-       { 0 }
- };
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_pci.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c       2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c 2006-09-21 01:30:18.000000000 -0400
-@@ -101,6 +101,7 @@
-       { 0xc250, 0x0002 } /* EMTAC A2424i */,
-       { 0xd601, 0x0002 } /* Z-Com XI300 */,
-       { 0xd601, 0x0005 } /* Zcomax XI-325H 200mW */,
-+      { 0xd601, 0x0010 } /* Zcomax XI-325H 100mW */,
-       { 0, 0}
- };
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_plx.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h      2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h        2006-09-21 01:30:18.000000000 -0400
-@@ -575,6 +575,7 @@
-       int (*hw_config)(struct net_device *dev, int initial);
-       void (*hw_reset)(struct net_device *dev);
-       void (*hw_shutdown)(struct net_device *dev, int no_disable);
-+      int (*monitor_enable)(struct net_device *dev);
-       int (*reset_port)(struct net_device *dev);
-       void (*schedule_reset)(local_info_t *local);
-       int (*download)(local_info_t *local,
diff --git a/meta/packages/linux/linux-rp-2.6.20/pxa-serial-hack.patch b/meta/packages/linux/linux-rp-2.6.20/pxa-serial-hack.patch
deleted file mode 100644 (file)
index bf20f46..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
----
- drivers/serial/8250.c        |    5 +++++
- drivers/serial/serial_core.c |    1 +
- drivers/serial/serial_cs.c   |   12 +++++++++---
- include/linux/serial_core.h  |    1 +
- 4 files changed, 16 insertions(+), 3 deletions(-)
-
-Index: linux-2.6.20/drivers/serial/8250.c
-===================================================================
---- linux-2.6.20.orig/drivers/serial/8250.c    2007-04-27 13:37:26.000000000 +0100
-+++ linux-2.6.20/drivers/serial/8250.c 2007-04-27 13:38:16.000000000 +0100
-@@ -2429,7 +2429,12 @@
-       .driver_name            = "serial",
-       .dev_name               = "ttyS",
-       .major                  = TTY_MAJOR,
-+#ifdef CONFIG_SERIAL_PXA
-+      .minor                  = 64 + 4,
-+      .name_base              = 4,
-+#else
-       .minor                  = 64,
-+#endif
-       .nr                     = UART_NR,
-       .cons                   = SERIAL8250_CONSOLE,
- };
-Index: linux-2.6.20/drivers/serial/serial_core.c
-===================================================================
---- linux-2.6.20.orig/drivers/serial/serial_core.c     2007-02-04 18:44:54.000000000 +0000
-+++ linux-2.6.20/drivers/serial/serial_core.c  2007-04-27 13:39:39.000000000 +0100
-@@ -2068,7 +2068,8 @@
-       printk(KERN_INFO "%s%s%s%d at %s (irq = %d) is a %s\n",
-              port->dev ? port->dev->bus_id : "",
-              port->dev ? ": " : "",
--             drv->dev_name, port->line, address, port->irq, uart_type(port));
-+             drv->dev_name, port->line + drv->name_base, address, port->irq,
-+             uart_type(port));
- }
- static void
-@@ -2183,6 +2184,7 @@
-       normal->owner           = drv->owner;
-       normal->driver_name     = drv->driver_name;
-       normal->name            = drv->dev_name;
-+      normal->name_base       = drv->name_base;
-       normal->major           = drv->major;
-       normal->minor_start     = drv->minor;
-       normal->type            = TTY_DRIVER_TYPE_SERIAL;
-Index: linux-2.6.20/include/linux/serial_core.h
-===================================================================
---- linux-2.6.20.orig/include/linux/serial_core.h      2007-02-04 18:44:54.000000000 +0000
-+++ linux-2.6.20/include/linux/serial_core.h   2007-04-27 13:37:27.000000000 +0100
-@@ -341,6 +341,7 @@
-       struct module           *owner;
-       const char              *driver_name;
-       const char              *dev_name;
-+      int                      name_base;
-       int                      major;
-       int                      minor;
-       int                      nr;
-Index: linux-2.6.20/drivers/serial/serial_cs.c
-===================================================================
---- linux-2.6.20.orig/drivers/serial/serial_cs.c       2007-02-04 18:44:54.000000000 +0000
-+++ linux-2.6.20/drivers/serial/serial_cs.c    2007-04-27 13:40:34.000000000 +0100
-@@ -390,7 +390,7 @@
-                       kio_addr_t iobase, int irq)
- {
-       struct uart_port port;
--      int line;
-+      int line, linestart;
-       memset(&port, 0, sizeof (struct uart_port));
-       port.iobase = iobase;
-@@ -411,10 +411,16 @@
-               return -EINVAL;
-       }
-+#if CONFIG_SERIAL_PXA
-+      linestart = 4;
-+#else
-+      linestart = 0;
-+#endif
-+
-       info->line[info->ndev] = line;
--      sprintf(info->node[info->ndev].dev_name, "ttyS%d", line);
-+      sprintf(info->node[info->ndev].dev_name, "ttyS%d", line+linestart);
-       info->node[info->ndev].major = TTY_MAJOR;
--      info->node[info->ndev].minor = 0x40 + line;
-+      info->node[info->ndev].minor = 0x40 + line + linestart;
-       if (info->ndev > 0)
-               info->node[info->ndev - 1].next = &info->node[info->ndev];
-       info->ndev++;
diff --git a/meta/packages/linux/linux-rp-2.6.20/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch b/meta/packages/linux/linux-rp-2.6.20/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch
deleted file mode 100644 (file)
index 18bf426..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-
-From: Petr Vandrovec <vandrove@vc.cvut.cz>
-
-Patch below adds support for using different prescaler than 16 for 16c950
-chips.  This is needed for using Fujitsu-Siemens Connect2Air compact-flash
-card, which comes (apparently) with 806kHz clocks, and so you have to
-program prescaler for division by 7, and DLAB to 1, to get 115200Bd.  
-
-To get card properly running you also have to add lines below to
-/etc/pcmcia/serial.opts so kernel knows that base speed is not 115200 but
-50400 (50400 * 16 = 806400; 806400 / 7 = 115200).  As I've found no code
-specifying baud_rate in serial_cs, I assume that specifying it in
-serial.opts is right way to do this type of things.
-
-Patch also fixes problem that for UPF_MAGIC_MULTIPLIER maximum possible
-baud rate passed to uart code was uartclk / 16 while correct value for
-these devices (and for 16c950) is uartclk / 4.
-
-Patch also fixes problem that for UPF_MAGIC_MULTIPLIER devices with
-baud_rate 19200 or 9600 spd_cust did not work correctly.  Not that such
-devices exist, but we should not ignore spd_cust, user probably knows why
-he asked for spd_cust.
-
-serial.opts:
-
-case "$MANFID-$FUNCID-$PRODID_1-$PRODID_2-$PRODID_3-$PRODID_4" in
-'0279,950b-2-GPRS Modem---')
-    SERIAL_OPTS="baud_base 50400"
-    ;;
-esac
-
-Cc: David Woodhouse <dwmw2@infradead.org>
-Signed-off-by: Andrew Morton <akpm@osdl.org>
----
-
- drivers/serial/8250.c |   82 +++++++++++++++++++++++++++++++++++++++-----------
- 1 files changed, 64 insertions(+), 18 deletions(-)
-
-diff -puN drivers/serial/8250.c~serial-add-support-for-non-standard-xtals-to-16c950-driver drivers/serial/8250.c
---- devel/drivers/serial/8250.c~serial-add-support-for-non-standard-xtals-to-16c950-driver     2005-09-12 03:34:57.000000000 -0700
-+++ devel-akpm/drivers/serial/8250.c   2005-09-12 03:34:57.000000000 -0700
-@@ -1653,24 +1653,58 @@ static void serial8250_shutdown(struct u
-               serial_unlink_irq_chain(up);
- }
--static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
-+static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud,
-+                                         unsigned int *prescaler)
- {
--      unsigned int quot;
--
--      /*
--       * Handle magic divisors for baud rates above baud_base on
--       * SMSC SuperIO chips.
-+        /*
-+       * Use special handling only if user did not supply its own divider.
-+       * spd_cust is defined in terms of baud_base, so always use default
-+       * prescaler when spd_cust is requested.
-        */
--      if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
--          baud == (port->uartclk/4))
--              quot = 0x8001;
--      else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
--               baud == (port->uartclk/8))
--              quot = 0x8002;
--      else
--              quot = uart_get_divisor(port, baud);
--      return quot;
-+      *prescaler = 16;
-+        if (baud != 38400 || (port->flags & UPF_SPD_MASK) != UPF_SPD_CUST) {
-+              unsigned int quot = port->uartclk / baud;
-+
-+              /*
-+               * Handle magic divisors for baud rates above baud_base on
-+               * SMSC SuperIO chips.
-+               */
-+              if (port->flags & UPF_MAGIC_MULTIPLIER) {
-+                      if (quot == 4) {
-+                              return 0x8001;
-+                      } else if (quot == 8) {
-+                              return 0x8002;
-+                      }
-+              }
-+              if (port->type == PORT_16C950) {
-+                      /*
-+                       * This computes TCR value (4 to 16), not CPR value (which can
-+                       * be between 1.000 and 31.875) - chip I have uses XTAL of
-+                       * 806400Hz, and so a division by 7 is required to get 115200Bd.
-+                       * I'm leaving CPR disabled for now, until someone will
-+                       * hit even more exotic XTAL (it is needed to get 500kbps
-+                       * or 1000kbps from 18.432MHz XTAL, but I have no device
-+                       * which would benefit from doing that).
-+                       *
-+                       * If we can use divide by 16, use it.  Otherwise look for
-+                       * better prescaler, from 15 to 4.  If quotient cannot
-+                       * be divided by any integer value between 4 and 15, use 4.
-+                       */
-+                      if (quot & 0x0F) {
-+                              unsigned int div;
-+
-+                              for (div = 15; div > 4; div--) {
-+                                      if (quot % div == 0) {
-+                                              break;
-+                                      }
-+                              }
-+                              *prescaler = div;
-+                              return quot / div;
-+                      }
-+              }
-+      }
-+      return uart_get_divisor(port, baud);
- }
- static void
-@@ -1680,7 +1714,7 @@ serial8250_set_termios(struct uart_port 
-       struct uart_8250_port *up = (struct uart_8250_port *)port;
-       unsigned char cval, fcr = 0;
-       unsigned long flags;
--      unsigned int baud, quot;
-+      unsigned int baud, quot, prescaler;
-       switch (termios->c_cflag & CSIZE) {
-       case CS5:
-@@ -1712,8 +1746,13 @@ serial8250_set_termios(struct uart_port 
-       /*
-        * Ask the core to calculate the divisor for us.
-        */
--      baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); 
--      quot = serial8250_get_divisor(port, baud);
-+
-+      if (port->type == PORT_16C950 || (port->flags & UPF_MAGIC_MULTIPLIER)) {
-+              baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/4);
-+      } else {
-+              baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
-+      }
-+      quot = serial8250_get_divisor(port, baud, &prescaler);
-       /*
-        * Oxford Semi 952 rev B workaround
-@@ -1817,6 +1856,13 @@ serial8250_set_termios(struct uart_port 
-       serial_outp(up, UART_DLM, quot >> 8);           /* MS of divisor */
-       /*
-+       * Program prescaler for 16C950 chips.
-+       */
-+      if (up->port.type == PORT_16C950) {
-+              serial_icr_write(up, UART_TCR, prescaler == 16 ? 0 : prescaler);
-+      }
-+
-+      /*
-        * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
-        * is written without DLAB set, this mode will be disabled.
-        */
-_
diff --git a/meta/packages/linux/linux-rp-2.6.20/sharpsl-rc-r1.patch b/meta/packages/linux/linux-rp-2.6.20/sharpsl-rc-r1.patch
deleted file mode 100644 (file)
index da83fdf..0000000
+++ /dev/null
@@ -1,519 +0,0 @@
-Index: linux-2.6.20/arch/arm/mach-pxa/spitz.c
-===================================================================
---- linux-2.6.20.orig/arch/arm/mach-pxa/spitz.c
-+++ linux-2.6.20/arch/arm/mach-pxa/spitz.c
-@@ -244,6 +244,13 @@ static struct platform_device spitzkbd_d
-       .id             = -1,
- };
-+/*
-+ * Spitz Remote Control Device
-+ */
-+static struct platform_device sharpsl_rc_device = {
-+      .name           = "sharpsl-remote-control",
-+      .id             = -1,
-+};
- /*
-  * Spitz LEDs
-@@ -476,6 +483,7 @@ static struct platform_device *devices[]
-       &spitzscoop_device,
-       &spitzssp_device,
-       &spitzkbd_device,
-+      &sharpsl_rc_device,
-       &spitzts_device,
-       &spitzbl_device,
-       &spitzled_device,
-Index: linux-2.6.20/drivers/input/keyboard/Kconfig
-===================================================================
---- linux-2.6.20.orig/drivers/input/keyboard/Kconfig
-+++ linux-2.6.20/drivers/input/keyboard/Kconfig
-@@ -154,6 +154,17 @@ config KEYBOARD_SPITZ
-         To compile this driver as a module, choose M here: the
-         module will be called spitzkbd.
-+config SHARPSL_RC
-+      tristate "Sharp SL-Cxx00 Remote Control"
-+      depends on PXA_SHARPSL
-+      default y
-+      help
-+        Say Y here to enable the remote on the Sharp Zaurus SL-Cxx00,
-+        SL-C1000, SL-C3000 and Sl-C3100 series of PDAs.
-+
-+        To compile this driver as a module, choose M here: the
-+        module will be called sharpsl_rc.
-+
- config KEYBOARD_AMIGA
-       tristate "Amiga keyboard"
-       depends on AMIGA
-Index: linux-2.6.20/drivers/input/keyboard/Makefile
-===================================================================
---- linux-2.6.20.orig/drivers/input/keyboard/Makefile
-+++ linux-2.6.20/drivers/input/keyboard/Makefile
-@@ -14,6 +14,7 @@ obj-$(CONFIG_KEYBOARD_NEWTON)                += newton
- obj-$(CONFIG_KEYBOARD_STOWAWAY)               += stowaway.o
- obj-$(CONFIG_KEYBOARD_CORGI)          += corgikbd.o
- obj-$(CONFIG_KEYBOARD_SPITZ)          += spitzkbd.o
-+obj-$(CONFIG_SHARPSL_RC)                      += sharpsl_rc.o
- obj-$(CONFIG_KEYBOARD_HIL)            += hil_kbd.o
- obj-$(CONFIG_KEYBOARD_HIL_OLD)                += hilkbd.o
- obj-$(CONFIG_KEYBOARD_OMAP)             += omap-keypad.o
-Index: linux-2.6.20/drivers/input/keyboard/sharpsl_rc.c
-===================================================================
---- /dev/null
-+++ linux-2.6.20/drivers/input/keyboard/sharpsl_rc.c
-@@ -0,0 +1,291 @@
-+/*
-+ *  Keyboard driver for Sharp Clamshell Models (SL-Cxx00)
-+ *
-+ *  Copyright (c) 2004-2005 Richard Purdie
-+ *
-+ *  Based on corgikbd.c and Sharp's RC driver
-+ *
-+ *  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.
-+ *
-+ */
-+
-+#define DEBUG 1
-+#include <linux/delay.h>
-+#include <linux/platform_device.h>
-+#include <linux/init.h>
-+#include <linux/input.h>
-+#include <linux/interrupt.h>
-+#include <linux/jiffies.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+
-+#ifdef CONFIG_MACH_SPITZ
-+#include <asm/arch/spitz.h>
-+#endif
-+#ifdef CONFIG_MACH_CORGI
-+#include <asm/arch/corgi.h>
-+#endif
-+
-+#include <asm/arch/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/hardware/scoop.h>
-+#include <asm/arch/sharpsl.h>
-+#include <asm/hardware/sharpsl_pm.h>
-+
-+#define DPRINTK(fmt, args...) dev_dbg(data->dev, fmt "\n", ##args)
-+
-+struct remote_control_key {
-+      unsigned char min;
-+      unsigned char max;
-+      unsigned char key;
-+};
-+
-+#ifdef CONFIG_MACH_SPITZ
-+#define REMOTE_AKIN_PULLUP SPITZ_SCP2_AKIN_PULLUP
-+#define REMOTE_SCOOP_DEVICE spitzscoop2_device
-+#define REMOTE_GPIO_INT SPITZ_GPIO_AK_INT
-+#define REMOTE_IRQ_INT SPITZ_IRQ_GPIO_AK_INT
-+static struct remote_control_key remote_keys[] = {
-+      { 25, 35, KEY_STOPCD},
-+      { 55, 65, KEY_PLAYPAUSE},
-+      { 85, 95, KEY_NEXTSONG},
-+      { 115, 125, KEY_VOLUMEUP},
-+      { 145, 155, KEY_PREVIOUSSONG},
-+      { 180, 190, KEY_MUTE},
-+      { 215, 225, KEY_VOLUMEDOWN},
-+};
-+#endif
-+#ifdef CONFIG_MACH_CORGI
-+#define REMOTE_AKIN_PULLUP CORGI_SCP_AKIN_PULLUP
-+#define REMOTE_SCOOP_DEVICE corgiscoop_device
-+#define REMOTE_GPIO_INT CORGI_GPIO_AK_INT
-+#define REMOTE_IRQ_INT CORGI_IRQ_GPIO_AK_INT
-+static struct remote_control_key remote_keys[] = {
-+    //These need to be fixed for the CE-RH1's values
-+      { 25, 35, KEY_STOPCD},
-+      { 55, 65, KEY_PLAYPAUSE},
-+      { 85, 95, KEY_NEXTSONG},
-+      { 115, 125, KEY_VOLUMEUP},
-+      { 145, 155, KEY_PREVIOUSSONG},
-+      { 180, 190, KEY_MUTE},
-+      { 215, 225, KEY_VOLUMEDOWN},
-+};
-+#endif
-+
-+#define RELEASE_HI      230
-+#define MAX_EARPHONE    6
-+#define RC_POLL_MS      10
-+#define RC_FINISH_MS    500
-+#define WAIT_STATE      3
-+#define NOISE_THRESHOLD 100
-+
-+struct sharpsl_rc {
-+      struct input_dev *input;
-+      struct device *dev;
-+
-+      spinlock_t lock;
-+      struct timer_list rctimer;
-+      struct timer_list rctimer_finish;
-+
-+      unsigned int handling_press;
-+      unsigned int noise;
-+      unsigned int state;
-+      unsigned int last_key;
-+};
-+
-+static int get_remocon_raw(void)
-+{
-+      int i, val;
-+
-+      val = sharpsl_pm_pxa_read_max1111(MAX1111_REMCOM);
-+      for (i = 0; i < ARRAY_SIZE(remote_keys); ++i) {
-+              if (val >= remote_keys[i].min
-+                      && val <= remote_keys[i].max) {
-+                      printk("get_remocon_raw: VAL=%i, KEY=%i\n", val, remote_keys[i].key);
-+                      return remote_keys[i].key;
-+              }
-+      }
-+      return 0;
-+}
-+
-+static irqreturn_t sharpsl_rc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      struct sharpsl_rc *data = dev_id;
-+      DPRINTK("sharpsl_rc_interrupt %d\n", irq);
-+      if (!data->handling_press) {
-+              DPRINTK("handling interrupt");
-+              data->handling_press = 1;
-+              data->noise = 0;
-+              data->state = 0;
-+              data->last_key = 0;
-+
-+              reset_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP);
-+
-+              mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS));
-+      }
-+      return IRQ_HANDLED;
-+}
-+
-+static void sharpsl_rc_timer_callback(unsigned long dataPtr)
-+{
-+      struct sharpsl_rc *data = (struct sharpsl_rc *) dataPtr;
-+      int timer = 1;
-+      int key = get_remocon_raw();
-+      DPRINTK("timer callback, key: %d", key);
-+
-+      //wait for value to stabilize
-+      if (data->state < WAIT_STATE) {
-+              if (data->last_key != key) {
-+                      ++data->noise;
-+                      if (data->noise > NOISE_THRESHOLD) {
-+                              DPRINTK("too much noise, bailing");
-+                              timer = 0;
-+                      }
-+                      data->state = 0;
-+              } else {
-+                      ++data->state;
-+              }
-+              data->last_key = key;
-+
-+      //stable value, send event
-+      } else if (data->state == WAIT_STATE) {
-+              data->noise = 0;
-+              //non-key returned, skip the rest of the states and bail now
-+              if (data->last_key == 0) {
-+                      DPRINTK("non-key detected %d, noise: %d", data->last_key, data->noise);
-+                      timer = 0;
-+              //send button press
-+              } else {
-+                      DPRINTK("key press detected %d, noise %d", data->last_key, data->noise);
-+                      input_report_key(data->input, data->last_key, 1);
-+              }
-+              ++data->state;
-+
-+      //wait until key is released
-+      } else if (data->state < WAIT_STATE * 2) {
-+              if (key == data->last_key
-+                      && data->noise < NOISE_THRESHOLD) {
-+                      data->state = WAIT_STATE + 1;
-+                      ++data->noise;
-+              } else {
-+                      ++data->state;
-+              }
-+      //key is released, send event
-+      } else {
-+              //send button release
-+              DPRINTK("release key %d", data->last_key);
-+              input_report_key(data->input, data->last_key, 0);
-+              timer = 0;
-+      }
-+      if (timer) {
-+              mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS));
-+      } else {
-+              set_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP);
-+              data->handling_press = 0;
-+      }
-+}
-+
-+static int __init sharpsl_rc_probe(struct platform_device *pdev)
-+{
-+      struct sharpsl_rc *sharpsl_rc;
-+      struct input_dev *input_dev;
-+      int i, ret;
-+
-+      dev_dbg(&pdev->dev, "sharpsl_rc_probe\n");
-+
-+      sharpsl_rc = kzalloc(sizeof(struct sharpsl_rc), GFP_KERNEL);
-+      input_dev = input_allocate_device();
-+      if (!sharpsl_rc || !input_dev) {
-+              kfree(sharpsl_rc);
-+              input_free_device(input_dev);
-+              return -ENOMEM;
-+      }
-+
-+      platform_set_drvdata(pdev, sharpsl_rc);
-+
-+      sharpsl_rc->dev = &pdev->dev;
-+      sharpsl_rc->input = input_dev;
-+      spin_lock_init(&sharpsl_rc->lock);
-+
-+      /* Init Remote Control Timer */
-+      init_timer(&sharpsl_rc->rctimer);
-+      sharpsl_rc->rctimer.function = sharpsl_rc_timer_callback;
-+      sharpsl_rc->rctimer.data = (unsigned long) sharpsl_rc;
-+
-+      input_dev->name = "Sharp Remote Control CE-RHX";
-+      input_dev->phys = "sharpsl_rc/input0";
-+      input_dev->id.bustype = BUS_HOST;
-+      input_dev->id.vendor = 0x0001;
-+      input_dev->id.product = 0x0001;
-+      input_dev->id.version = 0x0100;
-+      input_dev->cdev.dev = &pdev->dev;
-+      input_dev->private = sharpsl_rc;
-+
-+      input_dev->evbit[0] = BIT(EV_KEY);
-+
-+      for (i = 0; i <= ARRAY_SIZE(remote_keys); i++)
-+        set_bit(remote_keys[i].key, input_dev->keybit);
-+
-+      input_register_device(sharpsl_rc->input);
-+
-+      pxa_gpio_mode(REMOTE_GPIO_INT | GPIO_IN);
-+      ret = request_irq(REMOTE_IRQ_INT,
-+                                        sharpsl_rc_interrupt,
-+                                        IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED,
-+                                        "sharpsl_rc",
-+                                        sharpsl_rc);
-+      if (ret < 0) {
-+              dev_dbg(&pdev->dev, "Can't get IRQ: %d!\n", i);
-+              kfree(sharpsl_rc);
-+              input_free_device(input_dev);
-+              return ret;
-+      }
-+
-+      return 0;
-+}
-+
-+static int sharpsl_rc_remove(struct platform_device *pdev)
-+{
-+      struct sharpsl_rc *sharpsl_rc = platform_get_drvdata(pdev);
-+
-+      dev_dbg(&pdev->dev, "sharpsl_rc_remove\n");
-+
-+      free_irq(REMOTE_IRQ_INT, sharpsl_rc);
-+      del_timer_sync(&sharpsl_rc->rctimer);
-+      input_unregister_device(sharpsl_rc->input);
-+      kfree(sharpsl_rc);
-+
-+      return 0;
-+}
-+
-+static struct platform_driver sharpsl_rc_driver = {
-+      .probe          = sharpsl_rc_probe,
-+      .remove         = sharpsl_rc_remove,
-+      .suspend        = NULL,
-+      .resume         = NULL,
-+      .driver         = {
-+              .name   = "sharpsl-remote-control",
-+      },
-+};
-+
-+static int __devinit sharpsl_rc_init(void)
-+{
-+      printk("sharpsl_rc_init\n");
-+      return platform_driver_register(&sharpsl_rc_driver);
-+}
-+
-+static void __exit sharpsl_rc_exit(void)
-+{
-+      printk("sharpsl_rc_exit\n");
-+      platform_driver_unregister(&sharpsl_rc_driver);
-+}
-+
-+module_init(sharpsl_rc_init);
-+module_exit(sharpsl_rc_exit);
-+
-+MODULE_AUTHOR("Justin Patrin <papercrane@reversefold.com>");
-+MODULE_AUTHOR("Richard Purdie <rpurdie@rpsys.net>");
-+MODULE_DESCRIPTION("SharpSL Remote Control Driver");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.20/drivers/input/keyboard/spitzkbd.c
-===================================================================
---- linux-2.6.20.orig/drivers/input/keyboard/spitzkbd.c
-+++ linux-2.6.20/drivers/input/keyboard/spitzkbd.c
-@@ -19,6 +19,7 @@
- #include <linux/jiffies.h>
- #include <linux/module.h>
- #include <linux/slab.h>
-+#include <linux/kmod.h>
- #include <asm/arch/spitz.h>
- #include <asm/arch/hardware.h>
-@@ -279,13 +280,21 @@ static irqreturn_t spitzkbd_hinge_isr(in
- static int sharpsl_hinge_state;
- static int hinge_count;
-+void spitzkbd_handle_sharpsl_rc(void *arg) {
-+      request_module("sharpsl_rc");
-+}
-+
-+DECLARE_WORK(spitzkbd_work, spitzkbd_handle_sharpsl_rc);
-+
- static void spitzkbd_hinge_timer(unsigned long data)
- {
-       struct spitzkbd *spitzkbd_data = (struct spitzkbd *) data;
-       unsigned long state;
-       unsigned long flags;
-+      unsigned int headphone, remote;
-       state = GPLR(SPITZ_GPIO_SWA) & (GPIO_bit(SPITZ_GPIO_SWA)|GPIO_bit(SPITZ_GPIO_SWB));
-+      state |= (GPLR(SPITZ_GPIO_HP_IN) & GPIO_bit(SPITZ_GPIO_HP_IN));
-       state |= (GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT));
-       if (state != sharpsl_hinge_state) {
-               hinge_count = 0;
-@@ -299,9 +308,18 @@ static void spitzkbd_hinge_timer(unsigne
-               input_report_switch(spitzkbd_data->input, SW_LID, ((GPLR(SPITZ_GPIO_SWA) & GPIO_bit(SPITZ_GPIO_SWA)) != 0));
-               input_report_switch(spitzkbd_data->input, SW_TABLET_MODE, ((GPLR(SPITZ_GPIO_SWB) & GPIO_bit(SPITZ_GPIO_SWB)) != 0));
--              input_report_switch(spitzkbd_data->input, SW_HEADPHONE_INSERT, ((GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)) != 0));
-+
-+              headphone = ((GPLR(SPITZ_GPIO_HP_IN) & GPIO_bit(SPITZ_GPIO_HP_IN)) != 0);
-+              input_report_switch(spitzkbd_data->input, SW_HEADPHONE_INSERT, headphone);
-+
-+              remote = headphone && ((GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)) == 0);
-+              input_report_switch(spitzkbd_data->input, SW_REMOTE_INSERT, remote);
-               input_sync(spitzkbd_data->input);
-+              if (remote) {
-+                      schedule_work(&spitzkbd_work);
-+              }
-+
-               spin_unlock_irqrestore(&spitzkbd_data->lock, flags);
-       } else {
-               mod_timer(&spitzkbd_data->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL));
-@@ -394,6 +412,7 @@ static int __init spitzkbd_probe(struct 
-       set_bit(SW_LID, input_dev->swbit);
-       set_bit(SW_TABLET_MODE, input_dev->swbit);
-       set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
-+      set_bit(SW_REMOTE_INSERT, input_dev->swbit);
-       err = input_register_device(input_dev);
-       if (err)
-@@ -431,9 +450,12 @@ static int __init spitzkbd_probe(struct 
-       request_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd_hinge_isr,
-                   IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-                   "Spitzkbd SWB", spitzkbd);
--      request_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd_hinge_isr,
-+      request_irq(SPITZ_IRQ_GPIO_HP_IN, spitzkbd_hinge_isr,
-                   IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-                   "Spitzkbd HP", spitzkbd);
-+      request_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd_hinge_isr,
-+                  IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED,
-+            "Spitzkbd HP Type", spitzkbd);
-       return 0;
-@@ -454,6 +476,7 @@ static int spitzkbd_remove(struct platfo
-       free_irq(SPITZ_IRQ_GPIO_ON_KEY, spitzkbd);
-       free_irq(SPITZ_IRQ_GPIO_SWA, spitzkbd);
-       free_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd);
-+      free_irq(SPITZ_IRQ_GPIO_HP_IN, spitzkbd);
-       free_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd);
-       del_timer_sync(&spitzkbd->htimer);
-Index: linux-2.6.20/arch/arm/mach-pxa/sharpsl.h
-===================================================================
---- linux-2.6.20.orig/arch/arm/mach-pxa/sharpsl.h
-+++ linux-2.6.20/arch/arm/mach-pxa/sharpsl.h
-@@ -50,15 +50,10 @@ void spitz_wait_hsync(void);
- #define READ_GPIO_BIT(x)    (GPLR(x) & GPIO_bit(x))
--/* MAX1111 Channel Definitions */
--#define MAX1111_BATT_VOLT   4u
--#define MAX1111_BATT_TEMP   2u
--#define MAX1111_ACIN_VOLT   6u
--
- extern struct battery_thresh spitz_battery_levels_acin[];
- extern struct battery_thresh spitz_battery_levels_noac[];
- void sharpsl_pm_pxa_init(void);
- void sharpsl_pm_pxa_remove(void);
--int sharpsl_pm_pxa_read_max1111(int channel);
-+
-Index: linux-2.6.20/arch/arm/mach-pxa/sharpsl_pm.c
-===================================================================
---- linux-2.6.20.orig/arch/arm/mach-pxa/sharpsl_pm.c
-+++ linux-2.6.20/arch/arm/mach-pxa/sharpsl_pm.c
-@@ -135,6 +135,8 @@ int sharpsl_pm_pxa_read_max1111(int chan
-                       | MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR);
- }
-+EXPORT_SYMBOL(sharpsl_pm_pxa_read_max1111);
-+
- void sharpsl_pm_pxa_init(void)
- {
-       pxa_gpio_mode(sharpsl_pm.machinfo->gpio_acin | GPIO_IN);
-Index: linux-2.6.20/include/asm-arm/hardware/sharpsl_pm.h
-===================================================================
---- linux-2.6.20.orig/include/asm-arm/hardware/sharpsl_pm.h
-+++ linux-2.6.20/include/asm-arm/hardware/sharpsl_pm.h
-@@ -104,3 +104,10 @@ irqreturn_t sharpsl_ac_isr(int irq, void
- irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id);
- irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id);
-+/* MAX1111 Channel Definitions */
-+#define MAX1111_REMCOM      0u
-+#define MAX1111_BATT_VOLT   4u
-+#define MAX1111_BATT_TEMP   2u
-+#define MAX1111_ACIN_VOLT   6u
-+
-+int sharpsl_pm_pxa_read_max1111(int channel);
-Index: linux-2.6.20/include/linux/input.h
-===================================================================
---- linux-2.6.20.orig/include/linux/input.h
-+++ linux-2.6.20/include/linux/input.h
-@@ -602,6 +602,7 @@ struct input_absinfo {
- #define SW_LID                        0x00  /* set = lid shut */
- #define SW_TABLET_MODE                0x01  /* set = tablet mode */
- #define SW_HEADPHONE_INSERT   0x02  /* set = inserted */
-+#define SW_REMOTE_INSERT    0x04  /* set = remote */
- #define SW_MAX                        0x0f
- /*
-Index: linux-2.6.20/arch/arm/mach-pxa/spitz_pm.c
-===================================================================
---- linux-2.6.20.orig/arch/arm/mach-pxa/spitz_pm.c
-+++ linux-2.6.20/arch/arm/mach-pxa/spitz_pm.c
-@@ -161,6 +161,13 @@ static int spitz_should_wakeup(unsigned 
-       if (resume_on_alarm && (PEDR & PWER_RTC))
-               is_resume |= PWER_RTC;
-+      printk("wakeup: PEDR: %x, PKSR: %x, HP_IN: %x, AK_INT: %x\n", PEDR, PKSR, GPIO_bit(SPITZ_GPIO_HP_IN), GPIO_bit(SPITZ_GPIO_AK_INT));
-+
-+      //remote/headphone interrupt, wakeup
-+      if (PEDR == 0 && (PKSR & 0xc0d01) != 0) {
-+              is_resume |= PWER_RTC;
-+      }
-+
-       dev_dbg(sharpsl_pm.dev, "is_resume: %x\n",is_resume);
-       return is_resume;
- }
diff --git a/meta/packages/linux/linux-rp-2.6.20/squashfs3.0-2.6.15.patch b/meta/packages/linux/linux-rp-2.6.20/squashfs3.0-2.6.15.patch
deleted file mode 100644 (file)
index 405d4ec..0000000
+++ /dev/null
@@ -1,4191 +0,0 @@
- fs/Kconfig                     |   65 +
- fs/Makefile                    |    1 
- fs/squashfs/Makefile           |    7 
- fs/squashfs/inode.c            | 2124 +++++++++++++++++++++++++++++++++++++++++
- fs/squashfs/squashfs.h         |   86 +
- fs/squashfs/squashfs2_0.c      |  757 ++++++++++++++
- include/linux/squashfs_fs.h    |  911 +++++++++++++++++
- include/linux/squashfs_fs_i.h  |   45 
- include/linux/squashfs_fs_sb.h |   74 +
- init/do_mounts_rd.c            |   13 
- 10 files changed, 4083 insertions(+)
-
-Index: git/fs/Kconfig
-===================================================================
---- git.orig/fs/Kconfig        2006-10-31 16:09:22.000000000 +0000
-+++ git/fs/Kconfig     2006-10-31 21:26:45.000000000 +0000
-@@ -1407,6 +1407,71 @@ config CRAMFS
-         If unsure, say N.
-+config SQUASHFS
-+      tristate "SquashFS 3.0 - Squashed file system support"
-+      select ZLIB_INFLATE
-+      help
-+        Saying Y here includes support for SquashFS 3.0 (a Compressed Read-Only File
-+        System).  Squashfs is a highly compressed read-only filesystem for Linux.
-+        It uses zlib compression to compress both files, inodes and directories.
-+        Inodes in the system are very small and all blocks are packed to minimise
-+        data overhead. Block sizes greater than 4K are supported up to a maximum of 64K.
-+        SquashFS 3.0 supports 64 bit filesystems and files (larger than 4GB), full
-+        uid/gid information, hard links and timestamps.
-+
-+        Squashfs is intended for general read-only filesystem use, for archival
-+        use (i.e. in cases where a .tar.gz file may be used), and in embedded
-+        systems where low overhead is needed.  Further information and filesystem tools
-+        are available from http://squashfs.sourceforge.net.
-+
-+        If you want to compile this as a module ( = code which can be
-+        inserted in and removed from the running kernel whenever you want),
-+        say M here and read <file:Documentation/modules.txt>.  The module
-+        will be called squashfs.  Note that the root file system (the one
-+        containing the directory /) cannot be compiled as a module.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_EMBEDDED
-+
-+      bool "Additional options for memory-constrained systems" 
-+      depends on SQUASHFS
-+      default n
-+      help
-+        Saying Y here allows you to specify cache sizes and how Squashfs
-+        allocates memory.  This is only intended for memory constrained
-+        systems.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_FRAGMENT_CACHE_SIZE
-+      int "Number of fragments cached" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default "3"
-+      help
-+        By default SquashFS caches the last 3 fragments read from
-+        the filesystem.  Increasing this amount may mean SquashFS
-+        has to re-read fragments less often from disk, at the expense
-+        of extra system memory.  Decreasing this amount will mean
-+        SquashFS uses less memory at the expense of extra reads from disk.
-+
-+        Note there must be at least one cached fragment.  Anything
-+        much more than three will probably not make much difference.
-+
-+config SQUASHFS_VMALLOC
-+      bool "Use Vmalloc rather than Kmalloc" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default n
-+      help
-+        By default SquashFS uses kmalloc to obtain fragment cache memory.
-+        Kmalloc memory is the standard kernel allocator, but it can fail
-+        on memory constrained systems.  Because of the way Vmalloc works,
-+        Vmalloc can succeed when kmalloc fails.  Specifying this option
-+        will make SquashFS always use Vmalloc to allocate the
-+        fragment cache memory.
-+
-+        If unsure, say N.
-+
- config VXFS_FS
-       tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
-       depends on BLOCK
-Index: git/fs/Makefile
-===================================================================
---- git.orig/fs/Makefile       2006-10-31 16:09:22.000000000 +0000
-+++ git/fs/Makefile    2006-10-31 21:26:45.000000000 +0000
-@@ -67,6 +67,7 @@ obj-$(CONFIG_JBD)            += jbd/
- obj-$(CONFIG_JBD2)            += jbd2/
- obj-$(CONFIG_EXT2_FS)         += ext2/
- obj-$(CONFIG_CRAMFS)          += cramfs/
-+obj-$(CONFIG_SQUASHFS)                += squashfs/
- obj-$(CONFIG_RAMFS)           += ramfs/
- obj-$(CONFIG_HUGETLBFS)               += hugetlbfs/
- obj-$(CONFIG_CODA_FS)         += coda/
-Index: git/fs/squashfs/inode.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/fs/squashfs/inode.c    2006-11-01 18:01:32.000000000 +0000
-@@ -0,0 +1,2124 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * inode.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+
-+static void squashfs_put_super(struct super_block *);
-+static int squashfs_statfs(struct dentry *, struct kstatfs *);
-+static int squashfs_symlink_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage4K(struct file *file, struct page *page);
-+static int squashfs_readdir(struct file *, void *, filldir_t);
-+static struct inode *squashfs_alloc_inode(struct super_block *sb);
-+static void squashfs_destroy_inode(struct inode *inode);
-+static int init_inodecache(void);
-+static void destroy_inodecache(void);
-+static struct dentry *squashfs_lookup(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode);
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize);
-+static int squashfs_get_sb(struct file_system_type *, int,
-+                              const char *, void *, struct vfsmount *);
-+
-+
-+static z_stream stream;
-+
-+static struct file_system_type squashfs_fs_type = {
-+      .owner = THIS_MODULE,
-+      .name = "squashfs",
-+      .get_sb = squashfs_get_sb,
-+      .kill_sb = kill_block_super,
-+      .fs_flags = FS_REQUIRES_DEV
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static struct super_operations squashfs_ops = {
-+      .alloc_inode = squashfs_alloc_inode,
-+      .destroy_inode = squashfs_destroy_inode,
-+      .statfs = squashfs_statfs,
-+      .put_super = squashfs_put_super,
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = {
-+      .readpage = squashfs_symlink_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops = {
-+      .readpage = squashfs_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops_4K = {
-+      .readpage = squashfs_readpage4K
-+};
-+
-+static struct file_operations squashfs_dir_ops = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir
-+};
-+
-+SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = {
-+      .lookup = squashfs_lookup
-+};
-+
-+
-+static struct buffer_head *get_block_length(struct super_block *s,
-+                              int *cur_index, int *offset, int *c_byte)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned short temp;
-+      struct buffer_head *bh;
-+
-+      if (!(bh = sb_bread(s, *cur_index)))
-+              goto out;
-+
-+      if (msblk->devblksize - *offset == 1) {
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              else
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              brelse(bh);
-+              if (!(bh = sb_bread(s, ++(*cur_index))))
-+                      goto out;
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              bh->b_data); 
-+              else
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              bh->b_data); 
-+              *c_byte = temp;
-+              *offset = 1;
-+      } else {
-+              if (msblk->swap) {
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1)); 
-+              } else {
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1)); 
-+              }
-+              *c_byte = temp;
-+              *offset += 2;
-+      }
-+
-+      if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) {
-+              if (*offset == msblk->devblksize) {
-+                      brelse(bh);
-+                      if (!(bh = sb_bread(s, ++(*cur_index))))
-+                              goto out;
-+                      *offset = 0;
-+              }
-+              if (*((unsigned char *) (bh->b_data + *offset)) !=
-+                                              SQUASHFS_MARKER_BYTE) {
-+                      ERROR("Metadata block marker corrupt @ %x\n",
-+                                              *cur_index);
-+                      brelse(bh);
-+                      goto out;
-+              }
-+              (*offset)++;
-+      }
-+      return bh;
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+SQSH_EXTERN unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                      long long index, unsigned int length,
-+                      long long *next_index)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >>
-+                      msblk->devblksize_log2) + 2];
-+      unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1);
-+      unsigned int cur_index = index >> msblk->devblksize_log2;
-+      int bytes, avail_bytes, b = 0, k;
-+      char *c_buffer;
-+      unsigned int compressed;
-+      unsigned int c_byte = length;
-+
-+      if (c_byte) {
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              if (!(bh[0] = sb_getblk(s, cur_index)))
-+                      goto block_release;
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b, bh);
-+      } else {
-+              if (!(bh[0] = get_block_length(s, &cur_index, &offset,
-+                                                              &c_byte)))
-+                      goto read_failure;
-+
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b - 1, bh + 1);
-+      }
-+
-+      if (compressed)
-+              down(&msblk->read_data_mutex);
-+
-+      for (bytes = 0, k = 0; k < b; k++) {
-+              avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ?
-+                                      msblk->devblksize - offset :
-+                                      c_byte - bytes;
-+              wait_on_buffer(bh[k]);
-+              if (!buffer_uptodate(bh[k]))
-+                      goto block_release;
-+              memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes);
-+              bytes += avail_bytes;
-+              offset = 0;
-+              brelse(bh[k]);
-+      }
-+
-+      /*
-+       * uncompress block
-+       */
-+      if (compressed) {
-+              int zlib_err;
-+
-+              stream.next_in = c_buffer;
-+              stream.avail_in = c_byte;
-+              stream.next_out = buffer;
-+              stream.avail_out = msblk->read_size;
-+
-+              if (((zlib_err = zlib_inflateInit(&stream)) != Z_OK) ||
-+                              ((zlib_err = zlib_inflate(&stream, Z_FINISH))
-+                               != Z_STREAM_END) || ((zlib_err =
-+                              zlib_inflateEnd(&stream)) != Z_OK)) {
-+                      ERROR("zlib_fs returned unexpected result 0x%x\n",
-+                              zlib_err);
-+                      bytes = 0;
-+              } else
-+                      bytes = stream.total_out;
-+              
-+              up(&msblk->read_data_mutex);
-+      }
-+
-+      if (next_index)
-+              *next_index = index + c_byte + (length ? 0 :
-+                              (SQUASHFS_CHECK_DATA(msblk->sblk.flags)
-+                               ? 3 : 2));
-+      return bytes;
-+
-+block_release:
-+      while (--b >= 0)
-+              brelse(bh[b]);
-+
-+read_failure:
-+      ERROR("sb_bread failed reading block 0x%x\n", cur_index);
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      int n, i, bytes, return_length = length;
-+      long long next_index;
-+
-+      TRACE("Entered squashfs_get_cached_block [%llx:%x]\n", block, offset);
-+
-+      while ( 1 ) {
-+              for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) 
-+                      if (msblk->block_cache[i].block == block)
-+                              break; 
-+              
-+              down(&msblk->block_cache_mutex);
-+
-+              if (i == SQUASHFS_CACHED_BLKS) {
-+                      /* read inode header block */
-+                      for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS;
-+                                      n ; n --, i = (i + 1) %
-+                                      SQUASHFS_CACHED_BLKS)
-+                              if (msblk->block_cache[i].block !=
-+                                                      SQUASHFS_USED_BLK)
-+                                      break;
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->waitq, &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->block_cache_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->waitq, &wait);
-+                              continue;
-+                      }
-+                      msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS;
-+
-+                      if (msblk->block_cache[i].block ==
-+                                                      SQUASHFS_INVALID_BLK) {
-+                              if (!(msblk->block_cache[i].data =
-+                                              kmalloc(SQUASHFS_METADATA_SIZE,
-+                                              GFP_KERNEL))) {
-+                                      ERROR("Failed to allocate cache"
-+                                                      "block\n");
-+                                      up(&msblk->block_cache_mutex);
-+                                      goto out;
-+                              }
-+                      }
-+      
-+                      msblk->block_cache[i].block = SQUASHFS_USED_BLK;
-+                      up(&msblk->block_cache_mutex);
-+
-+                      if (!(msblk->block_cache[i].length =
-+                                              squashfs_read_data(s,
-+                                              msblk->block_cache[i].data,
-+                                              block, 0, &next_index))) {
-+                              ERROR("Unable to read cache block [%llx:%x]\n",
-+                                              block, offset);
-+                              goto out;
-+                      }
-+
-+                      down(&msblk->block_cache_mutex);
-+                      wake_up(&msblk->waitq);
-+                      msblk->block_cache[i].block = block;
-+                      msblk->block_cache[i].next_index = next_index;
-+                      TRACE("Read cache block [%llx:%x]\n", block, offset);
-+              }
-+
-+              if (msblk->block_cache[i].block != block) {
-+                      up(&msblk->block_cache_mutex);
-+                      continue;
-+              }
-+
-+              if ((bytes = msblk->block_cache[i].length - offset) >= length) {
-+                      if (buffer)
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, length);
-+                      if (msblk->block_cache[i].length - offset == length) {
-+                              *next_block = msblk->block_cache[i].next_index;
-+                              *next_offset = 0;
-+                      } else {
-+                              *next_block = block;
-+                              *next_offset = offset + length;
-+                      }
-+                      up(&msblk->block_cache_mutex);
-+                      goto finish;
-+              } else {
-+                      if (buffer) {
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, bytes);
-+                              buffer += bytes;
-+                      }
-+                      block = msblk->block_cache[i].next_index;
-+                      up(&msblk->block_cache_mutex);
-+                      length -= bytes;
-+                      offset = 0;
-+              }
-+      }
-+
-+finish:
-+      return return_length;
-+out:
-+      return 0;
-+}
-+
-+
-+static int get_fragment_location(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET(fragment);
-+      struct squashfs_fragment_entry fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment)
-+{
-+      down(&msblk->fragment_mutex);
-+      fragment->locked --;
-+      wake_up(&msblk->fragment_wait_queue);
-+      up(&msblk->fragment_mutex);
-+}
-+
-+
-+SQSH_EXTERN struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length)
-+{
-+      int i, n, nf;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+
-+      while ( 1 ) {
-+              down(&msblk->fragment_mutex);
-+
-+              for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS &&
-+                              msblk->fragment[i].block != start_block; i++);
-+
-+              if (i == SQUASHFS_CACHED_FRAGMENTS) {
-+                      nf = (msblk->next_fragment + 1) % 
-+                              SQUASHFS_CACHED_FRAGMENTS;
-+                      for (i = msblk->next_fragment, n =
-+                              SQUASHFS_CACHED_FRAGMENTS; n &&
-+                              msblk->fragment[i].locked; n--, i = (i + 1) %
-+                              SQUASHFS_CACHED_FRAGMENTS);
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->fragment_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              continue;
-+                      }
-+                      msblk->next_fragment = nf;
-+                      
-+                      if (msblk->fragment[i].data == NULL)
-+                              if (!(msblk->fragment[i].data = SQUASHFS_ALLOC
-+                                              (SQUASHFS_FILE_MAX_SIZE))) {
-+                                      ERROR("Failed to allocate fragment "
-+                                                      "cache block\n");
-+                                      up(&msblk->fragment_mutex);
-+                                      goto out;
-+                              }
-+
-+                      msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+                      msblk->fragment[i].locked = 1;
-+                      up(&msblk->fragment_mutex);
-+
-+                      if (!(msblk->fragment[i].length = squashfs_read_data(s,
-+                                              msblk->fragment[i].data,
-+                                              start_block, length, NULL))) {
-+                              ERROR("Unable to read fragment cache block "
-+                                                      "[%llx]\n", start_block);
-+                              msblk->fragment[i].locked = 0;
-+                              goto out;
-+                      }
-+
-+                      msblk->fragment[i].block = start_block;
-+                      TRACE("New fragment %d, start block %lld, locked %d\n",
-+                                              i, msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+                      break;
-+              }
-+
-+              msblk->fragment[i].locked++;
-+              up(&msblk->fragment_mutex);
-+              TRACE("Got fragment %d, start block %lld, locked %d\n", i,
-+                                              msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+              break;
-+      }
-+
-+      return &msblk->fragment[i];
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header *inodeb)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = inodeb->inode_number;
-+              i->i_mtime.tv_sec = inodeb->mtime;
-+              i->i_atime.tv_sec = inodeb->mtime;
-+              i->i_ctime.tv_sec = inodeb->mtime;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header id, sid;
-+      struct squashfs_base_inode_header *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_reg_inode_header *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header *sinodep = &sid.reg;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = 1;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_LREG_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_lreg_inode_header *inodep = &id.lreg;
-+                      struct squashfs_lreg_inode_header *sinodep = &sid.lreg;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LREG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header *sinodep =
-+                                                              &sid.symlink;
-+      
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      struct squashfs_ipc_inode_header *inodep = &id.ipc;
-+                      struct squashfs_ipc_inode_header *sinodep = &sid.ipc;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_IPC_INODE_HEADER(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+      
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%llx:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int read_fragment_index_table(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      /* Allocate fragment index table */
-+      if (!(msblk->fragment_index = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+   
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              long long fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment),
-+                                              &msblk->fragment_index[i], 1);
-+                      msblk->fragment_index[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int supported_squashfs_filesystem(struct squashfs_sb_info *msblk, int silent)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget;
-+      msblk->read_blocklist = read_blocklist;
-+      msblk->read_fragment_index_table = read_fragment_index_table;
-+
-+      if (sblk->s_major == 1) {
-+              if (!squashfs_1_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 1.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if (sblk->s_major == 2) {
-+              if (!squashfs_2_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 2.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor >
-+                      SQUASHFS_MINOR) {
-+              SERROR("Major/Minor mismatch, trying to mount newer %d.%d "
-+                              "filesystem\n", sblk->s_major, sblk->s_minor);
-+              SERROR("Please update your kernel\n");
-+              return 0;
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int squashfs_fill_super(struct super_block *s, void *data, int silent)
-+{
-+      struct squashfs_sb_info *msblk;
-+      struct squashfs_super_block *sblk;
-+      int i;
-+      char b[BDEVNAME_SIZE];
-+      struct inode *root;
-+
-+      TRACE("Entered squashfs_read_superblock\n");
-+
-+      if (!(s->s_fs_info = kmalloc(sizeof(struct squashfs_sb_info),
-+                                              GFP_KERNEL))) {
-+              ERROR("Failed to allocate superblock\n");
-+              goto failure;
-+      }
-+      memset(s->s_fs_info, 0, sizeof(struct squashfs_sb_info));
-+      msblk = s->s_fs_info;
-+      sblk = &msblk->sblk;
-+      
-+      msblk->devblksize = sb_min_blocksize(s, BLOCK_SIZE);
-+      msblk->devblksize_log2 = ffz(~msblk->devblksize);
-+
-+      init_MUTEX(&msblk->read_data_mutex);
-+      init_MUTEX(&msblk->read_page_mutex);
-+      init_MUTEX(&msblk->block_cache_mutex);
-+      init_MUTEX(&msblk->fragment_mutex);
-+      init_MUTEX(&msblk->meta_index_mutex);
-+      
-+      init_waitqueue_head(&msblk->waitq);
-+      init_waitqueue_head(&msblk->fragment_wait_queue);
-+
-+      if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START,
-+                                      sizeof(struct squashfs_super_block) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              SERROR("unable to read superblock\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Check it is a SQUASHFS superblock */
-+      msblk->swap = 0;
-+      if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) {
-+              if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) {
-+                      struct squashfs_super_block ssblk;
-+
-+                      WARNING("Mounting a different endian SQUASHFS "
-+                              "filesystem on %s\n", bdevname(s->s_bdev, b));
-+
-+                      SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk);
-+                      memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block));
-+                      msblk->swap = 1;
-+              } else  {
-+                      SERROR("Can't find a SQUASHFS superblock on %s\n",
-+                                                      bdevname(s->s_bdev, b));
-+                      goto failed_mount;
-+              }
-+      }
-+
-+      /* Check the MAJOR & MINOR versions */
-+      if(!supported_squashfs_filesystem(msblk, silent))
-+              goto failed_mount;
-+
-+      TRACE("Found valid superblock on %s\n", bdevname(s->s_bdev, b));
-+      TRACE("Inodes are %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_INODES
-+                                      (sblk->flags) ? "un" : "");
-+      TRACE("Data is %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_DATA(sblk->flags)
-+                                      ? "un" : "");
-+      TRACE("Check data is %s present in the filesystem\n",
-+                                      SQUASHFS_CHECK_DATA(sblk->flags) ?
-+                                      "" : "not");
-+      TRACE("Filesystem size %lld bytes\n", sblk->bytes_used);
-+      TRACE("Block size %d\n", sblk->block_size);
-+      TRACE("Number of inodes %d\n", sblk->inodes);
-+      if (sblk->s_major > 1)
-+              TRACE("Number of fragments %d\n", sblk->fragments);
-+      TRACE("Number of uids %d\n", sblk->no_uids);
-+      TRACE("Number of gids %d\n", sblk->no_guids);
-+      TRACE("sblk->inode_table_start %llx\n", sblk->inode_table_start);
-+      TRACE("sblk->directory_table_start %llx\n", sblk->directory_table_start);
-+      if (sblk->s_major > 1)
-+              TRACE("sblk->fragment_table_start %llx\n",
-+                                      sblk->fragment_table_start);
-+      TRACE("sblk->uid_start %llx\n", sblk->uid_start);
-+
-+      s->s_flags |= MS_RDONLY;
-+      s->s_op = &squashfs_ops;
-+
-+      /* Init inode_table block pointer array */
-+      if (!(msblk->block_cache = kmalloc(sizeof(struct squashfs_cache) *
-+                                      SQUASHFS_CACHED_BLKS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+              msblk->block_cache[i].block = SQUASHFS_INVALID_BLK;
-+
-+      msblk->next_cache = 0;
-+
-+      /* Allocate read_data block */
-+      msblk->read_size = (sblk->block_size < SQUASHFS_METADATA_SIZE) ?
-+                                      SQUASHFS_METADATA_SIZE :
-+                                      sblk->block_size;
-+
-+      if (!(msblk->read_data = kmalloc(msblk->read_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_data block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate read_page block */
-+      if (!(msblk->read_page = kmalloc(sblk->block_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_page block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate uid and gid tables */
-+      if (!(msblk->uid = kmalloc((sblk->no_uids + sblk->no_guids) *
-+                                      sizeof(unsigned int), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              goto failed_mount;
-+      }
-+      msblk->guid = msblk->uid + sblk->no_uids;
-+   
-+      if (msblk->swap) {
-+              unsigned int suid[sblk->no_uids + sblk->no_guids];
-+
-+              if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+              SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids +
-+                      sblk->no_guids), (sizeof(unsigned int) * 8));
-+      } else
-+              if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+
-+      if (sblk->s_major == 1 && squashfs_1_0_supported(msblk))
-+              goto allocate_root;
-+
-+      if (!(msblk->fragment = kmalloc(sizeof(struct squashfs_fragment_cache) *
-+                              SQUASHFS_CACHED_FRAGMENTS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate fragment block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) {
-+              msblk->fragment[i].locked = 0;
-+              msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+              msblk->fragment[i].data = NULL;
-+      }
-+
-+      msblk->next_fragment = 0;
-+
-+      /* Allocate fragment index table */
-+      if (msblk->read_fragment_index_table(s) == 0)
-+              goto failed_mount;
-+
-+allocate_root:
-+      if ((root = (msblk->iget)(s, sblk->root_inode)) == NULL)
-+              goto failed_mount;
-+
-+      if ((s->s_root = d_alloc_root(root)) == NULL) {
-+              ERROR("Root inode create failed\n");
-+              iput(root);
-+              goto failed_mount;
-+      }
-+
-+      TRACE("Leaving squashfs_read_super\n");
-+      return 0;
-+
-+failed_mount:
-+      kfree(msblk->fragment_index);
-+      kfree(msblk->fragment);
-+      kfree(msblk->uid);
-+      kfree(msblk->read_page);
-+      kfree(msblk->read_data);
-+      kfree(msblk->block_cache);
-+      kfree(msblk->fragment_index_2);
-+      kfree(s->s_fs_info);
-+      s->s_fs_info = NULL;
-+      return -EINVAL;
-+
-+failure:
-+      return -ENOMEM;
-+}
-+
-+
-+static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf)
-+{
-+      struct super_block *s = dentry->d_sb;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      TRACE("Entered squashfs_statfs\n");
-+
-+      buf->f_type = SQUASHFS_MAGIC;
-+      buf->f_bsize = sblk->block_size;
-+      buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1;
-+      buf->f_bfree = buf->f_bavail = 0;
-+      buf->f_files = sblk->inodes;
-+      buf->f_ffree = 0;
-+      buf->f_namelen = SQUASHFS_NAME_LEN;
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_symlink_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      int index = page->index << PAGE_CACHE_SHIFT, length, bytes;
-+      long long block = SQUASHFS_I(inode)->start_block;
-+      int offset = SQUASHFS_I(inode)->offset;
-+      void *pageaddr = kmap(page);
-+
-+      TRACE("Entered squashfs_symlink_readpage, page index %ld, start block "
-+                              "%llx, offset %x\n", page->index,
-+                              SQUASHFS_I(inode)->start_block,
-+                              SQUASHFS_I(inode)->offset);
-+
-+      for (length = 0; length < index; length += bytes) {
-+              if (!(bytes = squashfs_get_cached_block(inode->i_sb, NULL,
-+                              block, offset, PAGE_CACHE_SIZE, &block,
-+                              &offset))) {
-+                      ERROR("Unable to read symbolic link [%llx:%x]\n", block,
-+                                      offset);
-+                      goto skip_read;
-+              }
-+      }
-+
-+      if (length != index) {
-+              ERROR("(squashfs_symlink_readpage) length != index\n");
-+              bytes = 0;
-+              goto skip_read;
-+      }
-+
-+      bytes = (i_size_read(inode) - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE :
-+                                      i_size_read(inode) - length;
-+
-+      if (!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block,
-+                                      offset, bytes, &block, &offset)))
-+              ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset);
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+struct meta_index *locate_meta_index(struct inode *inode, int index, int offset)
-+{
-+      struct meta_index *meta = NULL;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("locate_meta_index: index %d, offset %d\n", index, offset);
-+
-+      if(msblk->meta_index == NULL)
-+              goto not_allocated;
-+
-+      for (i = 0; i < SQUASHFS_META_NUMBER; i ++)
-+              if (msblk->meta_index[i].inode_number == inode->i_ino &&
-+                              msblk->meta_index[i].offset >= offset &&
-+                              msblk->meta_index[i].offset <= index &&
-+                              msblk->meta_index[i].locked == 0) {
-+                      TRACE("locate_meta_index: entry %d, offset %d\n", i,
-+                                      msblk->meta_index[i].offset);
-+                      meta = &msblk->meta_index[i];
-+                      offset = meta->offset;
-+              }
-+
-+      if (meta)
-+              meta->locked = 1;
-+
-+not_allocated:
-+      up(&msblk->meta_index_mutex);
-+
-+      return meta;
-+}
-+
-+
-+struct meta_index *empty_meta_index(struct inode *inode, int offset, int skip)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct meta_index *meta = NULL;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("empty_meta_index: offset %d, skip %d\n", offset, skip);
-+
-+      if(msblk->meta_index == NULL) {
-+              if (!(msblk->meta_index = kmalloc(sizeof(struct meta_index) *
-+                                      SQUASHFS_META_NUMBER, GFP_KERNEL))) {
-+                      ERROR("Failed to allocate meta_index\n");
-+                      goto failed;
-+              }
-+              for(i = 0; i < SQUASHFS_META_NUMBER; i++) {
-+                      msblk->meta_index[i].inode_number = 0;
-+                      msblk->meta_index[i].locked = 0;
-+              }
-+              msblk->next_meta_index = 0;
-+      }
-+
-+      for(i = SQUASHFS_META_NUMBER; i &&
-+                      msblk->meta_index[msblk->next_meta_index].locked; i --)
-+              msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      if(i == 0) {
-+              TRACE("empty_meta_index: failed!\n");
-+              goto failed;
-+      }
-+
-+      TRACE("empty_meta_index: returned meta entry %d, %p\n",
-+                      msblk->next_meta_index,
-+                      &msblk->meta_index[msblk->next_meta_index]);
-+
-+      meta = &msblk->meta_index[msblk->next_meta_index];
-+      msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      meta->inode_number = inode->i_ino;
-+      meta->offset = offset;
-+      meta->skip = skip;
-+      meta->entries = 0;
-+      meta->locked = 1;
-+
-+failed:
-+      up(&msblk->meta_index_mutex);
-+      return meta;
-+}
-+
-+
-+void release_meta_index(struct inode *inode, struct meta_index *meta)
-+{
-+      meta->locked = 0;
-+}
-+
-+
-+static int read_block_index(struct super_block *s, int blocks, char *block_list,
-+              long long *start_block, int *offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned int *block_listp;
-+      int block = 0;
-+      
-+      if (msblk->swap) {
-+              char sblock_list[blocks << 2];
-+
-+              if (!squashfs_get_cached_block(s, sblock_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+              SQUASHFS_SWAP_INTS(((unsigned int *)block_list),
-+                              ((unsigned int *)sblock_list), blocks);
-+      } else
-+              if (!squashfs_get_cached_block(s, block_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+
-+      for (block_listp = (unsigned int *) block_list; blocks;
-+                              block_listp++, blocks --)
-+              block += SQUASHFS_COMPRESSED_SIZE_BLOCK(*block_listp);
-+
-+      return block;
-+
-+failure:
-+      return -1;
-+}
-+
-+
-+#define SIZE 256
-+
-+static inline int calculate_skip(int blocks) {
-+      int skip = (blocks - 1) / ((SQUASHFS_SLOTS * SQUASHFS_META_ENTRIES + 1) * SQUASHFS_META_INDEXES);
-+      return skip >= 7 ? 7 : skip + 1;
-+}
-+
-+
-+static int get_meta_index(struct inode *inode, int index,
-+              long long *index_block, int *index_offset,
-+              long long *data_block, char *block_list)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int skip = calculate_skip(i_size_read(inode) >> sblk->block_log);
-+      int offset = 0;
-+      struct meta_index *meta;
-+      struct meta_entry *meta_entry;
-+      long long cur_index_block = SQUASHFS_I(inode)->u.s1.block_list_start;
-+      int cur_offset = SQUASHFS_I(inode)->offset;
-+      long long cur_data_block = SQUASHFS_I(inode)->start_block;
-+      int i;
-+ 
-+      index /= SQUASHFS_META_INDEXES * skip;
-+
-+      while ( offset < index ) {
-+              meta = locate_meta_index(inode, index, offset + 1);
-+
-+              if (meta == NULL) {
-+                      if ((meta = empty_meta_index(inode, offset + 1,
-+                                                      skip)) == NULL)
-+                              goto all_done;
-+              } else {
-+                      offset = index < meta->offset + meta->entries ? index :
-+                              meta->offset + meta->entries - 1;
-+                      meta_entry = &meta->meta_entry[offset - meta->offset];
-+                      cur_index_block = meta_entry->index_block + sblk->inode_table_start;
-+                      cur_offset = meta_entry->offset;
-+                      cur_data_block = meta_entry->data_block;
-+                      TRACE("get_meta_index: offset %d, meta->offset %d, "
-+                              "meta->entries %d\n", offset, meta->offset,
-+                              meta->entries);
-+                      TRACE("get_meta_index: index_block 0x%llx, offset 0x%x"
-+                              " data_block 0x%llx\n", cur_index_block,
-+                              cur_offset, cur_data_block);
-+              }
-+
-+              for (i = meta->offset + meta->entries; i <= index &&
-+                              i < meta->offset + SQUASHFS_META_ENTRIES; i++) {
-+                      int blocks = skip * SQUASHFS_META_INDEXES;
-+
-+                      while (blocks) {
-+                              int block = blocks > (SIZE >> 2) ? (SIZE >> 2) :
-+                                      blocks;
-+                              int res = read_block_index(inode->i_sb, block,
-+                                      block_list, &cur_index_block,
-+                                      &cur_offset);
-+
-+                              if (res == -1)
-+                                      goto failed;
-+
-+                              cur_data_block += res;
-+                              blocks -= block;
-+                      }
-+
-+                      meta_entry = &meta->meta_entry[i - meta->offset];
-+                      meta_entry->index_block = cur_index_block - sblk->inode_table_start;
-+                      meta_entry->offset = cur_offset;
-+                      meta_entry->data_block = cur_data_block;
-+                      meta->entries ++;
-+                      offset ++;
-+              }
-+
-+              TRACE("get_meta_index: meta->offset %d, meta->entries %d\n",
-+                              meta->offset, meta->entries);
-+
-+              release_meta_index(inode, meta);
-+      }
-+
-+all_done:
-+      *index_block = cur_index_block;
-+      *index_offset = cur_offset;
-+      *data_block = cur_data_block;
-+
-+      return offset * SQUASHFS_META_INDEXES * skip;
-+
-+failed:
-+      release_meta_index(inode, meta);
-+      return -1;
-+}
-+
-+
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize)
-+{
-+      long long block_ptr;
-+      int offset;
-+      long long block;
-+      int res = get_meta_index(inode, index, &block_ptr, &offset, &block,
-+              block_list);
-+
-+      TRACE("read_blocklist: res %d, index %d, block_ptr 0x%llx, offset"
-+                     " 0x%x, block 0x%llx\n", res, index, block_ptr, offset,
-+                     block);
-+
-+      if(res == -1)
-+              goto failure;
-+
-+      index -= res;
-+
-+      while ( index ) {
-+              int blocks = index > (SIZE >> 2) ? (SIZE >> 2) : index;
-+              int res = read_block_index(inode->i_sb, blocks, block_list,
-+                      &block_ptr, &offset);
-+              if (res == -1)
-+                      goto failure;
-+              block += res;
-+              index -= blocks;
-+      }
-+
-+      if (read_block_index(inode->i_sb, 1, block_list,
-+                      &block_ptr, &offset) == -1)
-+              goto failure;
-+      *bsize = *((unsigned int *) block_list);
-+
-+      return block;
-+
-+failure:
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, i = 0, bytes = 0, byte_offset = 0;
-+      int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT);
-+      void *pageaddr;
-+      struct squashfs_fragment_cache *fragment = NULL;
-+      char *data_ptr = msblk->read_page;
-+      
-+      int mask = (1 << (sblk->block_log - PAGE_CACHE_SHIFT)) - 1;
-+      int start_index = page->index & ~mask;
-+      int end_index = start_index | mask;
-+
-+      TRACE("Entered squashfs_readpage, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT))
-+              goto skip_read;
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              if ((block = (msblk->read_blocklist)(inode, index, 1,
-+                                      block_list, NULL, &bsize)) == 0)
-+                      goto skip_read;
-+
-+              down(&msblk->read_page_mutex);
-+              
-+              if (!(bytes = squashfs_read_data(inode->i_sb, msblk->read_page,
-+                                      block, bsize, NULL))) {
-+                      ERROR("Unable to read page, block %llx, size %x\n", block,
-+                                      bsize);
-+                      up(&msblk->read_page_mutex);
-+                      goto skip_read;
-+              }
-+      } else {
-+              if ((fragment = get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)->u.s1.fragment_size))
-+                                      == NULL) {
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      (int) SQUASHFS_I(inode)->
-+                                      u.s1.fragment_size);
-+                      goto skip_read;
-+              }
-+              bytes = SQUASHFS_I(inode)->u.s1.fragment_offset +
-+                                      (i_size_read(inode) & (sblk->block_size
-+                                      - 1));
-+              byte_offset = SQUASHFS_I(inode)->u.s1.fragment_offset;
-+              data_ptr = fragment->data;
-+      }
-+
-+      for (i = start_index; i <= end_index && byte_offset < bytes;
-+                                      i++, byte_offset += PAGE_CACHE_SIZE) {
-+              struct page *push_page;
-+              int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ?
-+                                      PAGE_CACHE_SIZE : bytes - byte_offset;
-+
-+              TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n",
-+                                      bytes, i, byte_offset, available_bytes);
-+
-+              if (i == page->index)  {
-+                      pageaddr = kmap_atomic(page, KM_USER0);
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(page);
-+                      SetPageUptodate(page);
-+                      unlock_page(page);
-+              } else if ((push_page =
-+                              grab_cache_page_nowait(page->mapping, i))) {
-+                      pageaddr = kmap_atomic(push_page, KM_USER0);
-+
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(push_page);
-+                      SetPageUptodate(push_page);
-+                      unlock_page(push_page);
-+                      page_cache_release(push_page);
-+              }
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log))
-+              up(&msblk->read_page_mutex);
-+      else
-+              release_cached_fragment(msblk, fragment);
-+
-+      return 0;
-+
-+skip_read:
-+      pageaddr = kmap_atomic(page, KM_USER0);
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage4K(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, bytes = 0;
-+      void *pageaddr;
-+      
-+      TRACE("Entered squashfs_readpage4K, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT)) {
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              goto skip_read;
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || page->index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              block = (msblk->read_blocklist)(inode, page->index, 1,
-+                                      block_list, NULL, &bsize);
-+
-+              down(&msblk->read_page_mutex);
-+              bytes = squashfs_read_data(inode->i_sb, msblk->read_page, block,
-+                                      bsize, NULL);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (bytes)
-+                      memcpy(pageaddr, msblk->read_page, bytes);
-+              else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      block, bsize);
-+              up(&msblk->read_page_mutex);
-+      } else {
-+              struct squashfs_fragment_cache *fragment =
-+                      get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (fragment) {
-+                      bytes = i_size_read(inode) & (sblk->block_size - 1);
-+                      memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)->
-+                                      u.s1.fragment_offset, bytes);
-+                      release_cached_fragment(msblk, fragment);
-+              } else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block, (int)
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+      }
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long 
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      f_pos =- 3;
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length + 3;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index *index = (struct squashfs_dir_index *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length + 3;
-+}
-+
-+              
-+static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_readdir [%llx:%x]\n", next_block, next_offset);
-+
-+      while(file->f_pos < 3) {
-+              char *name;
-+              int size, i_ino;
-+
-+              if(file->f_pos == 0) {
-+                      name = ".";
-+                      size = 1;
-+                      i_ino = i->i_ino;
-+              } else {
-+                      name = "..";
-+                      size = 2;
-+                      i_ino = SQUASHFS_I(i)->u.s2.parent_inode;
-+              }
-+              TRACE("Calling filldir(%x, %s, %d, %d, %d, %d)\n",
-+                              (unsigned int) dirent, name, size, (int)
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]);
-+
-+              if (filldir(dirent, name, size,
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]) < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+              }
-+              file->f_pos += size;
-+              dirs_read++;
-+      }
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+                      
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %d\n", name,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+static void squashfs_put_super(struct super_block *s)
-+{
-+      int i;
-+
-+      if (s->s_fs_info) {
-+              struct squashfs_sb_info *sbi = s->s_fs_info;
-+              if (sbi->block_cache)
-+                      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+                              if (sbi->block_cache[i].block !=
-+                                                      SQUASHFS_INVALID_BLK)
-+                                      kfree(sbi->block_cache[i].data);
-+              if (sbi->fragment)
-+                      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) 
-+                              SQUASHFS_FREE(sbi->fragment[i].data);
-+              kfree(sbi->fragment);
-+              kfree(sbi->block_cache);
-+              kfree(sbi->read_data);
-+              kfree(sbi->read_page);
-+              kfree(sbi->uid);
-+              kfree(sbi->fragment_index);
-+              kfree(sbi->fragment_index_2);
-+              kfree(sbi->meta_index);
-+              kfree(s->s_fs_info);
-+              s->s_fs_info = NULL;
-+      }
-+}
-+
-+
-+static int squashfs_get_sb(struct file_system_type *fs_type,
-+                              int flags, const char *dev_name, void *data, struct vfsmount *mnt)
-+{
-+      return get_sb_bdev(fs_type, flags, dev_name, data, squashfs_fill_super, mnt);
-+}
-+
-+
-+static int __init init_squashfs_fs(void)
-+{
-+      int err = init_inodecache();
-+      if (err)
-+              goto out;
-+
-+      printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
-+              "Phillip Lougher\n");
-+
-+      if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
-+              ERROR("Failed to allocate zlib workspace\n");
-+              destroy_inodecache();
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      if ((err = register_filesystem(&squashfs_fs_type))) {
-+              vfree(stream.workspace);
-+              destroy_inodecache();
-+      }
-+
-+out:
-+      return err;
-+}
-+
-+
-+static void __exit exit_squashfs_fs(void)
-+{
-+      vfree(stream.workspace);
-+      unregister_filesystem(&squashfs_fs_type);
-+      destroy_inodecache();
-+}
-+
-+
-+static kmem_cache_t * squashfs_inode_cachep;
-+
-+
-+static struct inode *squashfs_alloc_inode(struct super_block *sb)
-+{
-+      struct squashfs_inode_info *ei;
-+      ei = kmem_cache_alloc(squashfs_inode_cachep, GFP_KERNEL);
-+      if (!ei)
-+              return NULL;
-+      return &ei->vfs_inode;
-+}
-+
-+
-+static void squashfs_destroy_inode(struct inode *inode)
-+{
-+      kmem_cache_free(squashfs_inode_cachep, SQUASHFS_I(inode));
-+}
-+
-+
-+static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
-+{
-+      struct squashfs_inode_info *ei = foo;
-+
-+      if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
-+                                                      SLAB_CTOR_CONSTRUCTOR)
-+              inode_init_once(&ei->vfs_inode);
-+}
-+ 
-+
-+static int __init init_inodecache(void)
-+{
-+      squashfs_inode_cachep = kmem_cache_create("squashfs_inode_cache",
-+           sizeof(struct squashfs_inode_info),
-+           0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT,
-+           init_once, NULL);
-+      if (squashfs_inode_cachep == NULL)
-+              return -ENOMEM;
-+      return 0;
-+}
-+
-+
-+static void destroy_inodecache(void)
-+{
-+      kmem_cache_destroy(squashfs_inode_cachep);
-+}
-+
-+
-+module_init(init_squashfs_fs);
-+module_exit(exit_squashfs_fs);
-+MODULE_DESCRIPTION("squashfs, a compressed read-only filesystem");
-+MODULE_AUTHOR("Phillip Lougher <phillip@lougher.org.uk>");
-Index: git/fs/squashfs/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/fs/squashfs/Makefile   2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,7 @@
-+#
-+# Makefile for the linux squashfs routines.
-+#
-+
-+obj-$(CONFIG_SQUASHFS) += squashfs.o
-+squashfs-y += inode.o
-+squashfs-y += squashfs2_0.o
-Index: git/fs/squashfs/squashfs2_0.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/fs/squashfs/squashfs2_0.c      2006-11-01 18:01:49.000000000 +0000
-@@ -0,0 +1,757 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs2_0.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir);
-+static struct dentry *squashfs_lookup_2(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+
-+static struct file_operations squashfs_dir_ops_2 = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir_2
-+};
-+
-+static struct inode_operations squashfs_dir_inode_ops_2 = {
-+      .lookup = squashfs_lookup_2
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static int read_fragment_index_table_2(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      if (!(msblk->fragment_index_2 = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+   
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES_2(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index_2,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              unsigned int fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES_2(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES_2((&fragment),
-+                                              &msblk->fragment_index_2[i], 1);
-+                      msblk->fragment_index_2[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int get_fragment_location_2(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index_2[SQUASHFS_FRAGMENT_INDEX_2(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET_2(fragment);
-+      struct squashfs_fragment_entry_2 fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry_2 sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY_2(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header_2 *inodeb, unsigned int ino)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = ino;
-+              i->i_mtime.tv_sec = sblk->mkfs_time;
-+              i->i_atime.tv_sec = sblk->mkfs_time;
-+              i->i_ctime.tv_sec = sblk->mkfs_time;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_nlink = 1;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget_2(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned int block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      unsigned int ino = SQUASHFS_MK_VFS_INODE(block
-+              - sblk->inode_table_start, offset);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header_2 id, sid;
-+      struct squashfs_base_inode_header_2 *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER_2(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      struct squashfs_reg_inode_header_2 *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header_2 *sinodep = &sid.reg;
-+                      long long frag_blk;
-+                      unsigned int frag_size;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location_2(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %x, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header_2 *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header_2 *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header_2 *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header_2 *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER_2(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header_2 *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header_2 *sinodep =
-+                                                              &sid.symlink;
-+      
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header_2 *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header_2 *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER_2(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+      
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%x:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long 
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index_2 index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index_2 *index = (struct squashfs_dir_index_2 *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index_2),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length;
-+}
-+
-+              
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+
-+      TRACE("Entered squashfs_readdir_2 [%llx:%x]\n", next_block, next_offset);
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+                      
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos, SQUASHFS_MK_VFS_INODE(
-+                                      dirh.start_block, dire->offset),
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup_2(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+      int sorted = sblk->s_major == 2 && sblk->s_minor >= 1;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (sorted && name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %lld\n", name,
-+                                      dirh.start_block, dire->offset, ino);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget_2;
-+      msblk->read_fragment_index_table = read_fragment_index_table_2;
-+
-+      sblk->bytes_used = sblk->bytes_used_2;
-+      sblk->uid_start = sblk->uid_start_2;
-+      sblk->guid_start = sblk->guid_start_2;
-+      sblk->inode_table_start = sblk->inode_table_start_2;
-+      sblk->directory_table_start = sblk->directory_table_start_2;
-+      sblk->fragment_table_start = sblk->fragment_table_start_2;
-+
-+      return 1;
-+}
-Index: git/fs/squashfs/squashfs.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/fs/squashfs/squashfs.h 2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,86 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs.h
-+ */
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#undef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#endif
-+
-+#ifdef SQUASHFS_TRACE
-+#define TRACE(s, args...)     printk(KERN_NOTICE "SQUASHFS: "s, ## args)
-+#else
-+#define TRACE(s, args...)     {}
-+#endif
-+
-+#define ERROR(s, args...)     printk(KERN_ERR "SQUASHFS error: "s, ## args)
-+
-+#define SERROR(s, args...)    do { \
-+                              if (!silent) \
-+                              printk(KERN_ERR "SQUASHFS error: "s, ## args);\
-+                              } while(0)
-+
-+#define WARNING(s, args...)   printk(KERN_WARNING "SQUASHFS: "s, ## args)
-+
-+static inline struct squashfs_inode_info *SQUASHFS_I(struct inode *inode)
-+{
-+      return list_entry(inode, struct squashfs_inode_info, vfs_inode);
-+}
-+
-+#if defined(CONFIG_SQUASHFS_1_0_COMPATIBILITY ) || defined(CONFIG_SQUASHFS_2_0_COMPATIBILITY)
-+#define SQSH_EXTERN
-+extern unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                              long long index, unsigned int length,
-+                              long long *next_index);
-+extern int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset);
-+extern void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment);
-+extern struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length);
-+extern struct address_space_operations squashfs_symlink_aops;
-+extern struct address_space_operations squashfs_aops;
-+extern struct address_space_operations squashfs_aops_4K;
-+extern struct inode_operations squashfs_dir_inode_ops;
-+#else
-+#define SQSH_EXTERN static
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+extern int squashfs_1_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_1_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+extern int squashfs_2_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
-Index: git/include/linux/squashfs_fs.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/include/linux/squashfs_fs.h    2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,911 @@
-+#ifndef SQUASHFS_FS
-+#define SQUASHFS_FS
-+
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs.h
-+ */
-+
-+#ifndef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#define CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#endif
-+
-+#ifdef        CONFIG_SQUASHFS_VMALLOC
-+#define SQUASHFS_ALLOC(a)             vmalloc(a)
-+#define SQUASHFS_FREE(a)              vfree(a)
-+#else
-+#define SQUASHFS_ALLOC(a)             kmalloc(a, GFP_KERNEL)
-+#define SQUASHFS_FREE(a)              kfree(a)
-+#endif
-+#define SQUASHFS_CACHED_FRAGMENTS     CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE     
-+#define SQUASHFS_MAJOR                        3
-+#define SQUASHFS_MINOR                        0
-+#define SQUASHFS_MAGIC                        0x73717368
-+#define SQUASHFS_MAGIC_SWAP           0x68737173
-+#define SQUASHFS_START                        0
-+
-+/* size of metadata (inode and directory) blocks */
-+#define SQUASHFS_METADATA_SIZE                8192
-+#define SQUASHFS_METADATA_LOG         13
-+
-+/* default size of data blocks */
-+#define SQUASHFS_FILE_SIZE            65536
-+#define SQUASHFS_FILE_LOG             16
-+
-+#define SQUASHFS_FILE_MAX_SIZE                65536
-+
-+/* Max number of uids and gids */
-+#define SQUASHFS_UIDS                 256
-+#define SQUASHFS_GUIDS                        255
-+
-+/* Max length of filename (not 255) */
-+#define SQUASHFS_NAME_LEN             256
-+
-+#define SQUASHFS_INVALID              ((long long) 0xffffffffffff)
-+#define SQUASHFS_INVALID_FRAG         ((unsigned int) 0xffffffff)
-+#define SQUASHFS_INVALID_BLK          ((long long) -1)
-+#define SQUASHFS_USED_BLK             ((long long) -2)
-+
-+/* Filesystem flags */
-+#define SQUASHFS_NOI                  0
-+#define SQUASHFS_NOD                  1
-+#define SQUASHFS_CHECK                        2
-+#define SQUASHFS_NOF                  3
-+#define SQUASHFS_NO_FRAG              4
-+#define SQUASHFS_ALWAYS_FRAG          5
-+#define SQUASHFS_DUPLICATE            6
-+
-+#define SQUASHFS_BIT(flag, bit)               ((flag >> bit) & 1)
-+
-+#define SQUASHFS_UNCOMPRESSED_INODES(flags)   SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOI)
-+
-+#define SQUASHFS_UNCOMPRESSED_DATA(flags)     SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOD)
-+
-+#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags)        SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOF)
-+
-+#define SQUASHFS_NO_FRAGMENTS(flags)          SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NO_FRAG)
-+
-+#define SQUASHFS_ALWAYS_FRAGMENTS(flags)      SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_ALWAYS_FRAG)
-+
-+#define SQUASHFS_DUPLICATES(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_DUPLICATE)
-+
-+#define SQUASHFS_CHECK_DATA(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_CHECK)
-+
-+#define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, \
-+              duplicate_checking)     (noi | (nod << 1) | (check_data << 2) \
-+              | (nof << 3) | (no_frag << 4) | (always_frag << 5) | \
-+              (duplicate_checking << 6))
-+
-+/* Max number of types and file types */
-+#define SQUASHFS_DIR_TYPE             1
-+#define SQUASHFS_FILE_TYPE            2
-+#define SQUASHFS_SYMLINK_TYPE         3
-+#define SQUASHFS_BLKDEV_TYPE          4
-+#define SQUASHFS_CHRDEV_TYPE          5
-+#define SQUASHFS_FIFO_TYPE            6
-+#define SQUASHFS_SOCKET_TYPE          7
-+#define SQUASHFS_LDIR_TYPE            8
-+#define SQUASHFS_LREG_TYPE            9
-+
-+/* 1.0 filesystem type definitions */
-+#define SQUASHFS_TYPES                        5
-+#define SQUASHFS_IPC_TYPE             0
-+
-+/* Flag whether block is compressed or uncompressed, bit is set if block is
-+ * uncompressed */
-+#define SQUASHFS_COMPRESSED_BIT               (1 << 15)
-+
-+#define SQUASHFS_COMPRESSED_SIZE(B)   (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \
-+              (B) & ~SQUASHFS_COMPRESSED_BIT :  SQUASHFS_COMPRESSED_BIT)
-+
-+#define SQUASHFS_COMPRESSED(B)                (!((B) & SQUASHFS_COMPRESSED_BIT))
-+
-+#define SQUASHFS_COMPRESSED_BIT_BLOCK         (1 << 24)
-+
-+#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B)     (((B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? (B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK)
-+
-+#define SQUASHFS_COMPRESSED_BLOCK(B)  (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))
-+
-+/*
-+ * Inode number ops.  Inodes consist of a compressed block number, and an
-+ * uncompressed  offset within that block
-+ */
-+#define SQUASHFS_INODE_BLK(a)         ((unsigned int) ((a) >> 16))
-+
-+#define SQUASHFS_INODE_OFFSET(a)      ((unsigned int) ((a) & 0xffff))
-+
-+#define SQUASHFS_MKINODE(A, B)                ((squashfs_inode_t)(((squashfs_inode_t) (A)\
-+                                      << 16) + (B)))
-+
-+/* Compute 32 bit VFS inode number from squashfs inode number */
-+#define SQUASHFS_MK_VFS_INODE(a, b)   ((unsigned int) (((a) << 8) + \
-+                                      ((b) >> 2) + 1))
-+/* XXX */
-+
-+/* Translate between VFS mode and squashfs mode */
-+#define SQUASHFS_MODE(a)              ((a) & 0xfff)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES(A)    (A * sizeof(struct squashfs_fragment_entry))
-+
-+#define SQUASHFS_FRAGMENT_INDEX(A)    (SQUASHFS_FRAGMENT_BYTES(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A)     (SQUASHFS_FRAGMENT_BYTES(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES(A)  ((SQUASHFS_FRAGMENT_BYTES(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES(A)      (SQUASHFS_FRAGMENT_INDEXES(A) *\
-+                                              sizeof(long long))
-+
-+/* cached data constants for filesystem */
-+#define SQUASHFS_CACHED_BLKS          8
-+
-+#define SQUASHFS_MAX_FILE_SIZE_LOG    64
-+
-+#define SQUASHFS_MAX_FILE_SIZE                ((long long) 1 << \
-+                                      (SQUASHFS_MAX_FILE_SIZE_LOG - 2))
-+
-+#define SQUASHFS_MARKER_BYTE          0xff
-+
-+/* meta index cache */
-+#define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int))
-+#define SQUASHFS_META_ENTRIES 31
-+#define SQUASHFS_META_NUMBER  8
-+#define SQUASHFS_SLOTS                4
-+
-+struct meta_entry {
-+      long long               data_block;
-+      unsigned int            index_block;
-+      unsigned short          offset;
-+      unsigned short          pad;
-+};
-+
-+struct meta_index {
-+      unsigned int            inode_number;
-+      unsigned int            offset;
-+      unsigned short          entries;
-+      unsigned short          skip;
-+      unsigned short          locked;
-+      unsigned short          pad;
-+      struct meta_entry       meta_entry[SQUASHFS_META_ENTRIES];
-+};
-+
-+
-+/*
-+ * definitions for structures on disk
-+ */
-+
-+typedef long long             squashfs_block_t;
-+typedef long long             squashfs_inode_t;
-+
-+struct squashfs_super_block {
-+      unsigned int            s_magic;
-+      unsigned int            inodes;
-+      unsigned int            bytes_used_2;
-+      unsigned int            uid_start_2;
-+      unsigned int            guid_start_2;
-+      unsigned int            inode_table_start_2;
-+      unsigned int            directory_table_start_2;
-+      unsigned int            s_major:16;
-+      unsigned int            s_minor:16;
-+      unsigned int            block_size_1:16;
-+      unsigned int            block_log:16;
-+      unsigned int            flags:8;
-+      unsigned int            no_uids:8;
-+      unsigned int            no_guids:8;
-+      unsigned int            mkfs_time /* time of filesystem creation */;
-+      squashfs_inode_t        root_inode;
-+      unsigned int            block_size;
-+      unsigned int            fragments;
-+      unsigned int            fragment_table_start_2;
-+      long long               bytes_used;
-+      long long               uid_start;
-+      long long               guid_start;
-+      long long               inode_table_start;
-+      long long               directory_table_start;
-+      long long               fragment_table_start;
-+      long long               unused;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_index {
-+      unsigned int            index;
-+      unsigned int            start_block;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_BASE_INODE_HEADER            \
-+      unsigned int            inode_type:4;   \
-+      unsigned int            mode:12;        \
-+      unsigned int            uid:8;          \
-+      unsigned int            guid:8;         \
-+      unsigned int            mtime;          \
-+      unsigned int            inode_number;
-+
-+struct squashfs_base_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_lreg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      long long               file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            parent_inode;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            i_count:16;
-+      unsigned int            parent_inode;
-+      struct squashfs_dir_index       index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header {
-+      struct squashfs_base_inode_header       base;
-+      struct squashfs_dev_inode_header        dev;
-+      struct squashfs_symlink_inode_header    symlink;
-+      struct squashfs_reg_inode_header        reg;
-+      struct squashfs_lreg_inode_header       lreg;
-+      struct squashfs_dir_inode_header        dir;
-+      struct squashfs_ldir_inode_header       ldir;
-+      struct squashfs_ipc_inode_header        ipc;
-+};
-+      
-+struct squashfs_dir_entry {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      int                     inode_number:16;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_header {
-+      unsigned int            count:8;
-+      unsigned int            start_block;
-+      unsigned int            inode_number;
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry {
-+      long long               start_block;
-+      unsigned int            size;
-+      unsigned int            unused;
-+} __attribute__ ((packed));
-+
-+extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen);
-+extern int squashfs_uncompress_init(void);
-+extern int squashfs_uncompress_exit(void);
-+
-+/*
-+ * macros to convert each packed bitfield structure from little endian to big
-+ * endian and vice versa.  These are needed when creating or using a filesystem
-+ * on a machine with different byte ordering to the target architecture.
-+ *
-+ */
-+
-+#define SQUASHFS_SWAP_START \
-+      int bits;\
-+      int b_pos;\
-+      unsigned long long val;\
-+      unsigned char *s;\
-+      unsigned char *d;
-+
-+#define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_super_block));\
-+      SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->inodes, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used_2, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->uid_start_2, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->guid_start_2, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->inode_table_start_2, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->directory_table_start_2, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->s_major, d, 224, 16);\
-+      SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\
-+      SQUASHFS_SWAP((s)->block_size_1, d, 256, 16);\
-+      SQUASHFS_SWAP((s)->block_log, d, 272, 16);\
-+      SQUASHFS_SWAP((s)->flags, d, 288, 8);\
-+      SQUASHFS_SWAP((s)->no_uids, d, 296, 8);\
-+      SQUASHFS_SWAP((s)->no_guids, d, 304, 8);\
-+      SQUASHFS_SWAP((s)->mkfs_time, d, 312, 32);\
-+      SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\
-+      SQUASHFS_SWAP((s)->block_size, d, 408, 32);\
-+      SQUASHFS_SWAP((s)->fragments, d, 440, 32);\
-+      SQUASHFS_SWAP((s)->fragment_table_start_2, d, 472, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used, d, 504, 64);\
-+      SQUASHFS_SWAP((s)->uid_start, d, 568, 64);\
-+      SQUASHFS_SWAP((s)->guid_start, d, 632, 64);\
-+      SQUASHFS_SWAP((s)->inode_table_start, d, 696, 64);\
-+      SQUASHFS_SWAP((s)->directory_table_start, d, 760, 64);\
-+      SQUASHFS_SWAP((s)->fragment_table_start, d, 824, 64);\
-+      SQUASHFS_SWAP((s)->unused, d, 888, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 64, 32);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header))\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header)); \
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->rdev, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header));\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 224, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_lreg_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 128, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 224, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 256, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 147, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 192, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 155, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 168, 32);\
-+      SQUASHFS_SWAP((s)->i_count, d, 200, 16);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 216, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 64);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_SHORTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 2);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      16)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_INTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 4);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      32)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LONG_LONGS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      64)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DATA(s, d, n, bits) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * bits / 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      bits)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, bits);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+
-+struct squashfs_base_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            type:4;
-+      unsigned int            offset:4;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n) \
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 4);\
-+      SQUASHFS_SWAP((s)->guid, d, 20, 4);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header_1));\
-+      SQUASHFS_SWAP((s)->type, d, 24, 4);\
-+      SQUASHFS_SWAP((s)->offset, d, 28, 4);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_1));\
-+      SQUASHFS_SWAP((s)->rdev, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_1));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_1));\
-+      SQUASHFS_SWAP((s)->mtime, d, 24, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 88, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_1));\
-+      SQUASHFS_SWAP((s)->file_size, d, 24, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 43, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 88, 24);\
-+}
-+
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+
-+struct squashfs_dir_index_2 {
-+      unsigned int            index:27;
-+      unsigned int            start_block:29;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_base_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+      unsigned int            i_count:16;
-+      struct squashfs_dir_index_2     index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header_2 {
-+      struct squashfs_base_inode_header_2     base;
-+      struct squashfs_dev_inode_header_2      dev;
-+      struct squashfs_symlink_inode_header_2  symlink;
-+      struct squashfs_reg_inode_header_2      reg;
-+      struct squashfs_dir_inode_header_2      dir;
-+      struct squashfs_ldir_inode_header_2     ldir;
-+      struct squashfs_ipc_inode_header_2      ipc;
-+};
-+      
-+struct squashfs_dir_header_2 {
-+      unsigned int            count:8;
-+      unsigned int            start_block:24;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_entry_2 {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry_2 {
-+      unsigned int            start_block;
-+      unsigned int            size;
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_2(s, d) \
-+      SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, sizeof(struct squashfs_ipc_inode_header_2))
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_2)); \
-+      SQUASHFS_SWAP((s)->rdev, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_2));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_2));\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->fragment, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 160, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 51, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 59, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 72, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 104, 24);\
-+      SQUASHFS_SWAP((s)->i_count, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index_2));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 27);\
-+      SQUASHFS_SWAP((s)->start_block, d, 27, 29);\
-+      SQUASHFS_SWAP((s)->size, d, 56, 8);\
-+}
-+#define SQUASHFS_SWAP_DIR_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header_2));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry_2));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry_2));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 32, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES_2(s, d, n) SQUASHFS_SWAP_INTS(s, d, n)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES_2(A)  (A * sizeof(struct squashfs_fragment_entry_2))
-+
-+#define SQUASHFS_FRAGMENT_INDEX_2(A)  (SQUASHFS_FRAGMENT_BYTES_2(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET_2(A)   (SQUASHFS_FRAGMENT_BYTES_2(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES_2(A)        ((SQUASHFS_FRAGMENT_BYTES_2(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES_2(A)    (SQUASHFS_FRAGMENT_INDEXES_2(A) *\
-+                                              sizeof(int))
-+
-+#endif
-+
-+#ifdef __KERNEL__
-+
-+/*
-+ * macros used to swap each structure entry, taking into account
-+ * bitfields and different bitfield placing conventions on differing
-+ * architectures
-+ */
-+
-+#include <asm/byteorder.h>
-+
-+#ifdef __BIG_ENDIAN
-+      /* convert from little endian to big endian */
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, b_pos)
-+#else
-+      /* convert from big endian to little endian */ 
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, 64 - tbits - b_pos)
-+#endif
-+
-+#define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\
-+      b_pos = pos % 8;\
-+      val = 0;\
-+      s = (unsigned char *)p + (pos / 8);\
-+      d = ((unsigned char *) &val) + 7;\
-+      for(bits = 0; bits < (tbits + b_pos); bits += 8) \
-+              *d-- = *s++;\
-+      value = (val >> (SHIFT))/* & ((1 << tbits) - 1)*/;\
-+}
-+
-+#define SQUASHFS_MEMSET(s, d, n)      memset(s, 0, n);
-+
-+#endif
-+#endif
-Index: git/include/linux/squashfs_fs_i.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/include/linux/squashfs_fs_i.h  2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,45 @@
-+#ifndef SQUASHFS_FS_I
-+#define SQUASHFS_FS_I
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_i.h
-+ */
-+
-+struct squashfs_inode_info {
-+      long long       start_block;
-+      unsigned int    offset;
-+      union {
-+              struct {
-+                      long long       fragment_start_block;
-+                      unsigned int    fragment_size;
-+                      unsigned int    fragment_offset;
-+                      long long       block_list_start;
-+              } s1;
-+              struct {
-+                      long long       directory_index_start;
-+                      unsigned int    directory_index_offset;
-+                      unsigned int    directory_index_count;
-+                      unsigned int    parent_inode;
-+              } s2;
-+      } u;
-+      struct inode    vfs_inode;
-+};
-+#endif
-Index: git/include/linux/squashfs_fs_sb.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/include/linux/squashfs_fs_sb.h 2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,74 @@
-+#ifndef SQUASHFS_FS_SB
-+#define SQUASHFS_FS_SB
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_sb.h
-+ */
-+
-+#include <linux/squashfs_fs.h>
-+
-+struct squashfs_cache {
-+      long long       block;
-+      int             length;
-+      long long       next_index;
-+      char            *data;
-+};
-+
-+struct squashfs_fragment_cache {
-+      long long       block;
-+      int             length;
-+      unsigned int    locked;
-+      char            *data;
-+};
-+
-+struct squashfs_sb_info {
-+      struct squashfs_super_block     sblk;
-+      int                     devblksize;
-+      int                     devblksize_log2;
-+      int                     swap;
-+      struct squashfs_cache   *block_cache;
-+      struct squashfs_fragment_cache  *fragment;
-+      int                     next_cache;
-+      int                     next_fragment;
-+      int                     next_meta_index;
-+      unsigned int            *uid;
-+      unsigned int            *guid;
-+      long long               *fragment_index;
-+      unsigned int            *fragment_index_2;
-+      unsigned int            read_size;
-+      char                    *read_data;
-+      char                    *read_page;
-+      struct semaphore        read_data_mutex;
-+      struct semaphore        read_page_mutex;
-+      struct semaphore        block_cache_mutex;
-+      struct semaphore        fragment_mutex;
-+      struct semaphore        meta_index_mutex;
-+      wait_queue_head_t       waitq;
-+      wait_queue_head_t       fragment_wait_queue;
-+      struct meta_index       *meta_index;
-+      struct inode            *(*iget)(struct super_block *s,  squashfs_inode_t \
-+                              inode);
-+      long long               (*read_blocklist)(struct inode *inode, int \
-+                              index, int readahead_blks, char *block_list, \
-+                              unsigned short **block_p, unsigned int *bsize);
-+      int                     (*read_fragment_index_table)(struct super_block *s);
-+};
-+#endif
-Index: git/init/do_mounts_rd.c
-===================================================================
---- git.orig/init/do_mounts_rd.c       2006-10-31 16:09:47.000000000 +0000
-+++ git/init/do_mounts_rd.c    2006-10-31 21:26:45.000000000 +0000
-@@ -5,6 +5,7 @@
- #include <linux/ext2_fs.h>
- #include <linux/romfs_fs.h>
- #include <linux/cramfs_fs.h>
-+#include <linux/squashfs_fs.h>
- #include <linux/initrd.h>
- #include <linux/string.h>
-@@ -39,6 +40,7 @@ static int __init crd_load(int in_fd, in
-  * numbers could not be found.
-  *
-  * We currently check for the following magic numbers:
-+ *      squashfs
-  *    minix
-  *    ext2
-  *    romfs
-@@ -53,6 +55,7 @@ identify_ramdisk_image(int fd, int start
-       struct ext2_super_block *ext2sb;
-       struct romfs_super_block *romfsb;
-       struct cramfs_super *cramfsb;
-+      struct squashfs_super_block *squashfsb;
-       int nblocks = -1;
-       unsigned char *buf;
-@@ -64,6 +67,7 @@ identify_ramdisk_image(int fd, int start
-       ext2sb = (struct ext2_super_block *) buf;
-       romfsb = (struct romfs_super_block *) buf;
-       cramfsb = (struct cramfs_super *) buf;
-+      squashfsb = (struct squashfs_super_block *) buf;
-       memset(buf, 0xe5, size);
-       /*
-@@ -101,6 +105,15 @@ identify_ramdisk_image(int fd, int start
-               goto done;
-       }
-+      /* squashfs is at block zero too */
-+      if (squashfsb->s_magic == SQUASHFS_MAGIC) {
-+              printk(KERN_NOTICE
-+                     "RAMDISK: squashfs filesystem found at block %d\n",
-+                     start_block);
-+              nblocks = (squashfsb->bytes_used+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
-+              goto done;
-+      }
-+
-       /*
-        * Read block 1 to test for minix and ext2 superblock
-        */
diff --git a/meta/packages/linux/linux-rp-2.6.20/vesafb-tng-1.0-rc2-2.6.20-rc2.patch b/meta/packages/linux/linux-rp-2.6.20/vesafb-tng-1.0-rc2-2.6.20-rc2.patch
deleted file mode 100644 (file)
index b1b0fc3..0000000
+++ /dev/null
@@ -1,3141 +0,0 @@
-diff --git a/Documentation/fb/vesafb.txt b/Documentation/fb/vesafb.txt
-index ee277dd..93d6e6e 100644
---- a/Documentation/fb/vesafb.txt
-+++ b/Documentation/fb/vesafb.txt
-@@ -2,16 +2,18 @@
- What is vesafb?
- ===============
--This is a generic driver for a graphic framebuffer on intel boxes.
-+Vesafb is a generic framebuffer driver for x86 and x86_64 boxes.
--The idea is simple:  Turn on graphics mode at boot time with the help
--of the BIOS, and use this as framebuffer device /dev/fb0, like the m68k
--(and other) ports do.
-+VESA BIOS Extensions Version 2.0 are required, because we need access to
-+a linear frame buffer. VBE 3.0 is required if you want to use modes with a
-+higher (than the standard 60 Hz) refresh rate.
--This means we decide at boot time whenever we want to run in text or
--graphics mode.  Switching mode later on (in protected mode) is
--impossible; BIOS calls work in real mode only.  VESA BIOS Extensions
--Version 2.0 are required, because we need a linear frame buffer.
-+The VESA framebuffer driver comes in two flavors - the standard 'vesafb'
-+and 'vesafb-tng'. Vesafb-tng is available only on 32-bit x86 due to the
-+technology it uses (vm86). Vesafb-tng has more features than vesafb
-+(adjusting the refresh rate on VBE 3.0 compliant boards, switching the
-+video mode without rebooting, selecting a mode by providing its
-+modedb name, and more).
- Advantages:
-@@ -29,26 +31,35 @@ Disadvantages:
- How to use it?
- ==============
--Switching modes is done using the vga=... boot parameter.  Read
--Documentation/svga.txt for details.
-+If you are running a 32-bit x86 system and you decide to use vesafb-tng,
-+you can either compile the driver into the kernel or use it as a module.
-+The graphics mode you want to use is in both cases specified using the
-+standard modedb format.
--You should compile in both vgacon (for text mode) and vesafb (for
--graphics mode). Which of them takes over the console depends on
--whenever the specified mode is text or graphics.
-+If your system doesn't support vm86 calls, things get a little more tricky.
-+Since on such systems you can't do BIOS calls from protected mode in which
-+kernel runs, you have to decide at boot time whenever you want to run in text
-+or in graphics mode. Switching mode later on is impossible. Switching modes
-+is done using the vga=... boot parameter.  Read Documentation/svga.txt for
-+details. Below is a more detailed description of what to do on systems using
-+the standard vesafb driver.
--The graphic modes are NOT in the list which you get if you boot with
--vga=ask and hit return. The mode you wish to use is derived from the
--VESA mode number. Here are those VESA mode numbers:
-+You should compile in both vgacon (for text mode) and vesafb (for graphics
-+mode). Which of them takes over the console depends on whenever the
-+specified mode is text or graphics.
-+
-+The graphic modes are NOT in the list which you get if you boot with vga=ask
-+and hit return. The mode you wish to use is derived from the VESA mode number.
-+Here are those VESA mode numbers:
-     | 640x480  800x600  1024x768 1280x1024
- ----+-------------------------------------
--256 |  0x101    0x103    0x105    0x107   
--32k |  0x110    0x113    0x116    0x119   
--64k |  0x111    0x114    0x117    0x11A   
--16M |  0x112    0x115    0x118    0x11B   
-+256 |  0x101    0x103    0x105    0x107
-+32k |  0x110    0x113    0x116    0x119
-+64k |  0x111    0x114    0x117    0x11A
-+16M |  0x112    0x115    0x118    0x11B
--The video mode number of the Linux kernel is the VESA mode number plus
--0x200.
-+The video mode number of the Linux kernel is the VESA mode number plus 0x200.
-  
-  Linux_kernel_mode_number = VESA_mode_number + 0x200
-@@ -56,15 +67,15 @@ So the table for the Kernel mode numbers are:
-     | 640x480  800x600  1024x768 1280x1024
- ----+-------------------------------------
--256 |  0x301    0x303    0x305    0x307   
--32k |  0x310    0x313    0x316    0x319   
--64k |  0x311    0x314    0x317    0x31A   
--16M |  0x312    0x315    0x318    0x31B   
-+256 |  0x301    0x303    0x305    0x307
-+32k |  0x310    0x313    0x316    0x319
-+64k |  0x311    0x314    0x317    0x31A
-+16M |  0x312    0x315    0x318    0x31B
--To enable one of those modes you have to specify "vga=ask" in the
--lilo.conf file and rerun LILO. Then you can type in the desired
--mode at the "vga=ask" prompt. For example if you like to use 
--1024x768x256 colors you have to say "305" at this prompt.
-+To enable one of those modes you have to specify "vga=ask" in the lilo.conf
-+file and rerun LILO. Then you can type in the desired mode at the "vga=ask"
-+prompt. For example if you like to use 1024x768x256 colors you have to say
-+"305" at this prompt.
- If this does not work, this might be because your BIOS does not support
- linear framebuffers or because it does not support this mode at all.
-@@ -72,11 +83,12 @@ Even if your board does, it might be the BIOS which does not.  VESA BIOS
- Extensions v2.0 are required, 1.2 is NOT sufficient.  You will get a
- "bad mode number" message if something goes wrong.
--1. Note: LILO cannot handle hex, for booting directly with 
-+1. Note: LILO cannot handle hex, for booting directly with
-          "vga=mode-number" you have to transform the numbers to decimal.
- 2. Note: Some newer versions of LILO appear to work with those hex values,
-          if you set the 0x in front of the numbers.
-+
- X11
- ===
-@@ -84,98 +96,164 @@ XF68_FBDev should work just fine, but it is non-accelerated.  Running
- another (accelerated) X-Server like XF86_SVGA might or might not work.
- It depends on X-Server and graphics board.
--The X-Server must restore the video mode correctly, else you end up
-+The X-Server must restore the video mode correctly, or else you end up
- with a broken console (and vesafb cannot do anything about this).
-+With vesafb-tng chances are that the console will be restored properly
-+even if the X server messes up the video mode.
- Refresh rates
- =============
--There is no way to change the vesafb video mode and/or timings after
--booting linux.  If you are not happy with the 60 Hz refresh rate, you
--have these options:
-+With VBE 3.0 compatible BIOSes and vesafb-tng it is possible to change
-+the refresh rate either at boot time (by specifying the @<rr> part of
-+the mode name) or later, using the fbset utility.
-+
-+If you want to use the default BIOS refresh rate while switching modes
-+on a running system, set pixclock to 0.
-- * configure and load the DOS-Tools for your the graphics board (if
--   available) and boot linux with loadlin.
-- * use a native driver (matroxfb/atyfb) instead if vesafb.  If none
-+With VBE 2.0 there is no way to change the mode timings after booting
-+Linux. If you are not happy with the 60 Hz refresh rate, you have
-+the following options:
-+
-+ * Configure and load the DOS tools for your the graphics board (if
-+   available) and boot Linux with loadlin.
-+ * Use a native driver (matroxfb/atyfb) instead of vesafb.  If none
-    is available, write a new one!
-- * VBE 3.0 might work too.  I have neither a gfx board with VBE 3.0
--   support nor the specs, so I have not checked this yet.
-+ * Use a BIOS editor to change the default refresh rate (such an
-+   editor does exist at least for ATI Radeon BIOSes).
-+ * If you're running a non-vm86 and VBE 3.0 compatible system, you can
-+   use a kernel patch (vesafb-rrc) to hard-code some mode timings in
-+   the kernel and use these while setting the video mode at boot time.
-+
-+Note that there are some boards (nVidia 59**, 57** and newer models)
-+claiming that their Video BIOS is VBE 3.0 compliant, while ignoring the
-+CRTC values provided by software such as vesafb-tng. You'll not be able
-+to adjust the refresh rate if you're using one of these boards.
- Configuration
- =============
--The VESA BIOS provides protected mode interface for changing
--some parameters.  vesafb can use it for palette changes and
--to pan the display.  It is turned off by default because it
--seems not to work with some BIOS versions, but there are options
--to turn it on.
--
--You can pass options to vesafb using "video=vesafb:option" on
--the kernel command line.  Multiple options should be separated
--by comma, like this: "video=vesafb:ypan,invers"
--
--Accepted options:
--
--invers        no comment...
--
--ypan  enable display panning using the VESA protected mode 
--      interface.  The visible screen is just a window of the
--      video memory, console scrolling is done by changing the
--      start of the window.
--      pro:    * scrolling (fullscreen) is fast, because there is
--                no need to copy around data.
--              * You'll get scrollback (the Shift-PgUp thing),
--                the video memory can be used as scrollback buffer
--      kontra: * scrolling only parts of the screen causes some
--                ugly flicker effects (boot logo flickers for
--                example).
--
--ywrap Same as ypan, but assumes your gfx board can wrap-around 
--      the video memory (i.e. starts reading from top if it
--      reaches the end of video memory).  Faster than ypan.
--
--redraw        scroll by redrawing the affected part of the screen, this
--      is the safe (and slow) default.
--
--
--vgapal        Use the standard vga registers for palette changes.
--      This is the default.
--pmipal        Use the protected mode interface for palette changes.
--
--mtrr:n        setup memory type range registers for the vesafb framebuffer
--      where n:
--            0 - disabled (equivalent to nomtrr) (default)
--            1 - uncachable
--            2 - write-back
--            3 - write-combining
--            4 - write-through
--
--      If you see the following in dmesg, choose the type that matches the
--      old one. In this example, use "mtrr:2".
-+The VESA BIOS provides protected mode interface for changing some parameters.
-+vesafb can use it for palette changes and to pan the display. It is turned
-+off by default because it seems not to work with some BIOS versions, but
-+there are options to turn it on.
-+
-+You can pass options to vesafb using "video=vesafb:option" on the kernel
-+command line. Multiple options should be separated by a comma, like this:
-+"video=vesafb:ypan,1024x768-32@85"
-+
-+Note that vesafb-tng still uses the "video=vesafb:option" format of the
-+kernel command line video parameter. "video=vesafb-tng:xxx" is incorrect.
-+
-+Accepted options (both vesafb and vesafb-tng):
-+
-+ypan    Enable display panning using the VESA protected mode interface
-+        The visible screen is just a window of the video memory,
-+        console scrolling is done by changing the start of the window.
-+        pro:    * scrolling (fullscreen) is fast, because there is
-+                  no need to copy around data.
-+                * you'll get scrollback (the Shift-PgUp thing),
-+                  the video memory can be used as scrollback buffer
-+        con:    * scrolling only parts of the screen causes some
-+                  ugly flicker effects (boot logo flickers for
-+                  example).
-+
-+ywrap   Same as ypan, but assumes your gfx board can wrap-around the video
-+        memory (i.e. starts reading from top if it reaches the end of
-+        video memory). Faster than ypan.
-+
-+redraw  Scroll by redrawing the affected part of the screen, this is the
-+        safe (and slow) default.
-+
-+vgapal  Use the standard VGA registers for palette changes.
-+
-+pmipal  Use the protected mode interface for palette changes.
-+        This is the default is the protected mode interface is available.
-+
-+mtrr:n  Setup memory type range registers for the vesafb framebuffer
-+        where n:
-+              0 - disabled (equivalent to nomtrr) (default)
-+              1 - uncachable
-+              2 - write-back
-+              3 - write-combining
-+              4 - write-through
-+
-+        If you see the following in dmesg, choose the type that matches
-+        the old one. In this example, use "mtrr:2".
- ...
- mtrr: type mismatch for e0000000,8000000 old: write-back new: write-combining
- ...
--nomtrr  disable mtrr
-+nomtrr  Do not use memory type range registers for vesafb.
- vremap:n
-         remap 'n' MiB of video RAM. If 0 or not specified, remap memory
--      according to video mode. (2.5.66 patch/idea by Antonino Daplas
--      reversed to give override possibility (allocate more fb memory
--      than the kernel would) to 2.4 by tmb@iki.fi)
-+        according to video mode. (2.5.66 patch/idea by Antonino Daplas
-+        reversed to give override possibility (allocate more fb memory
-+        than the kernel would) to 2.4 by tmb@iki.fi)
- vtotal:n
-         if the video BIOS of your card incorrectly determines the total
-         amount of video RAM, use this option to override the BIOS (in MiB).
--Have fun!
-+Options accepted only by vesafb-tng:
-+
-+<mode>  The mode you want to set, in the standard modedb format. Refer to
-+        modedb.txt for a detailed description. If you specify a mode that is
-+        not supported by your board's BIOS, vesafb-tng will attempt to set a
-+        similar mode. The list of supported modes can be found in
-+        /proc/fbx/modes, where x is the framebuffer number (usually 0).
-+        When vesafb-tng is compiled as a module, the mode string should be
-+        provided as a value of the parameter 'mode'.
-+
-+vbemode:x
-+        Force the use of VBE mode x. The mode will only be set if it's
-+        found in the VBE-provided list of supported modes.
-+        NOTE: The mode number 'x' should be specified in VESA mode number
-+        notation, not the Linux kernel one (eg. 257 instead of 769).
-+        HINT: If you use this option because normal <mode> parameter does
-+        not work for you and you use a X server, you'll probably want to
-+        set the 'nocrtc' option to ensure that the video mode is properly
-+        restored after console <-> X switches.
-+
-+nocrtc  Do not use CRTC timings while setting the video mode. This option
-+        makes sence only with VBE 3.0 compliant systems. Use it if you have
-+        problems with modes set in the standard way. Note that using this
-+              option means that any refresh rate adjustments will be ignored
-+              and the refresh rate will stay at your BIOS default (60 Hz).
-+
-+noedid  Do not try to fetch and use EDID-provided modes.
-+
-+noblank Disable hardware blanking.
-+
-+gtf     Force the use of VESA's GTF (Generalized Timing Formula). Specifying
-+        this will cause vesafb to skip its internal modedb and EDID-modedb
-+        and jump straight to the GTF part of the code (normally used only if
-+        everything else failed). This can be useful if you want to get as
-+        much as possible from your graphics board but your BIOS doesn't
-+        support modes with the refresh rates you require. Note that you may 
-+              need to specify the maxhf, maxvf and maxclk parameters if they are not
-+        provided by the EDID block.
-+
-+Additionally, the following parameters may be provided. They all override the
-+EDID-provided values and BIOS defaults. Refer to your monitor's specs to get
-+the correct values for maxhf, maxvf and maxclk for your hardware.
-+
-+maxhf:n     Maximum horizontal frequency (in kHz).
-+maxvf:n     Maximum vertical frequency (in Hz).
-+maxclk:n    Maximum pixel clock (in MHz).
--  Gerd
-+Have fun!
- --
-+Original document for the vesafb driver by
- Gerd Knorr <kraxel@goldbach.in-berlin.de>
--Minor (mostly typo) changes 
--by Nico Schmoigl <schmoigl@rumms.uni-mannheim.de>
-+Minor (mostly typo) changes by
-+Nico Schmoigl <schmoigl@rumms.uni-mannheim.de>
-+
-+Extended documentation for vm86, VBE 3.0 and vesafb-tng by
-+Michal Januszewski <spock@gentoo.org>
-+
-diff --git a/arch/i386/boot/video.S b/arch/i386/boot/video.S
-index 2c5b5cc..2c2d4b5 100644
---- a/arch/i386/boot/video.S
-+++ b/arch/i386/boot/video.S
-@@ -163,10 +163,12 @@ basret:  ret
- # parameters in the default 80x25 mode -- these are set directly,
- # because some very obscure BIOSes supply insane values.
- mode_params:
-+#ifdef CONFIG_FB_VESA_STD
- #ifdef CONFIG_VIDEO_SELECT
-       cmpb    $0, graphic_mode
-       jnz     mopar_gr
- #endif
-+#endif
-       movb    $0x03, %ah                      # Read cursor position
-       xorb    %bh, %bh
-       int     $0x10
-@@ -199,6 +201,7 @@ mopar2: movb       %al, %fs:(PARAM_VIDEO_LINES)
-       ret
- #ifdef CONFIG_VIDEO_SELECT
-+#ifdef CONFIG_FB_VESA_STD
- # Fetching of VESA frame buffer parameters
- mopar_gr:
-       leaw    modelist+1024, %di
-@@ -281,6 +284,7 @@ dac_done:
-       movw    %es, %fs:(PARAM_VESAPM_SEG)
-       movw    %di, %fs:(PARAM_VESAPM_OFF)
- no_pm:        ret
-+#endif
- # The video mode menu
- mode_menu:
-@@ -495,10 +499,12 @@ mode_set:
-       
-       cmpb    $VIDEO_FIRST_V7>>8, %ah
-       jz      setv7
--      
-+
-+#ifdef CONFIG_FB_VESA_STD
-       cmpb    $VIDEO_FIRST_VESA>>8, %ah
-       jnc     check_vesa
--      
-+#endif        
-+
-       orb     %ah, %ah
-       jz      setmenu
-       
-@@ -570,6 +576,7 @@ setr1:     lodsw
-       movw    -4(%si), %ax                    # Fetch mode ID
-       jmp     _m_s
-+#ifdef CONFIG_FB_VESA_STD
- check_vesa:
-       leaw    modelist+1024, %di
-       subb    $VIDEO_FIRST_VESA>>8, %bh
-@@ -603,6 +610,7 @@ check_vesa:
-       ret
- _setbad:      jmp     setbad                  # Ugly...
-+#endif
- # Recalculate vertical display end registers -- this fixes various
- # inconsistencies of extended modes on many adapters. Called when
-diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c
-index 1393523..8a05f95 100644
---- a/drivers/char/sysrq.c
-+++ b/drivers/char/sysrq.c
-@@ -240,7 +240,7 @@ static void send_sig_all(int sig)
-       struct task_struct *p;
-       for_each_process(p) {
--              if (p->mm && !is_init(p))
-+              if (p->mm && !is_init(p) && !(p->flags & PF_BORROWED_MM))
-                       /* Not swapper, init nor kernel thread */
-                       force_sig(sig, p);
-       }
-diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
-index 4e83f01..ae122fd 100644
---- a/drivers/video/Kconfig
-+++ b/drivers/video/Kconfig
-@@ -547,8 +547,22 @@ config FB_TGA
-         cards. Say Y if you have one of those.
- config FB_VESA
--      bool "VESA VGA graphics support"
--      depends on (FB = y) && X86
-+      tristate "VESA VGA graphics support"
-+      depends on (FB = y) && (X86 || X86_64)
-+      help
-+        This is the frame buffer device driver for generic VESA 2.0
-+        compliant graphic cards. The older VESA 1.2 cards are not supported.
-+        You will get a boot time penguin logo at no additional cost. Please
-+        read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-+
-+choice 
-+      prompt "VESA driver type"
-+      depends on FB_VESA
-+      default FB_VESA_STD if X86_64
-+      default FB_VESA_TNG if X86
-+
-+config FB_VESA_STD
-+      bool "vesafb"
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-@@ -557,7 +571,43 @@ config FB_VESA
-         This is the frame buffer device driver for generic VESA 2.0
-         compliant graphic cards. The older VESA 1.2 cards are not supported.
-         You will get a boot time penguin logo at no additional cost. Please
--        read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-+        read <file:Documentation/fb/vesafb.txt>. Choose this driver if you
-+        are experiencing problems with vesafb-tng or if you own a 64-bit system.
-+
-+        Note that this driver cannot be compiled as a module.
-+
-+config FB_VESA_TNG
-+      bool "vesafb-tng"
-+      depends on !X86_64
-+      select FB_MODE_HELPERS
-+      select FB_CFB_FILLRECT
-+      select FB_CFB_COPYAREA
-+      select FB_CFB_IMAGEBLIT
-+      help
-+        This is an enhanced generic frame buffer device driver for
-+        VBE 2.0 compliant graphic cards. It can take advantage of VBE 3.0
-+        features (refresh rate adjustment) when these are available.
-+        The driver also makes it possible to change the video mode
-+        on the fly and to switch back to text mode when it's unloaded.
-+
-+        If the driver is compiled as a module, the module will be called
-+        vesafb-tng.
-+
-+endchoice
-+
-+config FB_VESA_DEFAULT_MODE
-+      string "VESA default mode"
-+      depends on FB_VESA_TNG
-+      default "640x480@60"
-+      help 
-+        This option is used to determine the default mode vesafb is
-+        supposed to switch to in case no mode is provided as a kernel
-+        command line parameter.
-+
-+config VIDEO_SELECT
-+      bool
-+      depends on FB_VESA
-+      default y
- config FB_IMAC
-       bool "Intel-based Macintosh Framebuffer Support"
-diff --git a/drivers/video/Makefile b/drivers/video/Makefile
-index 309a26d..e57b0e7 100644
---- a/drivers/video/Makefile
-+++ b/drivers/video/Makefile
-@@ -102,7 +102,11 @@ obj-$(CONFIG_FB_PNX4008_DUM_RGB)  += pnx4008/
- obj-$(CONFIG_FB_IBM_GXT4500)    += gxt4500.o
- # Platform or fallback drivers go here
--obj-$(CONFIG_FB_VESA)             += vesafb.o
-+ifeq ($(CONFIG_FB_VESA_STD),y)
-+  obj-y                                 += vesafb.o
-+else
-+  obj-$(CONFIG_FB_VESA)                 += vesafb-thread.o vesafb-tng.o
-+endif
- obj-$(CONFIG_FB_IMAC)             += imacfb.o
- obj-$(CONFIG_FB_VGA16)            += vga16fb.o vgastate.o
- obj-$(CONFIG_FB_OF)               += offb.o
-diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
-index 3cfea31..bfb39cc 100644
---- a/drivers/video/fbmem.c
-+++ b/drivers/video/fbmem.c
-@@ -1408,6 +1408,7 @@ fbmem_init(void)
-               printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
-               fb_class = NULL;
-       }
-+
-       return 0;
- }
-diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
-index 5df41f6..f838a53 100644
---- a/drivers/video/modedb.c
-+++ b/drivers/video/modedb.c
-@@ -674,6 +674,7 @@ void fb_var_to_videomode(struct fb_videomode *mode,
- {
-       u32 pixclock, hfreq, htotal, vtotal;
-+      mode->refresh = 0;
-       mode->name = NULL;
-       mode->xres = var->xres;
-       mode->yres = var->yres;
-@@ -1025,3 +1026,4 @@ EXPORT_SYMBOL(fb_find_best_mode);
- EXPORT_SYMBOL(fb_find_nearest_mode);
- EXPORT_SYMBOL(fb_videomode_to_modelist);
- EXPORT_SYMBOL(fb_find_mode);
-+EXPORT_SYMBOL(fb_destroy_modelist);
-diff --git a/drivers/video/vesafb-thread.c b/drivers/video/vesafb-thread.c
-new file mode 100644
-index 0000000..543e202
---- /dev/null
-+++ b/drivers/video/vesafb-thread.c
-@@ -0,0 +1,751 @@
-+/*
-+ * Framebuffer driver for VBE 2.0+ compliant graphic boards.
-+ * Kernel thread and vm86 routines.
-+ *
-+ * (c) 2004-2006 Michal Januszewski <spock@gentoo.org>
-+ *
-+ */
-+
-+#include <linux/workqueue.h>
-+#include <linux/completion.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/delay.h>
-+#include <linux/signal.h>
-+#include <linux/freezer.h>
-+#include <linux/suspend.h>
-+#include <linux/unistd.h>
-+#include <video/vesa.h>
-+#include <video/edid.h>
-+#include <asm/mman.h>
-+#include <asm/page.h>
-+#include <asm/vm86.h>
-+#include <asm/thread_info.h>
-+#include <asm/uaccess.h>
-+#include <asm/mmu_context.h>
-+#include "edid.h"
-+
-+static int errno;
-+
-+static DECLARE_COMPLETION(vesafb_th_completion);
-+static DECLARE_MUTEX(vesafb_task_list_sem);
-+static LIST_HEAD(vesafb_task_list);
-+static DECLARE_WAIT_QUEUE_HEAD(vesafb_wait);
-+
-+static struct vm86_struct vm86;
-+static int vesafb_pid = 0;
-+
-+#define DEFAULT_VM86_FLAGS (IF_MASK | IOPL_MASK)
-+#define VM86_PUSHW(x)                                 \
-+do {                                                  \
-+      vm86.regs.esp -= 2;                             \
-+      *(u16*)(STACK_ADDR + vm86.regs.esp) = x;        \
-+} while(0);
-+
-+/* Stack, the return code and buffers will be put into
-+ * one contiguous memory chunk:
-+ *
-+ * [ STACK | RET_CODE | BUFFER ]
-+ *
-+ * Some video BIOSes (sis6326) try to store data somewhere
-+ * in 0x7000-0x7fff, so we zeromap more memory to be safe.
-+ */
-+#define IVTBDA_SIZE   PAGE_SIZE
-+#define RET_CODE_SIZE 0x0010
-+#define STACK_SIZE    0x0500
-+#define BUFFER_SIZE   0x10000
-+
-+/* The amount of memory that will be allocated should be a multiple
-+ * of PAGE_SIZE. */
-+#define __MEM_SIZE    (RET_CODE_SIZE + STACK_SIZE + BUFFER_SIZE)
-+#define REAL_MEM_SIZE (((__MEM_SIZE / PAGE_SIZE) + 1) * PAGE_SIZE)
-+
-+#define IVTBDA_ADDR   0x00000
-+#define STACK_ADDR    (IVTBDA_ADDR + IVTBDA_SIZE)
-+#define RET_CODE_ADDR (STACK_ADDR + STACK_SIZE)
-+#define BUF_ADDR      (RET_CODE_ADDR + RET_CODE_SIZE)
-+
-+#define FLAG_D                (1 << 10)
-+
-+/* Syscalls used by the vesafb thread */
-+static int vm86old(struct vm86_struct __user* v86)
-+{
-+      long res;
-+      __asm__ volatile ("push %%ebx; movl %2, %%ebx ; int $0x80 ; pop %%ebx"
-+                      : "=a" (res)
-+                      : "0" (__NR_vm86old), "ri" ((long)(v86)) : "memory");
-+
-+      if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) {
-+              errno = -res;
-+              res = -1;
-+      }
-+      return (int)res;
-+}
-+
-+static int ioperm(unsigned long a, unsigned long b, unsigned long c)
-+{
-+      long res;
-+      __asm__ volatile ("push %%ebx; movl %2, %%ebx ; int $0x80 ; pop %%ebx"
-+                      : "=a" (res)
-+                      : "0" (__NR_ioperm), "ri" ((long)(a)), "c" ((long)(b)),
-+                        "d" ((long)(c)) : "memory");
-+
-+      if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) {
-+              errno = -res;
-+              res = -1;
-+      }
-+      return (int)res;
-+}
-+
-+/* Segment prefix opcodes */
-+enum {
-+      P_CS = 0x2e,
-+      P_SS = 0x36,
-+      P_DS = 0x3e,
-+      P_ES = 0x26,
-+      P_FS = 0x64,
-+      P_GS = 0x65
-+};
-+
-+/* Emulated vm86 ins instruction */
-+static void vm86_ins(int size)
-+{
-+      u32 edx, edi;
-+      edx = vm86.regs.edx & 0xffff;
-+      edi = (vm86.regs.edi & 0xffff) + (u32)(vm86.regs.es << 4);
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("std\n");
-+      else
-+              asm volatile ("cld\n");
-+
-+      switch (size) {
-+      case 4:
-+              asm volatile ("insl\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      case 2:
-+              asm volatile ("insw\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      case 1:
-+              asm volatile ("insb\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      }
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("cld\n");
-+
-+      edi -= (u32)(vm86.regs.es << 4);
-+
-+      vm86.regs.edi &= 0xffff0000;
-+      vm86.regs.edi |= edi & 0xffff;
-+}
-+
-+static void vm86_rep_ins(int size)
-+{
-+      u16 cx = vm86.regs.ecx;
-+      while (cx--)
-+              vm86_ins(size);
-+
-+      vm86.regs.ecx &= 0xffff0000;
-+}
-+
-+/* Emulated vm86 outs instruction */
-+static void vm86_outs(int size, int segment)
-+{
-+      u32 edx, esi, base;
-+
-+      edx = vm86.regs.edx & 0xffff;
-+      esi = vm86.regs.esi & 0xffff;
-+
-+      switch (segment) {
-+      case P_CS: base = vm86.regs.cs; break;
-+      case P_SS: base = vm86.regs.ss; break;
-+      case P_ES: base = vm86.regs.es; break;
-+      case P_FS: base = vm86.regs.fs; break;
-+      case P_GS: base = vm86.regs.gs; break;
-+      default:   base = vm86.regs.ds; break;
-+      }
-+
-+      esi += base << 4;
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("std\n");
-+      else
-+              asm volatile ("cld\n");
-+
-+      switch (size) {
-+      case 4:
-+              asm volatile ("outsl\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      case 2:
-+              asm volatile ("outsw\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      case 1:
-+              asm volatile ("outsb\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      }
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("cld");
-+
-+      esi -= base << 4;
-+      vm86.regs.esi &= 0xffff0000;
-+      vm86.regs.esi |= (esi & 0xffff);
-+}
-+
-+static void vm86_rep_outs(int size, int segment)
-+{
-+      u16 cx = vm86.regs.ecx;
-+      while (cx--)
-+              vm86_outs(size, segment);
-+
-+      vm86.regs.ecx &= 0xffff0000;
-+}
-+
-+static int vm86_do_unknown(void)
-+{
-+      u8 data32 = 0, segment = P_DS, rep = 0;
-+      u8 *instr;
-+      int ret = 0, i = 0;
-+
-+      instr = (u8*)((vm86.regs.cs << 4) + vm86.regs.eip);
-+
-+      while (1) {
-+              switch(instr[i]) {
-+              case 0x66:      /* operand size prefix */
-+                      data32 = 1 - data32;
-+                      i++;
-+                      break;
-+              case 0xf2:      /* repnz */
-+              case 0xf3:      /* rep */
-+                      rep = 1;
-+                      i++;
-+                      break;
-+              case P_CS:      /* segment prefix */
-+              case P_SS:
-+              case P_DS:
-+              case P_ES:
-+              case P_FS:
-+              case P_GS:
-+                      segment = instr[i];
-+                      i++;
-+                      break;
-+              case 0xf0:      /* LOCK - ignored */
-+              case 0x67:      /* address size prefix - ignored */
-+                      i++;
-+                      break;
-+              case 0x6c:      /* insb */
-+                      if (rep)
-+                              vm86_rep_ins(1);
-+                      else
-+                              vm86_ins(1);
-+                      i++;
-+                      goto out;
-+              case 0x6d:      /* insw / insd */
-+                      if (rep) {
-+                              if (data32)
-+                                      vm86_rep_ins(4);
-+                              else
-+                                      vm86_rep_ins(2);
-+                      } else {
-+                              if (data32)
-+                                      vm86_ins(4);
-+                              else
-+                                      vm86_ins(2);
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0x6e:      /* outsb */
-+                      if (rep)
-+                              vm86_rep_outs(1, segment);
-+                      else
-+                              vm86_outs(1, segment);
-+                      i++;
-+                      goto out;
-+              case 0x6f:      /* outsw / outsd */
-+                      if (rep) {
-+                              if (data32)
-+                                      vm86_rep_outs(4, segment);
-+                              else
-+                                      vm86_rep_outs(2, segment);
-+                      } else {
-+                              if (data32)
-+                                      vm86_outs(4, segment);
-+                              else
-+                                      vm86_outs(2, segment);
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0xe4:      /* inb xx */
-+                      asm volatile (
-+                              "inb %w1, %b0"
-+                              : "=a" (vm86.regs.eax)
-+                              : "d" (instr[i+1]), "0" (vm86.regs.eax));
-+                      i += 2;
-+                      goto out;
-+              case 0xe5:      /* inw xx / ind xx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "inl %w1, %0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (instr[i+1]),
-+                                        "0" (vm86.regs.eax));
-+                      } else {
-+                              asm volatile (
-+                                      "inw %w1, %w0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (instr[i+1]),
-+                                        "0" (vm86.regs.eax));
-+                      }
-+                      i += 2;
-+                      goto out;
-+
-+              case 0xec:      /* inb dx */
-+                      asm volatile (
-+                              "inb %w1, %b0"
-+                              : "=a" (vm86.regs.eax)
-+                              : "d" (vm86.regs.edx), "0" (vm86.regs.eax));
-+                      i++;
-+                      goto out;
-+              case 0xed:      /* inw dx / ind dx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "inl %w1, %0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (vm86.regs.edx));
-+                      } else {
-+                              asm volatile (
-+                                      "inw %w1, %w0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (vm86.regs.edx));
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0xe6:      /* outb xx */
-+                      asm volatile (
-+                              "outb %b0, %w1"
-+                              : /* no return value */
-+                              : "a" (vm86.regs.eax), "d" (instr[i+1]));
-+                      i += 2;
-+                      goto out;
-+              case 0xe7:      /* outw xx / outd xx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "outl %0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (instr[i+1]));
-+                      } else {
-+                              asm volatile (
-+                                      "outw %w0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (instr[i+1]));
-+                      }
-+                      i += 2;
-+                      goto out;
-+              case 0xee:      /* outb dx */
-+                      asm volatile (
-+                              "outb %b0, %w1"
-+                              : /* no return value */
-+                              : "a" (vm86.regs.eax), "d" (vm86.regs.edx));
-+                      i++;
-+                      goto out;
-+              case 0xef:      /* outw dx / outd dx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "outl %0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (vm86.regs.edx));
-+                      } else {
-+                              asm volatile (
-+                                      "outw %w0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (vm86.regs.edx));
-+                      }
-+                      i++;
-+                      goto out;
-+              default:
-+                      printk(KERN_ERR "vesafb: BUG, opcode 0x%x emulation "
-+                                      "not supported (EIP: 0x%lx)\n",
-+                                      instr[i], (u32)(vm86.regs.cs << 4) +
-+                                      vm86.regs.eip);
-+                      ret = 1;
-+                      goto out;
-+              }
-+      }
-+out:  vm86.regs.eip += i;
-+      return ret;
-+}
-+
-+void vesafb_do_vm86(struct vm86_regs *regs)
-+{
-+      unsigned int ret;
-+      u8 *retcode = (void*)RET_CODE_ADDR;
-+
-+      memset(&vm86,0,sizeof(vm86));
-+      memcpy(&vm86.regs, regs, sizeof(struct vm86_regs));
-+
-+      /* The return code */
-+      retcode[0] = 0xcd;              /* int opcode */
-+      retcode[1] = 0xff;              /* int number (255) */
-+
-+        /* We use int 0xff to get back to protected mode */
-+      memset(&vm86.int_revectored, 0, sizeof(vm86.int_revectored));
-+        ((unsigned char *)&vm86.int_revectored)[0xff / 8] |= (1 << (0xff % 8));
-+
-+      /*
-+       * We want to call int 0x10, so we set:
-+       *   CS = 0x42 = 0x10 * 4 + 2
-+       *   IP = 0x40 = 0x10 * 4
-+       * and SS:ESP. It's up to the caller to set the rest of the registers.
-+       */
-+      vm86.regs.eflags = DEFAULT_VM86_FLAGS;
-+      vm86.regs.cs = *(unsigned short *)0x42;
-+      vm86.regs.eip = *(unsigned short *)0x40;
-+      vm86.regs.ss = (STACK_ADDR >> 4);
-+      vm86.regs.esp = ((STACK_ADDR & 0x0000f) + STACK_SIZE);
-+
-+      /* These will be fetched off the stack when we come to an iret in the
-+       * int's 0x10 code. */
-+      VM86_PUSHW(DEFAULT_VM86_FLAGS);
-+      VM86_PUSHW((RET_CODE_ADDR >> 4));       /* return code segment */
-+      VM86_PUSHW((RET_CODE_ADDR & 0x0000f));  /* return code offset */
-+
-+      while(1) {
-+              ret = vm86old(&vm86);
-+
-+              if (VM86_TYPE(ret) == VM86_INTx) {
-+                      int vint = VM86_ARG(ret);
-+
-+                      /* If exit from vm86 was caused by int 0xff, then
-+                       * we're done.. */
-+                      if (vint == 0xff)
-+                              goto out;
-+
-+                      /* .. otherwise, we have to call the int handler
-+                       * manually */
-+                      VM86_PUSHW(vm86.regs.eflags);
-+                      VM86_PUSHW(vm86.regs.cs);
-+                      VM86_PUSHW(vm86.regs.eip);
-+
-+                      vm86.regs.cs = *(u16 *)((vint << 2) + 2);
-+                      vm86.regs.eip = *(u16 *)(vint << 2);
-+                      vm86.regs.eflags &= ~(VIF_MASK | TF_MASK);
-+              } else if (VM86_TYPE(ret) == VM86_UNKNOWN) {
-+                      if (vm86_do_unknown())
-+                              goto out;
-+              } else {
-+                      printk(KERN_ERR "vesafb: BUG, returned from "
-+                                      "vm86 with %x (EIP: 0x%lx)\n",
-+                                      ret, (u32)(vm86.regs.cs << 4) +
-+                                      vm86.regs.eip);
-+                      goto out;
-+              }
-+      }
-+
-+out:  /* copy the registers' state back to the caller's struct */
-+      memcpy(regs, &vm86.regs, sizeof(struct vm86_regs));
-+}
-+
-+static int vesafb_remap_pfn_range(unsigned long start, unsigned long end,
-+                                unsigned long pgoff, unsigned long prot,
-+                                int type)
-+{
-+      struct vm_area_struct *vma;
-+      struct mm_struct *mm = current->mm;
-+      int ret = 0;
-+
-+      vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
-+      if (!vma)
-+              return -ENOMEM;
-+      memset(vma, 0, sizeof(*vma));
-+      down_write(&mm->mmap_sem);
-+      vma->vm_mm = mm;
-+      vma->vm_start = start;
-+      vma->vm_end = end;
-+      vma->vm_flags = VM_READ | VM_WRITE | VM_EXEC;
-+      vma->vm_flags |= mm->def_flags;
-+      vma->vm_page_prot.pgprot = prot;
-+      vma->vm_pgoff = pgoff;
-+
-+      if ((ret = insert_vm_struct(mm, vma))) {
-+              up_write(&mm->mmap_sem);
-+              kmem_cache_free(vm_area_cachep, vma);
-+              return ret;
-+      }
-+
-+      if (type) {
-+              ret = zeromap_page_range(vma,
-+                                       vma->vm_start,
-+                                       vma->vm_end - vma->vm_start,
-+                                       vma->vm_page_prot);
-+      } else {
-+              vma->vm_flags |= VM_SHARED;
-+              ret = remap_pfn_range(vma,
-+                                    vma->vm_start,
-+                                    vma->vm_pgoff,
-+                                    vma->vm_end - vma->vm_start,
-+                                    vma->vm_page_prot);
-+      }
-+      up_write(&mm->mmap_sem);
-+      return ret;
-+}
-+
-+static inline int vesafb_init_mem(void)
-+{
-+      int ret = 0;
-+
-+      /* The memory chunks we're remapping here should be multiples
-+       * of PAGE_SIZE. */
-+      ret += vesafb_remap_pfn_range(0x00000, IVTBDA_SIZE, 0,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 0);
-+      ret += vesafb_remap_pfn_range(IVTBDA_SIZE, REAL_MEM_SIZE, 0,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 1);
-+      ret += vesafb_remap_pfn_range(0x9f000, 0x100000, 
-+                                    0x9f000 >> PAGE_SHIFT,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 0);
-+      if (ret)
-+              printk(KERN_ERR "vesafb thread: memory remapping failed\n");
-+
-+      return ret;
-+}
-+
-+#define vesafb_get_string(str) \
-+{                                                                     \
-+      /* The address is in the form ssssoooo, where oooo = offset,    \
-+       * ssss = segment */                                            \
-+      addr = ((p_vbe(tsk->buf)->str & 0xffff0000) >> 12) +            \
-+              (p_vbe(tsk->buf)->str & 0x0000ffff);                    \
-+                                                                      \
-+      /* The data is in ROM which is shared between processes, so we  \
-+       * just translate the real mode address into one visible from   \
-+       * kernel space */                                              \
-+      if (addr >= 0xa0000) {                                          \
-+              p_vbe(tsk->buf)->str = (u32) __va(addr);                \
-+                                                                      \
-+      /* The data is in the buffer, we just have to convert the       \
-+       * address so that it points into the buffer user provided. */  \
-+      } else if (addr > BUF_ADDR && addr < BUF_ADDR +                 \
-+                 sizeof(struct vesafb_vbe_ib)) {                      \
-+              addr -= BUF_ADDR;                                       \
-+              p_vbe(tsk->buf)->str = (u32) (tsk->buf + addr);         \
-+                                                                      \
-+      /* This should never happen: someone was insane enough to put   \
-+       * the data somewhere in RAM.. */                               \
-+      } else {                                                        \
-+              p_vbe(tsk->buf)->str = (u32) "";                        \
-+      }                                                               \
-+}
-+
-+void vesafb_handle_getvbeib(struct vesafb_task *tsk)
-+{
-+      int addr, res;
-+
-+      tsk->regs.es  = (BUF_ADDR >> 4);
-+      tsk->regs.edi = (BUF_ADDR & 0x000f);
-+      strncpy(p_vbe(BUF_ADDR)->vbe_signature, "VBE2", 4);
-+
-+      vesafb_do_vm86(&tsk->regs);
-+      memcpy(tsk->buf, (void*)(BUF_ADDR), sizeof(struct vesafb_vbe_ib));
-+
-+      /* The OEM fields were not defined prior to VBE 2.0 */
-+      if (p_vbe(tsk->buf)->vbe_version >= 0x200) {
-+              vesafb_get_string(oem_string_ptr);
-+              vesafb_get_string(oem_vendor_name_ptr);
-+              vesafb_get_string(oem_product_name_ptr);
-+              vesafb_get_string(oem_product_rev_ptr);
-+      }
-+
-+      /* This is basically the same as vesafb_get_string() */
-+      addr = ((p_vbe(tsk->buf)->mode_list_ptr & 0xffff0000) >> 12) +
-+              (p_vbe(tsk->buf)->mode_list_ptr & 0x0000ffff);
-+
-+      if (addr >= 0xa0000) {
-+              p_vbe(tsk->buf)->mode_list_ptr = (u32) __va(addr);
-+      } else if (addr > BUF_ADDR && addr < BUF_ADDR +
-+                 sizeof(struct vesafb_vbe_ib)) {
-+              addr -= BUF_ADDR;
-+              p_vbe(tsk->buf)->mode_list_ptr = (u32) (tsk->buf + addr);
-+      } else {
-+              res = 0;
-+              printk(KERN_WARNING "vesafb: warning, copying modelist "
-+                                  "from somewhere in RAM!\n");
-+              while (*(u16*)(addr+res) != 0xffff &&
-+                     res < (sizeof(p_vbe(tsk->buf)->reserved) - 2)) {
-+                      *(u16*) ((u32)&(p_vbe(tsk->buf)->reserved) + res) =
-+                              *(u16*)(addr+res);
-+                      res += 2;
-+              }
-+              *(u16*) ((u32)&(p_vbe(tsk->buf)->reserved) + res) = 0xffff;
-+      }
-+}
-+
-+int vesafb_handle_tasks(void)
-+{
-+      struct vesafb_task *tsk;
-+      struct list_head *curr, *next;
-+      int ret = 0;
-+
-+      down(&vesafb_task_list_sem);
-+      list_for_each_safe(curr, next, &vesafb_task_list) {
-+              tsk = list_entry(curr, struct vesafb_task, node);
-+
-+              if (tsk->flags & TF_EXIT) {
-+                      ret = 1;
-+                      goto task_done;
-+              }
-+              if (tsk->flags & TF_GETVBEIB) {
-+                      vesafb_handle_getvbeib(tsk);
-+                      goto task_done;
-+              }
-+              /* Do we need to store a pointer to the buffer in ES:EDI? */
-+              if (tsk->flags & TF_BUF_DI) {
-+                      tsk->regs.es  = (BUF_ADDR >> 4);
-+                      tsk->regs.edi = (BUF_ADDR & 0x000f);
-+              }
-+              /* Sometimes the pointer has to be in ES:EBX. */
-+              if (tsk->flags & TF_BUF_BX) {
-+                      tsk->regs.es  = (BUF_ADDR >> 4);
-+                      tsk->regs.ebx = (BUF_ADDR & 0x000f);
-+              }
-+              if (tsk->flags & (TF_BUF_DI | TF_BUF_BX))
-+                      memcpy((void*)BUF_ADDR, tsk->buf, tsk->buf_len);
-+
-+              vesafb_do_vm86(&tsk->regs);
-+
-+              if (tsk->flags & TF_RETURN_BUF)
-+                      memcpy(tsk->buf, (void*)BUF_ADDR, tsk->buf_len);
-+
-+task_done:    list_del(curr);
-+              complete(&tsk->done);
-+      }
-+
-+      /* If we're going to kill this thread, don't allow any elements
-+       * to be added to the task list. */
-+      if (!ret)
-+              up(&vesafb_task_list_sem);
-+
-+      return ret;
-+}
-+
-+/*
-+ * This 'hybrid' thread serves as a backend for vesafb-tng, handling all vm86
-+ * calls. It is started as a kernel thread. It then creates its own mm struct,
-+ * thus separating itself from any userspace processes. At this moment, it
-+ * stops being a kernel thread (kernel threads have mm = NULL) and becomes
-+ * a 'hybrid' thread -- one that has full access to kernel space, yet runs
-+ * with its own address space.
-+ *
-+ * This is necessary because in order to make vm86 calls some parts of the
-+ * first 1MB of RAM have to be setup to mimic the real mode. These are:
-+ *  - interrupt vector table  [0x00000-0x003ff]
-+ *  - BIOS data area          [0x00400-0x004ff]
-+ *  - Extended BIOS data area [0x9fc00-0x9ffff]
-+ *  - the video RAM           [0xa0000-0xbffff]
-+ *  - video BIOS              [0xc0000-0xcffff]
-+ *  - motherboard BIOS                [0xf0000-0xfffff]
-+ */
-+int vesafb_thread(void *unused)
-+{
-+      int err = 0;
-+
-+      set_fs(KERNEL_DS);
-+      daemonize("vesafb");
-+
-+      if (set_new_mm()) {
-+              err = -ENOMEM;
-+              goto thr_end;
-+      }
-+      if (vesafb_init_mem()) {
-+              err = -ENOMEM;
-+              goto thr_end;
-+      }
-+
-+      DPRINTK("started vesafb thread\n");
-+
-+      /* Having an IO bitmap makes things faster as we avoid GPFs
-+       * when running vm86 code. We can live if it fails, though,
-+       * so don't bother checking for errors. */
-+      ioperm(0,1024,1);
-+      set_user_nice(current, -10);
-+
-+      complete(&vesafb_th_completion);
-+
-+      while (1) {
-+              if (vesafb_handle_tasks())
-+                      break;
-+              wait_event_interruptible(vesafb_wait,
-+                                       !list_empty(&vesafb_task_list));
-+              try_to_freeze();
-+      }
-+
-+out:  DPRINTK("exiting the vesafb thread\n");
-+      vesafb_pid = -1;
-+
-+      /* Now that all callers know this thread is no longer running
-+       * (pid < 0), allow them to continue. */
-+      up(&vesafb_task_list_sem);
-+      return err;
-+thr_end:
-+      down(&vesafb_task_list_sem);
-+      complete(&vesafb_th_completion);
-+      goto out;       
-+}
-+
-+int vesafb_queue_task(struct vesafb_task *tsk)
-+{
-+      down(&vesafb_task_list_sem);
-+      if (vesafb_pid < 0)
-+              return -1;
-+      list_add_tail(&tsk->node, &vesafb_task_list);
-+      up(&vesafb_task_list_sem);
-+      wake_up(&vesafb_wait);
-+      return 0;
-+}
-+
-+int vesafb_wait_for_thread(void)
-+{
-+      /* PID 0 means that the thread is still initializing. */
-+      if (vesafb_pid < 0)
-+              return -1;
-+      wait_for_completion(&vesafb_th_completion);
-+      return 0;
-+}
-+
-+int __init vesafb_init_thread(void)
-+{
-+      vesafb_pid = kernel_thread(vesafb_thread,NULL,0);
-+      return 0;
-+}
-+
-+#ifdef MODULE
-+void __exit vesafb_kill_thread(void)
-+{
-+      struct vesafb_task *tsk;
-+      if (vesafb_pid <= 0)
-+              return;
-+
-+      vesafb_create_task(tsk);
-+      if (!tsk)
-+              return;
-+      tsk->flags |= TF_EXIT;
-+      vesafb_queue_task(tsk);
-+      vesafb_wait_for_task(tsk);
-+      kfree(tsk);
-+      return;
-+}
-+module_exit(vesafb_kill_thread);
-+#endif
-+module_init(vesafb_init_thread);
-+
-+EXPORT_SYMBOL_GPL(vesafb_queue_task);
-+EXPORT_SYMBOL_GPL(vesafb_wait_for_thread);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Michal Januszewski");
-+
-diff --git a/drivers/video/vesafb-tng.c b/drivers/video/vesafb-tng.c
-new file mode 100644
-index 0000000..b4d4394
---- /dev/null
-+++ b/drivers/video/vesafb-tng.c
-@@ -0,0 +1,1586 @@
-+/*
-+ * Framebuffer driver for VBE 2.0+ compliant graphic boards
-+ *
-+ * (c) 2004-2006 Michal Januszewski <spock@gentoo.org>
-+ *     Based upon vesafb code by Gerd Knorr <kraxel@goldbach.in-berlin.de>
-+ *
-+ */
-+
-+#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/delay.h>
-+#include <linux/fb.h>
-+#include <linux/ioport.h>
-+#include <linux/init.h>
-+#include <linux/proc_fs.h>
-+#include <linux/completion.h>
-+#include <linux/platform_device.h>
-+#include <video/edid.h>
-+#include <video/vesa.h>
-+#include <video/vga.h>
-+#include <asm/io.h>
-+#include <asm/mtrr.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include "edid.h"
-+
-+#define dac_reg       (0x3c8)
-+#define dac_val       (0x3c9)
-+
-+#define VESAFB_NEED_EXACT_RES         1
-+#define VESAFB_NEED_EXACT_DEPTH 2
-+
-+/* --------------------------------------------------------------------- */
-+
-+static struct fb_var_screeninfo vesafb_defined __initdata = {
-+      .activate       = FB_ACTIVATE_NOW,
-+      .height         = 0,
-+      .width          = 0,
-+      .right_margin   = 32,
-+      .upper_margin   = 16,
-+      .lower_margin   = 4,
-+      .vsync_len      = 4,
-+      .vmode          = FB_VMODE_NONINTERLACED,
-+};
-+
-+static struct fb_fix_screeninfo vesafb_fix __initdata = {
-+      .id     = "VESA VGA",
-+      .type   = FB_TYPE_PACKED_PIXELS,
-+      .accel  = FB_ACCEL_NONE,
-+};
-+
-+static int  mtrr       = 0;   /* disable mtrr by default */
-+static int  blank      = 1;     /* enable blanking by default */
-+static int  ypan       = 0;   /* 0 - nothing, 1 - ypan, 2 - ywrap */
-+static int  pmi_setpal = 1;   /* pmi for palette changes */
-+static u16  *pmi_base  = NULL;  /* protected mode interface location */
-+static void (*pmi_start)(void) = NULL;
-+static void (*pmi_pal)(void)   = NULL;
-+static struct vesafb_vbe_ib  vbe_ib;
-+static struct vesafb_mode_ib *vbe_modes;
-+static int                   vbe_modes_cnt = 0;
-+static struct fb_info      *vesafb_info = NULL;
-+static int  nocrtc                = 0; /* ignore CRTC settings */
-+static int  noedid       __initdata = 0; /* don't try DDC transfers */
-+static int  vram_remap   __initdata = 0; /* set amount of memory to be used */
-+static int  vram_total   __initdata = 0; /* set total amount of memory */
-+static u16  maxclk       __initdata = 0; /* maximum pixel clock */
-+static u16  maxvf        __initdata = 0; /* maximum vertical frequency */
-+static u16  maxhf        __initdata = 0; /* maximum horizontal frequency */
-+static int  gtf          __initdata = 0; /* forces use of the GTF */
-+static char *mode_option __initdata = NULL;
-+static u16  vbemode      __initdata = 0;
-+
-+/* --------------------------------------------------------------------- */
-+
-+static int vesafb_find_vbe_mode(int xres, int yres, int depth,
-+                              unsigned char flags)
-+{
-+      int i, match = -1, h = 0, d = 0x7fffffff;
-+
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              h = abs(vbe_modes[i].x_res - xres) +
-+                  abs(vbe_modes[i].y_res - yres) +
-+                  abs(depth - vbe_modes[i].depth);
-+              if (h == 0)
-+                      return i;
-+              if (h < d || (h == d && vbe_modes[i].depth > depth)) {
-+                      d = h;
-+                      match = i;
-+              }
-+      }
-+      i = 1;
-+
-+      if (flags & VESAFB_NEED_EXACT_DEPTH && vbe_modes[match].depth != depth)
-+              i = 0;
-+      if (flags & VESAFB_NEED_EXACT_RES && d > 24)
-+              i = 0;
-+      if (i != 0)
-+              return match;
-+      else
-+              return -1;
-+}
-+
-+static int vesafb_pan_display(struct fb_var_screeninfo *var,
-+                              struct fb_info *info)
-+{
-+      int offset;
-+
-+      offset = (var->yoffset * info->fix.line_length + var->xoffset) / 4;
-+
-+      /* It turns out it's not the best idea to do panning via vm86,
-+       * so we only allow it if we have a PMI. */
-+      if (pmi_start) {
-+              __asm__ __volatile__(
-+                      "call *(%%edi)"
-+                      : /* no return value */
-+                      : "a" (0x4f07),         /* EAX */
-+                        "b" (0),              /* EBX */
-+                        "c" (offset),         /* ECX */
-+                        "d" (offset >> 16),   /* EDX */
-+                        "D" (&pmi_start));    /* EDI */
-+      }
-+      return 0;
-+}
-+
-+static int vesafb_blank(int blank, struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int err = 1;
-+
-+      if (vbe_ib.capabilities & VBE_CAP_VGACOMPAT) {
-+              int loop = 10000;
-+              u8 seq = 0, crtc17 = 0;
-+
-+              if (blank == FB_BLANK_POWERDOWN) {
-+                      seq = 0x20;
-+                      crtc17 = 0x00;
-+                      err = 0;
-+              } else {
-+                      seq = 0x00;
-+                      crtc17 = 0x80;
-+                      err = (blank == FB_BLANK_UNBLANK) ? 0 : -EINVAL;
-+              }
-+
-+              vga_wseq(NULL, 0x00, 0x01);
-+              seq |= vga_rseq(NULL, 0x01) & ~0x20;
-+              vga_wseq(NULL, 0x00, seq);
-+
-+              crtc17 |= vga_rcrt(NULL, 0x17) & ~0x80;
-+              while (loop--);
-+              vga_wcrt(NULL, 0x17, crtc17);
-+              vga_wseq(NULL, 0x00, 0x03);
-+      } else {
-+              vesafb_create_task (tsk);
-+              if (!tsk)
-+                      return -ENOMEM;
-+              tsk->regs.eax = 0x4f10;
-+              switch (blank) {
-+              case FB_BLANK_UNBLANK:
-+                      tsk->regs.ebx = 0x0001;
-+                      break;
-+              case FB_BLANK_NORMAL:
-+                      tsk->regs.ebx = 0x0101; /* standby */
-+                      break;
-+              case FB_BLANK_POWERDOWN:
-+                      tsk->regs.ebx = 0x0401; /* powerdown */
-+                      break;
-+              default:
-+                      goto out;
-+              }
-+              tsk->flags = TF_CALL;
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) == 0x004f)
-+                      err = 0;
-+out:          kfree(tsk);
-+      }
-+      return err;
-+}
-+
-+static int vesafb_setpalette(struct vesafb_pal_entry *entries, int count,
-+                           int start, struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int i = ((struct vesafb_par*)info->par)->mode_idx;
-+      int ret = 0;
-+
-+      /* We support palette modifications for 8 bpp modes only, so
-+       * there can never be more than 256 entries. */
-+      if (start + count > 256)
-+              return -EINVAL;
-+
-+      /* Use VGA registers if mode is VGA-compatible. */
-+      if (i >= 0 && i < vbe_modes_cnt &&
-+          vbe_modes[i].mode_attr & VBE_MODE_VGACOMPAT) {
-+              for (i = 0; i < count; i++) {
-+                      outb_p(start + i,        dac_reg);
-+                      outb_p(entries[i].red,   dac_val);
-+                      outb_p(entries[i].green, dac_val);
-+                      outb_p(entries[i].blue,  dac_val);
-+              }
-+      } else if (pmi_setpal) {
-+              __asm__ __volatile__(
-+              "call *(%%esi)"
-+              : /* no return value */
-+              : "a" (0x4f09),         /* EAX */
-+                "b" (0),              /* EBX */
-+                "c" (count),          /* ECX */
-+                "d" (start),          /* EDX */
-+                "D" (entries),        /* EDI */
-+                "S" (&pmi_pal));      /* ESI */
-+      } else {
-+              vesafb_create_task (tsk);
-+              if (!tsk)
-+                      return -ENOMEM;
-+              tsk->regs.eax = 0x4f09;
-+              tsk->regs.ebx = 0x0;
-+              tsk->regs.ecx = count;
-+              tsk->regs.edx = start;
-+              tsk->buf = entries;
-+              tsk->buf_len = sizeof(struct vesafb_pal_entry) * count;
-+              tsk->flags = TF_CALL | TF_BUF_DI;
-+
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+              if ((tsk->regs.eax & 0xffff) != 0x004f)
-+                      ret = 1;
-+              kfree(tsk);
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_setcolreg(unsigned regno, unsigned red, unsigned green,
-+                          unsigned blue, unsigned transp,
-+                          struct fb_info *info)
-+{
-+      struct vesafb_pal_entry entry;
-+      int shift = 16 - info->var.green.length;
-+      int ret = 0;
-+
-+      if (regno >= info->cmap.len)
-+              return -EINVAL;
-+
-+      if (info->var.bits_per_pixel == 8) {
-+              entry.red   = red   >> shift;
-+              entry.green = green >> shift;
-+              entry.blue  = blue  >> shift;
-+              entry.pad   = 0;
-+
-+              ret = vesafb_setpalette(&entry, 1, regno, info);
-+      } else if (regno < 16) {
-+              switch (info->var.bits_per_pixel) {
-+              case 16:
-+                      if (info->var.red.offset == 10) {
-+                              /* 1:5:5:5 */
-+                              ((u32*) (info->pseudo_palette))[regno] =
-+                                              ((red   & 0xf800) >>  1) |
-+                                              ((green & 0xf800) >>  6) |
-+                                              ((blue  & 0xf800) >> 11);
-+                      } else {
-+                              /* 0:5:6:5 */
-+                              ((u32*) (info->pseudo_palette))[regno] =
-+                                              ((red   & 0xf800)      ) |
-+                                              ((green & 0xfc00) >>  5) |
-+                                              ((blue  & 0xf800) >> 11);
-+                      }
-+                      break;
-+
-+              case 24:
-+              case 32:
-+                      red   >>= 8;
-+                      green >>= 8;
-+                      blue  >>= 8;
-+                      ((u32 *)(info->pseudo_palette))[regno] =
-+                              (red   << info->var.red.offset)   |
-+                              (green << info->var.green.offset) |
-+                              (blue  << info->var.blue.offset);
-+                      break;
-+              }
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
-+{
-+      struct vesafb_pal_entry *entries;
-+      int shift = 16 - info->var.green.length;
-+      int i, ret = 0;
-+
-+      if (info->var.bits_per_pixel == 8) {
-+              if (cmap->start + cmap->len > info->cmap.start +
-+                  info->cmap.len || cmap->start < info->cmap.start)
-+                      return -EINVAL;
-+
-+              entries = vmalloc(sizeof(struct vesafb_pal_entry) * cmap->len);
-+              if (!entries)
-+                      return -ENOMEM;
-+              for (i = 0; i < cmap->len; i++) {
-+                      entries[i].red   = cmap->red[i]   >> shift;
-+                      entries[i].green = cmap->green[i] >> shift;
-+                      entries[i].blue  = cmap->blue[i]  >> shift;
-+                      entries[i].pad   = 0;
-+              }
-+              ret = vesafb_setpalette(entries, cmap->len, cmap->start, info);
-+              vfree(entries);
-+      } else {
-+              /* For modes with bpp > 8, we only set the pseudo palette in
-+               * the fb_info struct. We rely on vesafb_setcolreg to do all
-+               * sanity checking. */
-+              for (i = 0; i < cmap->len; i++) {
-+                      ret += vesafb_setcolreg(cmap->start + i, cmap->red[i],
-+                                              cmap->green[i], cmap->blue[i],
-+                                              0, info);
-+              }
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_set_par(struct fb_info *info)
-+{
-+      struct vesafb_par *par = (struct vesafb_par *) info->par;
-+      struct vesafb_task *tsk;
-+      struct vesafb_crtc_ib *crtc = NULL;
-+      struct vesafb_mode_ib *mode = NULL;
-+      int i, err = 0, depth = info->var.bits_per_pixel;
-+
-+      if (depth > 8 && depth != 32)
-+              depth = info->var.red.length + info->var.green.length +
-+                      info->var.blue.length;
-+
-+      i = vesafb_find_vbe_mode(info->var.xres, info->var.yres, depth,
-+                               VESAFB_NEED_EXACT_RES |
-+                               VESAFB_NEED_EXACT_DEPTH);
-+      if (i >= 0)
-+              mode = &vbe_modes[i];
-+      else
-+              return -EINVAL;
-+
-+      vesafb_create_task (tsk);
-+      if (!tsk)
-+              return -ENOMEM;
-+      tsk->regs.eax = 0x4f02;
-+      tsk->regs.ebx = mode->mode_id | 0x4000;         /* use LFB */
-+      tsk->flags = TF_CALL;
-+
-+      if (vbe_ib.vbe_version >= 0x0300 && !nocrtc &&
-+          info->var.pixclock != 0) {
-+              tsk->regs.ebx |= 0x0800;                /* use CRTC data */
-+              tsk->flags |= TF_BUF_DI;
-+              crtc = kmalloc(sizeof(struct vesafb_crtc_ib), GFP_KERNEL);
-+              if (!crtc) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+              crtc->horiz_start = info->var.xres + info->var.right_margin;
-+              crtc->horiz_end   = crtc->horiz_start + info->var.hsync_len;
-+              crtc->horiz_total = crtc->horiz_end + info->var.left_margin;
-+
-+              crtc->vert_start  = info->var.yres + info->var.lower_margin;
-+              crtc->vert_end    = crtc->vert_start + info->var.vsync_len;
-+              crtc->vert_total  = crtc->vert_end + info->var.upper_margin;
-+
-+              crtc->pixel_clock = PICOS2KHZ(info->var.pixclock) * 1000;
-+              crtc->refresh_rate = (u16)(100 * (crtc->pixel_clock /
-+                                   (crtc->vert_total * crtc->horiz_total)));
-+              crtc->flags = 0;
-+
-+              if (info->var.vmode & FB_VMODE_DOUBLE)
-+                      crtc->flags |= 0x1;
-+              if (info->var.vmode & FB_VMODE_INTERLACED)
-+                      crtc->flags |= 0x2;
-+              if (!(info->var.sync & FB_SYNC_HOR_HIGH_ACT))
-+                      crtc->flags |= 0x4;
-+              if (!(info->var.sync & FB_SYNC_VERT_HIGH_ACT))
-+                      crtc->flags |= 0x8;
-+              memcpy(&par->crtc, crtc, sizeof(struct vesafb_crtc_ib));
-+      } else
-+              memset(&par->crtc, 0, sizeof(struct vesafb_crtc_ib));
-+
-+      tsk->buf = (void*)crtc;
-+      tsk->buf_len = sizeof(struct vesafb_crtc_ib);
-+
-+      if (vesafb_queue_task (tsk)) {
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+              printk(KERN_ERR "vesafb: mode switch failed (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      par->mode_idx = i;
-+
-+      /* For 8bpp modes, always try to set the DAC to 8 bits. */
-+      if (vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC &&
-+          mode->bits_per_pixel <= 8) {
-+              vesafb_reset_task(tsk);
-+              tsk->flags = TF_CALL;
-+              tsk->regs.eax = 0x4f08;
-+              tsk->regs.ebx = 0x0800;
-+
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f ||
-+                  ((tsk->regs.ebx & 0xff00) >> 8) != 8) {
-+                      /* We've failed to set the DAC palette format -
-+                       * time to correct var. */
-+                      info->var.red.length    = 6;
-+                      info->var.green.length  = 6;
-+                      info->var.blue.length   = 6;
-+              }
-+      }
-+
-+      info->fix.visual = (info->var.bits_per_pixel == 8) ?
-+                         FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
-+      info->fix.line_length = mode->bytes_per_scan_line;
-+
-+      DPRINTK("set new mode %dx%d-%d (0x%x)\n",
-+              info->var.xres, info->var.yres, info->var.bits_per_pixel,
-+              mode->mode_id);
-+
-+out:  if (crtc != NULL)
-+              kfree(crtc);
-+      kfree(tsk);
-+
-+      return err;
-+}
-+
-+static void vesafb_setup_var(struct fb_var_screeninfo *var, struct fb_info *info,
-+                           struct vesafb_mode_ib *mode)
-+{
-+      var->xres = mode->x_res;
-+      var->yres = mode->y_res;
-+      var->xres_virtual = mode->x_res;
-+      var->yres_virtual = (ypan) ?
-+                            info->fix.smem_len / mode->bytes_per_scan_line :
-+                            mode->y_res;
-+      var->xoffset = 0;
-+      var->yoffset = 0;
-+      var->bits_per_pixel = mode->bits_per_pixel;
-+
-+      if (var->bits_per_pixel == 15)
-+              var->bits_per_pixel = 16;
-+
-+      if (var->bits_per_pixel > 8) {
-+              var->red.offset    = mode->red_off;
-+              var->red.length    = mode->red_len;
-+              var->green.offset  = mode->green_off;
-+              var->green.length  = mode->green_len;
-+              var->blue.offset   = mode->blue_off;
-+              var->blue.length   = mode->blue_len;
-+              var->transp.offset = mode->rsvd_off;
-+              var->transp.length = mode->rsvd_len;
-+
-+              DPRINTK("directcolor: size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n",
-+                      mode->rsvd_len,
-+                      mode->red_len,
-+                      mode->green_len,
-+                      mode->blue_len,
-+                      mode->rsvd_off,
-+                      mode->red_off,
-+                      mode->green_off,
-+                      mode->blue_off);
-+      } else {
-+              var->red.offset    = 0;
-+              var->green.offset  = 0;
-+              var->blue.offset   = 0;
-+              var->transp.offset = 0;
-+
-+              /* We're assuming that we can switch the DAC to 8 bits. If
-+               * this proves to be incorrect, we'll update the fields
-+               * later in set_par(). */
-+              if (vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC) {
-+                      var->red.length    = 8;
-+                      var->green.length  = 8;
-+                      var->blue.length   = 8;
-+                      var->transp.length = 0;
-+              } else {
-+                      var->red.length    = 6;
-+                      var->green.length  = 6;
-+                      var->blue.length   = 6;
-+                      var->transp.length = 0;
-+              }
-+      }
-+}
-+
-+static void inline vesafb_check_limits(struct fb_var_screeninfo *var,
-+                                     struct fb_info *info)
-+{
-+      struct fb_videomode *mode;
-+
-+      if (!var->pixclock)
-+              return;
-+      if (vbe_ib.vbe_version < 0x0300) {
-+              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60, var, info);
-+              return;
-+      }
-+      if (!fb_validate_mode(var, info))
-+              return;
-+      mode = fb_find_best_mode(var, &info->modelist);
-+      if (mode) {
-+              DPRINTK("find_best_mode: %d %d @ %d (vmode: %d)\n",
-+                      mode->xres, mode->yres, mode->refresh, mode->vmode);
-+              if (mode->xres == var->xres && mode->yres == var->yres &&
-+                  !(mode->vmode & (FB_VMODE_INTERLACED | FB_VMODE_DOUBLE))) {
-+                      fb_videomode_to_var(var, mode);
-+                      return;
-+              }
-+      }
-+      if (info->monspecs.gtf && !fb_get_mode(FB_MAXTIMINGS, 0, var, info))
-+              return;
-+      /* Use default refresh rate */
-+      var->pixclock = 0;
-+}
-+
-+static int vesafb_check_var(struct fb_var_screeninfo *var,
-+                          struct fb_info *info)
-+{
-+      int match = -1;
-+      int depth = var->red.length + var->green.length + var->blue.length;
-+
-+      /* Various apps will use bits_per_pixel to set the color depth,
-+       * which is theoretically incorrect, but which we'll try to handle
-+       * here. */
-+      if (depth == 0 || abs(depth - var->bits_per_pixel) >= 8)
-+              depth = var->bits_per_pixel;
-+      match = vesafb_find_vbe_mode(var->xres, var->yres, depth,
-+                                   VESAFB_NEED_EXACT_RES);
-+
-+      if (match == -1) {
-+              DPRINTK("vesafb: mode %dx%d-%d not found\n", var->xres,
-+                      var->yres, depth);
-+              return -EINVAL;
-+      }
-+
-+      vesafb_setup_var(var, info, &vbe_modes[match]);
-+      DPRINTK("found mode 0x%x (%dx%d-%dbpp)\n",
-+              vbe_modes[match].mode_id, vbe_modes[match].x_res,
-+              vbe_modes[match].y_res, vbe_modes[match].depth);
-+
-+      /* Check whether we have remapped enough memory for this mode. */
-+      if (var->yres * vbe_modes[match].bytes_per_scan_line >
-+          info->fix.smem_len) {
-+              return -EINVAL;
-+      }
-+
-+      if ((var->vmode & FB_VMODE_DOUBLE) &&
-+          !(vbe_modes[match].mode_attr & 0x100))
-+              var->vmode &= ~FB_VMODE_DOUBLE;
-+      if ((var->vmode & FB_VMODE_INTERLACED) &&
-+          !(vbe_modes[match].mode_attr & 0x200))
-+              var->vmode &= ~FB_VMODE_INTERLACED;
-+      vesafb_check_limits(var, info);
-+      return 0;
-+}
-+
-+static int vesafb_open(struct fb_info *info, int user)
-+{
-+      struct vesafb_task *tsk = NULL;
-+      struct vesafb_par *par = info->par;
-+      int cnt = atomic_read(&par->ref_count);
-+
-+      if (!cnt) {
-+              vesafb_create_task(tsk);
-+              if (!tsk)
-+                      goto out;
-+
-+              /* Get the VBE state buffer size. We want all available
-+               * hardware state data (CL = 0x0f). */
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0000;
-+              tsk->flags = TF_CALL;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+              
-+              if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+                      printk(KERN_WARNING "vesafb: VBE state buffer size "
-+                              "cannot be determined (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+                      goto out;
-+              }
-+
-+              par->vbe_state_size = 64 * (tsk->regs.ebx & 0xffff);
-+              par->vbe_state = kzalloc(par->vbe_state_size, GFP_KERNEL);
-+              if (!par->vbe_state) 
-+                      goto out;
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0001;
-+              tsk->flags = TF_CALL | TF_BUF_BX | TF_RETURN_BUF;
-+              tsk->buf = (void*)(par->vbe_state);
-+              tsk->buf_len = par->vbe_state_size;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto getstate_failed;
-+              vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+                      printk(KERN_WARNING "vesafb: VBE get state call "
-+                              "failed (eax: 0x%lx)\n", tsk->regs.eax);
-+                      goto getstate_failed;
-+              }
-+      }
-+out:
-+      atomic_inc(&par->ref_count);
-+      if (tsk)
-+              kfree(tsk);
-+      return 0;
-+
-+getstate_failed:
-+      kfree(par->vbe_state);
-+      par->vbe_state = NULL;
-+      par->vbe_state_size = 0;
-+      goto out;
-+}
-+
-+static int vesafb_release(struct fb_info *info, int user)
-+{
-+      struct vesafb_task *tsk = NULL;
-+      struct vesafb_par *par = info->par;
-+      int cnt = atomic_read(&par->ref_count);
-+
-+      if (!cnt)
-+              return -EINVAL;
-+      
-+      if (cnt == 1 && par->vbe_state && par->vbe_state_size) {
-+              vesafb_create_task(tsk);
-+              if (!tsk)
-+                      goto out;
-+
-+              tsk->regs.eax = 0x0003;
-+              tsk->regs.ebx = 0x0000;
-+              tsk->flags = TF_CALL;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0002;
-+              tsk->buf = (void*)(par->vbe_state);
-+              tsk->buf_len = par->vbe_state_size;
-+              tsk->flags = TF_CALL | TF_BUF_BX;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f)
-+                      printk(KERN_WARNING "vesafb: VBE state restore call "
-+                              "failed (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+      }
-+out:
-+      atomic_dec(&par->ref_count);
-+      if (tsk)
-+              kfree(tsk);
-+      return 0;
-+}
-+
-+static int __init vesafb_probe(struct platform_device *device);
-+
-+static struct fb_ops vesafb_ops = {
-+      .owner          = THIS_MODULE,
-+      .fb_open        = vesafb_open,
-+      .fb_release     = vesafb_release,
-+      .fb_setcolreg   = vesafb_setcolreg,
-+      .fb_setcmap     = vesafb_setcmap,
-+      .fb_pan_display = vesafb_pan_display,
-+      .fb_blank       = vesafb_blank,
-+      .fb_fillrect    = cfb_fillrect,
-+      .fb_copyarea    = cfb_copyarea,
-+      .fb_imageblit   = cfb_imageblit,
-+      .fb_check_var   = vesafb_check_var,
-+      .fb_set_par     = vesafb_set_par
-+};
-+
-+static struct platform_driver vesafb_driver = {
-+      .probe  = vesafb_probe,
-+      .driver = {
-+              .name   = "vesafb",
-+      },
-+};
-+
-+static struct platform_device *vesafb_device;
-+ 
-+#ifndef MODULE
-+int __init vesafb_setup(char *options)
-+{
-+      char *this_opt;
-+
-+      if (!options || !*options)
-+              return 0;
-+
-+      DPRINTK("options %s\n",options);
-+
-+      while ((this_opt = strsep(&options, ",")) != NULL) {
-+              if (!*this_opt) continue;
-+
-+              DPRINTK("this_opt: %s\n",this_opt);
-+
-+              if (! strcmp(this_opt, "redraw"))
-+                      ypan=0;
-+              else if (! strcmp(this_opt, "ypan"))
-+                      ypan=1;
-+              else if (! strcmp(this_opt, "ywrap"))
-+                      ypan=2;
-+              else if (! strcmp(this_opt, "vgapal"))
-+                      pmi_setpal=0;
-+              else if (! strcmp(this_opt, "pmipal"))
-+                      pmi_setpal=1;
-+              else if (! strncmp(this_opt, "mtrr:", 5))
-+                      mtrr = simple_strtoul(this_opt+5, NULL, 0);
-+              else if (! strcmp(this_opt, "nomtrr"))
-+                      mtrr=0;
-+              else if (! strcmp(this_opt, "nocrtc"))
-+                      nocrtc=1;
-+              else if (! strcmp(this_opt, "noedid"))
-+                      noedid=1;
-+              else if (! strcmp(this_opt, "noblank"))
-+                      blank=0;
-+              else if (! strcmp(this_opt, "gtf"))
-+                      gtf=1;
-+              else if (! strncmp(this_opt, "vtotal:", 7))
-+                      vram_total = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "vremap:", 7))
-+                      vram_remap = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "maxhf:", 6))
-+                      maxhf = simple_strtoul(this_opt + 6, NULL, 0);
-+              else if (! strncmp(this_opt, "maxvf:", 6))
-+                      maxvf = simple_strtoul(this_opt + 6, NULL, 0);
-+              else if (! strncmp(this_opt, "maxclk:", 7))
-+                      maxclk = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "vbemode:", 8))
-+                      vbemode = simple_strtoul(this_opt + 8, NULL,0);
-+              else if (this_opt[0] >= '0' && this_opt[0] <= '9') {
-+                      DPRINTK("mode_option: %s\n",this_opt);
-+                      mode_option = this_opt;
-+              } else {
-+                      printk(KERN_WARNING
-+                             "vesafb: unrecognized option %s\n", this_opt);
-+              }
-+      }
-+
-+      return 0;
-+}
-+#endif /* !MODULE */
-+
-+static int vesafb_read_proc_modes(char *buf, char **start, off_t offset,
-+                                int len, int *eof, void *private)
-+{
-+      int clen = 0, i;
-+
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              clen += min(snprintf(buf + clen, len - clen, "%dx%d-%d\n", vbe_modes[i].x_res,
-+                              vbe_modes[i].y_res, vbe_modes[i].depth), len - clen);
-+      }
-+      *eof = 1;
-+      return clen;
-+}
-+
-+static int vesafb_read_proc_vbe_info(char *buf, char **start, off_t offset,
-+                                   int len, int *eof, void *private)
-+{
-+      int clen = 0;
-+
-+      clen += min(snprintf(buf + clen, len, "Version:    %d.%d\n",
-+                      ((vbe_ib.vbe_version & 0xff00) >> 8),
-+                      vbe_ib.vbe_version & 0xff), len);
-+      clen += min(snprintf(buf + clen, len - clen, "Vendor:     %s\n",
-+                      (char*)vbe_ib.oem_vendor_name_ptr), len - clen);
-+      clen += min(snprintf(buf + clen, len - clen, "Product:    %s\n",
-+                      (char*)vbe_ib.oem_product_name_ptr), len - clen);
-+      clen += min(snprintf(buf + clen, len - clen, "OEM rev:    %s\n",
-+                      (char*)vbe_ib.oem_product_rev_ptr), len - clen);
-+      clen += min(snprintf(buf + clen, len - clen, "OEM string: %s\n",
-+                      (char*)vbe_ib.oem_string_ptr), len - clen);
-+
-+      *eof = 1;
-+      return clen;
-+}
-+
-+static int __init inline vesafb_vbe_getinfo(struct vesafb_task *tsk)
-+{
-+      tsk->regs.eax = 0x4f00;
-+      tsk->flags = TF_CALL | TF_GETVBEIB;
-+      tsk->buf = &vbe_ib;
-+      tsk->buf_len = sizeof(vbe_ib);
-+      if (vesafb_queue_task (tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if (vbe_ib.vbe_version < 0x0200) {
-+              printk(KERN_ERR "vesafb: Sorry, pre-VBE 2.0 cards are "
-+                              "not supported.\n");
-+              return -EINVAL;
-+      }
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+              printk(KERN_ERR "vesafb: Getting mode info block failed "
-+                              "(eax=0x%x)\n", (u32)tsk->regs.eax);
-+              return -EINVAL;
-+      }
-+
-+      printk(KERN_INFO "vesafb: %s, %s, %s (OEM: %s)\n",
-+              (char*)vbe_ib.oem_vendor_name_ptr,
-+              (char*)vbe_ib.oem_product_name_ptr,
-+              (char*)vbe_ib.oem_product_rev_ptr,
-+              (char*)vbe_ib.oem_string_ptr);
-+
-+      printk(KERN_INFO "vesafb: VBE version: %d.%d\n",
-+                       ((vbe_ib.vbe_version & 0xff00) >> 8),
-+                       vbe_ib.vbe_version & 0xff);
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getmodes(struct vesafb_task *tsk)
-+{
-+      u16 *mode = 0;
-+      int off = 0;
-+
-+      /* Count available modes. */
-+      mode = (u16*)vbe_ib.mode_list_ptr;
-+      while (*mode != 0xffff) {
-+              vbe_modes_cnt++;
-+              mode++;
-+      }
-+
-+      vbe_modes = kmalloc(sizeof(struct vesafb_mode_ib)*
-+                          vbe_modes_cnt, GFP_KERNEL);
-+      if (!vbe_modes)
-+              return -ENOMEM;
-+
-+      /* Get mode info for all available modes. */
-+      mode = (u16*)vbe_ib.mode_list_ptr;
-+
-+      while (*mode != 0xffff) {
-+              struct vesafb_mode_ib *mib;
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f01;
-+              tsk->regs.ecx = (u32) *mode;
-+              tsk->flags = TF_CALL | TF_RETURN_BUF | TF_BUF_DI;
-+              tsk->buf = vbe_modes+off;
-+              tsk->buf_len = sizeof(struct vesafb_mode_ib);
-+              if (vesafb_queue_task(tsk))
-+                      return -EINVAL;
-+              vesafb_wait_for_task(tsk);
-+              mib = p_mode(tsk->buf);
-+              mib->mode_id = *mode;
-+
-+              /* We only want modes that are supported with the currennt
-+               * hardware configuration (D0), color (D3), graphics (D4)
-+               * and that have support for the LFB (D7). */
-+              if ((mib->mode_attr & 0x99) == 0x99 &&
-+                  mib->bits_per_pixel >= 8) {
-+                      off++;
-+              } else {
-+                      vbe_modes_cnt--;
-+              }
-+              mode++;
-+              mib->depth = mib->red_len + mib->green_len + mib->blue_len;
-+              /* Handle 8bpp modes and modes with broken color component
-+               * lengths. */
-+              if (mib->depth == 0 ||
-+                  (mib->depth == 24 && mib->bits_per_pixel == 32))
-+                      mib->depth = mib->bits_per_pixel;
-+      }
-+
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getpmi(struct vesafb_task *tsk)
-+{
-+      int i;
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f0a;
-+      tsk->regs.ebx = 0x0;
-+      tsk->flags = TF_CALL;
-+      if (vesafb_queue_task(tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f || tsk->regs.es < 0xc000) {
-+              pmi_setpal = ypan = 0;
-+      } else {
-+              pmi_base  = (u16*)phys_to_virt(((u32)tsk->regs.es << 4) +
-+                           tsk->regs.edi);
-+              pmi_start = (void*)((char*)pmi_base + pmi_base[1]);
-+              pmi_pal   = (void*)((char*)pmi_base + pmi_base[2]);
-+              printk(KERN_INFO "vesafb: protected mode interface info at "
-+                               "%04x:%04x\n",
-+                               (u16)tsk->regs.es, (u16)tsk->regs.edi);
-+              printk(KERN_INFO "vesafb: pmi: set display start = %p, "
-+                               "set palette = %p\n", pmi_start, pmi_pal);
-+
-+              if (pmi_base[3]) {
-+                      printk(KERN_INFO "vesafb: pmi: ports = ");
-+                      for (i = pmi_base[3]/2; pmi_base[i] != 0xffff; i++)
-+                              printk("%x ",pmi_base[i]);
-+                      printk("\n");
-+
-+                      /*
-+                       * memory areas not supported (yet?)
-+                       *
-+                       * Rules are: we have to set up a descriptor for the
-+                       * requested memory area and pass it in the ES register
-+                       * to the BIOS function.
-+                       */
-+                      if (pmi_base[i] != 0xffff) {
-+                              printk(KERN_INFO "vesafb: can't handle memory "
-+                                               "requests, pmi disabled\n");
-+                              ypan = pmi_setpal = 0;
-+                      }
-+              }
-+      }
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getedid(struct vesafb_task *tsk,
-+                                          struct fb_info *info)
-+{
-+      int res = 0;
-+
-+      if (noedid || vbe_ib.vbe_version < 0x0300)
-+              return -EINVAL;
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f15;
-+      tsk->regs.ebx = 0;
-+      tsk->regs.ecx = 0;
-+      if (vesafb_queue_task(tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f)
-+              return -EINVAL;
-+
-+      if ((tsk->regs.ebx & 0x3) == 3) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports both "
-+                               "DDC1 and DDC2 transfers\n");
-+      } else if ((tsk->regs.ebx & 0x3) == 2) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports DDC2 "
-+                               "transfers\n");
-+      } else if ((tsk->regs.ebx & 0x3) == 1) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports DDC1 "
-+                               "transfers\n");
-+      } else {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware doesn't support "
-+                               "DDC transfers\n");
-+              return -EINVAL;
-+      }
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f15;
-+      tsk->regs.ebx = 1;
-+      tsk->regs.ecx = tsk->regs.edx = 0;
-+      tsk->flags = TF_CALL | TF_RETURN_BUF | TF_BUF_DI;
-+      tsk->buf = kmalloc(EDID_LENGTH, GFP_KERNEL);
-+      tsk->buf_len = EDID_LENGTH;
-+
-+      if (vesafb_queue_task(tsk)) {
-+              res = -EINVAL;
-+              goto out;
-+      }
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) == 0x004f) {
-+              fb_edid_to_monspecs(tsk->buf, &info->monspecs);
-+              fb_videomode_to_modelist(info->monspecs.modedb,
-+                              info->monspecs.modedb_len, &info->modelist);
-+              if (info->monspecs.vfmax && info->monspecs.hfmax) {
-+                      /* If the maximum pixel clock wasn't specified in
-+                       * the EDID block, set it to 300 MHz. */
-+                      if (info->monspecs.dclkmax == 0)
-+                              info->monspecs.dclkmax = 300 * 1000000;
-+                      info->monspecs.gtf = 1;
-+              } else {
-+                      res = -EINVAL;
-+              }
-+      }
-+
-+out:  kfree(tsk->buf);
-+      return res;
-+}
-+
-+static void __init inline vesafb_vbe_getmonspecs(struct vesafb_task *tsk,
-+                                               struct fb_info *info)
-+{
-+      struct fb_var_screeninfo var;
-+      int i;
-+      memset(&info->monspecs, 0, sizeof(struct fb_monspecs));
-+
-+      /* If we didn't get all necessary data from the EDID block,
-+       * mark it as incompatible with the GTF. */
-+      if (vesafb_vbe_getedid(tsk, info))
-+              info->monspecs.gtf = 0;
-+
-+      /* Kernel command line overrides. */
-+      if (maxclk)
-+              info->monspecs.dclkmax = maxclk * 1000000;
-+      if (maxvf)
-+              info->monspecs.vfmax = maxvf;
-+      if (maxhf)
-+              info->monspecs.hfmax = maxhf * 1000;
-+
-+      /* In case DDC transfers are not supported the user can provide
-+       * monitor limits manually. Lower limits are set to "safe" values. */
-+      if (info->monspecs.gtf == 0 && maxclk && maxvf && maxhf) {
-+              info->monspecs.dclkmin = 0;
-+              info->monspecs.vfmin = 60;
-+              info->monspecs.hfmin = 29000;
-+              info->monspecs.gtf = 1;
-+      }
-+
-+      if (info->monspecs.gtf) {
-+              printk(KERN_INFO
-+                      "vesafb: monitor limits: vf = %d Hz, hf = %d kHz, "
-+                      "clk = %d MHz\n", info->monspecs.vfmax,
-+                      (int)(info->monspecs.hfmax / 1000),
-+                      (int)(info->monspecs.dclkmax / 1000000));
-+              /* Add valid VESA video modes to our modelist. */
-+              for (i = 0; i < VESA_MODEDB_SIZE; i++) {
-+                      fb_videomode_to_var(&var, (struct fb_videomode *)
-+                                          &vesa_modes[i]);
-+                      if (!fb_validate_mode(&var, info))
-+                              fb_add_videomode((struct fb_videomode *)
-+                                               &vesa_modes[i],
-+                                               &info->modelist);
-+              }
-+      } else {
-+              /* Add all VESA video modes to our modelist. */
-+              fb_videomode_to_modelist((struct fb_videomode *)vesa_modes,
-+                                       VESA_MODEDB_SIZE, &info->modelist);
-+              printk(KERN_INFO "vesafb: no monitor limits have been set\n");
-+      }
-+      return;
-+}
-+
-+static int __init inline vesafb_vbe_init(struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int res = 0;
-+
-+      vesafb_create_task(tsk);
-+      if (!tsk)
-+              return -EINVAL;
-+      if ((res = vesafb_vbe_getinfo(tsk)) != 0)
-+              goto out;
-+      if ((res = vesafb_vbe_getmodes(tsk)) != 0)
-+              goto out;
-+      if (pmi_setpal || ypan)
-+              vesafb_vbe_getpmi(tsk);
-+
-+      INIT_LIST_HEAD(&info->modelist);
-+      vesafb_vbe_getmonspecs(tsk, info);
-+
-+out:  kfree(tsk);
-+      return res;
-+}
-+
-+static int __init decode_mode(u32 *xres, u32 *yres, u32 *bpp, u32 *refresh)
-+{
-+      int len = strlen(mode_option), i, err = 0;
-+      u8 res_specified = 0, bpp_specified = 0, refresh_specified = 0,
-+         yres_specified = 0;
-+
-+      for (i = len-1; i >= 0; i--) {
-+              switch (mode_option[i]) {
-+              case '@':
-+                      len = i;
-+                      if (!refresh_specified && !bpp_specified &&
-+                          !yres_specified) {
-+                              *refresh = simple_strtoul(&mode_option[i+1],
-+                                                        NULL, 0);
-+                              refresh_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case '-':
-+                      len = i;
-+                      if (!bpp_specified && !yres_specified) {
-+                              *bpp = simple_strtoul(&mode_option[i+1],
-+                                                    NULL, 0);
-+                              bpp_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case 'x':
-+                      if (!yres_specified) {
-+                              *yres = simple_strtoul(&mode_option[i+1],
-+                                                     NULL, 0);
-+                              yres_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case '0'...'9':
-+                      break;
-+              default:
-+                      goto out;
-+              }
-+      }
-+
-+      if (i < 0 && yres_specified) {
-+              *xres = simple_strtoul(mode_option, NULL, 0);
-+              res_specified = 1;
-+      }
-+
-+out:  if (!res_specified || !yres_specified) {
-+              printk(KERN_ERR "vesafb: invalid resolution, "
-+                              "%s not specified\n",
-+                              (!res_specified) ? "width" : "height");
-+              err = -EINVAL;
-+      }
-+
-+      return err;
-+}
-+
-+static int __init vesafb_init_set_mode(struct fb_info *info)
-+{
-+      struct fb_videomode *fbmode;
-+      struct fb_videomode mode;
-+      int i, modeid, refresh = 0;
-+      u8 refresh_specified = 0;
-+
-+      if (!mode_option)
-+              mode_option = CONFIG_FB_VESA_DEFAULT_MODE;
-+
-+      if (vbemode > 0) {
-+              for (i = 0; i < vbe_modes_cnt; i++) {
-+                      if (vbe_modes[i].mode_id == vbemode) {
-+                              info->var.vmode = FB_VMODE_NONINTERLACED;
-+                              info->var.sync = FB_SYNC_VERT_HIGH_ACT;
-+                              vesafb_setup_var(&info->var, info,
-+                                               &vbe_modes[i]);
-+                              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON,
-+                                          60, &info->var, info);
-+                              /* With pixclock set to 0, the default BIOS
-+                               * timings will be used in set_par(). */
-+                              info->var.pixclock = 0;
-+                              modeid = i;
-+                              goto out;
-+                      }
-+              }
-+              printk(KERN_INFO "specified VBE mode %d not found\n",
-+                               vbemode);
-+              vbemode = 0;
-+      }
-+
-+      /* Decode the mode specified on the kernel command line. We save
-+       * the depth into bits_per_pixel, which is wrong, but will work
-+       * anyway. */
-+      if (decode_mode(&info->var.xres, &info->var.yres,
-+                      &info->var.bits_per_pixel, &refresh))
-+              return -EINVAL;
-+      if (refresh)
-+              refresh_specified = 1;
-+      else
-+              refresh = 60;
-+
-+      /* Look for a matching VBE mode. We can live if an exact match
-+       * cannot be found. */
-+      modeid = vesafb_find_vbe_mode(info->var.xres, info->var.yres,
-+                                    info->var.bits_per_pixel, 0);
-+
-+      if (modeid == -1) {
-+              return -EINVAL;
-+      } else {
-+              info->var.vmode = FB_VMODE_NONINTERLACED;
-+              info->var.sync = FB_SYNC_VERT_HIGH_ACT;
-+              vesafb_setup_var(&info->var, info, &vbe_modes[modeid]);
-+      }
-+      if (vbe_ib.vbe_version < 0x0300) {
-+              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60,
-+                          &info->var, info);
-+              goto out;
-+      }
-+      if (!gtf) {
-+              struct fb_videomode tmode;
-+
-+              if (refresh_specified) {
-+                      fb_var_to_videomode(&tmode, &info->var);
-+                      tmode.refresh = refresh;
-+                      fbmode = fb_find_nearest_mode(&tmode, 
-+                                                    &info->modelist);
-+              } else
-+                      fbmode = fb_find_best_mode(&info->var, 
-+                                                 &info->modelist);
-+
-+              if (fbmode->xres == info->var.xres &&
-+                  fbmode->yres == info->var.yres &&
-+                  !(fbmode->vmode & (FB_VMODE_INTERLACED | FB_VMODE_DOUBLE))
-+                  && (!refresh_specified || 
-+                  abs(refresh - fbmode->refresh) <= 5)) {
-+                      fb_videomode_to_var(&info->var, fbmode);
-+                      return modeid;
-+              }
-+      }
-+      i = FB_MAXTIMINGS;
-+      if (!info->monspecs.gtf)
-+              i = FB_IGNOREMON | FB_VSYNCTIMINGS;
-+      else if (refresh_specified)
-+              i = FB_VSYNCTIMINGS;
-+      if (!fb_get_mode(i, refresh, &info->var, info))
-+              goto out;
-+      if (info->monspecs.gtf &&
-+          !fb_get_mode(FB_MAXTIMINGS, 0, &info->var, info))
-+              goto out;
-+      /* Use default refresh rate */
-+      printk(KERN_WARNING "vesafb: using default BIOS refresh rate\n");
-+      info->var.pixclock = 0;
-+
-+out:
-+      fb_var_to_videomode(&mode, &info->var);
-+      fb_add_videomode(&mode, &info->modelist);
-+      return modeid;
-+}
-+
-+static int __init vesafb_probe(struct platform_device *dev)
-+{
-+      char entry[16];
-+      struct fb_info *info;
-+      struct vesafb_mode_ib *mode = NULL;
-+      int err = 0, i, h;
-+      unsigned int size_vmode;
-+      unsigned int size_remap;
-+      unsigned int size_total;
-+
-+      vesafb_info = info = framebuffer_alloc(sizeof(struct vesafb_par) +
-+                                             sizeof(u32) * 256, &dev->dev);
-+      if (!info)
-+              return -ENOMEM;
-+
-+      if (vesafb_wait_for_thread()) {
-+              printk(KERN_ERR "vesafb: vesafb thread not running\n");
-+              framebuffer_release(info);
-+              return -EINVAL;
-+      }
-+
-+      if (vesafb_vbe_init(info)) {
-+              printk(KERN_ERR "vesafb: vbe_init failed\n");
-+              err = -EINVAL;
-+              goto out;
-+      }
-+
-+      vesafb_fix.ypanstep  = ypan     ? 1 : 0;
-+      vesafb_fix.ywrapstep = (ypan>1) ? 1 : 0;
-+
-+      info->pseudo_palette = ((u8*)info->par + sizeof(struct vesafb_par));
-+      info->fbops = &vesafb_ops;
-+      info->var = vesafb_defined;
-+      info->fix = vesafb_fix;
-+
-+      if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
-+              err = -ENXIO;
-+              goto out;
-+      }
-+
-+      i = vesafb_init_set_mode(info);
-+      if (i < 0) {
-+              err = -EINVAL;
-+              goto out_cmap;
-+      } else
-+              mode = &vbe_modes[i];
-+
-+      /* Disable blanking if the user requested so. */
-+      if (!blank) {
-+              info->fbops->fb_blank = NULL;
-+      }
-+
-+      /* Find out how much IO memory is required for the mode with
-+       * the highest resolution. */
-+      size_remap = 0;
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              h = vbe_modes[i].bytes_per_scan_line * vbe_modes[i].y_res;
-+              if (h > size_remap)
-+                      size_remap = h;
-+      }
-+      size_remap *= 2;
-+
-+      /*   size_vmode -- that is the amount of memory needed for the
-+       *                 used video mode, i.e. the minimum amount of
-+       *                 memory we need. */
-+      if (mode != NULL) {
-+              size_vmode = info->var.yres * mode->bytes_per_scan_line;
-+      } else {
-+              size_vmode = info->var.yres * info->var.xres *
-+                           ((info->var.bits_per_pixel + 7) >> 3);
-+      }
-+
-+      /*   size_total -- all video memory we have. Used for mtrr
-+       *                 entries, ressource allocation and bounds
-+       *                 checking. */
-+      size_total = vbe_ib.total_memory * 65536;
-+      if (vram_total)
-+              size_total = vram_total * 1024 * 1024;
-+      if (size_total < size_vmode)
-+              size_total = size_vmode;
-+      ((struct vesafb_par*)(info->par))->mem_total = size_total;
-+
-+      /*   size_remap -- the amount of video memory we are going to
-+       *                 use for vesafb.  With modern cards it is no
-+       *                 option to simply use size_total as th
-+       *                 wastes plenty of kernel address space. */
-+      if (vram_remap)
-+              size_remap = vram_remap * 1024 * 1024;
-+      if (size_remap < size_vmode)
-+              size_remap = size_vmode;
-+      if (size_remap > size_total)
-+              size_remap = size_total;
-+
-+      info->fix.smem_len = size_remap;
-+      info->fix.smem_start = mode->phys_base_ptr;
-+
-+      /* We have to set it here, because when setup_var() was called,
-+       * smem_len wasn't defined yet. */
-+      info->var.yres_virtual = info->fix.smem_len /
-+                               mode->bytes_per_scan_line;
-+
-+      if (ypan && info->var.yres_virtual > info->var.yres) {
-+              printk(KERN_INFO "vesafb: scrolling: %s "
-+                     "using protected mode interface, "
-+                     "yres_virtual=%d\n",
-+                     (ypan > 1) ? "ywrap" : "ypan",info->var.yres_virtual);
-+      } else {
-+              printk(KERN_INFO "vesafb: scrolling: redraw\n");
-+              info->var.yres_virtual = info->var.yres;
-+              ypan = 0;
-+      }
-+
-+      info->flags = FBINFO_FLAG_DEFAULT |
-+              (ypan) ? FBINFO_HWACCEL_YPAN : 0;
-+
-+      if (!ypan)
-+              info->fbops->fb_pan_display = NULL;
-+
-+      if (!request_mem_region(info->fix.smem_start, size_total, "vesafb")) {
-+              printk(KERN_WARNING "vesafb: cannot reserve video memory at "
-+                     "0x%lx\n", info->fix.smem_start);
-+              /* We cannot make this fatal. Sometimes this comes from magic
-+                 spaces our resource handlers simply don't know about. */
-+      }
-+
-+      info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len);
-+
-+      if (!info->screen_base) {
-+              printk(KERN_ERR
-+                     "vesafb: abort, cannot ioremap video memory "
-+                     "0x%x @ 0x%lx\n",
-+                     info->fix.smem_len, info->fix.smem_start);
-+              err = -EIO;
-+              goto out_mem;
-+      }
-+
-+      /* Request failure does not faze us, as vgacon probably has this
-+         region already (FIXME) */
-+      request_region(0x3c0, 32, "vesafb");
-+
-+#ifdef CONFIG_MTRR
-+      if (mtrr && !(info->fix.smem_start & (PAGE_SIZE - 1))) {
-+              int temp_size = size_total;
-+              unsigned int type = 0;
-+
-+              switch (mtrr) {
-+              case 1:
-+                      type = MTRR_TYPE_UNCACHABLE;
-+                      break;
-+              case 2:
-+                      type = MTRR_TYPE_WRBACK;
-+                      break;
-+              case 3:
-+                      type = MTRR_TYPE_WRCOMB;
-+                      break;
-+              case 4:
-+                      type = MTRR_TYPE_WRTHROUGH;
-+                      break;
-+              default:
-+                      type = 0;
-+                      break;
-+              }
-+
-+              if (type) {
-+                      int rc;
-+
-+                      /* Find the largest power-of-two */
-+                      while (temp_size & (temp_size - 1))
-+                              temp_size &= (temp_size - 1);
-+
-+                      /* Try and find a power of two to add */
-+                      do {
-+                              rc = mtrr_add(info->fix.smem_start,
-+                                            temp_size, type, 1);
-+                              temp_size >>= 1;
-+                      } while (temp_size >= PAGE_SIZE && rc == -EINVAL);
-+              }
-+      }
-+#endif /* CONFIG_MTRR */
-+
-+      if (register_framebuffer(info) < 0) {
-+              printk(KERN_ERR
-+                     "vesafb: failed to register framebuffer device\n");
-+              err = -EINVAL;
-+              goto out_mem;
-+      }
-+
-+      printk(KERN_INFO "vesafb: framebuffer at 0x%lx, mapped to 0x%p, "
-+             "using %dk, total %dk\n", info->fix.smem_start,
-+             info->screen_base, size_remap/1024, size_total/1024);
-+      printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node,
-+             info->fix.id);
-+
-+      sprintf(entry, "fb%d", info->node);
-+      proc_mkdir(entry, 0);
-+
-+      sprintf(entry, "fb%d/modes", info->node);
-+      create_proc_read_entry(entry, 0, 0, vesafb_read_proc_modes, NULL);
-+
-+      sprintf(entry, "fb%d/vbe_info", info->node);
-+      create_proc_read_entry(entry, 0, 0, vesafb_read_proc_vbe_info, NULL);
-+      return 0;
-+
-+out_mem:
-+      release_mem_region(info->fix.smem_start, size_total);
-+      if (!list_empty(&info->modelist))
-+              fb_destroy_modelist(&info->modelist);
-+      fb_destroy_modedb(info->monspecs.modedb);
-+out_cmap:
-+      fb_dealloc_cmap(&info->cmap);
-+out:
-+      framebuffer_release(info);
-+      vesafb_info = NULL;
-+      kfree(vbe_modes);
-+      vbe_modes = NULL;
-+      return err;
-+}
-+
-+int __init vesafb_init(void)
-+{
-+      int ret;
-+#ifndef MODULE
-+      char *option = NULL;
-+
-+      if (fb_get_options("vesafb", &option))
-+              return -ENODEV;
-+      vesafb_setup(option);
-+#endif
-+      ret = platform_driver_register(&vesafb_driver);
-+
-+      if (!ret) {
-+              vesafb_device = platform_device_alloc("vesafb", 0);
-+
-+              if (vesafb_device)
-+                      ret = platform_device_add(vesafb_device);
-+              else
-+                      ret = -ENOMEM;
-+
-+              if (ret) {
-+                      platform_device_put(vesafb_device);
-+                      platform_driver_unregister(&vesafb_driver);
-+              }
-+      }
-+      return ret;
-+}
-+
-+module_init(vesafb_init);
-+
-+#ifdef MODULE
-+void __exit vesafb_exit(void)
-+{
-+      char entry[16];
-+
-+      if (vesafb_info)
-+              unregister_framebuffer(vesafb_info);
-+
-+      platform_device_unregister(vesafb_device);
-+      platform_driver_unregister(&vesafb_driver);
-+
-+      if (vesafb_info) {
-+              struct vesafb_par *par = (struct vesafb_par*)vesafb_info->par;
-+
-+              sprintf(entry, "fb%d/modes", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              sprintf(entry, "fb%d/vbe_info", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              sprintf(entry, "fb%d", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              iounmap(vesafb_info->screen_base);
-+              release_mem_region(vesafb_info->fix.smem_start,
-+                                 par->mem_total);
-+              fb_dealloc_cmap(&vesafb_info->cmap);
-+              if (!list_empty(&vesafb_info->modelist))
-+                      fb_destroy_modelist(&vesafb_info->modelist);
-+              fb_destroy_modedb(vesafb_info->monspecs.modedb);
-+              framebuffer_release(vesafb_info);
-+      }
-+
-+      if (vbe_modes != NULL)
-+              kfree(vbe_modes);
-+}
-+
-+module_exit(vesafb_exit);
-+
-+static inline int param_get_scroll(char *buffer, struct kernel_param *kp)
-+{
-+      return 0;
-+}
-+static inline int param_set_scroll(const char *val, struct kernel_param *kp)
-+{
-+      ypan = 0;
-+
-+      if (! strcmp(val, "redraw"))
-+              ypan = 0;
-+      else if (! strcmp(val, "ypan"))
-+              ypan = 1;
-+      else if (! strcmp(val, "ywrap"))
-+              ypan = 2;
-+
-+      return 0;
-+}
-+
-+#define param_check_scroll(name, p) __param_check(name, p, void);
-+
-+module_param_named(scroll, ypan, scroll, 0);
-+MODULE_PARM_DESC(scroll,"Scrolling mode, set to 'redraw', 'ypan' or 'ywrap'");
-+module_param_named(vgapal, pmi_setpal, invbool, 0);
-+MODULE_PARM_DESC(vgapal,"bool: set palette using VGA registers");
-+module_param_named(pmipal, pmi_setpal, bool, 0);
-+MODULE_PARM_DESC(pmipal,"bool: set palette using PMI calls");
-+module_param(mtrr, uint, 0);
-+MODULE_PARM_DESC(mtrr,"Memory Type Range Registers setting. Use 0 to disable.");
-+module_param(blank, bool, 1);
-+MODULE_PARM_DESC(blank,"bool: enable hardware blanking");
-+module_param(nocrtc, bool, 0);
-+MODULE_PARM_DESC(nocrtc,"bool: ignore CRTC timings when setting modes");
-+module_param(noedid, bool, 0);
-+MODULE_PARM_DESC(noedid,"bool: ignore EDID-provided monitor limits "
-+                      "when setting modes");
-+module_param(gtf, bool, 0);
-+MODULE_PARM_DESC(gtf,"bool: force use of VESA GTF to calculate mode timings");
-+module_param(vram_remap, uint, 0);
-+MODULE_PARM_DESC(vram_remap,"Set amount of video memory to be used [MiB]");
-+module_param(vram_total, uint, 0);
-+MODULE_PARM_DESC(vram_total,"Set total amount of video memoery [MiB]");
-+module_param(maxclk, ushort, 0);
-+MODULE_PARM_DESC(maxclk,"Maximum pixelclock [MHz], overrides EDID data");
-+module_param(maxhf, ushort, 0);
-+MODULE_PARM_DESC(maxhf,"Maximum horizontal frequency [kHz], "
-+                     "overrides EDID data");
-+module_param(maxvf, ushort, 0);
-+MODULE_PARM_DESC(maxvf,"Maximum vertical frequency [Hz], "
-+                     "overrides EDID data");
-+module_param_named(mode, mode_option, charp, 0);
-+MODULE_PARM_DESC(mode, "Specify resolution as "
-+                     "\"<xres>x<yres>[-<bpp>][@<refresh>]\"");
-+module_param(vbemode, ushort, 0);
-+MODULE_PARM_DESC(vbemode,"VBE mode number to set, overrides 'mode' setting");
-+
-+#endif /* MODULE */
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Michal Januszewski");
-+MODULE_DESCRIPTION("Framebuffer driver for VBE2.0+ compliant graphics boards");
-+
-diff --git a/include/linux/sched.h b/include/linux/sched.h
-index 4463735..7283e48 100644
---- a/include/linux/sched.h
-+++ b/include/linux/sched.h
-@@ -1390,6 +1390,8 @@ extern void mmput(struct mm_struct *);
- extern struct mm_struct *get_task_mm(struct task_struct *task);
- /* Remove the current tasks stale references to the old mm_struct */
- extern void mm_release(struct task_struct *, struct mm_struct *);
-+/* Create a new mm for a kernel thread */
-+extern int set_new_mm(void);
- extern int  copy_thread(int, unsigned long, unsigned long, unsigned long, struct task_struct *, struct pt_regs *);
- extern void flush_thread(void);
-diff --git a/include/video/vesa.h b/include/video/vesa.h
-new file mode 100644
-index 0000000..bb5abcf
---- /dev/null
-+++ b/include/video/vesa.h
-@@ -0,0 +1,150 @@
-+#if 0
-+#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , \
-+                                                ## args)
-+#else
-+#define DPRINTK(fmt, args...)
-+#endif
-+
-+#define p_crtc(arg) ((struct vesafb_crtc_ib*)(arg))
-+#define p_vbe(arg)  ((struct vesafb_vbe_ib*)(arg))
-+#define p_mode(arg) ((struct vesafb_mode_ib*)(arg))
-+
-+struct vesafb_task {
-+      u8 flags;
-+      void *buf;
-+      int buf_len;
-+      struct vm86_regs regs;
-+      struct list_head node;
-+      struct completion done;
-+};
-+
-+/* Vesafb task flags and masks */
-+#define TF_CALL               0x00
-+#define TF_EXIT               0x01
-+#define TF_GETVBEIB   0x02
-+#define TF_BUF_DI     0x04
-+#define TF_BUF_BX     0x08
-+#define TF_RETURN_BUF 0x10
-+
-+/* Macros and functions for manipulating vesafb tasks */
-+#define vesafb_create_task(task)                              \
-+do {                                                          \
-+      task = kmalloc(sizeof(struct vesafb_task), GFP_ATOMIC); \
-+      if (task)                                               \
-+              memset(task, 0, sizeof(struct vesafb_task));    \
-+      init_completion(&task->done);                           \
-+} while (0)
-+
-+#define vesafb_wait_for_task(task)    wait_for_completion(&task->done);
-+#define vesafb_reset_task(task)               init_completion(&task->done);
-+int vesafb_queue_task(struct vesafb_task *task);
-+
-+/* Functions for controlling the vesafb thread */
-+int vesafb_wait_for_thread(void);
-+
-+#define VBE_CAP_CAN_SWITCH_DAC        0x01
-+#define VBE_CAP_VGACOMPAT     0x02
-+
-+/* This struct is 512 bytes long */
-+struct vesafb_vbe_ib {
-+      char vbe_signature[4];
-+      u16  vbe_version;
-+      u32  oem_string_ptr;
-+      u32  capabilities;
-+      u32  mode_list_ptr;
-+      u16  total_memory;
-+      u16  oem_software_rev;
-+      u32  oem_vendor_name_ptr;
-+      u32  oem_product_name_ptr;
-+      u32  oem_product_rev_ptr;
-+      u8   reserved[222];
-+      char oem_data[256];
-+} __attribute__ ((packed));
-+
-+struct vesafb_crtc_ib {
-+      u16 horiz_total;
-+      u16 horiz_start;
-+      u16 horiz_end;
-+      u16 vert_total;
-+      u16 vert_start;
-+      u16 vert_end;
-+      u8  flags;
-+      u32 pixel_clock;
-+      u16 refresh_rate;
-+      u8  reserved[40];
-+} __attribute__ ((packed));
-+
-+#define VBE_MODE_VGACOMPAT    0x20
-+
-+struct vesafb_mode_ib {
-+      /* for all VBE revisions */
-+      u16 mode_attr;
-+      u8  winA_attr;
-+      u8  winB_attr;
-+      u16 win_granularity;
-+      u16 win_size;
-+      u16 winA_seg;
-+      u16 winB_seg;
-+      u32 win_func_ptr;
-+      u16 bytes_per_scan_line;
-+
-+      /* for VBE 1.2+ */
-+      u16 x_res;
-+      u16 y_res;
-+      u8  x_char_size;
-+      u8  y_char_size;
-+      u8  planes;
-+      u8  bits_per_pixel;
-+      u8  banks;
-+      u8  memory_model;
-+      u8  bank_size;
-+      u8  image_pages;
-+      u8  reserved1;
-+
-+      /* Direct color fields for direct/6 and YUV/7 memory models. */
-+      /* Offsets are bit positions of lsb in the mask. */
-+      u8  red_len;
-+      u8  red_off;
-+      u8  green_len;
-+      u8  green_off;
-+      u8  blue_len;
-+      u8  blue_off;
-+      u8  rsvd_len;
-+      u8  rsvd_off;
-+      u8  direct_color_info;  /* direct color mode attributes */
-+
-+      /* for VBE 2.0+ */
-+      u32 phys_base_ptr;
-+      u8  reserved2[6];
-+
-+      /* for VBE 3.0+ */
-+      u16 lin_bytes_per_scan_line;
-+      u8  bnk_image_pages;
-+      u8  lin_image_pages;
-+      u8  lin_red_len;
-+      u8  lin_red_off;
-+      u8  lin_green_len;
-+      u8  lin_green_off;
-+      u8  lin_blue_len;
-+      u8  lin_blue_off;
-+      u8  lin_rsvd_len;
-+      u8  lin_rsvd_off;
-+      u32 max_pixel_clock;
-+      u16 mode_id;
-+      u8  depth;
-+} __attribute__ ((packed));
-+
-+struct vesafb_pal_entry {
-+      u_char blue, green, red, pad;
-+} __attribute__ ((packed));
-+
-+struct vesafb_par {
-+      u8 *vbe_state;
-+      int vbe_state_size;
-+      atomic_t ref_count;
-+      
-+      u32 mem_total;
-+      int mode_idx;
-+      struct vesafb_crtc_ib crtc;
-+};
-+
-diff --git a/kernel/fork.c b/kernel/fork.c
-index fc723e5..dc8f93b 100644
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -100,6 +100,7 @@ struct kmem_cache *fs_cachep;
- /* SLAB cache for vm_area_struct structures */
- struct kmem_cache *vm_area_cachep;
-+EXPORT_SYMBOL_GPL(vm_area_cachep);
- /* SLAB cache for mm_struct structures (tsk->mm) */
- static struct kmem_cache *mm_cachep;
-@@ -399,6 +400,40 @@ void mmput(struct mm_struct *mm)
- EXPORT_SYMBOL_GPL(mmput);
- /**
-+ * set_new_mm - allocate, init and activate a new mm for a kernel thread
-+ */
-+int set_new_mm(void)
-+{
-+      struct mm_struct *mm;
-+      struct task_struct *tsk = current;
-+      struct mm_struct *active_mm;
-+
-+      mm = mm_alloc();
-+      if (!mm)
-+              goto fail_nomem;
-+      if (init_new_context(current,mm))
-+              goto fail_nocontext;
-+
-+      task_lock(tsk);
-+      tsk->flags |= PF_BORROWED_MM;   
-+      active_mm = tsk->active_mm;
-+      current->mm = mm;
-+      current->active_mm = mm;
-+      activate_mm(active_mm, mm);
-+      task_unlock(current);
-+
-+      /* Drop the previous active_mm */
-+      mmdrop(active_mm);
-+      return 0;
-+      
-+fail_nocontext:
-+      mmdrop(mm);
-+fail_nomem:
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL_GPL(set_new_mm);
-+
-+/**
-  * get_task_mm - acquire a reference to the task's mm
-  *
-  * Returns %NULL if the task has no mm.  Checks PF_BORROWED_MM (meaning
-diff --git a/mm/memory.c b/mm/memory.c
-index 563792f..a9519ea 100644
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -1193,6 +1193,7 @@ int zeromap_page_range(struct vm_area_struct *vma,
-       } while (pgd++, addr = next, addr != end);
-       return err;
- }
-+EXPORT_SYMBOL_GPL(zeromap_page_range);
- pte_t * fastcall get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)
- {
-diff --git a/mm/mmap.c b/mm/mmap.c
-index 9717337..6fa5b1c 100644
---- a/mm/mmap.c
-+++ b/mm/mmap.c
-@@ -2024,6 +2024,7 @@ int insert_vm_struct(struct mm_struct * mm, struct vm_area_struct * vma)
-       vma_link(mm, vma, prev, rb_link, rb_parent);
-       return 0;
- }
-+EXPORT_SYMBOL_GPL(insert_vm_struct);
- /*
-  * Copy the vma structure to a new location in the same mm,
diff --git a/meta/packages/linux/linux-rp-2.6.20/wm97xx-lcdnoise-r0.patch b/meta/packages/linux/linux-rp-2.6.20/wm97xx-lcdnoise-r0.patch
deleted file mode 100644 (file)
index 191de3a..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-Index: linux-tosa/drivers/input/touchscreen/wm9712.c
-===================================================================
---- linux-tosa.orig/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/drivers/input/touchscreen/wm9712.c      2006-08-29 16:52:50.923275896 +0100
-@@ -1,7 +1,7 @@
- /*
-  * wm9712.c  --  Codec driver for Wolfson WM9712 AC97 Codecs.
-  *
-- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC.
-  * Author: Liam Girdwood
-  *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-  * Parts Copyright : Ian Molton <spyro@f2s.com>
-@@ -13,6 +13,12 @@
-  *  Free Software Foundation;  either version 2 of the  License, or (at your
-  *  option) any later version.
-  *
-+ *  Revision history
-+ *     4th Jul 2005  Initial version.
-+ *    29th Aug 2006  Mike Arthur <mike@mikearthur.co.uk>
-+ *                   Added fixes for Sharp SL-6000 (Tosa) LCD noise causing
-+ *                   touchscreen interference.
-+ *
-  */
- #include <linux/module.h>
-@@ -28,6 +34,10 @@
- #define WM9705_VERSION                "0.60"
- #define DEFAULT_PRESSURE      0xb0c0
-+#define CCNT(a)     asm volatile ("mrc p14, 0, %0, C1, C1, 0" : "=r"(a))
-+#define CCNT_ON()   asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1))
-+#define CCNT_OFF()  asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1))
-+
- /*
-  * Debug
-  */
-@@ -243,6 +253,36 @@
-       return wm->dig[2] & WM9712_PDEN;
- }
-+
-+#ifdef CONFIG_MACH_TOSA
-+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait
-+ * before sampling the Y axis of the touchscreen */
-+static inline void wm9712_lcd_sync_on(struct wm97xx* wm, int adcsel) {
-+    unsigned long timer1 = 0, timer2 = 0, wait_time = 0;
-+    if (adcsel == WM97XX_ADCSEL_Y) {
-+        wait_time = wm97xx_calc_lcd_waittime(wm);
-+
-+        CCNT_ON();
-+
-+        if (wait_time) {
-+            /* wait for LCD rising edge */
-+            wm_machinfo->wait_hsync();
-+            /* get clock */
-+            CCNT(timer1);
-+            CCNT(timer2);
-+
-+            while ((timer2 - timer1) < wait_time) {
-+                CCNT(timer2);
-+            }
-+        }
-+    }
-+}
-+
-+static inline void wm9712_lcd_sync_off(void) {
-+    CCNT_OFF();
-+}
-+#endif
-+
- /*
-  * Read a sample from the WM9712 adc in polling mode.
-  */
-@@ -260,6 +300,9 @@
-       /* set up digitiser */
-       if (adcsel & 0x8000)
-               adcsel = ((adcsel & 0x7fff) + 3) << 12;
-+    #ifdef CONFIG_MACH_TOSA
-+    wm9712_lcd_sync_on(wm, adcsel);
-+    #endif
-       wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay));
-       
-       /* wait 3 AC97 time slots + delay for conversion */
-@@ -282,6 +325,10 @@
-       
-       *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD);
-       
-+    #ifdef CONFIG_MACH_TOSA
-+    wm9712_lcd_sync_off();
-+    #endif
-+
-       /* check we have correct sample */
-       if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) {
-               dbg ("adc wrong sample, read %x got %x", adcsel,
-@@ -303,11 +350,12 @@
- static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data)
- {
-       int rc;
--      
-       if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID)
-               return rc;
-+
-       if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID)
-               return rc;
-+
-       if (pil && !five_wire) {
-               if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID)
-                       return rc;
-Index: linux-tosa/drivers/input/touchscreen/wm97xx-core.c
-===================================================================
---- linux-tosa.orig/drivers/input/touchscreen/wm97xx-core.c    2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:50.924275744 +0100
-@@ -2,7 +2,7 @@
-  * wm97xx-core.c  --  Touch screen driver core for Wolfson WM9705, WM9712
-  *                           and WM9713 AC97 Codecs.
-  *
-- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC.
-  * Author: Liam Girdwood
-  *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-  * Parts Copyright : Ian Molton <spyro@f2s.com>
-@@ -67,6 +67,9 @@
-  *                   GPIOs) and 2.6 power management. 
-  *    29th Nov 2004  Added WM9713 support.
-  *     4th Jul 2005  Moved codec specific code out to seperate files.
-+ *    29th Aug 2006  Mike Arthur <mike@mikearthur.co.uk>
-+ *                   Added fixes for Sharp SL-6000 (Tosa) LCD noise causing
-+ *                   touchscreen interference.
-  */  
-     
- #include <linux/module.h>
-@@ -94,6 +97,7 @@
- static DECLARE_MUTEX(gpio_sem);
- static LIST_HEAD(wm97xx_misc_list);
- static struct wm97xx* wm_codec = NULL;
-+struct wm97xx_machinfo *wm_machinfo;
- /*
-  * WM97xx - enable/disable AUX ADC sysfs 
-@@ -832,6 +836,23 @@
-               mdev->remove(wm_codec);
- }
-+#ifdef CONFIG_MACH_TOSA
-+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait
-+ * before sampling the Y axis of the touchscreen */
-+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm) {
-+    unsigned long hsync_time = wm_machinfo->get_hsync_time();
-+    return hsync_time;
-+}
-+
-+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo) {
-+    wm_machinfo = machinfo;
-+}
-+
-+void wm97xx_unset_machinfo() {
-+    wm_machinfo = NULL;
-+}
-+#endif
-+
- static struct device_driver wm97xx_driver = {
-       .name =         "ac97", 
-       .bus =          &ac97_bus_type, 
-@@ -861,6 +882,9 @@
- EXPORT_SYMBOL_GPL(wm97xx_reg_write);
- EXPORT_SYMBOL_GPL(wm97xx_register_misc_dev);
- EXPORT_SYMBOL_GPL(wm97xx_unregister_misc_dev);
-+EXPORT_SYMBOL_GPL(wm97xx_calc_lcd_waittime);
-+EXPORT_SYMBOL_GPL(wm97xx_set_machinfo);
-+EXPORT_SYMBOL_GPL(wm97xx_unset_machinfo);
- module_init(wm97xx_init); 
- module_exit(wm97xx_exit);
-Index: linux-tosa/include/linux/wm97xx.h
-===================================================================
---- linux-tosa.orig/include/linux/wm97xx.h     2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/include/linux/wm97xx.h  2006-08-29 16:52:50.924275744 +0100
-@@ -207,6 +207,7 @@
- struct wm97xx;
- extern struct wm97xx_codec_drv wm97xx_codec;
-+extern struct wm97xx_machinfo *wm_machinfo;
- /*
-  * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs
-@@ -253,6 +254,11 @@
-       struct list_head list;
- };
-+struct wm97xx_machinfo {
-+    unsigned long (*get_hsync_time)(void);
-+    void (*wait_hsync)(void);
-+};
-+
- int wm97xx_register_misc_dev(struct wm97xx_misc_dev* mdev);
- void wm97xx_unregister_misc_dev(struct wm97xx_misc_dev* mdev);
-@@ -281,4 +287,9 @@
- int wm97xx_acc_startup(struct wm97xx* wm);
- void wm97xx_acc_shutdown(struct wm97xx* wm);
-+
-+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm);
-+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo);
-+void wm97xx_unset_machinfo(void);
-+
- #endif
diff --git a/meta/packages/linux/linux-rp-2.6.21/connectplus-prevent-oops-HACK.patch b/meta/packages/linux/linux-rp-2.6.21/connectplus-prevent-oops-HACK.patch
deleted file mode 100644 (file)
index b5439c6..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-Index: linux-2.6.21/drivers/net/wireless/hostap/hostap_hw.c
-===================================================================
---- linux-2.6.21.orig/drivers/net/wireless/hostap/hostap_hw.c  2007-07-07 12:45:39.000000000 +0100
-+++ linux-2.6.21/drivers/net/wireless/hostap/hostap_hw.c       2007-07-07 12:47:30.000000000 +0100
-@@ -2666,6 +2666,12 @@
-       iface = netdev_priv(dev);
-       local = iface->local;
-+      if(dev->base_addr == 0)
-+      {
-+              printk(KERN_DEBUG "%s: IRQ before base_addr set\n", dev->name);
-+              return IRQ_HANDLED;
-+      }
-+
-       prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0);
-       if (local->func->card_present && !local->func->card_present(local)) {
diff --git a/meta/packages/linux/linux-rp-2.6.21/connectplus-remove-ide-HACK.patch b/meta/packages/linux/linux-rp-2.6.21/connectplus-remove-ide-HACK.patch
deleted file mode 100644 (file)
index 4414b21..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Index: linux-2.6.13/drivers/ide/legacy/ide-cs.c
-===================================================================
---- linux-2.6.13.orig/drivers/ide/legacy/ide-cs.c      2005-09-01 22:43:46.000000000 +0100
-+++ linux-2.6.13/drivers/ide/legacy/ide-cs.c   2005-09-01 22:45:46.000000000 +0100
-@@ -488,7 +488,6 @@
-       PCMCIA_DEVICE_PROD_ID123("KODAK Picture Card       ", "KODAK  ", "V100K", 0x94a0d8f3, 0xe4fc3ea0, 0xe5e7eed4),
-       PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
-       PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
--      PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
-       PCMCIA_DEVICE_NULL,
- };
- MODULE_DEVICE_TABLE(pcmcia, ide_ids);
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-akita b/meta/packages/linux/linux-rp-2.6.21/defconfig-akita
deleted file mode 100644 (file)
index cc4cc78..0000000
+++ /dev/null
@@ -1,1744 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20
-# Thu Mar 29 12:24:24 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_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_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_SYSFS_DEPRECATED=y
-# CONFIG_RELAY is not set
-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_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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL=y
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-# CONFIG_PXA_SHARPSL_25x is not set
-CONFIG_PXA_SHARPSL_27x=y
-CONFIG_MACH_AKITA=y
-CONFIG_MACH_SPITZ=y
-CONFIG_MACH_BORZOI=y
-CONFIG_PXA27x=y
-CONFIG_PXA_SHARP_Cxx00=y
-CONFIG_PXA_SSP=y
-# CONFIG_PXA_KEYS 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_XSCALE_PMU=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2  fbcon=rotate:1 dyntick=enable quiet"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=y
-
-#
-# 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=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=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_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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Dongle support
-#
-
-#
-# 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=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_KEYBOARD_CORGI is not set
-CONFIG_KEYBOARD_SPITZ=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_SPITZ=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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_S1D13XXX is not set
-CONFIG_FB_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-# CONFIG_FB_PXA_OVERLAY is not set
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX is not set
-# CONFIG_FB_W100 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=y
-CONFIG_FONTS=y
-# CONFIG_FONT_8x8 is not set
-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
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 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_CORGI=y
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# PCMCIA devices
-#
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_PDAUDIOCF is not set
-
-#
-# SoC audio support
-#
-CONFIG_SND_SOC=m
-
-
-#
-# Soc Platforms
-#
-CONFIG_SND_PXA2xx_SOC=m
-CONFIG_SND_PXA2xx_SOC_I2S=m
-CONFIG_SND_PXA2xx_SOC_SPITZ=m
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2XX_SOC=m
-CONFIG_SND_PXA2XX_SOC_I2S=m
-CONFIG_SND_PXA2XX_SOC_SPITZ=m
-# CONFIG_SND_PXA2XX_SOC_MAGICIAN is not set
-
-#
-# SoC Audio for the Atmel AT91
-#
-
-#
-# SoC Audio for the Freescale i.MX
-#
-
-#
-# SoC Audio for the Samsung S3C24XX
-#
-
-#
-# Soc Codecs
-#
-# 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=m
-# 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_WM9713 is not set
-# CONFIG_SND_SOC_WM9712 is not set
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 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=y
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# 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_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-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 is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 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=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=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_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X 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
-
-#
-# 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
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_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 is not set
-# CONFIG_EXT4DEV_FS is not set
-CONFIG_JBD=m
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-# 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=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_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_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_SCHEDSTATS is not set
-CONFIG_TIMER_STATS=y
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-CONFIG_SHARPSL_RC=m
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-bootcdx86 b/meta/packages/linux/linux-rp-2.6.21/defconfig-bootcdx86
deleted file mode 100644 (file)
index d439d89..0000000
+++ /dev/null
@@ -1,1606 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21
-# Mon Jun 11 12:01:43 2007
-#
-CONFIG_X86_32=y
-CONFIG_GENERIC_TIME=y
-CONFIG_CLOCKSOURCE_WATCHDOG=y
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_X86=y
-CONFIG_MMU=y
-CONFIG_ZONE_DMA=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_GENERIC_BUG=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=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 is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_UTS_NS is not set
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-# CONFIG_SYSFS_DEPRECATED is not set
-# CONFIG_RELAY is not set
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-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=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 is not set
-# 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 is not set
-# CONFIG_IOSCHED_DEADLINE is not set
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_DEADLINE is not set
-CONFIG_DEFAULT_CFQ=y
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="cfq"
-
-#
-# Processor type and features
-#
-CONFIG_TICK_ONESHOT=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_SMP=y
-CONFIG_X86_PC=y
-# CONFIG_X86_ELAN is not set
-# CONFIG_X86_VOYAGER is not set
-# CONFIG_X86_NUMAQ is not set
-# CONFIG_X86_SUMMIT is not set
-# CONFIG_X86_BIGSMP is not set
-# CONFIG_X86_VISWS is not set
-# CONFIG_X86_GENERICARCH is not set
-# CONFIG_X86_ES7000 is not set
-# CONFIG_PARAVIRT is not set
-# CONFIG_M386 is not set
-# CONFIG_M486 is not set
-# CONFIG_M586 is not set
-# CONFIG_M586TSC is not set
-# CONFIG_M586MMX is not set
-# CONFIG_M686 is not set
-CONFIG_MPENTIUMII=y
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUMM is not set
-# CONFIG_MCORE2 is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK6 is not set
-# CONFIG_MK7 is not set
-# CONFIG_MK8 is not set
-# CONFIG_MCRUSOE is not set
-# CONFIG_MEFFICEON is not set
-# CONFIG_MWINCHIPC6 is not set
-# CONFIG_MWINCHIP2 is not set
-# CONFIG_MWINCHIP3D is not set
-# CONFIG_MGEODEGX1 is not set
-# CONFIG_MGEODE_LX is not set
-# CONFIG_MCYRIXIII is not set
-# CONFIG_MVIAC3_2 is not set
-CONFIG_X86_GENERIC=y
-CONFIG_X86_CMPXCHG=y
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_WP_WORKS_OK=y
-CONFIG_X86_INVLPG=y
-CONFIG_X86_BSWAP=y
-CONFIG_X86_POPAD_OK=y
-CONFIG_X86_CMPXCHG64=y
-CONFIG_X86_GOOD_APIC=y
-CONFIG_X86_INTEL_USERCOPY=y
-CONFIG_X86_USE_PPRO_CHECKSUM=y
-CONFIG_X86_TSC=y
-CONFIG_HPET_TIMER=y
-CONFIG_NR_CPUS=8
-CONFIG_SCHED_SMT=y
-CONFIG_SCHED_MC=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_X86_IO_APIC=y
-CONFIG_X86_MCE=y
-CONFIG_X86_MCE_NONFATAL=y
-CONFIG_X86_MCE_P4THERMAL=y
-CONFIG_VM86=y
-# CONFIG_TOSHIBA is not set
-# CONFIG_I8K is not set
-# CONFIG_X86_REBOOTFIXUPS is not set
-# CONFIG_MICROCODE is not set
-# CONFIG_X86_MSR is not set
-# CONFIG_X86_CPUID is not set
-
-#
-# Firmware Drivers
-#
-# CONFIG_EDD is not set
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-CONFIG_NOHIGHMEM=y
-# CONFIG_HIGHMEM4G is not set
-# CONFIG_HIGHMEM64G is not set
-CONFIG_VMSPLIT_3G=y
-# CONFIG_VMSPLIT_3G_OPT is not set
-# CONFIG_VMSPLIT_2G is not set
-# CONFIG_VMSPLIT_1G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_POPULATES_NODE_MAP=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=y
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_RESOURCES_64BIT is not set
-CONFIG_ZONE_DMA_FLAG=1
-# CONFIG_MATH_EMULATION is not set
-CONFIG_MTRR=y
-# CONFIG_EFI is not set
-CONFIG_IRQBALANCE=y
-CONFIG_SECCOMP=y
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_300 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-# CONFIG_KEXEC is not set
-CONFIG_PHYSICAL_START=0x100000
-# CONFIG_RELOCATABLE is not set
-CONFIG_PHYSICAL_ALIGN=0x100000
-# CONFIG_HOTPLUG_CPU is not set
-# CONFIG_COMPAT_VDSO is not set
-
-#
-# Power management options (ACPI, APM)
-#
-CONFIG_PM=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_PROCFS=y
-CONFIG_ACPI_AC=y
-CONFIG_ACPI_BATTERY=y
-CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_FAN=y
-# CONFIG_ACPI_DOCK is not set
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_THERMAL=y
-# CONFIG_ACPI_ASUS is not set
-# CONFIG_ACPI_IBM is not set
-# CONFIG_ACPI_TOSHIBA is not set
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_X86_PM_TIMER=y
-# CONFIG_ACPI_CONTAINER is not set
-
-#
-# APM (Advanced Power Management) BIOS Support
-#
-# CONFIG_APM is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-#
-CONFIG_PCI=y
-# CONFIG_PCI_GOBIOS is not set
-# CONFIG_PCI_GOMMCONFIG is not set
-# CONFIG_PCI_GODIRECT is not set
-CONFIG_PCI_GOANY=y
-CONFIG_PCI_BIOS=y
-CONFIG_PCI_DIRECT=y
-CONFIG_PCI_MMCONFIG=y
-CONFIG_PCIEPORTBUS=y
-CONFIG_PCIEAER=y
-CONFIG_PCI_MSI=y
-CONFIG_HT_IRQ=y
-CONFIG_ISA_DMA_API=y
-CONFIG_ISA=y
-# CONFIG_EISA is not set
-# CONFIG_MCA is not set
-# CONFIG_SCx200 is not set
-CONFIG_K8_NB=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_AOUT is not set
-# CONFIG_BINFMT_MISC 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=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 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=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 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
-# 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_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-# CONFIG_ISAPNP is not set
-# CONFIG_PNPBIOS is not set
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_XD 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
-# 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_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=65536
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# Misc devices
-#
-# CONFIG_IBM_ASM is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_TIFM_CORE is not set
-# CONFIG_SONY_LAPTOP is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-# CONFIG_IDE is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-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=y
-# 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
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_7000FASST is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 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_AIC94XX is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH 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_STEX is not set
-# CONFIG_SCSI_SYM53C8XX_2 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_1280 is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_SEAGATE 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_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_SRP is not set
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA 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
-# 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
-
-#
-# Macintosh device drivers
-#
-# CONFIG_MAC_EMUMOUSEBTN 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
-# 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_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-CONFIG_NET_VENDOR_3COM=y
-# CONFIG_EL1 is not set
-# CONFIG_EL2 is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_EL16 is not set
-# CONFIG_EL3 is not set
-# CONFIG_3C515 is not set
-CONFIG_VORTEX=m
-CONFIG_TYPHOON=m
-CONFIG_LANCE=m
-CONFIG_NET_VENDOR_SMC=y
-CONFIG_WD80x3=m
-CONFIG_ULTRA=m
-CONFIG_SMC9194=m
-# CONFIG_NET_VENDOR_RACAL is not set
-
-#
-# Tulip family network device support
-#
-CONFIG_NET_TULIP=y
-# CONFIG_DE2104X is not set
-CONFIG_TULIP=m
-CONFIG_TULIP_MWI=y
-CONFIG_TULIP_MMIO=y
-CONFIG_TULIP_NAPI=y
-CONFIG_TULIP_NAPI_HW_MITIGATION=y
-CONFIG_DE4X5=m
-CONFIG_WINBOND_840=m
-CONFIG_DM9102=m
-CONFIG_ULI526X=m
-CONFIG_AT1700=m
-CONFIG_DEPCA=m
-CONFIG_HP100=m
-CONFIG_NET_ISA=y
-# CONFIG_E2100 is not set
-# CONFIG_EWRK3 is not set
-# CONFIG_EEXPRESS is not set
-# CONFIG_EEXPRESS_PRO is not set
-# CONFIG_HPLAN_PLUS is not set
-# CONFIG_HPLAN is not set
-# CONFIG_LP486E is not set
-# CONFIG_ETH16I is not set
-CONFIG_NE2000=y
-# CONFIG_ZNET is not set
-# CONFIG_SEEQ8005 is not set
-CONFIG_NET_PCI=y
-CONFIG_PCNET32=m
-CONFIG_PCNET32_NAPI=y
-CONFIG_AMD8111_ETH=m
-CONFIG_AMD8111E_NAPI=y
-CONFIG_ADAPTEC_STARFIRE=m
-CONFIG_ADAPTEC_STARFIRE_NAPI=y
-CONFIG_AC3200=m
-CONFIG_APRICOT=m
-CONFIG_B44=m
-CONFIG_FORCEDETH=m
-CONFIG_FORCEDETH_NAPI=y
-CONFIG_CS89x0=m
-CONFIG_DGRS=m
-CONFIG_EEPRO100=m
-CONFIG_E100=m
-CONFIG_FEALNX=m
-CONFIG_NATSEMI=m
-CONFIG_NE2K_PCI=y
-CONFIG_8139CP=m
-CONFIG_8139TOO=m
-CONFIG_8139TOO_PIO=y
-CONFIG_8139TOO_TUNE_TWISTER=y
-CONFIG_8139TOO_8129=y
-# CONFIG_8139_OLD_RX_RESET is not set
-CONFIG_SIS900=m
-CONFIG_EPIC100=m
-CONFIG_SUNDANCE=m
-CONFIG_SUNDANCE_MMIO=y
-CONFIG_TLAN=m
-CONFIG_VIA_RHINE=m
-CONFIG_VIA_RHINE_MMIO=y
-CONFIG_VIA_RHINE_NAPI=y
-CONFIG_SC92031=m
-
-#
-# Ethernet (1000 Mbit)
-#
-CONFIG_ACENIC=m
-CONFIG_ACENIC_OMIT_TIGON_I=y
-CONFIG_DL2K=m
-CONFIG_E1000=m
-CONFIG_E1000_NAPI=y
-# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-CONFIG_NS83820=m
-CONFIG_HAMACHI=m
-CONFIG_YELLOWFIN=m
-CONFIG_R8169=m
-CONFIG_R8169_NAPI=y
-CONFIG_SIS190=m
-CONFIG_SKGE=m
-CONFIG_SKY2=m
-CONFIG_SK98LIN=m
-CONFIG_VIA_VELOCITY=m
-CONFIG_TIGON3=m
-CONFIG_BNX2=m
-CONFIG_QLA3XXX=m
-CONFIG_ATL1=m
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NETXEN_NIC 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_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
-# CONFIG_INPUT_FF_MEMLESS is not set
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# 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=y
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_POWER is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-# 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
-# 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 is not set
-CONFIG_SERIAL_8250_PCI=y
-CONFIG_SERIAL_8250_PNP=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_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_HW_RANDOM is not set
-# CONFIG_NVRAM 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
-# CONFIG_SONYPI is not set
-CONFIG_AGP=m
-CONFIG_AGP_ALI=m
-CONFIG_AGP_ATI=m
-CONFIG_AGP_AMD=m
-CONFIG_AGP_AMD64=m
-CONFIG_AGP_INTEL=m
-CONFIG_AGP_NVIDIA=m
-CONFIG_AGP_SIS=m
-CONFIG_AGP_SWORKS=m
-CONFIG_AGP_VIA=m
-CONFIG_AGP_EFFICEON=m
-# CONFIG_DRM is not set
-# CONFIG_DRM_I830 is not set
-# CONFIG_DRM_I915 is not set
-# CONFIG_MWAVE is not set
-# CONFIG_PC8736x_GPIO is not set
-# CONFIG_NSC_GPIO is not set
-# CONFIG_CS5535_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER 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 is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Multifunction device drivers
-#
-# CONFIG_MFD_SM501 is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-# CONFIG_BACKLIGHT_LCD_SUPPORT 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=y
-# CONFIG_FB_TILEBLITTING is not set
-
-#
-# Frame buffer hardware drivers
-#
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-CONFIG_FB_VGA16=y
-CONFIG_FB_VESA=y
-# CONFIG_FB_VESA_STD is not set
-CONFIG_FB_VESA_TNG=y
-CONFIG_FB_VESA_DEFAULT_MODE="640x480-16@60"
-CONFIG_VIDEO_SELECT=y
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_I810 is not set
-# CONFIG_FB_INTEL is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_S3 is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# 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_GEODE is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-CONFIG_FONTS=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
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_SEQUENCER=y
-# CONFIG_SND_SEQ_DUMMY 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_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=y
-# 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
-
-#
-# ISA devices
-#
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_WAVEFRONT is not set
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-CONFIG_SND_INTEL8X0=y
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-CONFIG_SND_AC97_POWER_SAVE=y
-
-#
-# USB devices
-#
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_USX2Y 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=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_DYNAMIC_MINORS is not set
-CONFIG_USB_SUSPEND=y
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_EHCI_SPLIT_ISO=y
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_EHCI_BIG_ENDIAN_MMIO is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# 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_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_WACOM=y
-# 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
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_USBNET_MII is not set
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_MON is not set
-
-#
-# 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_SISUSBVGA is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_IOWARRIOR 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)
-#
-# CONFIG_EDAC is not set
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# Auxiliary Display support
-#
-
-#
-# Virtualization
-#
-# CONFIG_KVM 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=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS 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_PROC_SYSCTL=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_TMPFS_POSIX_ACL is not set
-# 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_SQUASHFS 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=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 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=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
-
-#
-# Instrumentation Support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# 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_LOG_BUF_SHIFT=15
-# CONFIG_DEBUG_BUGVERBOSE is not set
-CONFIG_EARLY_PRINTK=y
-CONFIG_X86_FIND_SMP_CONFIG=y
-CONFIG_X86_MPPARSE=y
-CONFIG_DOUBLEFAULT=y
-
-#
-# 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=m
-# 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_TWOFISH_586 is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_AES_586 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_LZO 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
-#
-CONFIG_CRYPTO_DEV_PADLOCK=m
-CONFIG_CRYPTO_DEV_PADLOCK_AES=m
-CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
-CONFIG_CRYPTO_DEV_GEODE=m
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_AUDIT_GENERIC=y
-# CONFIG_LZO is not set
-CONFIG_ZLIB_INFLATE=m
-CONFIG_PLIST=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_X86_SMP=y
-CONFIG_X86_HT=y
-CONFIG_X86_BIOS_REBOOT=y
-CONFIG_X86_TRAMPOLINE=y
-CONFIG_KTIME_SCALAR=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-c7x0 b/meta/packages/linux/linux-rp-2.6.21/defconfig-c7x0
deleted file mode 100644 (file)
index 1ff275c..0000000
+++ /dev/null
@@ -1,1787 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20
-# Thu Mar 29 13:32:11 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_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_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_SYSFS_DEPRECATED=y
-# CONFIG_RELAY is not set
-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_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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL=y
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-# CONFIG_MACH_POODLE is not set
-CONFIG_MACH_CORGI=y
-CONFIG_MACH_SHEPHERD=y
-CONFIG_MACH_HUSKY=y
-# CONFIG_MACH_TOSA is not set
-CONFIG_PXA25x=y
-CONFIG_PXA_SHARP_C7xx=y
-CONFIG_PXA_SSP=y
-# CONFIG_PXA_KEYS 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_XSCALE_PMU=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable quiet"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_CPU_FREQ_PXA25x=y
-CONFIG_KEXEC=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 is not set
-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=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=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=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-# 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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Dongle support
-#
-
-#
-# 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=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_KEYBOARD_CORGI=y
-# CONFIG_KEYBOARD_SPITZ is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# 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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_CORGI=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT 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_VIVI is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_USBVISION is not set
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-CONFIG_USB_DSBR=m
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-# CONFIG_FB_DDC is not set
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_MBX is not set
-CONFIG_FB_W100=y
-# 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 is not set
-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
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-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
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# 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 Intel PXA2xx
-#
-CONFIG_SND_PXA2XX_SOC=m
-CONFIG_SND_PXA2XX_SOC_I2S=m
-CONFIG_SND_PXA2XX_SOC_CORGI=m
-# CONFIG_SND_PXA2XX_SOC_MAGICIAN is not set
-
-#
-# SoC Audio for the Atmel AT91
-#
-
-#
-# SoC Audio for the Freescale i.MX
-#
-
-#
-# SoC Audio for the Samsung S3C24XX
-#
-
-#
-# Soc Codecs
-#
-# 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=m
-# 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_WM9713 is not set
-# CONFIG_SND_SOC_WM9712 is not set
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 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=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# 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_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-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 is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 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=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=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_LH7A40X 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
-
-#
-# 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
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_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 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=y
-# 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=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_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_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-CONFIG_TIMER_STATS=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-collie b/meta/packages/linux/linux-rp-2.6.21/defconfig-collie
deleted file mode 100644 (file)
index 422ed94..0000000
+++ /dev/null
@@ -1,1739 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20.4
-# Fri Apr  6 23:20:59 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_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_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_SYSFS_DEPRECATED is not set
-# CONFIG_RELAY is not set
-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_ALL is not set
-# 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=m
-CONFIG_IOSCHED_CFQ=m
-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 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
-
-#
-# SA11x0 Implementations
-#
-# CONFIG_SA1100_ASSABET is not set
-# CONFIG_SA1100_CERF is not set
-CONFIG_SA1100_COLLIE=y
-# 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_JORNADA720 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
-
-#
-# 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_SHARP_LOCOMO=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-CONFIG_ISA=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
-
-#
-# PC-card bridges
-#
-# CONFIG_I82365 is not set
-# CONFIG_TCIC is not set
-CONFIG_PCMCIA_SA1100=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-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_LEDS is not set
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=y
-
-#
-# 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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=m
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-# 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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Old Serial dongle support
-#
-
-#
-# FIR device drivers
-#
-CONFIG_USB_IRDA=m
-# CONFIG_SIGMATEL_FIR is not set
-CONFIG_SA1100_FIR=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=m
-CONFIG_BT_HCIBT3C=m
-CONFIG_BT_HCIBLUECARD=m
-CONFIG_BT_HCIBTUART=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_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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS 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=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=y
-# CONFIG_MTD_ABSENT is not set
-CONFIG_MTD_OBSOLETE_CHIPS=y
-CONFIG_MTD_SHARP=y
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SA1100=y
-# 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_PNP 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_UB 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=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 is not set
-CONFIG_BLK_DEV_IDEDISK=m
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECS=m
-# 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 is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-# 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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# 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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_NET_VENDOR_SMC is not set
-# CONFIG_SMC91X is not set
-# CONFIG_DM9000 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_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 is not set
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-# CONFIG_STRIP is not set
-# CONFIG_ARLAN is not set
-# CONFIG_WAVELAN is not set
-# 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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_LOCOMO=y
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY 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_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_SA1100=y
-CONFIG_SERIAL_SA1100_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=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_ELEKTOR 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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-CONFIG_SPI=y
-# CONFIG_SPI_DEBUG is not set
-CONFIG_SPI_MASTER=y
-
-#
-# SPI Master Controller Drivers
-#
-# CONFIG_SPI_BITBANG is not set
-CONFIG_SPI_LOCOMO=m
-
-#
-# SPI Protocol Masters
-#
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multimedia Capabilities Port drivers
-#
-CONFIG_MCP=y
-CONFIG_MCP_SA11X0=y
-CONFIG_MCP_UCB1200=y
-CONFIG_MCP_UCB1200_TS=m
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=m
-
-#
-# LED drivers
-#
-CONFIG_LEDS_LOCOMO=m
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=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_VIVI is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_USBVISION is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_USB_DSBR is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-CONFIG_FB_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_SA1100=y
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=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
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-CONFIG_BACKLIGHT_LOCOMO=y
-
-#
-# 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=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-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
-#
-
-#
-# 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
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# 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=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-CONFIG_USB_USBNET_MII=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-CONFIG_USB_NET_CDC_SUBSET=m
-# CONFIG_USB_ALI_M5632 is not set
-# CONFIG_USB_AN2720 is not set
-CONFIG_USB_BELKIN=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_EPSON2888 is not set
-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 is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
-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 is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-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_LED is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGET is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-# 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_LH7A40X 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=m
-CONFIG_MMC_DEBUG=y
-CONFIG_MMC_BLOCK=m
-# CONFIG_MMC_TIFM_SD is not set
-CONFIG_MMC_SPI=m
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-CONFIG_RTC_DRV_SA1100=y
-# 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=m
-# 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=m
-
-#
-# 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_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 is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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=m
-
-#
-# 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=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK 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 is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=m
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=m
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=m
-CONFIG_CRC16=m
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-hx2000 b/meta/packages/linux/linux-rp-2.6.21/defconfig-hx2000
deleted file mode 100644 (file)
index b962caa..0000000
+++ /dev/null
@@ -1,1166 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc2
-# Mon Jan  1 01:49:04 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_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-# CONFIG_SWAP is not set
-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=""
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_SYSCTL=y
-CONFIG_EMBEDDED=y
-CONFIG_UID16=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODVERSIONS 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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL is not set
-# CONFIG_MACH_TRIZEPS4 is not set
-CONFIG_MACH_HX2750=y
-CONFIG_PXA27x=y
-CONFIG_PXA_SSP=y
-CONFIG_PXA_KEYS=y
-
-#
-# 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_XSCALE_PMU=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable debug"
-# 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 is not set
-# CONFIG_BINFMT_MISC is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-CONFIG_PM_DEBUG=y
-# CONFIG_DISABLE_CONSOLE_SUSPEND is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=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=y
-# 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 is not set
-# CONFIG_BT is not set
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-# CONFIG_IEEE80211_CRYPT_CCMP is not set
-# CONFIG_IEEE80211_CRYPT_TKIP is not set
-# CONFIG_IEEE80211_SOFTMAC is not set
-CONFIG_WIRELESS_EXT=y
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-# CONFIG_PREVENT_FIRMWARE_BUILD is not set
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_CONCAT=y
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_SSFDC is not set
-
-#
-# RAM/ROM/Flash chip drivers
-#
-CONFIG_MTD_CFI=y
-# CONFIG_MTD_JEDECPROBE 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_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 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=8192
-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=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_IDEDMA_AUTO is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_NETLINK is not set
-
-#
-# 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 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# 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_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD 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_UCB1400 is not set
-CONFIG_TOUCHSCREEN_TSC2101=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-CONFIG_MFD_TSC2101=y
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# 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_S1D13XXX is not set
-CONFIG_FB_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-# CONFIG_FB_PXA_OVERLAY is not set
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX 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
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 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_HX2750=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# HID Devices
-#
-CONFIG_HID=y
-
-#
-# 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 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
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-# CONFIG_RTC_DEBUG is not set
-
-#
-# RTC interfaces
-#
-CONFIG_RTC_INTF_SYSFS=y
-CONFIG_RTC_INTF_PROC=y
-CONFIG_RTC_INTF_DEV=y
-# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_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=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_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_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_SUMMARY is not set
-# CONFIG_JFFS2_FS_XATTR is not set
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=y
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="cp437"
-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 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=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_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-CONFIG_TIMER_STATS=y
-# CONFIG_SCHEDSTATS 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 is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-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=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 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 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=y
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-CONFIG_CRYPTO_CRC32C=y
-# 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=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-poodle b/meta/packages/linux/linux-rp-2.6.21/defconfig-poodle
deleted file mode 100644 (file)
index fa7b83d..0000000
+++ /dev/null
@@ -1,1657 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Mon Jul 10 23:38:56 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=y
-CONFIG_VECTORS_BASE=0xffff0000
-
-#
-# 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 is not set
-# 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=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_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_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_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX 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_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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 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_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-CONFIG_MACH_POODLE=y
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-# CONFIG_MACH_TOSA is not set
-CONFIG_PXA25x=y
-# CONFIG_PXA_KEYS is not set
-CONFIG_PXA_SSP=y
-
-#
-# 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_LOCOMO=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2  fbcon=rotate:1 dyntick=enable debug"
-# CONFIG_XIP_KERNEL 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 is not set
-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=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-CONFIG_CPU_FREQ_PXA25x=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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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_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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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_H323 is not set
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# 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_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_LOCOMO=y
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_CORGI is not set
-# CONFIG_KEYBOARD_SPITZ is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# 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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_LOCOMO=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# 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_VIVI is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-
-#
-# Encoders and Decoders
-#
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_EM28XX is not set
-CONFIG_USB_DSBR=m
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-# CONFIG_USB_ET61X251 is not set
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-CONFIG_FB_PXA=y
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_W100 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=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=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-# CONFIG_LOGO_OHAND_CLUT224 is not set
-CONFIG_LOGO_OZ240_CLUT224=y
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-# CONFIG_BACKLIGHT_CORGI is not set
-CONFIG_BACKLIGHT_LOCOMO=y
-
-#
-# 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=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
-
-#
-# 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=m
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8731 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8974 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_MAINSTONE_BASEBAND is not set
-# CONFIG_SND_MAINSTONE_BLUETOOTH is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-# CONFIG_SND_PXA2xx_SOC_CORGI is not set
-# CONFIG_SND_PXA2xx_SOC_SPITZ is not set
-CONFIG_SND_PXA2xx_SOC_POODLE=m
-# CONFIG_SND_PXA2xx_SOC_TOSA is not set
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC is not set
-CONFIG_SND_SOC_WM8731=m
-# 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_WM8974 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 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-# CONFIG_USB_ARCH_HAS_OHCI 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=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Network Adapters
-#
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_USB_NET_ZAURUS=m
-# 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 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_NAVMAN is not set
-CONFIG_USB_SERIAL_PL2303=m
-# CONFIG_USB_SERIAL_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST 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_LH7A40X 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-
-#
-# 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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 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
-
-#
-# 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_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 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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-CONFIG_TIMER_STATS=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT 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_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-qemuarm b/meta/packages/linux/linux-rp-2.6.21/defconfig-qemuarm
deleted file mode 100644 (file)
index 35cf3f5..0000000
+++ /dev/null
@@ -1,1194 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Sat Aug 26 22:45:02 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_VECTORS_BASE=0xffff0000
-
-#
-# 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 is not set
-# 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=y
-# 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=y
-
-#
-# 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_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-CONFIG_DEFAULT_AS=y
-# CONFIG_DEFAULT_DEADLINE is not set
-# CONFIG_DEFAULT_CFQ is not set
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="anticipatory"
-
-#
-# System Type
-#
-# CONFIG_ARCH_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_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX 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_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_OMAP is not set
-CONFIG_ARCH_VERSATILE=y
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# Versatile platform type
-#
-CONFIG_ARCH_VERSATILE_PB=y
-# CONFIG_MACH_VERSATILE_AB is not set
-
-#
-# Processor Type
-#
-CONFIG_CPU_32=y
-CONFIG_CPU_ARM926T=y
-CONFIG_CPU_32v5=y
-CONFIG_CPU_ABRT_EV5TJ=y
-CONFIG_CPU_CACHE_VIVT=y
-CONFIG_CPU_COPY_V4WB=y
-CONFIG_CPU_TLB_V4WBI=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_CPU_CACHE_ROUND_ROBIN is not set
-# CONFIG_KEXEC is not set
-CONFIG_ARM_VIC=y
-CONFIG_ICST307=y
-
-#
-# Bus support
-#
-CONFIG_ARM_AMBA=y
-CONFIG_PCI=y
-# CONFIG_PCI_DEBUG is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-
-#
-# Kernel Features
-#
-# CONFIG_PREEMPT is not set
-# CONFIG_NO_IDLE_HZ is not set
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_LEDS=y
-CONFIG_LEDS_TIMER=y
-CONFIG_LEDS_CPU=y
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable debug"
-# CONFIG_XIP_KERNEL is not set
-
-#
-# Floating point emulation
-#
-
-#
-# At least one emulation must be selected
-#
-CONFIG_FPE_NWFPE=y
-# CONFIG_FPE_NWFPE_XP is not set
-# CONFIG_FPE_FASTFPE is not set
-CONFIG_VFP=y
-
-#
-# Userspace binary formats
-#
-CONFIG_BINFMT_ELF=y
-# CONFIG_BINFMT_AOUT is not set
-# CONFIG_BINFMT_MISC is not set
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_APM 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_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 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_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 is not set
-# CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_AFS_PARTS=y
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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 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_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
-
-#
-# 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_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 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_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=51200
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH 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 is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-
-#
-# SCSI Transport Attributes
-#
-CONFIG_SCSI_SPI_ATTRS=y
-# 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=y
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-# 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=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-CONFIG_SMC91X=y
-# CONFIG_DM9000 is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_PCI 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_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_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
-
-#
-# 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=y
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_POWER 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=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL 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 is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-# CONFIG_SERIO_SERPORT is not set
-CONFIG_SERIO_AMBAKMI=y
-# 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
-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_AMBA_PL011=y
-CONFIG_SERIAL_AMBA_PL011_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_NVRAM 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
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-# CONFIG_LEDS_CLASS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-# CONFIG_LEDS_TRIGGERS is not set
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB 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=y
-CONFIG_FB_TILEBLITTING=y
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-CONFIG_FB_ARMCLCD=y
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT 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 is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-# CONFIG_USB_DEVICEFS is not set
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_EHCI_HCD 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 is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-
-#
-# 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=y
-# 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_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_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_LD is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-
-#
-# MMC/SD Card support
-#
-# CONFIG_MMC is not set
-
-#
-# Real Time Clock
-#
-CONFIG_RTC_LIB=y
-CONFIG_RTC_CLASS=y
-CONFIG_RTC_HCTOSYS=y
-CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
-
-#
-# 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_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 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_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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS 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_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=y
-# CONFIG_SQUASHFS 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 is not set
-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=y
-# 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 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-CONFIG_TIMER_STATS=y
-# 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_BUGVERBOSE=y
-CONFIG_DEBUG_INFO=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-qemux86 b/meta/packages/linux/linux-rp-2.6.21/defconfig-qemux86
deleted file mode 100644 (file)
index 0d26596..0000000
+++ /dev/null
@@ -1,1568 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Mon Oct 16 19:42:42 2006
-#
-CONFIG_X86_32=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_X86=y
-CONFIG_MMU=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=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 is not set
-CONFIG_SYSCTL=y
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-# CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
-CONFIG_UID16=y
-CONFIG_VM86=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 is not set
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-CONFIG_LBD=y
-# 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"
-
-#
-# Processor type and features
-#
-CONFIG_SMP=y
-CONFIG_X86_PC=y
-# CONFIG_X86_ELAN is not set
-# CONFIG_X86_VOYAGER is not set
-# CONFIG_X86_NUMAQ is not set
-# CONFIG_X86_SUMMIT is not set
-# CONFIG_X86_BIGSMP is not set
-# CONFIG_X86_VISWS is not set
-# CONFIG_X86_GENERICARCH is not set
-# CONFIG_X86_ES7000 is not set
-CONFIG_M386=y
-# CONFIG_M486 is not set
-# CONFIG_M586 is not set
-# CONFIG_M586TSC is not set
-# CONFIG_M586MMX is not set
-# CONFIG_M686 is not set
-# CONFIG_MPENTIUMII is not set
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUMM is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK6 is not set
-# CONFIG_MK7 is not set
-# CONFIG_MK8 is not set
-# CONFIG_MCRUSOE is not set
-# CONFIG_MEFFICEON is not set
-# CONFIG_MWINCHIPC6 is not set
-# CONFIG_MWINCHIP2 is not set
-# CONFIG_MWINCHIP3D is not set
-# CONFIG_MGEODEGX1 is not set
-# CONFIG_MGEODE_LX is not set
-# CONFIG_MCYRIXIII is not set
-# CONFIG_MVIAC3_2 is not set
-CONFIG_X86_GENERIC=y
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_PPRO_FENCE=y
-CONFIG_X86_F00F_BUG=y
-CONFIG_X86_INTEL_USERCOPY=y
-# CONFIG_HPET_TIMER is not set
-CONFIG_NR_CPUS=8
-CONFIG_SCHED_SMT=y
-CONFIG_SCHED_MC=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_X86_IO_APIC=y
-CONFIG_X86_MCE=y
-CONFIG_X86_MCE_NONFATAL=y
-CONFIG_X86_MCE_P4THERMAL=y
-# CONFIG_TOSHIBA is not set
-# CONFIG_I8K is not set
-# CONFIG_X86_REBOOTFIXUPS is not set
-# CONFIG_MICROCODE is not set
-# CONFIG_X86_MSR is not set
-# CONFIG_X86_CPUID is not set
-
-#
-# Firmware Drivers
-#
-# CONFIG_EDD is not set
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-CONFIG_NOHIGHMEM=y
-# CONFIG_HIGHMEM4G is not set
-# CONFIG_HIGHMEM64G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=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=y
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_MATH_EMULATION is not set
-CONFIG_MTRR=y
-# CONFIG_EFI is not set
-CONFIG_IRQBALANCE=y
-# CONFIG_REGPARM is not set
-CONFIG_SECCOMP=y
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-# CONFIG_KEXEC is not set
-CONFIG_PHYSICAL_START=0x100000
-# CONFIG_HOTPLUG_CPU is not set
-
-#
-# Power management options (ACPI, APM)
-#
-CONFIG_PM=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_AC=y
-CONFIG_ACPI_BATTERY=y
-CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_VIDEO=m
-# CONFIG_ACPI_HOTKEY is not set
-CONFIG_ACPI_FAN=y
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_THERMAL=y
-# CONFIG_ACPI_ASUS is not set
-CONFIG_ACPI_IBM=m
-# CONFIG_ACPI_IBM_DOCK is not set
-# CONFIG_ACPI_TOSHIBA is not set
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_X86_PM_TIMER=y
-# CONFIG_ACPI_CONTAINER is not set
-
-#
-# APM (Advanced Power Management) BIOS Support
-#
-# CONFIG_APM is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-#
-CONFIG_PCI=y
-# CONFIG_PCI_GOBIOS is not set
-# CONFIG_PCI_GOMMCONFIG is not set
-# CONFIG_PCI_GODIRECT is not set
-CONFIG_PCI_GOANY=y
-CONFIG_PCI_BIOS=y
-CONFIG_PCI_DIRECT=y
-CONFIG_PCI_MMCONFIG=y
-# CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_MSI is not set
-CONFIG_ISA_DMA_API=y
-CONFIG_ISA=y
-# CONFIG_EISA is not set
-# CONFIG_MCA is not set
-# CONFIG_SCx200 is not set
-
-#
-# 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_AOUT=y
-CONFIG_BINFMT_MISC=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_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 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_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_INET6_XFRM_TUNNEL is not set
-# CONFIG_INET6_TUNNEL is not set
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=y
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-# CONFIG_IP_NF_CT_PROTO_SCTP is not set
-# CONFIG_IP_NF_FTP is not set
-# CONFIG_IP_NF_IRC is not set
-# CONFIG_IP_NF_NETBIOS_NS is not set
-# CONFIG_IP_NF_TFTP is not set
-# CONFIG_IP_NF_AMANDA is not set
-# CONFIG_IP_NF_PPTP is not set
-# CONFIG_IP_NF_H323 is not set
-CONFIG_IP_NF_QUEUE=y
-
-#
-# 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 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=y
-CONFIG_PARPORT_PC=y
-# CONFIG_PARPORT_SERIAL is not set
-# CONFIG_PARPORT_PC_FIFO is not set
-# CONFIG_PARPORT_PC_SUPERIO is not set
-# CONFIG_PARPORT_GSC is not set
-# CONFIG_PARPORT_1284 is not set
-
-#
-# Plug and Play support
-#
-CONFIG_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-# CONFIG_ISAPNP is not set
-# CONFIG_PNPBIOS is not set
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=y
-# CONFIG_BLK_DEV_XD is not set
-# CONFIG_PARIDE 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
-# 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_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=51200
-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=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_HD_IDE is not set
-CONFIG_BLK_DEV_IDEDISK=y
-CONFIG_IDEDISK_MULTI_MODE=y
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-CONFIG_BLK_DEV_CMD640=y
-# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-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_RZ1000=y
-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 is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP 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_CS5535 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=y
-# 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_SIS5513 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_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=y
-# 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_7000FASST is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 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=m
-# CONFIG_SCSI_ADVANSYS 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=y
-# CONFIG_SCSI_SATA_AHCI is not set
-# CONFIG_SCSI_SATA_SVW is not set
-CONFIG_SCSI_ATA_PIIX=y
-# CONFIG_SCSI_SATA_MV is not set
-# CONFIG_SCSI_SATA_NV is not set
-# CONFIG_SCSI_PDC_ADMA is not set
-# CONFIG_SCSI_SATA_QSTOR is not set
-# CONFIG_SCSI_SATA_PROMISE is not set
-CONFIG_SCSI_SATA_SX4=m
-# CONFIG_SCSI_SATA_SIL is not set
-# CONFIG_SCSI_SATA_SIL24 is not set
-CONFIG_SCSI_SATA_SIS=m
-# CONFIG_SCSI_SATA_ULI is not set
-# CONFIG_SCSI_SATA_VIA is not set
-# CONFIG_SCSI_SATA_VITESSE is not set
-CONFIG_SCSI_SATA_INTEL_COMBINED=y
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH 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_PPA is not set
-# CONFIG_SCSI_IMM is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-CONFIG_SCSI_IPR=m
-# CONFIG_SCSI_IPR_TRACE is not set
-# CONFIG_SCSI_IPR_DUMP 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_1280 is not set
-# CONFIG_SCSI_QLA_FC 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_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG 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_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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=y
-
-#
-# Subsystem Options
-#
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_OUI_DB is not set
-# CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
-# CONFIG_IEEE1394_EXPORT_FULL_API is not set
-
-#
-# Device Drivers
-#
-
-#
-# Texas Instruments PCILynx requires I2C
-#
-CONFIG_IEEE1394_OHCI1394=y
-
-#
-# Protocol Drivers
-#
-# CONFIG_IEEE1394_VIDEO1394 is not set
-# CONFIG_IEEE1394_SBP2 is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-# CONFIG_IEEE1394_DV1394 is not set
-CONFIG_IEEE1394_RAWIO=y
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-# 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_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_LANCE is not set
-# CONFIG_NET_VENDOR_SMC 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=y
-# CONFIG_E2100 is not set
-# CONFIG_EWRK3 is not set
-# CONFIG_EEXPRESS is not set
-# CONFIG_EEXPRESS_PRO is not set
-# CONFIG_HPLAN_PLUS is not set
-# CONFIG_HPLAN is not set
-# CONFIG_LP486E is not set
-# CONFIG_ETH16I is not set
-CONFIG_NE2000=y
-# CONFIG_ZNET is not set
-# CONFIG_SEEQ8005 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=y
-# CONFIG_8139CP is not set
-CONFIG_8139TOO=y
-CONFIG_8139TOO_PIO=y
-# 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
-# CONFIG_NET_POCKET 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=m
-# CONFIG_S2IO_NAPI 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_PLIP 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 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_POWER 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_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_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=y
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PARKBD 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
-CONFIG_VT_CONSOLE=y
-CONFIG_HW_CONSOLE=y
-# CONFIG_SERIAL_NONSTANDARD is not set
-
-#
-# Serial drivers
-#
-CONFIG_SERIAL_8250=y
-# CONFIG_SERIAL_8250_CONSOLE is not set
-CONFIG_SERIAL_8250_PCI=y
-CONFIG_SERIAL_8250_PNP=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_JSM is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-CONFIG_PRINTER=y
-# CONFIG_LP_CONSOLE is not set
-# CONFIG_PPDEV is not set
-# CONFIG_TIPAR is not set
-
-#
-# 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_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
-# CONFIG_SONYPI is not set
-
-#
-# Ftape, the floppy tape device driver
-#
-CONFIG_AGP=y
-# CONFIG_AGP_ALI is not set
-# CONFIG_AGP_ATI is not set
-# CONFIG_AGP_AMD is not set
-# CONFIG_AGP_AMD64 is not set
-CONFIG_AGP_INTEL=y
-# CONFIG_AGP_NVIDIA is not set
-# CONFIG_AGP_SIS is not set
-# CONFIG_AGP_SWORKS is not set
-# CONFIG_AGP_VIA is not set
-# CONFIG_AGP_EFFICEON is not set
-CONFIG_DRM=y
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_R128 is not set
-# CONFIG_DRM_RADEON is not set
-# CONFIG_DRM_I810 is not set
-# CONFIG_DRM_I830 is not set
-# CONFIG_DRM_I915 is not set
-# CONFIG_DRM_MGA is not set
-# CONFIG_DRM_SIS is not set
-# CONFIG_DRM_VIA is not set
-# CONFIG_DRM_SAVAGE is not set
-# CONFIG_MWAVE is not set
-# CONFIG_CS5535_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER 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_SENSORS_HDAPS is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Misc devices
-#
-# CONFIG_IBM_ASM is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB 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=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-CONFIG_FB_VGA16=y
-CONFIG_FB_VESA=y
-# CONFIG_FB_VESA_STD is not set
-CONFIG_FB_VESA_TNG=y
-CONFIG_FB_VESA_DEFAULT_MODE="640x480-32@60"
-CONFIG_VIDEO_SELECT=y
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_I810 is not set
-# CONFIG_FB_INTEL is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# 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_GEODE is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-CONFIG_FONTS=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
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_SEQUENCER=y
-# CONFIG_SND_SEQ_DUMMY 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_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=y
-CONFIG_SND_AC97_BUS=y
-# 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
-
-#
-# ISA devices
-#
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_WAVEFRONT is not set
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-CONFIG_SND_INTEL8X0=y
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-
-#
-# USB devices
-#
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_USX2Y is not set
-
-#
-# SoC audio support
-#
-# CONFIG_SND_SOC is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=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_SUSPEND 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_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-CONFIG_USB_PRINTER=y
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-CONFIG_USB_HIDINPUT=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_WACOM=y
-# 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_MON=y
-
-#
-# USB port drivers
-#
-# CONFIG_USB_USS720 is not set
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_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=m
-# CONFIG_USB_PHIDGETKIT is not set
-CONFIG_USB_PHIDGETSERVO=m
-# 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)
-#
-# CONFIG_EDAC is not set
-
-#
-# 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 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 is not set
-CONFIG_AUTOFS4_FS=y
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-CONFIG_ISO9660_FS=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-CONFIG_UDF_FS=y
-CONFIG_UDF_NLS=y
-
-#
-# 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_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_SQUASHFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-# CONFIG_NFS_V3 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=y
-# CONFIG_NFSD_V3 is not set
-CONFIG_NFSD_TCP=y
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=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 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 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Instrumentation Support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-# CONFIG_KPROBES 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=15
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_UNWIND_INFO is not set
-CONFIG_EARLY_PRINTK=y
-CONFIG_STACK_BACKTRACE_COLS=2
-CONFIG_X86_FIND_SMP_CONFIG=y
-CONFIG_X86_MPPARSE=y
-CONFIG_DOUBLEFAULT=y
-CONFIG_TIMER_STATS=y
-
-#
-# 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=m
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_X86_SMP=y
-CONFIG_X86_HT=y
-CONFIG_X86_BIOS_REBOOT=y
-CONFIG_X86_TRAMPOLINE=y
-CONFIG_KTIME_SCALAR=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-spitz b/meta/packages/linux/linux-rp-2.6.21/defconfig-spitz
deleted file mode 100644 (file)
index ce9b900..0000000
+++ /dev/null
@@ -1,1781 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21
-# Sat Jun 30 20:16:08 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=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 is not set
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_SYSCTL=y
-CONFIG_EMBEDDED=y
-CONFIG_UID16=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=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=m
-CONFIG_IOSCHED_CFQ=m
-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
-
-#
-# 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_PXA_SHARPSL=y
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-# CONFIG_PXA_SHARPSL_25x is not set
-CONFIG_PXA_SHARPSL_27x=y
-CONFIG_MACH_AKITA=y
-CONFIG_MACH_SPITZ=y
-CONFIG_MACH_BORZOI=y
-CONFIG_PXA27x=y
-CONFIG_PXA_SHARP_Cxx00=y
-CONFIG_PXA_SSP=y
-# CONFIG_PXA_KEYS 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
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/hda1 rootfstype=ext3 rootdelay=1 rw  fbcon=rotate:1 dyntick=enable quiet"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=y
-
-#
-# 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=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM_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 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=y
-# 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=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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_IPTABLES 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 is not set
-
-#
-# Dongle support
-#
-
-#
-# 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=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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 is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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=y
-# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-# CONFIG_BLK_DEV_NBD is not set
-# 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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_IDEDMA is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_KEYBOARD_CORGI is not set
-CONFIG_KEYBOARD_SPITZ=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_CORGI=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-
-#
-# Multifunction device drivers
-#
-# CONFIG_MFD_SM501 is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_SPITZ=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT 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_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_USBVISION is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_USB_DSBR is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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=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_S1D13XXX is not set
-CONFIG_FB_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-CONFIG_FB_PXA_OVERLAY=y
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX is not set
-# CONFIG_FB_W100 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=y
-CONFIG_FONTS=y
-# CONFIG_FONT_8x8 is not set
-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
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# 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_SPITZ=m
-CONFIG_SND_SOC_WM8750=m
-
-#
-# 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=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# 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=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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# 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 is not set
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-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 is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 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=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-# CONFIG_USB_BERRY_CHARGE is not set
-CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
-CONFIG_USB_IDMOUSE=m
-# 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
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem 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_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=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
-
-#
-# 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 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=y
-# 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=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_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_JFFS2_FS=m
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_DEBUG_SHIRQ is not set
-CONFIG_LOG_BUF_SHIFT=14
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_SCHEDSTATS is not set
-CONFIG_TIMER_STATS=y
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_FAULT_INJECTION is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_CAMELLIA is not set
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=m
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_PLIST=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_SHARPSL_RC=m
\ No newline at end of file
diff --git a/meta/packages/linux/linux-rp-2.6.21/defconfig-tosa b/meta/packages/linux/linux-rp-2.6.21/defconfig-tosa
deleted file mode 100644 (file)
index 392acf4..0000000
+++ /dev/null
@@ -1,1613 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.16-rc5-git5
-# Tue Mar 14 09:05:26 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=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 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=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
-#
-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
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_L7200 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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# Intel PXA2xx Implementations
-#
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_ARCH_PXA_IDP is not set
-CONFIG_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-# CONFIG_MACH_POODLE is not set
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-CONFIG_MACH_TOSA=y
-CONFIG_PXA25x=y
-# CONFIG_PXA_KEYS 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-CONFIG_TOSHIBA_TC6393XB=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# 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=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_PXA25x=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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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=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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS 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_BLOCK=y
-# 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
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_SHARP_SL=y
-# 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_BLKMTD is not set
-# CONFIG_MTD_BLOCK2MTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_TMIO=y
-CONFIG_MTD_NAND_IDS=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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-# 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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_CORGI is not set
-# CONFIG_KEYBOARD_SPITZ is not set
-CONFIG_KEYBOARD_TOSA=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-# CONFIG_TOUCHSCREEN_CORGI 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_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 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=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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TOSA=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Video For Linux
-#
-
-#
-# Video Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# 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_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_AUDIO_DECODER is not set
-# CONFIG_VIDEO_DECODER is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# 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_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_W100 is not set
-CONFIG_FB_TMIO=y
-# 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 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
-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_HP680 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=m
-# CONFIG_SND_SEQUENCER is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_AC97_BUS=y
-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_AC97 is not set
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# PCMCIA devices
-#
-
-#
-# SoC audio support
-#
-CONFIG_SND_SOC=y
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=y
-CONFIG_SND_PXA2xx_SOC_AC97=y
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-# CONFIG_SND_PXA2xx_SOC_CORGI is not set
-# CONFIG_SND_PXA2xx_SOC_SPITZ is not set
-CONFIG_SND_PXA2xx_SOC_TOSA=y
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC 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_WM9713 is not set
-CONFIG_SND_SOC_WM9712=y
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
-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=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-CONFIG_USB_MTOUCH=m
-# CONFIG_USB_ITMTOUCH is not set
-CONFIG_USB_EGALAX=m
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Multimedia devices
-#
-CONFIG_USB_DABUSB=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_DSBR=m
-# CONFIG_USB_ET61X251 is not set
-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 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=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-CONFIG_USB_NET_GL620A=m
-CONFIG_USB_NET_NET1080=m
-CONFIG_USB_NET_PLUSB=m
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_ZAURUS 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_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-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_KEYSPAN_MPR is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-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_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST 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_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-
-#
-# Real Time Clock
-#
-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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-CONFIG_RTC_DRV_SA1100=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 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_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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# 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=14
-CONFIG_DETECT_SOFTLOCKUP=y
-CONFIG_TIMER_STATS=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT 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_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_GENERIC_ALLOCATOR=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.21/hostap-monitor-mode.patch b/meta/packages/linux/linux-rp-2.6.21/hostap-monitor-mode.patch
deleted file mode 100644 (file)
index 641fd19..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-This is a patch that I've been maintaining for a few years, and I'd 
-really like to see it added to the mainstream zaurus kernel so I can 
-finally stop distributing my own.
-
-This patch only effects the card while in monitor mode, and does not 
-cause any known stability issues.
-
-http://patches.aircrack-ng.org/hostap-kernel-2.6.18.patch
-
-Rick Farina (Zero_Chaos)
-
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c  2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c    2006-09-21 01:30:18.000000000 -0400
-@@ -69,6 +69,9 @@
-       iface = netdev_priv(dev);
-       local = iface->local;
-+      if (local->iw_mode == IW_MODE_MONITOR)
-+              goto xmit;
-+
-       if (skb->len < ETH_HLEN) {
-               printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb "
-                      "(len=%d)\n", dev->name, skb->len);
-@@ -234,6 +237,7 @@
-               memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN);
-       }
-+xmit:
-       iface->stats.tx_packets++;
-       iface->stats.tx_bytes += skb->len;
-@@ -404,8 +408,6 @@
-       }
-       if (skb->len < 24) {
--              printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb "
--                     "(len=%d)\n", dev->name, skb->len);
-               ret = 0;
-               iface->stats.tx_dropped++;
-               goto fail;
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.orig
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.rej
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c        2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c  2006-09-21 01:30:18.000000000 -0400
-@@ -1005,6 +1005,35 @@
-       return fid;
- }
-+static int prism2_monitor_enable(struct net_device *dev)
-+{
-+      if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) {
-+              printk(KERN_DEBUG "Port type setting for monitor mode "
-+                      "failed\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8),
-+                           0, NULL, NULL)) {
-+              printk(KERN_DEBUG "Could not enter testmode 0x0a\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS,
-+                          HFA384X_WEPFLAGS_PRIVACYINVOKED |
-+                          HFA384X_WEPFLAGS_HOSTENCRYPT |
-+                          HFA384X_WEPFLAGS_HOSTDECRYPT)) {
-+              printk(KERN_DEBUG "WEP flags setting failed\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) {
-+              printk(KERN_DEBUG "Could not set promiscuous mode\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      return 0;
-+}
- static int prism2_reset_port(struct net_device *dev)
- {
-@@ -1031,6 +1060,10 @@
-                              "port\n", dev->name);
-       }
-+      if (local->iw_mode == IW_MODE_MONITOR)
-+              /* force mode 0x0a after port 0 reset */
-+              return prism2_monitor_enable(dev);
-+
-       /* It looks like at least some STA firmware versions reset
-        * fragmentation threshold back to 2346 after enable command. Restore
-        * the configured value, if it differs from this default. */
-@@ -1466,6 +1499,10 @@
-               return 1;
-       }
-+      if (local->iw_mode == IW_MODE_MONITOR)
-+              /* force mode 0x0a after port 0 reset */
-+              prism2_monitor_enable(dev);
-+
-       local->hw_ready = 1;
-       local->hw_reset_tries = 0;
-       local->hw_resetting = 0;
-@@ -3156,6 +3193,7 @@
-       local->func->hw_config = prism2_hw_config;
-       local->func->hw_reset = prism2_hw_reset;
-       local->func->hw_shutdown = prism2_hw_shutdown;
-+      local->func->monitor_enable = prism2_monitor_enable;
-       local->func->reset_port = prism2_reset_port;
-       local->func->schedule_reset = prism2_schedule_reset;
- #ifdef PRISM2_DOWNLOAD_SUPPORT
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_hw.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c     2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c       2006-09-21 01:30:18.000000000 -0400
-@@ -1104,33 +1104,7 @@
-       printk(KERN_DEBUG "Enabling monitor mode\n");
-       hostap_monitor_set_type(local);
--
--      if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE,
--                          HFA384X_PORTTYPE_PSEUDO_IBSS)) {
--              printk(KERN_DEBUG "Port type setting for monitor mode "
--                     "failed\n");
--              return -EOPNOTSUPP;
--      }
--
--      /* Host decrypt is needed to get the IV and ICV fields;
--       * however, monitor mode seems to remove WEP flag from frame
--       * control field */
--      if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS,
--                          HFA384X_WEPFLAGS_HOSTENCRYPT |
--                          HFA384X_WEPFLAGS_HOSTDECRYPT)) {
--              printk(KERN_DEBUG "WEP flags setting failed\n");
--              return -EOPNOTSUPP;
--      }
--
--      if (local->func->reset_port(dev) ||
--          local->func->cmd(dev, HFA384X_CMDCODE_TEST |
--                           (HFA384X_TEST_MONITOR << 8),
--                           0, NULL, NULL)) {
--              printk(KERN_DEBUG "Setting monitor mode failed\n");
--              return -EOPNOTSUPP;
--      }
--
--      return 0;
-+      return local->func->reset_port(dev);
- }
-@@ -1199,7 +1173,7 @@
-       local->iw_mode = *mode;
-       if (local->iw_mode == IW_MODE_MONITOR)
--              hostap_monitor_mode_enable(local);
-+              return hostap_monitor_mode_enable(local);
-       else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt &&
-                !local->fw_encrypt_ok) {
-               printk(KERN_DEBUG "%s: defaulting to host-based encryption as "
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c      2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c        2006-09-21 01:30:18.000000000 -0400
-@@ -331,7 +331,7 @@
-       if (local->iw_mode == IW_MODE_REPEAT)
-               return HFA384X_PORTTYPE_WDS;
-       if (local->iw_mode == IW_MODE_MONITOR)
--              return HFA384X_PORTTYPE_PSEUDO_IBSS;
-+              return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/
-       return HFA384X_PORTTYPE_HOSTAP;
- }
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_main.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c       2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c 2006-09-21 01:30:18.000000000 -0400
-@@ -48,6 +48,8 @@
-       { 0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID },
-       /* Samsung MagicLAN SWL-2210P */
-       { 0x167d, 0xa000, PCI_ANY_ID, PCI_ANY_ID },
-+      /* NETGEAR MA311 */
-+      { 0x1385, 0x3872, PCI_ANY_ID, PCI_ANY_ID },
-       { 0 }
- };
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_pci.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c       2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c 2006-09-21 01:30:18.000000000 -0400
-@@ -101,6 +101,7 @@
-       { 0xc250, 0x0002 } /* EMTAC A2424i */,
-       { 0xd601, 0x0002 } /* Z-Com XI300 */,
-       { 0xd601, 0x0005 } /* Zcomax XI-325H 200mW */,
-+      { 0xd601, 0x0010 } /* Zcomax XI-325H 100mW */,
-       { 0, 0}
- };
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_plx.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h      2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h        2006-09-21 01:30:18.000000000 -0400
-@@ -575,6 +575,7 @@
-       int (*hw_config)(struct net_device *dev, int initial);
-       void (*hw_reset)(struct net_device *dev);
-       void (*hw_shutdown)(struct net_device *dev, int no_disable);
-+      int (*monitor_enable)(struct net_device *dev);
-       int (*reset_port)(struct net_device *dev);
-       void (*schedule_reset)(local_info_t *local);
-       int (*download)(local_info_t *local,
diff --git a/meta/packages/linux/linux-rp-2.6.21/pxa-serial-hack.patch b/meta/packages/linux/linux-rp-2.6.21/pxa-serial-hack.patch
deleted file mode 100644 (file)
index bf20f46..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
----
- drivers/serial/8250.c        |    5 +++++
- drivers/serial/serial_core.c |    1 +
- drivers/serial/serial_cs.c   |   12 +++++++++---
- include/linux/serial_core.h  |    1 +
- 4 files changed, 16 insertions(+), 3 deletions(-)
-
-Index: linux-2.6.20/drivers/serial/8250.c
-===================================================================
---- linux-2.6.20.orig/drivers/serial/8250.c    2007-04-27 13:37:26.000000000 +0100
-+++ linux-2.6.20/drivers/serial/8250.c 2007-04-27 13:38:16.000000000 +0100
-@@ -2429,7 +2429,12 @@
-       .driver_name            = "serial",
-       .dev_name               = "ttyS",
-       .major                  = TTY_MAJOR,
-+#ifdef CONFIG_SERIAL_PXA
-+      .minor                  = 64 + 4,
-+      .name_base              = 4,
-+#else
-       .minor                  = 64,
-+#endif
-       .nr                     = UART_NR,
-       .cons                   = SERIAL8250_CONSOLE,
- };
-Index: linux-2.6.20/drivers/serial/serial_core.c
-===================================================================
---- linux-2.6.20.orig/drivers/serial/serial_core.c     2007-02-04 18:44:54.000000000 +0000
-+++ linux-2.6.20/drivers/serial/serial_core.c  2007-04-27 13:39:39.000000000 +0100
-@@ -2068,7 +2068,8 @@
-       printk(KERN_INFO "%s%s%s%d at %s (irq = %d) is a %s\n",
-              port->dev ? port->dev->bus_id : "",
-              port->dev ? ": " : "",
--             drv->dev_name, port->line, address, port->irq, uart_type(port));
-+             drv->dev_name, port->line + drv->name_base, address, port->irq,
-+             uart_type(port));
- }
- static void
-@@ -2183,6 +2184,7 @@
-       normal->owner           = drv->owner;
-       normal->driver_name     = drv->driver_name;
-       normal->name            = drv->dev_name;
-+      normal->name_base       = drv->name_base;
-       normal->major           = drv->major;
-       normal->minor_start     = drv->minor;
-       normal->type            = TTY_DRIVER_TYPE_SERIAL;
-Index: linux-2.6.20/include/linux/serial_core.h
-===================================================================
---- linux-2.6.20.orig/include/linux/serial_core.h      2007-02-04 18:44:54.000000000 +0000
-+++ linux-2.6.20/include/linux/serial_core.h   2007-04-27 13:37:27.000000000 +0100
-@@ -341,6 +341,7 @@
-       struct module           *owner;
-       const char              *driver_name;
-       const char              *dev_name;
-+      int                      name_base;
-       int                      major;
-       int                      minor;
-       int                      nr;
-Index: linux-2.6.20/drivers/serial/serial_cs.c
-===================================================================
---- linux-2.6.20.orig/drivers/serial/serial_cs.c       2007-02-04 18:44:54.000000000 +0000
-+++ linux-2.6.20/drivers/serial/serial_cs.c    2007-04-27 13:40:34.000000000 +0100
-@@ -390,7 +390,7 @@
-                       kio_addr_t iobase, int irq)
- {
-       struct uart_port port;
--      int line;
-+      int line, linestart;
-       memset(&port, 0, sizeof (struct uart_port));
-       port.iobase = iobase;
-@@ -411,10 +411,16 @@
-               return -EINVAL;
-       }
-+#if CONFIG_SERIAL_PXA
-+      linestart = 4;
-+#else
-+      linestart = 0;
-+#endif
-+
-       info->line[info->ndev] = line;
--      sprintf(info->node[info->ndev].dev_name, "ttyS%d", line);
-+      sprintf(info->node[info->ndev].dev_name, "ttyS%d", line+linestart);
-       info->node[info->ndev].major = TTY_MAJOR;
--      info->node[info->ndev].minor = 0x40 + line;
-+      info->node[info->ndev].minor = 0x40 + line + linestart;
-       if (info->ndev > 0)
-               info->node[info->ndev - 1].next = &info->node[info->ndev];
-       info->ndev++;
diff --git a/meta/packages/linux/linux-rp-2.6.21/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch b/meta/packages/linux/linux-rp-2.6.21/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch
deleted file mode 100644 (file)
index 18bf426..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-
-From: Petr Vandrovec <vandrove@vc.cvut.cz>
-
-Patch below adds support for using different prescaler than 16 for 16c950
-chips.  This is needed for using Fujitsu-Siemens Connect2Air compact-flash
-card, which comes (apparently) with 806kHz clocks, and so you have to
-program prescaler for division by 7, and DLAB to 1, to get 115200Bd.  
-
-To get card properly running you also have to add lines below to
-/etc/pcmcia/serial.opts so kernel knows that base speed is not 115200 but
-50400 (50400 * 16 = 806400; 806400 / 7 = 115200).  As I've found no code
-specifying baud_rate in serial_cs, I assume that specifying it in
-serial.opts is right way to do this type of things.
-
-Patch also fixes problem that for UPF_MAGIC_MULTIPLIER maximum possible
-baud rate passed to uart code was uartclk / 16 while correct value for
-these devices (and for 16c950) is uartclk / 4.
-
-Patch also fixes problem that for UPF_MAGIC_MULTIPLIER devices with
-baud_rate 19200 or 9600 spd_cust did not work correctly.  Not that such
-devices exist, but we should not ignore spd_cust, user probably knows why
-he asked for spd_cust.
-
-serial.opts:
-
-case "$MANFID-$FUNCID-$PRODID_1-$PRODID_2-$PRODID_3-$PRODID_4" in
-'0279,950b-2-GPRS Modem---')
-    SERIAL_OPTS="baud_base 50400"
-    ;;
-esac
-
-Cc: David Woodhouse <dwmw2@infradead.org>
-Signed-off-by: Andrew Morton <akpm@osdl.org>
----
-
- drivers/serial/8250.c |   82 +++++++++++++++++++++++++++++++++++++++-----------
- 1 files changed, 64 insertions(+), 18 deletions(-)
-
-diff -puN drivers/serial/8250.c~serial-add-support-for-non-standard-xtals-to-16c950-driver drivers/serial/8250.c
---- devel/drivers/serial/8250.c~serial-add-support-for-non-standard-xtals-to-16c950-driver     2005-09-12 03:34:57.000000000 -0700
-+++ devel-akpm/drivers/serial/8250.c   2005-09-12 03:34:57.000000000 -0700
-@@ -1653,24 +1653,58 @@ static void serial8250_shutdown(struct u
-               serial_unlink_irq_chain(up);
- }
--static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
-+static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud,
-+                                         unsigned int *prescaler)
- {
--      unsigned int quot;
--
--      /*
--       * Handle magic divisors for baud rates above baud_base on
--       * SMSC SuperIO chips.
-+        /*
-+       * Use special handling only if user did not supply its own divider.
-+       * spd_cust is defined in terms of baud_base, so always use default
-+       * prescaler when spd_cust is requested.
-        */
--      if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
--          baud == (port->uartclk/4))
--              quot = 0x8001;
--      else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
--               baud == (port->uartclk/8))
--              quot = 0x8002;
--      else
--              quot = uart_get_divisor(port, baud);
--      return quot;
-+      *prescaler = 16;
-+        if (baud != 38400 || (port->flags & UPF_SPD_MASK) != UPF_SPD_CUST) {
-+              unsigned int quot = port->uartclk / baud;
-+
-+              /*
-+               * Handle magic divisors for baud rates above baud_base on
-+               * SMSC SuperIO chips.
-+               */
-+              if (port->flags & UPF_MAGIC_MULTIPLIER) {
-+                      if (quot == 4) {
-+                              return 0x8001;
-+                      } else if (quot == 8) {
-+                              return 0x8002;
-+                      }
-+              }
-+              if (port->type == PORT_16C950) {
-+                      /*
-+                       * This computes TCR value (4 to 16), not CPR value (which can
-+                       * be between 1.000 and 31.875) - chip I have uses XTAL of
-+                       * 806400Hz, and so a division by 7 is required to get 115200Bd.
-+                       * I'm leaving CPR disabled for now, until someone will
-+                       * hit even more exotic XTAL (it is needed to get 500kbps
-+                       * or 1000kbps from 18.432MHz XTAL, but I have no device
-+                       * which would benefit from doing that).
-+                       *
-+                       * If we can use divide by 16, use it.  Otherwise look for
-+                       * better prescaler, from 15 to 4.  If quotient cannot
-+                       * be divided by any integer value between 4 and 15, use 4.
-+                       */
-+                      if (quot & 0x0F) {
-+                              unsigned int div;
-+
-+                              for (div = 15; div > 4; div--) {
-+                                      if (quot % div == 0) {
-+                                              break;
-+                                      }
-+                              }
-+                              *prescaler = div;
-+                              return quot / div;
-+                      }
-+              }
-+      }
-+      return uart_get_divisor(port, baud);
- }
- static void
-@@ -1680,7 +1714,7 @@ serial8250_set_termios(struct uart_port 
-       struct uart_8250_port *up = (struct uart_8250_port *)port;
-       unsigned char cval, fcr = 0;
-       unsigned long flags;
--      unsigned int baud, quot;
-+      unsigned int baud, quot, prescaler;
-       switch (termios->c_cflag & CSIZE) {
-       case CS5:
-@@ -1712,8 +1746,13 @@ serial8250_set_termios(struct uart_port 
-       /*
-        * Ask the core to calculate the divisor for us.
-        */
--      baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); 
--      quot = serial8250_get_divisor(port, baud);
-+
-+      if (port->type == PORT_16C950 || (port->flags & UPF_MAGIC_MULTIPLIER)) {
-+              baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/4);
-+      } else {
-+              baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
-+      }
-+      quot = serial8250_get_divisor(port, baud, &prescaler);
-       /*
-        * Oxford Semi 952 rev B workaround
-@@ -1817,6 +1856,13 @@ serial8250_set_termios(struct uart_port 
-       serial_outp(up, UART_DLM, quot >> 8);           /* MS of divisor */
-       /*
-+       * Program prescaler for 16C950 chips.
-+       */
-+      if (up->port.type == PORT_16C950) {
-+              serial_icr_write(up, UART_TCR, prescaler == 16 ? 0 : prescaler);
-+      }
-+
-+      /*
-        * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
-        * is written without DLAB set, this mode will be disabled.
-        */
-_
diff --git a/meta/packages/linux/linux-rp-2.6.21/sharpsl-rc-r1.patch b/meta/packages/linux/linux-rp-2.6.21/sharpsl-rc-r1.patch
deleted file mode 100644 (file)
index da83fdf..0000000
+++ /dev/null
@@ -1,519 +0,0 @@
-Index: linux-2.6.20/arch/arm/mach-pxa/spitz.c
-===================================================================
---- linux-2.6.20.orig/arch/arm/mach-pxa/spitz.c
-+++ linux-2.6.20/arch/arm/mach-pxa/spitz.c
-@@ -244,6 +244,13 @@ static struct platform_device spitzkbd_d
-       .id             = -1,
- };
-+/*
-+ * Spitz Remote Control Device
-+ */
-+static struct platform_device sharpsl_rc_device = {
-+      .name           = "sharpsl-remote-control",
-+      .id             = -1,
-+};
- /*
-  * Spitz LEDs
-@@ -476,6 +483,7 @@ static struct platform_device *devices[]
-       &spitzscoop_device,
-       &spitzssp_device,
-       &spitzkbd_device,
-+      &sharpsl_rc_device,
-       &spitzts_device,
-       &spitzbl_device,
-       &spitzled_device,
-Index: linux-2.6.20/drivers/input/keyboard/Kconfig
-===================================================================
---- linux-2.6.20.orig/drivers/input/keyboard/Kconfig
-+++ linux-2.6.20/drivers/input/keyboard/Kconfig
-@@ -154,6 +154,17 @@ config KEYBOARD_SPITZ
-         To compile this driver as a module, choose M here: the
-         module will be called spitzkbd.
-+config SHARPSL_RC
-+      tristate "Sharp SL-Cxx00 Remote Control"
-+      depends on PXA_SHARPSL
-+      default y
-+      help
-+        Say Y here to enable the remote on the Sharp Zaurus SL-Cxx00,
-+        SL-C1000, SL-C3000 and Sl-C3100 series of PDAs.
-+
-+        To compile this driver as a module, choose M here: the
-+        module will be called sharpsl_rc.
-+
- config KEYBOARD_AMIGA
-       tristate "Amiga keyboard"
-       depends on AMIGA
-Index: linux-2.6.20/drivers/input/keyboard/Makefile
-===================================================================
---- linux-2.6.20.orig/drivers/input/keyboard/Makefile
-+++ linux-2.6.20/drivers/input/keyboard/Makefile
-@@ -14,6 +14,7 @@ obj-$(CONFIG_KEYBOARD_NEWTON)                += newton
- obj-$(CONFIG_KEYBOARD_STOWAWAY)               += stowaway.o
- obj-$(CONFIG_KEYBOARD_CORGI)          += corgikbd.o
- obj-$(CONFIG_KEYBOARD_SPITZ)          += spitzkbd.o
-+obj-$(CONFIG_SHARPSL_RC)                      += sharpsl_rc.o
- obj-$(CONFIG_KEYBOARD_HIL)            += hil_kbd.o
- obj-$(CONFIG_KEYBOARD_HIL_OLD)                += hilkbd.o
- obj-$(CONFIG_KEYBOARD_OMAP)             += omap-keypad.o
-Index: linux-2.6.20/drivers/input/keyboard/sharpsl_rc.c
-===================================================================
---- /dev/null
-+++ linux-2.6.20/drivers/input/keyboard/sharpsl_rc.c
-@@ -0,0 +1,291 @@
-+/*
-+ *  Keyboard driver for Sharp Clamshell Models (SL-Cxx00)
-+ *
-+ *  Copyright (c) 2004-2005 Richard Purdie
-+ *
-+ *  Based on corgikbd.c and Sharp's RC driver
-+ *
-+ *  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.
-+ *
-+ */
-+
-+#define DEBUG 1
-+#include <linux/delay.h>
-+#include <linux/platform_device.h>
-+#include <linux/init.h>
-+#include <linux/input.h>
-+#include <linux/interrupt.h>
-+#include <linux/jiffies.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+
-+#ifdef CONFIG_MACH_SPITZ
-+#include <asm/arch/spitz.h>
-+#endif
-+#ifdef CONFIG_MACH_CORGI
-+#include <asm/arch/corgi.h>
-+#endif
-+
-+#include <asm/arch/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/hardware/scoop.h>
-+#include <asm/arch/sharpsl.h>
-+#include <asm/hardware/sharpsl_pm.h>
-+
-+#define DPRINTK(fmt, args...) dev_dbg(data->dev, fmt "\n", ##args)
-+
-+struct remote_control_key {
-+      unsigned char min;
-+      unsigned char max;
-+      unsigned char key;
-+};
-+
-+#ifdef CONFIG_MACH_SPITZ
-+#define REMOTE_AKIN_PULLUP SPITZ_SCP2_AKIN_PULLUP
-+#define REMOTE_SCOOP_DEVICE spitzscoop2_device
-+#define REMOTE_GPIO_INT SPITZ_GPIO_AK_INT
-+#define REMOTE_IRQ_INT SPITZ_IRQ_GPIO_AK_INT
-+static struct remote_control_key remote_keys[] = {
-+      { 25, 35, KEY_STOPCD},
-+      { 55, 65, KEY_PLAYPAUSE},
-+      { 85, 95, KEY_NEXTSONG},
-+      { 115, 125, KEY_VOLUMEUP},
-+      { 145, 155, KEY_PREVIOUSSONG},
-+      { 180, 190, KEY_MUTE},
-+      { 215, 225, KEY_VOLUMEDOWN},
-+};
-+#endif
-+#ifdef CONFIG_MACH_CORGI
-+#define REMOTE_AKIN_PULLUP CORGI_SCP_AKIN_PULLUP
-+#define REMOTE_SCOOP_DEVICE corgiscoop_device
-+#define REMOTE_GPIO_INT CORGI_GPIO_AK_INT
-+#define REMOTE_IRQ_INT CORGI_IRQ_GPIO_AK_INT
-+static struct remote_control_key remote_keys[] = {
-+    //These need to be fixed for the CE-RH1's values
-+      { 25, 35, KEY_STOPCD},
-+      { 55, 65, KEY_PLAYPAUSE},
-+      { 85, 95, KEY_NEXTSONG},
-+      { 115, 125, KEY_VOLUMEUP},
-+      { 145, 155, KEY_PREVIOUSSONG},
-+      { 180, 190, KEY_MUTE},
-+      { 215, 225, KEY_VOLUMEDOWN},
-+};
-+#endif
-+
-+#define RELEASE_HI      230
-+#define MAX_EARPHONE    6
-+#define RC_POLL_MS      10
-+#define RC_FINISH_MS    500
-+#define WAIT_STATE      3
-+#define NOISE_THRESHOLD 100
-+
-+struct sharpsl_rc {
-+      struct input_dev *input;
-+      struct device *dev;
-+
-+      spinlock_t lock;
-+      struct timer_list rctimer;
-+      struct timer_list rctimer_finish;
-+
-+      unsigned int handling_press;
-+      unsigned int noise;
-+      unsigned int state;
-+      unsigned int last_key;
-+};
-+
-+static int get_remocon_raw(void)
-+{
-+      int i, val;
-+
-+      val = sharpsl_pm_pxa_read_max1111(MAX1111_REMCOM);
-+      for (i = 0; i < ARRAY_SIZE(remote_keys); ++i) {
-+              if (val >= remote_keys[i].min
-+                      && val <= remote_keys[i].max) {
-+                      printk("get_remocon_raw: VAL=%i, KEY=%i\n", val, remote_keys[i].key);
-+                      return remote_keys[i].key;
-+              }
-+      }
-+      return 0;
-+}
-+
-+static irqreturn_t sharpsl_rc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      struct sharpsl_rc *data = dev_id;
-+      DPRINTK("sharpsl_rc_interrupt %d\n", irq);
-+      if (!data->handling_press) {
-+              DPRINTK("handling interrupt");
-+              data->handling_press = 1;
-+              data->noise = 0;
-+              data->state = 0;
-+              data->last_key = 0;
-+
-+              reset_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP);
-+
-+              mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS));
-+      }
-+      return IRQ_HANDLED;
-+}
-+
-+static void sharpsl_rc_timer_callback(unsigned long dataPtr)
-+{
-+      struct sharpsl_rc *data = (struct sharpsl_rc *) dataPtr;
-+      int timer = 1;
-+      int key = get_remocon_raw();
-+      DPRINTK("timer callback, key: %d", key);
-+
-+      //wait for value to stabilize
-+      if (data->state < WAIT_STATE) {
-+              if (data->last_key != key) {
-+                      ++data->noise;
-+                      if (data->noise > NOISE_THRESHOLD) {
-+                              DPRINTK("too much noise, bailing");
-+                              timer = 0;
-+                      }
-+                      data->state = 0;
-+              } else {
-+                      ++data->state;
-+              }
-+              data->last_key = key;
-+
-+      //stable value, send event
-+      } else if (data->state == WAIT_STATE) {
-+              data->noise = 0;
-+              //non-key returned, skip the rest of the states and bail now
-+              if (data->last_key == 0) {
-+                      DPRINTK("non-key detected %d, noise: %d", data->last_key, data->noise);
-+                      timer = 0;
-+              //send button press
-+              } else {
-+                      DPRINTK("key press detected %d, noise %d", data->last_key, data->noise);
-+                      input_report_key(data->input, data->last_key, 1);
-+              }
-+              ++data->state;
-+
-+      //wait until key is released
-+      } else if (data->state < WAIT_STATE * 2) {
-+              if (key == data->last_key
-+                      && data->noise < NOISE_THRESHOLD) {
-+                      data->state = WAIT_STATE + 1;
-+                      ++data->noise;
-+              } else {
-+                      ++data->state;
-+              }
-+      //key is released, send event
-+      } else {
-+              //send button release
-+              DPRINTK("release key %d", data->last_key);
-+              input_report_key(data->input, data->last_key, 0);
-+              timer = 0;
-+      }
-+      if (timer) {
-+              mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS));
-+      } else {
-+              set_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP);
-+              data->handling_press = 0;
-+      }
-+}
-+
-+static int __init sharpsl_rc_probe(struct platform_device *pdev)
-+{
-+      struct sharpsl_rc *sharpsl_rc;
-+      struct input_dev *input_dev;
-+      int i, ret;
-+
-+      dev_dbg(&pdev->dev, "sharpsl_rc_probe\n");
-+
-+      sharpsl_rc = kzalloc(sizeof(struct sharpsl_rc), GFP_KERNEL);
-+      input_dev = input_allocate_device();
-+      if (!sharpsl_rc || !input_dev) {
-+              kfree(sharpsl_rc);
-+              input_free_device(input_dev);
-+              return -ENOMEM;
-+      }
-+
-+      platform_set_drvdata(pdev, sharpsl_rc);
-+
-+      sharpsl_rc->dev = &pdev->dev;
-+      sharpsl_rc->input = input_dev;
-+      spin_lock_init(&sharpsl_rc->lock);
-+
-+      /* Init Remote Control Timer */
-+      init_timer(&sharpsl_rc->rctimer);
-+      sharpsl_rc->rctimer.function = sharpsl_rc_timer_callback;
-+      sharpsl_rc->rctimer.data = (unsigned long) sharpsl_rc;
-+
-+      input_dev->name = "Sharp Remote Control CE-RHX";
-+      input_dev->phys = "sharpsl_rc/input0";
-+      input_dev->id.bustype = BUS_HOST;
-+      input_dev->id.vendor = 0x0001;
-+      input_dev->id.product = 0x0001;
-+      input_dev->id.version = 0x0100;
-+      input_dev->cdev.dev = &pdev->dev;
-+      input_dev->private = sharpsl_rc;
-+
-+      input_dev->evbit[0] = BIT(EV_KEY);
-+
-+      for (i = 0; i <= ARRAY_SIZE(remote_keys); i++)
-+        set_bit(remote_keys[i].key, input_dev->keybit);
-+
-+      input_register_device(sharpsl_rc->input);
-+
-+      pxa_gpio_mode(REMOTE_GPIO_INT | GPIO_IN);
-+      ret = request_irq(REMOTE_IRQ_INT,
-+                                        sharpsl_rc_interrupt,
-+                                        IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED,
-+                                        "sharpsl_rc",
-+                                        sharpsl_rc);
-+      if (ret < 0) {
-+              dev_dbg(&pdev->dev, "Can't get IRQ: %d!\n", i);
-+              kfree(sharpsl_rc);
-+              input_free_device(input_dev);
-+              return ret;
-+      }
-+
-+      return 0;
-+}
-+
-+static int sharpsl_rc_remove(struct platform_device *pdev)
-+{
-+      struct sharpsl_rc *sharpsl_rc = platform_get_drvdata(pdev);
-+
-+      dev_dbg(&pdev->dev, "sharpsl_rc_remove\n");
-+
-+      free_irq(REMOTE_IRQ_INT, sharpsl_rc);
-+      del_timer_sync(&sharpsl_rc->rctimer);
-+      input_unregister_device(sharpsl_rc->input);
-+      kfree(sharpsl_rc);
-+
-+      return 0;
-+}
-+
-+static struct platform_driver sharpsl_rc_driver = {
-+      .probe          = sharpsl_rc_probe,
-+      .remove         = sharpsl_rc_remove,
-+      .suspend        = NULL,
-+      .resume         = NULL,
-+      .driver         = {
-+              .name   = "sharpsl-remote-control",
-+      },
-+};
-+
-+static int __devinit sharpsl_rc_init(void)
-+{
-+      printk("sharpsl_rc_init\n");
-+      return platform_driver_register(&sharpsl_rc_driver);
-+}
-+
-+static void __exit sharpsl_rc_exit(void)
-+{
-+      printk("sharpsl_rc_exit\n");
-+      platform_driver_unregister(&sharpsl_rc_driver);
-+}
-+
-+module_init(sharpsl_rc_init);
-+module_exit(sharpsl_rc_exit);
-+
-+MODULE_AUTHOR("Justin Patrin <papercrane@reversefold.com>");
-+MODULE_AUTHOR("Richard Purdie <rpurdie@rpsys.net>");
-+MODULE_DESCRIPTION("SharpSL Remote Control Driver");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.20/drivers/input/keyboard/spitzkbd.c
-===================================================================
---- linux-2.6.20.orig/drivers/input/keyboard/spitzkbd.c
-+++ linux-2.6.20/drivers/input/keyboard/spitzkbd.c
-@@ -19,6 +19,7 @@
- #include <linux/jiffies.h>
- #include <linux/module.h>
- #include <linux/slab.h>
-+#include <linux/kmod.h>
- #include <asm/arch/spitz.h>
- #include <asm/arch/hardware.h>
-@@ -279,13 +280,21 @@ static irqreturn_t spitzkbd_hinge_isr(in
- static int sharpsl_hinge_state;
- static int hinge_count;
-+void spitzkbd_handle_sharpsl_rc(void *arg) {
-+      request_module("sharpsl_rc");
-+}
-+
-+DECLARE_WORK(spitzkbd_work, spitzkbd_handle_sharpsl_rc);
-+
- static void spitzkbd_hinge_timer(unsigned long data)
- {
-       struct spitzkbd *spitzkbd_data = (struct spitzkbd *) data;
-       unsigned long state;
-       unsigned long flags;
-+      unsigned int headphone, remote;
-       state = GPLR(SPITZ_GPIO_SWA) & (GPIO_bit(SPITZ_GPIO_SWA)|GPIO_bit(SPITZ_GPIO_SWB));
-+      state |= (GPLR(SPITZ_GPIO_HP_IN) & GPIO_bit(SPITZ_GPIO_HP_IN));
-       state |= (GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT));
-       if (state != sharpsl_hinge_state) {
-               hinge_count = 0;
-@@ -299,9 +308,18 @@ static void spitzkbd_hinge_timer(unsigne
-               input_report_switch(spitzkbd_data->input, SW_LID, ((GPLR(SPITZ_GPIO_SWA) & GPIO_bit(SPITZ_GPIO_SWA)) != 0));
-               input_report_switch(spitzkbd_data->input, SW_TABLET_MODE, ((GPLR(SPITZ_GPIO_SWB) & GPIO_bit(SPITZ_GPIO_SWB)) != 0));
--              input_report_switch(spitzkbd_data->input, SW_HEADPHONE_INSERT, ((GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)) != 0));
-+
-+              headphone = ((GPLR(SPITZ_GPIO_HP_IN) & GPIO_bit(SPITZ_GPIO_HP_IN)) != 0);
-+              input_report_switch(spitzkbd_data->input, SW_HEADPHONE_INSERT, headphone);
-+
-+              remote = headphone && ((GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)) == 0);
-+              input_report_switch(spitzkbd_data->input, SW_REMOTE_INSERT, remote);
-               input_sync(spitzkbd_data->input);
-+              if (remote) {
-+                      schedule_work(&spitzkbd_work);
-+              }
-+
-               spin_unlock_irqrestore(&spitzkbd_data->lock, flags);
-       } else {
-               mod_timer(&spitzkbd_data->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL));
-@@ -394,6 +412,7 @@ static int __init spitzkbd_probe(struct 
-       set_bit(SW_LID, input_dev->swbit);
-       set_bit(SW_TABLET_MODE, input_dev->swbit);
-       set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
-+      set_bit(SW_REMOTE_INSERT, input_dev->swbit);
-       err = input_register_device(input_dev);
-       if (err)
-@@ -431,9 +450,12 @@ static int __init spitzkbd_probe(struct 
-       request_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd_hinge_isr,
-                   IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-                   "Spitzkbd SWB", spitzkbd);
--      request_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd_hinge_isr,
-+      request_irq(SPITZ_IRQ_GPIO_HP_IN, spitzkbd_hinge_isr,
-                   IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
-                   "Spitzkbd HP", spitzkbd);
-+      request_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd_hinge_isr,
-+                  IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED,
-+            "Spitzkbd HP Type", spitzkbd);
-       return 0;
-@@ -454,6 +476,7 @@ static int spitzkbd_remove(struct platfo
-       free_irq(SPITZ_IRQ_GPIO_ON_KEY, spitzkbd);
-       free_irq(SPITZ_IRQ_GPIO_SWA, spitzkbd);
-       free_irq(SPITZ_IRQ_GPIO_SWB, spitzkbd);
-+      free_irq(SPITZ_IRQ_GPIO_HP_IN, spitzkbd);
-       free_irq(SPITZ_IRQ_GPIO_AK_INT, spitzkbd);
-       del_timer_sync(&spitzkbd->htimer);
-Index: linux-2.6.20/arch/arm/mach-pxa/sharpsl.h
-===================================================================
---- linux-2.6.20.orig/arch/arm/mach-pxa/sharpsl.h
-+++ linux-2.6.20/arch/arm/mach-pxa/sharpsl.h
-@@ -50,15 +50,10 @@ void spitz_wait_hsync(void);
- #define READ_GPIO_BIT(x)    (GPLR(x) & GPIO_bit(x))
--/* MAX1111 Channel Definitions */
--#define MAX1111_BATT_VOLT   4u
--#define MAX1111_BATT_TEMP   2u
--#define MAX1111_ACIN_VOLT   6u
--
- extern struct battery_thresh spitz_battery_levels_acin[];
- extern struct battery_thresh spitz_battery_levels_noac[];
- void sharpsl_pm_pxa_init(void);
- void sharpsl_pm_pxa_remove(void);
--int sharpsl_pm_pxa_read_max1111(int channel);
-+
-Index: linux-2.6.20/arch/arm/mach-pxa/sharpsl_pm.c
-===================================================================
---- linux-2.6.20.orig/arch/arm/mach-pxa/sharpsl_pm.c
-+++ linux-2.6.20/arch/arm/mach-pxa/sharpsl_pm.c
-@@ -135,6 +135,8 @@ int sharpsl_pm_pxa_read_max1111(int chan
-                       | MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR);
- }
-+EXPORT_SYMBOL(sharpsl_pm_pxa_read_max1111);
-+
- void sharpsl_pm_pxa_init(void)
- {
-       pxa_gpio_mode(sharpsl_pm.machinfo->gpio_acin | GPIO_IN);
-Index: linux-2.6.20/include/asm-arm/hardware/sharpsl_pm.h
-===================================================================
---- linux-2.6.20.orig/include/asm-arm/hardware/sharpsl_pm.h
-+++ linux-2.6.20/include/asm-arm/hardware/sharpsl_pm.h
-@@ -104,3 +104,10 @@ irqreturn_t sharpsl_ac_isr(int irq, void
- irqreturn_t sharpsl_chrg_full_isr(int irq, void *dev_id);
- irqreturn_t sharpsl_fatal_isr(int irq, void *dev_id);
-+/* MAX1111 Channel Definitions */
-+#define MAX1111_REMCOM      0u
-+#define MAX1111_BATT_VOLT   4u
-+#define MAX1111_BATT_TEMP   2u
-+#define MAX1111_ACIN_VOLT   6u
-+
-+int sharpsl_pm_pxa_read_max1111(int channel);
-Index: linux-2.6.20/include/linux/input.h
-===================================================================
---- linux-2.6.20.orig/include/linux/input.h
-+++ linux-2.6.20/include/linux/input.h
-@@ -602,6 +602,7 @@ struct input_absinfo {
- #define SW_LID                        0x00  /* set = lid shut */
- #define SW_TABLET_MODE                0x01  /* set = tablet mode */
- #define SW_HEADPHONE_INSERT   0x02  /* set = inserted */
-+#define SW_REMOTE_INSERT    0x04  /* set = remote */
- #define SW_MAX                        0x0f
- /*
-Index: linux-2.6.20/arch/arm/mach-pxa/spitz_pm.c
-===================================================================
---- linux-2.6.20.orig/arch/arm/mach-pxa/spitz_pm.c
-+++ linux-2.6.20/arch/arm/mach-pxa/spitz_pm.c
-@@ -161,6 +161,13 @@ static int spitz_should_wakeup(unsigned 
-       if (resume_on_alarm && (PEDR & PWER_RTC))
-               is_resume |= PWER_RTC;
-+      printk("wakeup: PEDR: %x, PKSR: %x, HP_IN: %x, AK_INT: %x\n", PEDR, PKSR, GPIO_bit(SPITZ_GPIO_HP_IN), GPIO_bit(SPITZ_GPIO_AK_INT));
-+
-+      //remote/headphone interrupt, wakeup
-+      if (PEDR == 0 && (PKSR & 0xc0d01) != 0) {
-+              is_resume |= PWER_RTC;
-+      }
-+
-       dev_dbg(sharpsl_pm.dev, "is_resume: %x\n",is_resume);
-       return is_resume;
- }
diff --git a/meta/packages/linux/linux-rp-2.6.21/squashfs3.0-2.6.15.patch b/meta/packages/linux/linux-rp-2.6.21/squashfs3.0-2.6.15.patch
deleted file mode 100644 (file)
index 405d4ec..0000000
+++ /dev/null
@@ -1,4191 +0,0 @@
- fs/Kconfig                     |   65 +
- fs/Makefile                    |    1 
- fs/squashfs/Makefile           |    7 
- fs/squashfs/inode.c            | 2124 +++++++++++++++++++++++++++++++++++++++++
- fs/squashfs/squashfs.h         |   86 +
- fs/squashfs/squashfs2_0.c      |  757 ++++++++++++++
- include/linux/squashfs_fs.h    |  911 +++++++++++++++++
- include/linux/squashfs_fs_i.h  |   45 
- include/linux/squashfs_fs_sb.h |   74 +
- init/do_mounts_rd.c            |   13 
- 10 files changed, 4083 insertions(+)
-
-Index: git/fs/Kconfig
-===================================================================
---- git.orig/fs/Kconfig        2006-10-31 16:09:22.000000000 +0000
-+++ git/fs/Kconfig     2006-10-31 21:26:45.000000000 +0000
-@@ -1407,6 +1407,71 @@ config CRAMFS
-         If unsure, say N.
-+config SQUASHFS
-+      tristate "SquashFS 3.0 - Squashed file system support"
-+      select ZLIB_INFLATE
-+      help
-+        Saying Y here includes support for SquashFS 3.0 (a Compressed Read-Only File
-+        System).  Squashfs is a highly compressed read-only filesystem for Linux.
-+        It uses zlib compression to compress both files, inodes and directories.
-+        Inodes in the system are very small and all blocks are packed to minimise
-+        data overhead. Block sizes greater than 4K are supported up to a maximum of 64K.
-+        SquashFS 3.0 supports 64 bit filesystems and files (larger than 4GB), full
-+        uid/gid information, hard links and timestamps.
-+
-+        Squashfs is intended for general read-only filesystem use, for archival
-+        use (i.e. in cases where a .tar.gz file may be used), and in embedded
-+        systems where low overhead is needed.  Further information and filesystem tools
-+        are available from http://squashfs.sourceforge.net.
-+
-+        If you want to compile this as a module ( = code which can be
-+        inserted in and removed from the running kernel whenever you want),
-+        say M here and read <file:Documentation/modules.txt>.  The module
-+        will be called squashfs.  Note that the root file system (the one
-+        containing the directory /) cannot be compiled as a module.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_EMBEDDED
-+
-+      bool "Additional options for memory-constrained systems" 
-+      depends on SQUASHFS
-+      default n
-+      help
-+        Saying Y here allows you to specify cache sizes and how Squashfs
-+        allocates memory.  This is only intended for memory constrained
-+        systems.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_FRAGMENT_CACHE_SIZE
-+      int "Number of fragments cached" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default "3"
-+      help
-+        By default SquashFS caches the last 3 fragments read from
-+        the filesystem.  Increasing this amount may mean SquashFS
-+        has to re-read fragments less often from disk, at the expense
-+        of extra system memory.  Decreasing this amount will mean
-+        SquashFS uses less memory at the expense of extra reads from disk.
-+
-+        Note there must be at least one cached fragment.  Anything
-+        much more than three will probably not make much difference.
-+
-+config SQUASHFS_VMALLOC
-+      bool "Use Vmalloc rather than Kmalloc" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default n
-+      help
-+        By default SquashFS uses kmalloc to obtain fragment cache memory.
-+        Kmalloc memory is the standard kernel allocator, but it can fail
-+        on memory constrained systems.  Because of the way Vmalloc works,
-+        Vmalloc can succeed when kmalloc fails.  Specifying this option
-+        will make SquashFS always use Vmalloc to allocate the
-+        fragment cache memory.
-+
-+        If unsure, say N.
-+
- config VXFS_FS
-       tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
-       depends on BLOCK
-Index: git/fs/Makefile
-===================================================================
---- git.orig/fs/Makefile       2006-10-31 16:09:22.000000000 +0000
-+++ git/fs/Makefile    2006-10-31 21:26:45.000000000 +0000
-@@ -67,6 +67,7 @@ obj-$(CONFIG_JBD)            += jbd/
- obj-$(CONFIG_JBD2)            += jbd2/
- obj-$(CONFIG_EXT2_FS)         += ext2/
- obj-$(CONFIG_CRAMFS)          += cramfs/
-+obj-$(CONFIG_SQUASHFS)                += squashfs/
- obj-$(CONFIG_RAMFS)           += ramfs/
- obj-$(CONFIG_HUGETLBFS)               += hugetlbfs/
- obj-$(CONFIG_CODA_FS)         += coda/
-Index: git/fs/squashfs/inode.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/fs/squashfs/inode.c    2006-11-01 18:01:32.000000000 +0000
-@@ -0,0 +1,2124 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * inode.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+
-+static void squashfs_put_super(struct super_block *);
-+static int squashfs_statfs(struct dentry *, struct kstatfs *);
-+static int squashfs_symlink_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage4K(struct file *file, struct page *page);
-+static int squashfs_readdir(struct file *, void *, filldir_t);
-+static struct inode *squashfs_alloc_inode(struct super_block *sb);
-+static void squashfs_destroy_inode(struct inode *inode);
-+static int init_inodecache(void);
-+static void destroy_inodecache(void);
-+static struct dentry *squashfs_lookup(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode);
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize);
-+static int squashfs_get_sb(struct file_system_type *, int,
-+                              const char *, void *, struct vfsmount *);
-+
-+
-+static z_stream stream;
-+
-+static struct file_system_type squashfs_fs_type = {
-+      .owner = THIS_MODULE,
-+      .name = "squashfs",
-+      .get_sb = squashfs_get_sb,
-+      .kill_sb = kill_block_super,
-+      .fs_flags = FS_REQUIRES_DEV
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static struct super_operations squashfs_ops = {
-+      .alloc_inode = squashfs_alloc_inode,
-+      .destroy_inode = squashfs_destroy_inode,
-+      .statfs = squashfs_statfs,
-+      .put_super = squashfs_put_super,
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = {
-+      .readpage = squashfs_symlink_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops = {
-+      .readpage = squashfs_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops_4K = {
-+      .readpage = squashfs_readpage4K
-+};
-+
-+static struct file_operations squashfs_dir_ops = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir
-+};
-+
-+SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = {
-+      .lookup = squashfs_lookup
-+};
-+
-+
-+static struct buffer_head *get_block_length(struct super_block *s,
-+                              int *cur_index, int *offset, int *c_byte)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned short temp;
-+      struct buffer_head *bh;
-+
-+      if (!(bh = sb_bread(s, *cur_index)))
-+              goto out;
-+
-+      if (msblk->devblksize - *offset == 1) {
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              else
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              brelse(bh);
-+              if (!(bh = sb_bread(s, ++(*cur_index))))
-+                      goto out;
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              bh->b_data); 
-+              else
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              bh->b_data); 
-+              *c_byte = temp;
-+              *offset = 1;
-+      } else {
-+              if (msblk->swap) {
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1)); 
-+              } else {
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1)); 
-+              }
-+              *c_byte = temp;
-+              *offset += 2;
-+      }
-+
-+      if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) {
-+              if (*offset == msblk->devblksize) {
-+                      brelse(bh);
-+                      if (!(bh = sb_bread(s, ++(*cur_index))))
-+                              goto out;
-+                      *offset = 0;
-+              }
-+              if (*((unsigned char *) (bh->b_data + *offset)) !=
-+                                              SQUASHFS_MARKER_BYTE) {
-+                      ERROR("Metadata block marker corrupt @ %x\n",
-+                                              *cur_index);
-+                      brelse(bh);
-+                      goto out;
-+              }
-+              (*offset)++;
-+      }
-+      return bh;
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+SQSH_EXTERN unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                      long long index, unsigned int length,
-+                      long long *next_index)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >>
-+                      msblk->devblksize_log2) + 2];
-+      unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1);
-+      unsigned int cur_index = index >> msblk->devblksize_log2;
-+      int bytes, avail_bytes, b = 0, k;
-+      char *c_buffer;
-+      unsigned int compressed;
-+      unsigned int c_byte = length;
-+
-+      if (c_byte) {
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              if (!(bh[0] = sb_getblk(s, cur_index)))
-+                      goto block_release;
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b, bh);
-+      } else {
-+              if (!(bh[0] = get_block_length(s, &cur_index, &offset,
-+                                                              &c_byte)))
-+                      goto read_failure;
-+
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b - 1, bh + 1);
-+      }
-+
-+      if (compressed)
-+              down(&msblk->read_data_mutex);
-+
-+      for (bytes = 0, k = 0; k < b; k++) {
-+              avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ?
-+                                      msblk->devblksize - offset :
-+                                      c_byte - bytes;
-+              wait_on_buffer(bh[k]);
-+              if (!buffer_uptodate(bh[k]))
-+                      goto block_release;
-+              memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes);
-+              bytes += avail_bytes;
-+              offset = 0;
-+              brelse(bh[k]);
-+      }
-+
-+      /*
-+       * uncompress block
-+       */
-+      if (compressed) {
-+              int zlib_err;
-+
-+              stream.next_in = c_buffer;
-+              stream.avail_in = c_byte;
-+              stream.next_out = buffer;
-+              stream.avail_out = msblk->read_size;
-+
-+              if (((zlib_err = zlib_inflateInit(&stream)) != Z_OK) ||
-+                              ((zlib_err = zlib_inflate(&stream, Z_FINISH))
-+                               != Z_STREAM_END) || ((zlib_err =
-+                              zlib_inflateEnd(&stream)) != Z_OK)) {
-+                      ERROR("zlib_fs returned unexpected result 0x%x\n",
-+                              zlib_err);
-+                      bytes = 0;
-+              } else
-+                      bytes = stream.total_out;
-+              
-+              up(&msblk->read_data_mutex);
-+      }
-+
-+      if (next_index)
-+              *next_index = index + c_byte + (length ? 0 :
-+                              (SQUASHFS_CHECK_DATA(msblk->sblk.flags)
-+                               ? 3 : 2));
-+      return bytes;
-+
-+block_release:
-+      while (--b >= 0)
-+              brelse(bh[b]);
-+
-+read_failure:
-+      ERROR("sb_bread failed reading block 0x%x\n", cur_index);
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      int n, i, bytes, return_length = length;
-+      long long next_index;
-+
-+      TRACE("Entered squashfs_get_cached_block [%llx:%x]\n", block, offset);
-+
-+      while ( 1 ) {
-+              for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) 
-+                      if (msblk->block_cache[i].block == block)
-+                              break; 
-+              
-+              down(&msblk->block_cache_mutex);
-+
-+              if (i == SQUASHFS_CACHED_BLKS) {
-+                      /* read inode header block */
-+                      for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS;
-+                                      n ; n --, i = (i + 1) %
-+                                      SQUASHFS_CACHED_BLKS)
-+                              if (msblk->block_cache[i].block !=
-+                                                      SQUASHFS_USED_BLK)
-+                                      break;
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->waitq, &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->block_cache_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->waitq, &wait);
-+                              continue;
-+                      }
-+                      msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS;
-+
-+                      if (msblk->block_cache[i].block ==
-+                                                      SQUASHFS_INVALID_BLK) {
-+                              if (!(msblk->block_cache[i].data =
-+                                              kmalloc(SQUASHFS_METADATA_SIZE,
-+                                              GFP_KERNEL))) {
-+                                      ERROR("Failed to allocate cache"
-+                                                      "block\n");
-+                                      up(&msblk->block_cache_mutex);
-+                                      goto out;
-+                              }
-+                      }
-+      
-+                      msblk->block_cache[i].block = SQUASHFS_USED_BLK;
-+                      up(&msblk->block_cache_mutex);
-+
-+                      if (!(msblk->block_cache[i].length =
-+                                              squashfs_read_data(s,
-+                                              msblk->block_cache[i].data,
-+                                              block, 0, &next_index))) {
-+                              ERROR("Unable to read cache block [%llx:%x]\n",
-+                                              block, offset);
-+                              goto out;
-+                      }
-+
-+                      down(&msblk->block_cache_mutex);
-+                      wake_up(&msblk->waitq);
-+                      msblk->block_cache[i].block = block;
-+                      msblk->block_cache[i].next_index = next_index;
-+                      TRACE("Read cache block [%llx:%x]\n", block, offset);
-+              }
-+
-+              if (msblk->block_cache[i].block != block) {
-+                      up(&msblk->block_cache_mutex);
-+                      continue;
-+              }
-+
-+              if ((bytes = msblk->block_cache[i].length - offset) >= length) {
-+                      if (buffer)
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, length);
-+                      if (msblk->block_cache[i].length - offset == length) {
-+                              *next_block = msblk->block_cache[i].next_index;
-+                              *next_offset = 0;
-+                      } else {
-+                              *next_block = block;
-+                              *next_offset = offset + length;
-+                      }
-+                      up(&msblk->block_cache_mutex);
-+                      goto finish;
-+              } else {
-+                      if (buffer) {
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, bytes);
-+                              buffer += bytes;
-+                      }
-+                      block = msblk->block_cache[i].next_index;
-+                      up(&msblk->block_cache_mutex);
-+                      length -= bytes;
-+                      offset = 0;
-+              }
-+      }
-+
-+finish:
-+      return return_length;
-+out:
-+      return 0;
-+}
-+
-+
-+static int get_fragment_location(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET(fragment);
-+      struct squashfs_fragment_entry fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment)
-+{
-+      down(&msblk->fragment_mutex);
-+      fragment->locked --;
-+      wake_up(&msblk->fragment_wait_queue);
-+      up(&msblk->fragment_mutex);
-+}
-+
-+
-+SQSH_EXTERN struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length)
-+{
-+      int i, n, nf;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+
-+      while ( 1 ) {
-+              down(&msblk->fragment_mutex);
-+
-+              for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS &&
-+                              msblk->fragment[i].block != start_block; i++);
-+
-+              if (i == SQUASHFS_CACHED_FRAGMENTS) {
-+                      nf = (msblk->next_fragment + 1) % 
-+                              SQUASHFS_CACHED_FRAGMENTS;
-+                      for (i = msblk->next_fragment, n =
-+                              SQUASHFS_CACHED_FRAGMENTS; n &&
-+                              msblk->fragment[i].locked; n--, i = (i + 1) %
-+                              SQUASHFS_CACHED_FRAGMENTS);
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->fragment_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              continue;
-+                      }
-+                      msblk->next_fragment = nf;
-+                      
-+                      if (msblk->fragment[i].data == NULL)
-+                              if (!(msblk->fragment[i].data = SQUASHFS_ALLOC
-+                                              (SQUASHFS_FILE_MAX_SIZE))) {
-+                                      ERROR("Failed to allocate fragment "
-+                                                      "cache block\n");
-+                                      up(&msblk->fragment_mutex);
-+                                      goto out;
-+                              }
-+
-+                      msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+                      msblk->fragment[i].locked = 1;
-+                      up(&msblk->fragment_mutex);
-+
-+                      if (!(msblk->fragment[i].length = squashfs_read_data(s,
-+                                              msblk->fragment[i].data,
-+                                              start_block, length, NULL))) {
-+                              ERROR("Unable to read fragment cache block "
-+                                                      "[%llx]\n", start_block);
-+                              msblk->fragment[i].locked = 0;
-+                              goto out;
-+                      }
-+
-+                      msblk->fragment[i].block = start_block;
-+                      TRACE("New fragment %d, start block %lld, locked %d\n",
-+                                              i, msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+                      break;
-+              }
-+
-+              msblk->fragment[i].locked++;
-+              up(&msblk->fragment_mutex);
-+              TRACE("Got fragment %d, start block %lld, locked %d\n", i,
-+                                              msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+              break;
-+      }
-+
-+      return &msblk->fragment[i];
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header *inodeb)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = inodeb->inode_number;
-+              i->i_mtime.tv_sec = inodeb->mtime;
-+              i->i_atime.tv_sec = inodeb->mtime;
-+              i->i_ctime.tv_sec = inodeb->mtime;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header id, sid;
-+      struct squashfs_base_inode_header *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_reg_inode_header *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header *sinodep = &sid.reg;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = 1;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_LREG_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_lreg_inode_header *inodep = &id.lreg;
-+                      struct squashfs_lreg_inode_header *sinodep = &sid.lreg;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LREG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header *sinodep =
-+                                                              &sid.symlink;
-+      
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      struct squashfs_ipc_inode_header *inodep = &id.ipc;
-+                      struct squashfs_ipc_inode_header *sinodep = &sid.ipc;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_IPC_INODE_HEADER(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+      
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%llx:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int read_fragment_index_table(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      /* Allocate fragment index table */
-+      if (!(msblk->fragment_index = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+   
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              long long fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment),
-+                                              &msblk->fragment_index[i], 1);
-+                      msblk->fragment_index[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int supported_squashfs_filesystem(struct squashfs_sb_info *msblk, int silent)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget;
-+      msblk->read_blocklist = read_blocklist;
-+      msblk->read_fragment_index_table = read_fragment_index_table;
-+
-+      if (sblk->s_major == 1) {
-+              if (!squashfs_1_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 1.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if (sblk->s_major == 2) {
-+              if (!squashfs_2_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 2.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor >
-+                      SQUASHFS_MINOR) {
-+              SERROR("Major/Minor mismatch, trying to mount newer %d.%d "
-+                              "filesystem\n", sblk->s_major, sblk->s_minor);
-+              SERROR("Please update your kernel\n");
-+              return 0;
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int squashfs_fill_super(struct super_block *s, void *data, int silent)
-+{
-+      struct squashfs_sb_info *msblk;
-+      struct squashfs_super_block *sblk;
-+      int i;
-+      char b[BDEVNAME_SIZE];
-+      struct inode *root;
-+
-+      TRACE("Entered squashfs_read_superblock\n");
-+
-+      if (!(s->s_fs_info = kmalloc(sizeof(struct squashfs_sb_info),
-+                                              GFP_KERNEL))) {
-+              ERROR("Failed to allocate superblock\n");
-+              goto failure;
-+      }
-+      memset(s->s_fs_info, 0, sizeof(struct squashfs_sb_info));
-+      msblk = s->s_fs_info;
-+      sblk = &msblk->sblk;
-+      
-+      msblk->devblksize = sb_min_blocksize(s, BLOCK_SIZE);
-+      msblk->devblksize_log2 = ffz(~msblk->devblksize);
-+
-+      init_MUTEX(&msblk->read_data_mutex);
-+      init_MUTEX(&msblk->read_page_mutex);
-+      init_MUTEX(&msblk->block_cache_mutex);
-+      init_MUTEX(&msblk->fragment_mutex);
-+      init_MUTEX(&msblk->meta_index_mutex);
-+      
-+      init_waitqueue_head(&msblk->waitq);
-+      init_waitqueue_head(&msblk->fragment_wait_queue);
-+
-+      if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START,
-+                                      sizeof(struct squashfs_super_block) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              SERROR("unable to read superblock\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Check it is a SQUASHFS superblock */
-+      msblk->swap = 0;
-+      if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) {
-+              if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) {
-+                      struct squashfs_super_block ssblk;
-+
-+                      WARNING("Mounting a different endian SQUASHFS "
-+                              "filesystem on %s\n", bdevname(s->s_bdev, b));
-+
-+                      SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk);
-+                      memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block));
-+                      msblk->swap = 1;
-+              } else  {
-+                      SERROR("Can't find a SQUASHFS superblock on %s\n",
-+                                                      bdevname(s->s_bdev, b));
-+                      goto failed_mount;
-+              }
-+      }
-+
-+      /* Check the MAJOR & MINOR versions */
-+      if(!supported_squashfs_filesystem(msblk, silent))
-+              goto failed_mount;
-+
-+      TRACE("Found valid superblock on %s\n", bdevname(s->s_bdev, b));
-+      TRACE("Inodes are %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_INODES
-+                                      (sblk->flags) ? "un" : "");
-+      TRACE("Data is %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_DATA(sblk->flags)
-+                                      ? "un" : "");
-+      TRACE("Check data is %s present in the filesystem\n",
-+                                      SQUASHFS_CHECK_DATA(sblk->flags) ?
-+                                      "" : "not");
-+      TRACE("Filesystem size %lld bytes\n", sblk->bytes_used);
-+      TRACE("Block size %d\n", sblk->block_size);
-+      TRACE("Number of inodes %d\n", sblk->inodes);
-+      if (sblk->s_major > 1)
-+              TRACE("Number of fragments %d\n", sblk->fragments);
-+      TRACE("Number of uids %d\n", sblk->no_uids);
-+      TRACE("Number of gids %d\n", sblk->no_guids);
-+      TRACE("sblk->inode_table_start %llx\n", sblk->inode_table_start);
-+      TRACE("sblk->directory_table_start %llx\n", sblk->directory_table_start);
-+      if (sblk->s_major > 1)
-+              TRACE("sblk->fragment_table_start %llx\n",
-+                                      sblk->fragment_table_start);
-+      TRACE("sblk->uid_start %llx\n", sblk->uid_start);
-+
-+      s->s_flags |= MS_RDONLY;
-+      s->s_op = &squashfs_ops;
-+
-+      /* Init inode_table block pointer array */
-+      if (!(msblk->block_cache = kmalloc(sizeof(struct squashfs_cache) *
-+                                      SQUASHFS_CACHED_BLKS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+              msblk->block_cache[i].block = SQUASHFS_INVALID_BLK;
-+
-+      msblk->next_cache = 0;
-+
-+      /* Allocate read_data block */
-+      msblk->read_size = (sblk->block_size < SQUASHFS_METADATA_SIZE) ?
-+                                      SQUASHFS_METADATA_SIZE :
-+                                      sblk->block_size;
-+
-+      if (!(msblk->read_data = kmalloc(msblk->read_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_data block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate read_page block */
-+      if (!(msblk->read_page = kmalloc(sblk->block_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_page block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate uid and gid tables */
-+      if (!(msblk->uid = kmalloc((sblk->no_uids + sblk->no_guids) *
-+                                      sizeof(unsigned int), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              goto failed_mount;
-+      }
-+      msblk->guid = msblk->uid + sblk->no_uids;
-+   
-+      if (msblk->swap) {
-+              unsigned int suid[sblk->no_uids + sblk->no_guids];
-+
-+              if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+              SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids +
-+                      sblk->no_guids), (sizeof(unsigned int) * 8));
-+      } else
-+              if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+
-+      if (sblk->s_major == 1 && squashfs_1_0_supported(msblk))
-+              goto allocate_root;
-+
-+      if (!(msblk->fragment = kmalloc(sizeof(struct squashfs_fragment_cache) *
-+                              SQUASHFS_CACHED_FRAGMENTS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate fragment block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) {
-+              msblk->fragment[i].locked = 0;
-+              msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+              msblk->fragment[i].data = NULL;
-+      }
-+
-+      msblk->next_fragment = 0;
-+
-+      /* Allocate fragment index table */
-+      if (msblk->read_fragment_index_table(s) == 0)
-+              goto failed_mount;
-+
-+allocate_root:
-+      if ((root = (msblk->iget)(s, sblk->root_inode)) == NULL)
-+              goto failed_mount;
-+
-+      if ((s->s_root = d_alloc_root(root)) == NULL) {
-+              ERROR("Root inode create failed\n");
-+              iput(root);
-+              goto failed_mount;
-+      }
-+
-+      TRACE("Leaving squashfs_read_super\n");
-+      return 0;
-+
-+failed_mount:
-+      kfree(msblk->fragment_index);
-+      kfree(msblk->fragment);
-+      kfree(msblk->uid);
-+      kfree(msblk->read_page);
-+      kfree(msblk->read_data);
-+      kfree(msblk->block_cache);
-+      kfree(msblk->fragment_index_2);
-+      kfree(s->s_fs_info);
-+      s->s_fs_info = NULL;
-+      return -EINVAL;
-+
-+failure:
-+      return -ENOMEM;
-+}
-+
-+
-+static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf)
-+{
-+      struct super_block *s = dentry->d_sb;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      TRACE("Entered squashfs_statfs\n");
-+
-+      buf->f_type = SQUASHFS_MAGIC;
-+      buf->f_bsize = sblk->block_size;
-+      buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1;
-+      buf->f_bfree = buf->f_bavail = 0;
-+      buf->f_files = sblk->inodes;
-+      buf->f_ffree = 0;
-+      buf->f_namelen = SQUASHFS_NAME_LEN;
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_symlink_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      int index = page->index << PAGE_CACHE_SHIFT, length, bytes;
-+      long long block = SQUASHFS_I(inode)->start_block;
-+      int offset = SQUASHFS_I(inode)->offset;
-+      void *pageaddr = kmap(page);
-+
-+      TRACE("Entered squashfs_symlink_readpage, page index %ld, start block "
-+                              "%llx, offset %x\n", page->index,
-+                              SQUASHFS_I(inode)->start_block,
-+                              SQUASHFS_I(inode)->offset);
-+
-+      for (length = 0; length < index; length += bytes) {
-+              if (!(bytes = squashfs_get_cached_block(inode->i_sb, NULL,
-+                              block, offset, PAGE_CACHE_SIZE, &block,
-+                              &offset))) {
-+                      ERROR("Unable to read symbolic link [%llx:%x]\n", block,
-+                                      offset);
-+                      goto skip_read;
-+              }
-+      }
-+
-+      if (length != index) {
-+              ERROR("(squashfs_symlink_readpage) length != index\n");
-+              bytes = 0;
-+              goto skip_read;
-+      }
-+
-+      bytes = (i_size_read(inode) - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE :
-+                                      i_size_read(inode) - length;
-+
-+      if (!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block,
-+                                      offset, bytes, &block, &offset)))
-+              ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset);
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+struct meta_index *locate_meta_index(struct inode *inode, int index, int offset)
-+{
-+      struct meta_index *meta = NULL;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("locate_meta_index: index %d, offset %d\n", index, offset);
-+
-+      if(msblk->meta_index == NULL)
-+              goto not_allocated;
-+
-+      for (i = 0; i < SQUASHFS_META_NUMBER; i ++)
-+              if (msblk->meta_index[i].inode_number == inode->i_ino &&
-+                              msblk->meta_index[i].offset >= offset &&
-+                              msblk->meta_index[i].offset <= index &&
-+                              msblk->meta_index[i].locked == 0) {
-+                      TRACE("locate_meta_index: entry %d, offset %d\n", i,
-+                                      msblk->meta_index[i].offset);
-+                      meta = &msblk->meta_index[i];
-+                      offset = meta->offset;
-+              }
-+
-+      if (meta)
-+              meta->locked = 1;
-+
-+not_allocated:
-+      up(&msblk->meta_index_mutex);
-+
-+      return meta;
-+}
-+
-+
-+struct meta_index *empty_meta_index(struct inode *inode, int offset, int skip)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct meta_index *meta = NULL;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("empty_meta_index: offset %d, skip %d\n", offset, skip);
-+
-+      if(msblk->meta_index == NULL) {
-+              if (!(msblk->meta_index = kmalloc(sizeof(struct meta_index) *
-+                                      SQUASHFS_META_NUMBER, GFP_KERNEL))) {
-+                      ERROR("Failed to allocate meta_index\n");
-+                      goto failed;
-+              }
-+              for(i = 0; i < SQUASHFS_META_NUMBER; i++) {
-+                      msblk->meta_index[i].inode_number = 0;
-+                      msblk->meta_index[i].locked = 0;
-+              }
-+              msblk->next_meta_index = 0;
-+      }
-+
-+      for(i = SQUASHFS_META_NUMBER; i &&
-+                      msblk->meta_index[msblk->next_meta_index].locked; i --)
-+              msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      if(i == 0) {
-+              TRACE("empty_meta_index: failed!\n");
-+              goto failed;
-+      }
-+
-+      TRACE("empty_meta_index: returned meta entry %d, %p\n",
-+                      msblk->next_meta_index,
-+                      &msblk->meta_index[msblk->next_meta_index]);
-+
-+      meta = &msblk->meta_index[msblk->next_meta_index];
-+      msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      meta->inode_number = inode->i_ino;
-+      meta->offset = offset;
-+      meta->skip = skip;
-+      meta->entries = 0;
-+      meta->locked = 1;
-+
-+failed:
-+      up(&msblk->meta_index_mutex);
-+      return meta;
-+}
-+
-+
-+void release_meta_index(struct inode *inode, struct meta_index *meta)
-+{
-+      meta->locked = 0;
-+}
-+
-+
-+static int read_block_index(struct super_block *s, int blocks, char *block_list,
-+              long long *start_block, int *offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned int *block_listp;
-+      int block = 0;
-+      
-+      if (msblk->swap) {
-+              char sblock_list[blocks << 2];
-+
-+              if (!squashfs_get_cached_block(s, sblock_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+              SQUASHFS_SWAP_INTS(((unsigned int *)block_list),
-+                              ((unsigned int *)sblock_list), blocks);
-+      } else
-+              if (!squashfs_get_cached_block(s, block_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+
-+      for (block_listp = (unsigned int *) block_list; blocks;
-+                              block_listp++, blocks --)
-+              block += SQUASHFS_COMPRESSED_SIZE_BLOCK(*block_listp);
-+
-+      return block;
-+
-+failure:
-+      return -1;
-+}
-+
-+
-+#define SIZE 256
-+
-+static inline int calculate_skip(int blocks) {
-+      int skip = (blocks - 1) / ((SQUASHFS_SLOTS * SQUASHFS_META_ENTRIES + 1) * SQUASHFS_META_INDEXES);
-+      return skip >= 7 ? 7 : skip + 1;
-+}
-+
-+
-+static int get_meta_index(struct inode *inode, int index,
-+              long long *index_block, int *index_offset,
-+              long long *data_block, char *block_list)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int skip = calculate_skip(i_size_read(inode) >> sblk->block_log);
-+      int offset = 0;
-+      struct meta_index *meta;
-+      struct meta_entry *meta_entry;
-+      long long cur_index_block = SQUASHFS_I(inode)->u.s1.block_list_start;
-+      int cur_offset = SQUASHFS_I(inode)->offset;
-+      long long cur_data_block = SQUASHFS_I(inode)->start_block;
-+      int i;
-+ 
-+      index /= SQUASHFS_META_INDEXES * skip;
-+
-+      while ( offset < index ) {
-+              meta = locate_meta_index(inode, index, offset + 1);
-+
-+              if (meta == NULL) {
-+                      if ((meta = empty_meta_index(inode, offset + 1,
-+                                                      skip)) == NULL)
-+                              goto all_done;
-+              } else {
-+                      offset = index < meta->offset + meta->entries ? index :
-+                              meta->offset + meta->entries - 1;
-+                      meta_entry = &meta->meta_entry[offset - meta->offset];
-+                      cur_index_block = meta_entry->index_block + sblk->inode_table_start;
-+                      cur_offset = meta_entry->offset;
-+                      cur_data_block = meta_entry->data_block;
-+                      TRACE("get_meta_index: offset %d, meta->offset %d, "
-+                              "meta->entries %d\n", offset, meta->offset,
-+                              meta->entries);
-+                      TRACE("get_meta_index: index_block 0x%llx, offset 0x%x"
-+                              " data_block 0x%llx\n", cur_index_block,
-+                              cur_offset, cur_data_block);
-+              }
-+
-+              for (i = meta->offset + meta->entries; i <= index &&
-+                              i < meta->offset + SQUASHFS_META_ENTRIES; i++) {
-+                      int blocks = skip * SQUASHFS_META_INDEXES;
-+
-+                      while (blocks) {
-+                              int block = blocks > (SIZE >> 2) ? (SIZE >> 2) :
-+                                      blocks;
-+                              int res = read_block_index(inode->i_sb, block,
-+                                      block_list, &cur_index_block,
-+                                      &cur_offset);
-+
-+                              if (res == -1)
-+                                      goto failed;
-+
-+                              cur_data_block += res;
-+                              blocks -= block;
-+                      }
-+
-+                      meta_entry = &meta->meta_entry[i - meta->offset];
-+                      meta_entry->index_block = cur_index_block - sblk->inode_table_start;
-+                      meta_entry->offset = cur_offset;
-+                      meta_entry->data_block = cur_data_block;
-+                      meta->entries ++;
-+                      offset ++;
-+              }
-+
-+              TRACE("get_meta_index: meta->offset %d, meta->entries %d\n",
-+                              meta->offset, meta->entries);
-+
-+              release_meta_index(inode, meta);
-+      }
-+
-+all_done:
-+      *index_block = cur_index_block;
-+      *index_offset = cur_offset;
-+      *data_block = cur_data_block;
-+
-+      return offset * SQUASHFS_META_INDEXES * skip;
-+
-+failed:
-+      release_meta_index(inode, meta);
-+      return -1;
-+}
-+
-+
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize)
-+{
-+      long long block_ptr;
-+      int offset;
-+      long long block;
-+      int res = get_meta_index(inode, index, &block_ptr, &offset, &block,
-+              block_list);
-+
-+      TRACE("read_blocklist: res %d, index %d, block_ptr 0x%llx, offset"
-+                     " 0x%x, block 0x%llx\n", res, index, block_ptr, offset,
-+                     block);
-+
-+      if(res == -1)
-+              goto failure;
-+
-+      index -= res;
-+
-+      while ( index ) {
-+              int blocks = index > (SIZE >> 2) ? (SIZE >> 2) : index;
-+              int res = read_block_index(inode->i_sb, blocks, block_list,
-+                      &block_ptr, &offset);
-+              if (res == -1)
-+                      goto failure;
-+              block += res;
-+              index -= blocks;
-+      }
-+
-+      if (read_block_index(inode->i_sb, 1, block_list,
-+                      &block_ptr, &offset) == -1)
-+              goto failure;
-+      *bsize = *((unsigned int *) block_list);
-+
-+      return block;
-+
-+failure:
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, i = 0, bytes = 0, byte_offset = 0;
-+      int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT);
-+      void *pageaddr;
-+      struct squashfs_fragment_cache *fragment = NULL;
-+      char *data_ptr = msblk->read_page;
-+      
-+      int mask = (1 << (sblk->block_log - PAGE_CACHE_SHIFT)) - 1;
-+      int start_index = page->index & ~mask;
-+      int end_index = start_index | mask;
-+
-+      TRACE("Entered squashfs_readpage, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT))
-+              goto skip_read;
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              if ((block = (msblk->read_blocklist)(inode, index, 1,
-+                                      block_list, NULL, &bsize)) == 0)
-+                      goto skip_read;
-+
-+              down(&msblk->read_page_mutex);
-+              
-+              if (!(bytes = squashfs_read_data(inode->i_sb, msblk->read_page,
-+                                      block, bsize, NULL))) {
-+                      ERROR("Unable to read page, block %llx, size %x\n", block,
-+                                      bsize);
-+                      up(&msblk->read_page_mutex);
-+                      goto skip_read;
-+              }
-+      } else {
-+              if ((fragment = get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)->u.s1.fragment_size))
-+                                      == NULL) {
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      (int) SQUASHFS_I(inode)->
-+                                      u.s1.fragment_size);
-+                      goto skip_read;
-+              }
-+              bytes = SQUASHFS_I(inode)->u.s1.fragment_offset +
-+                                      (i_size_read(inode) & (sblk->block_size
-+                                      - 1));
-+              byte_offset = SQUASHFS_I(inode)->u.s1.fragment_offset;
-+              data_ptr = fragment->data;
-+      }
-+
-+      for (i = start_index; i <= end_index && byte_offset < bytes;
-+                                      i++, byte_offset += PAGE_CACHE_SIZE) {
-+              struct page *push_page;
-+              int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ?
-+                                      PAGE_CACHE_SIZE : bytes - byte_offset;
-+
-+              TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n",
-+                                      bytes, i, byte_offset, available_bytes);
-+
-+              if (i == page->index)  {
-+                      pageaddr = kmap_atomic(page, KM_USER0);
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(page);
-+                      SetPageUptodate(page);
-+                      unlock_page(page);
-+              } else if ((push_page =
-+                              grab_cache_page_nowait(page->mapping, i))) {
-+                      pageaddr = kmap_atomic(push_page, KM_USER0);
-+
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(push_page);
-+                      SetPageUptodate(push_page);
-+                      unlock_page(push_page);
-+                      page_cache_release(push_page);
-+              }
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log))
-+              up(&msblk->read_page_mutex);
-+      else
-+              release_cached_fragment(msblk, fragment);
-+
-+      return 0;
-+
-+skip_read:
-+      pageaddr = kmap_atomic(page, KM_USER0);
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage4K(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, bytes = 0;
-+      void *pageaddr;
-+      
-+      TRACE("Entered squashfs_readpage4K, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT)) {
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              goto skip_read;
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || page->index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              block = (msblk->read_blocklist)(inode, page->index, 1,
-+                                      block_list, NULL, &bsize);
-+
-+              down(&msblk->read_page_mutex);
-+              bytes = squashfs_read_data(inode->i_sb, msblk->read_page, block,
-+                                      bsize, NULL);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (bytes)
-+                      memcpy(pageaddr, msblk->read_page, bytes);
-+              else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      block, bsize);
-+              up(&msblk->read_page_mutex);
-+      } else {
-+              struct squashfs_fragment_cache *fragment =
-+                      get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (fragment) {
-+                      bytes = i_size_read(inode) & (sblk->block_size - 1);
-+                      memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)->
-+                                      u.s1.fragment_offset, bytes);
-+                      release_cached_fragment(msblk, fragment);
-+              } else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block, (int)
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+      }
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long 
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      f_pos =- 3;
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length + 3;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index *index = (struct squashfs_dir_index *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length + 3;
-+}
-+
-+              
-+static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_readdir [%llx:%x]\n", next_block, next_offset);
-+
-+      while(file->f_pos < 3) {
-+              char *name;
-+              int size, i_ino;
-+
-+              if(file->f_pos == 0) {
-+                      name = ".";
-+                      size = 1;
-+                      i_ino = i->i_ino;
-+              } else {
-+                      name = "..";
-+                      size = 2;
-+                      i_ino = SQUASHFS_I(i)->u.s2.parent_inode;
-+              }
-+              TRACE("Calling filldir(%x, %s, %d, %d, %d, %d)\n",
-+                              (unsigned int) dirent, name, size, (int)
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]);
-+
-+              if (filldir(dirent, name, size,
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]) < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+              }
-+              file->f_pos += size;
-+              dirs_read++;
-+      }
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+                      
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %d\n", name,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+static void squashfs_put_super(struct super_block *s)
-+{
-+      int i;
-+
-+      if (s->s_fs_info) {
-+              struct squashfs_sb_info *sbi = s->s_fs_info;
-+              if (sbi->block_cache)
-+                      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+                              if (sbi->block_cache[i].block !=
-+                                                      SQUASHFS_INVALID_BLK)
-+                                      kfree(sbi->block_cache[i].data);
-+              if (sbi->fragment)
-+                      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) 
-+                              SQUASHFS_FREE(sbi->fragment[i].data);
-+              kfree(sbi->fragment);
-+              kfree(sbi->block_cache);
-+              kfree(sbi->read_data);
-+              kfree(sbi->read_page);
-+              kfree(sbi->uid);
-+              kfree(sbi->fragment_index);
-+              kfree(sbi->fragment_index_2);
-+              kfree(sbi->meta_index);
-+              kfree(s->s_fs_info);
-+              s->s_fs_info = NULL;
-+      }
-+}
-+
-+
-+static int squashfs_get_sb(struct file_system_type *fs_type,
-+                              int flags, const char *dev_name, void *data, struct vfsmount *mnt)
-+{
-+      return get_sb_bdev(fs_type, flags, dev_name, data, squashfs_fill_super, mnt);
-+}
-+
-+
-+static int __init init_squashfs_fs(void)
-+{
-+      int err = init_inodecache();
-+      if (err)
-+              goto out;
-+
-+      printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
-+              "Phillip Lougher\n");
-+
-+      if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
-+              ERROR("Failed to allocate zlib workspace\n");
-+              destroy_inodecache();
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      if ((err = register_filesystem(&squashfs_fs_type))) {
-+              vfree(stream.workspace);
-+              destroy_inodecache();
-+      }
-+
-+out:
-+      return err;
-+}
-+
-+
-+static void __exit exit_squashfs_fs(void)
-+{
-+      vfree(stream.workspace);
-+      unregister_filesystem(&squashfs_fs_type);
-+      destroy_inodecache();
-+}
-+
-+
-+static kmem_cache_t * squashfs_inode_cachep;
-+
-+
-+static struct inode *squashfs_alloc_inode(struct super_block *sb)
-+{
-+      struct squashfs_inode_info *ei;
-+      ei = kmem_cache_alloc(squashfs_inode_cachep, GFP_KERNEL);
-+      if (!ei)
-+              return NULL;
-+      return &ei->vfs_inode;
-+}
-+
-+
-+static void squashfs_destroy_inode(struct inode *inode)
-+{
-+      kmem_cache_free(squashfs_inode_cachep, SQUASHFS_I(inode));
-+}
-+
-+
-+static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
-+{
-+      struct squashfs_inode_info *ei = foo;
-+
-+      if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
-+                                                      SLAB_CTOR_CONSTRUCTOR)
-+              inode_init_once(&ei->vfs_inode);
-+}
-+ 
-+
-+static int __init init_inodecache(void)
-+{
-+      squashfs_inode_cachep = kmem_cache_create("squashfs_inode_cache",
-+           sizeof(struct squashfs_inode_info),
-+           0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT,
-+           init_once, NULL);
-+      if (squashfs_inode_cachep == NULL)
-+              return -ENOMEM;
-+      return 0;
-+}
-+
-+
-+static void destroy_inodecache(void)
-+{
-+      kmem_cache_destroy(squashfs_inode_cachep);
-+}
-+
-+
-+module_init(init_squashfs_fs);
-+module_exit(exit_squashfs_fs);
-+MODULE_DESCRIPTION("squashfs, a compressed read-only filesystem");
-+MODULE_AUTHOR("Phillip Lougher <phillip@lougher.org.uk>");
-Index: git/fs/squashfs/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/fs/squashfs/Makefile   2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,7 @@
-+#
-+# Makefile for the linux squashfs routines.
-+#
-+
-+obj-$(CONFIG_SQUASHFS) += squashfs.o
-+squashfs-y += inode.o
-+squashfs-y += squashfs2_0.o
-Index: git/fs/squashfs/squashfs2_0.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/fs/squashfs/squashfs2_0.c      2006-11-01 18:01:49.000000000 +0000
-@@ -0,0 +1,757 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs2_0.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir);
-+static struct dentry *squashfs_lookup_2(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+
-+static struct file_operations squashfs_dir_ops_2 = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir_2
-+};
-+
-+static struct inode_operations squashfs_dir_inode_ops_2 = {
-+      .lookup = squashfs_lookup_2
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static int read_fragment_index_table_2(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      if (!(msblk->fragment_index_2 = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+   
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES_2(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index_2,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              unsigned int fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES_2(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES_2((&fragment),
-+                                              &msblk->fragment_index_2[i], 1);
-+                      msblk->fragment_index_2[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int get_fragment_location_2(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index_2[SQUASHFS_FRAGMENT_INDEX_2(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET_2(fragment);
-+      struct squashfs_fragment_entry_2 fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry_2 sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY_2(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header_2 *inodeb, unsigned int ino)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = ino;
-+              i->i_mtime.tv_sec = sblk->mkfs_time;
-+              i->i_atime.tv_sec = sblk->mkfs_time;
-+              i->i_ctime.tv_sec = sblk->mkfs_time;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_nlink = 1;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget_2(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned int block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      unsigned int ino = SQUASHFS_MK_VFS_INODE(block
-+              - sblk->inode_table_start, offset);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header_2 id, sid;
-+      struct squashfs_base_inode_header_2 *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER_2(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      struct squashfs_reg_inode_header_2 *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header_2 *sinodep = &sid.reg;
-+                      long long frag_blk;
-+                      unsigned int frag_size;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location_2(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %x, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header_2 *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header_2 *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header_2 *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header_2 *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER_2(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header_2 *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header_2 *sinodep =
-+                                                              &sid.symlink;
-+      
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header_2 *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header_2 *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER_2(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+      
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%x:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long 
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index_2 index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index_2 *index = (struct squashfs_dir_index_2 *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index_2),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length;
-+}
-+
-+              
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+
-+      TRACE("Entered squashfs_readdir_2 [%llx:%x]\n", next_block, next_offset);
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+                      
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos, SQUASHFS_MK_VFS_INODE(
-+                                      dirh.start_block, dire->offset),
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup_2(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+      int sorted = sblk->s_major == 2 && sblk->s_minor >= 1;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (sorted && name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %lld\n", name,
-+                                      dirh.start_block, dire->offset, ino);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget_2;
-+      msblk->read_fragment_index_table = read_fragment_index_table_2;
-+
-+      sblk->bytes_used = sblk->bytes_used_2;
-+      sblk->uid_start = sblk->uid_start_2;
-+      sblk->guid_start = sblk->guid_start_2;
-+      sblk->inode_table_start = sblk->inode_table_start_2;
-+      sblk->directory_table_start = sblk->directory_table_start_2;
-+      sblk->fragment_table_start = sblk->fragment_table_start_2;
-+
-+      return 1;
-+}
-Index: git/fs/squashfs/squashfs.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/fs/squashfs/squashfs.h 2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,86 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs.h
-+ */
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#undef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#endif
-+
-+#ifdef SQUASHFS_TRACE
-+#define TRACE(s, args...)     printk(KERN_NOTICE "SQUASHFS: "s, ## args)
-+#else
-+#define TRACE(s, args...)     {}
-+#endif
-+
-+#define ERROR(s, args...)     printk(KERN_ERR "SQUASHFS error: "s, ## args)
-+
-+#define SERROR(s, args...)    do { \
-+                              if (!silent) \
-+                              printk(KERN_ERR "SQUASHFS error: "s, ## args);\
-+                              } while(0)
-+
-+#define WARNING(s, args...)   printk(KERN_WARNING "SQUASHFS: "s, ## args)
-+
-+static inline struct squashfs_inode_info *SQUASHFS_I(struct inode *inode)
-+{
-+      return list_entry(inode, struct squashfs_inode_info, vfs_inode);
-+}
-+
-+#if defined(CONFIG_SQUASHFS_1_0_COMPATIBILITY ) || defined(CONFIG_SQUASHFS_2_0_COMPATIBILITY)
-+#define SQSH_EXTERN
-+extern unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                              long long index, unsigned int length,
-+                              long long *next_index);
-+extern int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset);
-+extern void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment);
-+extern struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length);
-+extern struct address_space_operations squashfs_symlink_aops;
-+extern struct address_space_operations squashfs_aops;
-+extern struct address_space_operations squashfs_aops_4K;
-+extern struct inode_operations squashfs_dir_inode_ops;
-+#else
-+#define SQSH_EXTERN static
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+extern int squashfs_1_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_1_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+extern int squashfs_2_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
-Index: git/include/linux/squashfs_fs.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/include/linux/squashfs_fs.h    2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,911 @@
-+#ifndef SQUASHFS_FS
-+#define SQUASHFS_FS
-+
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs.h
-+ */
-+
-+#ifndef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#define CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#endif
-+
-+#ifdef        CONFIG_SQUASHFS_VMALLOC
-+#define SQUASHFS_ALLOC(a)             vmalloc(a)
-+#define SQUASHFS_FREE(a)              vfree(a)
-+#else
-+#define SQUASHFS_ALLOC(a)             kmalloc(a, GFP_KERNEL)
-+#define SQUASHFS_FREE(a)              kfree(a)
-+#endif
-+#define SQUASHFS_CACHED_FRAGMENTS     CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE     
-+#define SQUASHFS_MAJOR                        3
-+#define SQUASHFS_MINOR                        0
-+#define SQUASHFS_MAGIC                        0x73717368
-+#define SQUASHFS_MAGIC_SWAP           0x68737173
-+#define SQUASHFS_START                        0
-+
-+/* size of metadata (inode and directory) blocks */
-+#define SQUASHFS_METADATA_SIZE                8192
-+#define SQUASHFS_METADATA_LOG         13
-+
-+/* default size of data blocks */
-+#define SQUASHFS_FILE_SIZE            65536
-+#define SQUASHFS_FILE_LOG             16
-+
-+#define SQUASHFS_FILE_MAX_SIZE                65536
-+
-+/* Max number of uids and gids */
-+#define SQUASHFS_UIDS                 256
-+#define SQUASHFS_GUIDS                        255
-+
-+/* Max length of filename (not 255) */
-+#define SQUASHFS_NAME_LEN             256
-+
-+#define SQUASHFS_INVALID              ((long long) 0xffffffffffff)
-+#define SQUASHFS_INVALID_FRAG         ((unsigned int) 0xffffffff)
-+#define SQUASHFS_INVALID_BLK          ((long long) -1)
-+#define SQUASHFS_USED_BLK             ((long long) -2)
-+
-+/* Filesystem flags */
-+#define SQUASHFS_NOI                  0
-+#define SQUASHFS_NOD                  1
-+#define SQUASHFS_CHECK                        2
-+#define SQUASHFS_NOF                  3
-+#define SQUASHFS_NO_FRAG              4
-+#define SQUASHFS_ALWAYS_FRAG          5
-+#define SQUASHFS_DUPLICATE            6
-+
-+#define SQUASHFS_BIT(flag, bit)               ((flag >> bit) & 1)
-+
-+#define SQUASHFS_UNCOMPRESSED_INODES(flags)   SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOI)
-+
-+#define SQUASHFS_UNCOMPRESSED_DATA(flags)     SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOD)
-+
-+#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags)        SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOF)
-+
-+#define SQUASHFS_NO_FRAGMENTS(flags)          SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NO_FRAG)
-+
-+#define SQUASHFS_ALWAYS_FRAGMENTS(flags)      SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_ALWAYS_FRAG)
-+
-+#define SQUASHFS_DUPLICATES(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_DUPLICATE)
-+
-+#define SQUASHFS_CHECK_DATA(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_CHECK)
-+
-+#define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, \
-+              duplicate_checking)     (noi | (nod << 1) | (check_data << 2) \
-+              | (nof << 3) | (no_frag << 4) | (always_frag << 5) | \
-+              (duplicate_checking << 6))
-+
-+/* Max number of types and file types */
-+#define SQUASHFS_DIR_TYPE             1
-+#define SQUASHFS_FILE_TYPE            2
-+#define SQUASHFS_SYMLINK_TYPE         3
-+#define SQUASHFS_BLKDEV_TYPE          4
-+#define SQUASHFS_CHRDEV_TYPE          5
-+#define SQUASHFS_FIFO_TYPE            6
-+#define SQUASHFS_SOCKET_TYPE          7
-+#define SQUASHFS_LDIR_TYPE            8
-+#define SQUASHFS_LREG_TYPE            9
-+
-+/* 1.0 filesystem type definitions */
-+#define SQUASHFS_TYPES                        5
-+#define SQUASHFS_IPC_TYPE             0
-+
-+/* Flag whether block is compressed or uncompressed, bit is set if block is
-+ * uncompressed */
-+#define SQUASHFS_COMPRESSED_BIT               (1 << 15)
-+
-+#define SQUASHFS_COMPRESSED_SIZE(B)   (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \
-+              (B) & ~SQUASHFS_COMPRESSED_BIT :  SQUASHFS_COMPRESSED_BIT)
-+
-+#define SQUASHFS_COMPRESSED(B)                (!((B) & SQUASHFS_COMPRESSED_BIT))
-+
-+#define SQUASHFS_COMPRESSED_BIT_BLOCK         (1 << 24)
-+
-+#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B)     (((B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? (B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK)
-+
-+#define SQUASHFS_COMPRESSED_BLOCK(B)  (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))
-+
-+/*
-+ * Inode number ops.  Inodes consist of a compressed block number, and an
-+ * uncompressed  offset within that block
-+ */
-+#define SQUASHFS_INODE_BLK(a)         ((unsigned int) ((a) >> 16))
-+
-+#define SQUASHFS_INODE_OFFSET(a)      ((unsigned int) ((a) & 0xffff))
-+
-+#define SQUASHFS_MKINODE(A, B)                ((squashfs_inode_t)(((squashfs_inode_t) (A)\
-+                                      << 16) + (B)))
-+
-+/* Compute 32 bit VFS inode number from squashfs inode number */
-+#define SQUASHFS_MK_VFS_INODE(a, b)   ((unsigned int) (((a) << 8) + \
-+                                      ((b) >> 2) + 1))
-+/* XXX */
-+
-+/* Translate between VFS mode and squashfs mode */
-+#define SQUASHFS_MODE(a)              ((a) & 0xfff)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES(A)    (A * sizeof(struct squashfs_fragment_entry))
-+
-+#define SQUASHFS_FRAGMENT_INDEX(A)    (SQUASHFS_FRAGMENT_BYTES(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A)     (SQUASHFS_FRAGMENT_BYTES(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES(A)  ((SQUASHFS_FRAGMENT_BYTES(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES(A)      (SQUASHFS_FRAGMENT_INDEXES(A) *\
-+                                              sizeof(long long))
-+
-+/* cached data constants for filesystem */
-+#define SQUASHFS_CACHED_BLKS          8
-+
-+#define SQUASHFS_MAX_FILE_SIZE_LOG    64
-+
-+#define SQUASHFS_MAX_FILE_SIZE                ((long long) 1 << \
-+                                      (SQUASHFS_MAX_FILE_SIZE_LOG - 2))
-+
-+#define SQUASHFS_MARKER_BYTE          0xff
-+
-+/* meta index cache */
-+#define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int))
-+#define SQUASHFS_META_ENTRIES 31
-+#define SQUASHFS_META_NUMBER  8
-+#define SQUASHFS_SLOTS                4
-+
-+struct meta_entry {
-+      long long               data_block;
-+      unsigned int            index_block;
-+      unsigned short          offset;
-+      unsigned short          pad;
-+};
-+
-+struct meta_index {
-+      unsigned int            inode_number;
-+      unsigned int            offset;
-+      unsigned short          entries;
-+      unsigned short          skip;
-+      unsigned short          locked;
-+      unsigned short          pad;
-+      struct meta_entry       meta_entry[SQUASHFS_META_ENTRIES];
-+};
-+
-+
-+/*
-+ * definitions for structures on disk
-+ */
-+
-+typedef long long             squashfs_block_t;
-+typedef long long             squashfs_inode_t;
-+
-+struct squashfs_super_block {
-+      unsigned int            s_magic;
-+      unsigned int            inodes;
-+      unsigned int            bytes_used_2;
-+      unsigned int            uid_start_2;
-+      unsigned int            guid_start_2;
-+      unsigned int            inode_table_start_2;
-+      unsigned int            directory_table_start_2;
-+      unsigned int            s_major:16;
-+      unsigned int            s_minor:16;
-+      unsigned int            block_size_1:16;
-+      unsigned int            block_log:16;
-+      unsigned int            flags:8;
-+      unsigned int            no_uids:8;
-+      unsigned int            no_guids:8;
-+      unsigned int            mkfs_time /* time of filesystem creation */;
-+      squashfs_inode_t        root_inode;
-+      unsigned int            block_size;
-+      unsigned int            fragments;
-+      unsigned int            fragment_table_start_2;
-+      long long               bytes_used;
-+      long long               uid_start;
-+      long long               guid_start;
-+      long long               inode_table_start;
-+      long long               directory_table_start;
-+      long long               fragment_table_start;
-+      long long               unused;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_index {
-+      unsigned int            index;
-+      unsigned int            start_block;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_BASE_INODE_HEADER            \
-+      unsigned int            inode_type:4;   \
-+      unsigned int            mode:12;        \
-+      unsigned int            uid:8;          \
-+      unsigned int            guid:8;         \
-+      unsigned int            mtime;          \
-+      unsigned int            inode_number;
-+
-+struct squashfs_base_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_lreg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      long long               file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            parent_inode;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            i_count:16;
-+      unsigned int            parent_inode;
-+      struct squashfs_dir_index       index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header {
-+      struct squashfs_base_inode_header       base;
-+      struct squashfs_dev_inode_header        dev;
-+      struct squashfs_symlink_inode_header    symlink;
-+      struct squashfs_reg_inode_header        reg;
-+      struct squashfs_lreg_inode_header       lreg;
-+      struct squashfs_dir_inode_header        dir;
-+      struct squashfs_ldir_inode_header       ldir;
-+      struct squashfs_ipc_inode_header        ipc;
-+};
-+      
-+struct squashfs_dir_entry {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      int                     inode_number:16;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_header {
-+      unsigned int            count:8;
-+      unsigned int            start_block;
-+      unsigned int            inode_number;
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry {
-+      long long               start_block;
-+      unsigned int            size;
-+      unsigned int            unused;
-+} __attribute__ ((packed));
-+
-+extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen);
-+extern int squashfs_uncompress_init(void);
-+extern int squashfs_uncompress_exit(void);
-+
-+/*
-+ * macros to convert each packed bitfield structure from little endian to big
-+ * endian and vice versa.  These are needed when creating or using a filesystem
-+ * on a machine with different byte ordering to the target architecture.
-+ *
-+ */
-+
-+#define SQUASHFS_SWAP_START \
-+      int bits;\
-+      int b_pos;\
-+      unsigned long long val;\
-+      unsigned char *s;\
-+      unsigned char *d;
-+
-+#define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_super_block));\
-+      SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->inodes, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used_2, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->uid_start_2, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->guid_start_2, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->inode_table_start_2, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->directory_table_start_2, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->s_major, d, 224, 16);\
-+      SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\
-+      SQUASHFS_SWAP((s)->block_size_1, d, 256, 16);\
-+      SQUASHFS_SWAP((s)->block_log, d, 272, 16);\
-+      SQUASHFS_SWAP((s)->flags, d, 288, 8);\
-+      SQUASHFS_SWAP((s)->no_uids, d, 296, 8);\
-+      SQUASHFS_SWAP((s)->no_guids, d, 304, 8);\
-+      SQUASHFS_SWAP((s)->mkfs_time, d, 312, 32);\
-+      SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\
-+      SQUASHFS_SWAP((s)->block_size, d, 408, 32);\
-+      SQUASHFS_SWAP((s)->fragments, d, 440, 32);\
-+      SQUASHFS_SWAP((s)->fragment_table_start_2, d, 472, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used, d, 504, 64);\
-+      SQUASHFS_SWAP((s)->uid_start, d, 568, 64);\
-+      SQUASHFS_SWAP((s)->guid_start, d, 632, 64);\
-+      SQUASHFS_SWAP((s)->inode_table_start, d, 696, 64);\
-+      SQUASHFS_SWAP((s)->directory_table_start, d, 760, 64);\
-+      SQUASHFS_SWAP((s)->fragment_table_start, d, 824, 64);\
-+      SQUASHFS_SWAP((s)->unused, d, 888, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 64, 32);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header))\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header)); \
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->rdev, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header));\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 224, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_lreg_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 128, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 224, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 256, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 147, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 192, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 155, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 168, 32);\
-+      SQUASHFS_SWAP((s)->i_count, d, 200, 16);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 216, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 64);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_SHORTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 2);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      16)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_INTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 4);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      32)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LONG_LONGS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      64)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DATA(s, d, n, bits) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * bits / 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      bits)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, bits);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+
-+struct squashfs_base_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            type:4;
-+      unsigned int            offset:4;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n) \
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 4);\
-+      SQUASHFS_SWAP((s)->guid, d, 20, 4);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header_1));\
-+      SQUASHFS_SWAP((s)->type, d, 24, 4);\
-+      SQUASHFS_SWAP((s)->offset, d, 28, 4);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_1));\
-+      SQUASHFS_SWAP((s)->rdev, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_1));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_1));\
-+      SQUASHFS_SWAP((s)->mtime, d, 24, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 88, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_1));\
-+      SQUASHFS_SWAP((s)->file_size, d, 24, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 43, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 88, 24);\
-+}
-+
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+
-+struct squashfs_dir_index_2 {
-+      unsigned int            index:27;
-+      unsigned int            start_block:29;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_base_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+      unsigned int            i_count:16;
-+      struct squashfs_dir_index_2     index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header_2 {
-+      struct squashfs_base_inode_header_2     base;
-+      struct squashfs_dev_inode_header_2      dev;
-+      struct squashfs_symlink_inode_header_2  symlink;
-+      struct squashfs_reg_inode_header_2      reg;
-+      struct squashfs_dir_inode_header_2      dir;
-+      struct squashfs_ldir_inode_header_2     ldir;
-+      struct squashfs_ipc_inode_header_2      ipc;
-+};
-+      
-+struct squashfs_dir_header_2 {
-+      unsigned int            count:8;
-+      unsigned int            start_block:24;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_entry_2 {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry_2 {
-+      unsigned int            start_block;
-+      unsigned int            size;
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_2(s, d) \
-+      SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, sizeof(struct squashfs_ipc_inode_header_2))
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_2)); \
-+      SQUASHFS_SWAP((s)->rdev, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_2));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_2));\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->fragment, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 160, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 51, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 59, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 72, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 104, 24);\
-+      SQUASHFS_SWAP((s)->i_count, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index_2));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 27);\
-+      SQUASHFS_SWAP((s)->start_block, d, 27, 29);\
-+      SQUASHFS_SWAP((s)->size, d, 56, 8);\
-+}
-+#define SQUASHFS_SWAP_DIR_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header_2));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry_2));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry_2));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 32, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES_2(s, d, n) SQUASHFS_SWAP_INTS(s, d, n)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES_2(A)  (A * sizeof(struct squashfs_fragment_entry_2))
-+
-+#define SQUASHFS_FRAGMENT_INDEX_2(A)  (SQUASHFS_FRAGMENT_BYTES_2(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET_2(A)   (SQUASHFS_FRAGMENT_BYTES_2(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES_2(A)        ((SQUASHFS_FRAGMENT_BYTES_2(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES_2(A)    (SQUASHFS_FRAGMENT_INDEXES_2(A) *\
-+                                              sizeof(int))
-+
-+#endif
-+
-+#ifdef __KERNEL__
-+
-+/*
-+ * macros used to swap each structure entry, taking into account
-+ * bitfields and different bitfield placing conventions on differing
-+ * architectures
-+ */
-+
-+#include <asm/byteorder.h>
-+
-+#ifdef __BIG_ENDIAN
-+      /* convert from little endian to big endian */
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, b_pos)
-+#else
-+      /* convert from big endian to little endian */ 
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, 64 - tbits - b_pos)
-+#endif
-+
-+#define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\
-+      b_pos = pos % 8;\
-+      val = 0;\
-+      s = (unsigned char *)p + (pos / 8);\
-+      d = ((unsigned char *) &val) + 7;\
-+      for(bits = 0; bits < (tbits + b_pos); bits += 8) \
-+              *d-- = *s++;\
-+      value = (val >> (SHIFT))/* & ((1 << tbits) - 1)*/;\
-+}
-+
-+#define SQUASHFS_MEMSET(s, d, n)      memset(s, 0, n);
-+
-+#endif
-+#endif
-Index: git/include/linux/squashfs_fs_i.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/include/linux/squashfs_fs_i.h  2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,45 @@
-+#ifndef SQUASHFS_FS_I
-+#define SQUASHFS_FS_I
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_i.h
-+ */
-+
-+struct squashfs_inode_info {
-+      long long       start_block;
-+      unsigned int    offset;
-+      union {
-+              struct {
-+                      long long       fragment_start_block;
-+                      unsigned int    fragment_size;
-+                      unsigned int    fragment_offset;
-+                      long long       block_list_start;
-+              } s1;
-+              struct {
-+                      long long       directory_index_start;
-+                      unsigned int    directory_index_offset;
-+                      unsigned int    directory_index_count;
-+                      unsigned int    parent_inode;
-+              } s2;
-+      } u;
-+      struct inode    vfs_inode;
-+};
-+#endif
-Index: git/include/linux/squashfs_fs_sb.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ git/include/linux/squashfs_fs_sb.h 2006-10-31 21:26:45.000000000 +0000
-@@ -0,0 +1,74 @@
-+#ifndef SQUASHFS_FS_SB
-+#define SQUASHFS_FS_SB
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_sb.h
-+ */
-+
-+#include <linux/squashfs_fs.h>
-+
-+struct squashfs_cache {
-+      long long       block;
-+      int             length;
-+      long long       next_index;
-+      char            *data;
-+};
-+
-+struct squashfs_fragment_cache {
-+      long long       block;
-+      int             length;
-+      unsigned int    locked;
-+      char            *data;
-+};
-+
-+struct squashfs_sb_info {
-+      struct squashfs_super_block     sblk;
-+      int                     devblksize;
-+      int                     devblksize_log2;
-+      int                     swap;
-+      struct squashfs_cache   *block_cache;
-+      struct squashfs_fragment_cache  *fragment;
-+      int                     next_cache;
-+      int                     next_fragment;
-+      int                     next_meta_index;
-+      unsigned int            *uid;
-+      unsigned int            *guid;
-+      long long               *fragment_index;
-+      unsigned int            *fragment_index_2;
-+      unsigned int            read_size;
-+      char                    *read_data;
-+      char                    *read_page;
-+      struct semaphore        read_data_mutex;
-+      struct semaphore        read_page_mutex;
-+      struct semaphore        block_cache_mutex;
-+      struct semaphore        fragment_mutex;
-+      struct semaphore        meta_index_mutex;
-+      wait_queue_head_t       waitq;
-+      wait_queue_head_t       fragment_wait_queue;
-+      struct meta_index       *meta_index;
-+      struct inode            *(*iget)(struct super_block *s,  squashfs_inode_t \
-+                              inode);
-+      long long               (*read_blocklist)(struct inode *inode, int \
-+                              index, int readahead_blks, char *block_list, \
-+                              unsigned short **block_p, unsigned int *bsize);
-+      int                     (*read_fragment_index_table)(struct super_block *s);
-+};
-+#endif
-Index: git/init/do_mounts_rd.c
-===================================================================
---- git.orig/init/do_mounts_rd.c       2006-10-31 16:09:47.000000000 +0000
-+++ git/init/do_mounts_rd.c    2006-10-31 21:26:45.000000000 +0000
-@@ -5,6 +5,7 @@
- #include <linux/ext2_fs.h>
- #include <linux/romfs_fs.h>
- #include <linux/cramfs_fs.h>
-+#include <linux/squashfs_fs.h>
- #include <linux/initrd.h>
- #include <linux/string.h>
-@@ -39,6 +40,7 @@ static int __init crd_load(int in_fd, in
-  * numbers could not be found.
-  *
-  * We currently check for the following magic numbers:
-+ *      squashfs
-  *    minix
-  *    ext2
-  *    romfs
-@@ -53,6 +55,7 @@ identify_ramdisk_image(int fd, int start
-       struct ext2_super_block *ext2sb;
-       struct romfs_super_block *romfsb;
-       struct cramfs_super *cramfsb;
-+      struct squashfs_super_block *squashfsb;
-       int nblocks = -1;
-       unsigned char *buf;
-@@ -64,6 +67,7 @@ identify_ramdisk_image(int fd, int start
-       ext2sb = (struct ext2_super_block *) buf;
-       romfsb = (struct romfs_super_block *) buf;
-       cramfsb = (struct cramfs_super *) buf;
-+      squashfsb = (struct squashfs_super_block *) buf;
-       memset(buf, 0xe5, size);
-       /*
-@@ -101,6 +105,15 @@ identify_ramdisk_image(int fd, int start
-               goto done;
-       }
-+      /* squashfs is at block zero too */
-+      if (squashfsb->s_magic == SQUASHFS_MAGIC) {
-+              printk(KERN_NOTICE
-+                     "RAMDISK: squashfs filesystem found at block %d\n",
-+                     start_block);
-+              nblocks = (squashfsb->bytes_used+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
-+              goto done;
-+      }
-+
-       /*
-        * Read block 1 to test for minix and ext2 superblock
-        */
diff --git a/meta/packages/linux/linux-rp-2.6.21/vesafb-tng-1.0-rc2-2.6.20-rc2.patch b/meta/packages/linux/linux-rp-2.6.21/vesafb-tng-1.0-rc2-2.6.20-rc2.patch
deleted file mode 100644 (file)
index b1b0fc3..0000000
+++ /dev/null
@@ -1,3141 +0,0 @@
-diff --git a/Documentation/fb/vesafb.txt b/Documentation/fb/vesafb.txt
-index ee277dd..93d6e6e 100644
---- a/Documentation/fb/vesafb.txt
-+++ b/Documentation/fb/vesafb.txt
-@@ -2,16 +2,18 @@
- What is vesafb?
- ===============
--This is a generic driver for a graphic framebuffer on intel boxes.
-+Vesafb is a generic framebuffer driver for x86 and x86_64 boxes.
--The idea is simple:  Turn on graphics mode at boot time with the help
--of the BIOS, and use this as framebuffer device /dev/fb0, like the m68k
--(and other) ports do.
-+VESA BIOS Extensions Version 2.0 are required, because we need access to
-+a linear frame buffer. VBE 3.0 is required if you want to use modes with a
-+higher (than the standard 60 Hz) refresh rate.
--This means we decide at boot time whenever we want to run in text or
--graphics mode.  Switching mode later on (in protected mode) is
--impossible; BIOS calls work in real mode only.  VESA BIOS Extensions
--Version 2.0 are required, because we need a linear frame buffer.
-+The VESA framebuffer driver comes in two flavors - the standard 'vesafb'
-+and 'vesafb-tng'. Vesafb-tng is available only on 32-bit x86 due to the
-+technology it uses (vm86). Vesafb-tng has more features than vesafb
-+(adjusting the refresh rate on VBE 3.0 compliant boards, switching the
-+video mode without rebooting, selecting a mode by providing its
-+modedb name, and more).
- Advantages:
-@@ -29,26 +31,35 @@ Disadvantages:
- How to use it?
- ==============
--Switching modes is done using the vga=... boot parameter.  Read
--Documentation/svga.txt for details.
-+If you are running a 32-bit x86 system and you decide to use vesafb-tng,
-+you can either compile the driver into the kernel or use it as a module.
-+The graphics mode you want to use is in both cases specified using the
-+standard modedb format.
--You should compile in both vgacon (for text mode) and vesafb (for
--graphics mode). Which of them takes over the console depends on
--whenever the specified mode is text or graphics.
-+If your system doesn't support vm86 calls, things get a little more tricky.
-+Since on such systems you can't do BIOS calls from protected mode in which
-+kernel runs, you have to decide at boot time whenever you want to run in text
-+or in graphics mode. Switching mode later on is impossible. Switching modes
-+is done using the vga=... boot parameter.  Read Documentation/svga.txt for
-+details. Below is a more detailed description of what to do on systems using
-+the standard vesafb driver.
--The graphic modes are NOT in the list which you get if you boot with
--vga=ask and hit return. The mode you wish to use is derived from the
--VESA mode number. Here are those VESA mode numbers:
-+You should compile in both vgacon (for text mode) and vesafb (for graphics
-+mode). Which of them takes over the console depends on whenever the
-+specified mode is text or graphics.
-+
-+The graphic modes are NOT in the list which you get if you boot with vga=ask
-+and hit return. The mode you wish to use is derived from the VESA mode number.
-+Here are those VESA mode numbers:
-     | 640x480  800x600  1024x768 1280x1024
- ----+-------------------------------------
--256 |  0x101    0x103    0x105    0x107   
--32k |  0x110    0x113    0x116    0x119   
--64k |  0x111    0x114    0x117    0x11A   
--16M |  0x112    0x115    0x118    0x11B   
-+256 |  0x101    0x103    0x105    0x107
-+32k |  0x110    0x113    0x116    0x119
-+64k |  0x111    0x114    0x117    0x11A
-+16M |  0x112    0x115    0x118    0x11B
--The video mode number of the Linux kernel is the VESA mode number plus
--0x200.
-+The video mode number of the Linux kernel is the VESA mode number plus 0x200.
-  
-  Linux_kernel_mode_number = VESA_mode_number + 0x200
-@@ -56,15 +67,15 @@ So the table for the Kernel mode numbers are:
-     | 640x480  800x600  1024x768 1280x1024
- ----+-------------------------------------
--256 |  0x301    0x303    0x305    0x307   
--32k |  0x310    0x313    0x316    0x319   
--64k |  0x311    0x314    0x317    0x31A   
--16M |  0x312    0x315    0x318    0x31B   
-+256 |  0x301    0x303    0x305    0x307
-+32k |  0x310    0x313    0x316    0x319
-+64k |  0x311    0x314    0x317    0x31A
-+16M |  0x312    0x315    0x318    0x31B
--To enable one of those modes you have to specify "vga=ask" in the
--lilo.conf file and rerun LILO. Then you can type in the desired
--mode at the "vga=ask" prompt. For example if you like to use 
--1024x768x256 colors you have to say "305" at this prompt.
-+To enable one of those modes you have to specify "vga=ask" in the lilo.conf
-+file and rerun LILO. Then you can type in the desired mode at the "vga=ask"
-+prompt. For example if you like to use 1024x768x256 colors you have to say
-+"305" at this prompt.
- If this does not work, this might be because your BIOS does not support
- linear framebuffers or because it does not support this mode at all.
-@@ -72,11 +83,12 @@ Even if your board does, it might be the BIOS which does not.  VESA BIOS
- Extensions v2.0 are required, 1.2 is NOT sufficient.  You will get a
- "bad mode number" message if something goes wrong.
--1. Note: LILO cannot handle hex, for booting directly with 
-+1. Note: LILO cannot handle hex, for booting directly with
-          "vga=mode-number" you have to transform the numbers to decimal.
- 2. Note: Some newer versions of LILO appear to work with those hex values,
-          if you set the 0x in front of the numbers.
-+
- X11
- ===
-@@ -84,98 +96,164 @@ XF68_FBDev should work just fine, but it is non-accelerated.  Running
- another (accelerated) X-Server like XF86_SVGA might or might not work.
- It depends on X-Server and graphics board.
--The X-Server must restore the video mode correctly, else you end up
-+The X-Server must restore the video mode correctly, or else you end up
- with a broken console (and vesafb cannot do anything about this).
-+With vesafb-tng chances are that the console will be restored properly
-+even if the X server messes up the video mode.
- Refresh rates
- =============
--There is no way to change the vesafb video mode and/or timings after
--booting linux.  If you are not happy with the 60 Hz refresh rate, you
--have these options:
-+With VBE 3.0 compatible BIOSes and vesafb-tng it is possible to change
-+the refresh rate either at boot time (by specifying the @<rr> part of
-+the mode name) or later, using the fbset utility.
-+
-+If you want to use the default BIOS refresh rate while switching modes
-+on a running system, set pixclock to 0.
-- * configure and load the DOS-Tools for your the graphics board (if
--   available) and boot linux with loadlin.
-- * use a native driver (matroxfb/atyfb) instead if vesafb.  If none
-+With VBE 2.0 there is no way to change the mode timings after booting
-+Linux. If you are not happy with the 60 Hz refresh rate, you have
-+the following options:
-+
-+ * Configure and load the DOS tools for your the graphics board (if
-+   available) and boot Linux with loadlin.
-+ * Use a native driver (matroxfb/atyfb) instead of vesafb.  If none
-    is available, write a new one!
-- * VBE 3.0 might work too.  I have neither a gfx board with VBE 3.0
--   support nor the specs, so I have not checked this yet.
-+ * Use a BIOS editor to change the default refresh rate (such an
-+   editor does exist at least for ATI Radeon BIOSes).
-+ * If you're running a non-vm86 and VBE 3.0 compatible system, you can
-+   use a kernel patch (vesafb-rrc) to hard-code some mode timings in
-+   the kernel and use these while setting the video mode at boot time.
-+
-+Note that there are some boards (nVidia 59**, 57** and newer models)
-+claiming that their Video BIOS is VBE 3.0 compliant, while ignoring the
-+CRTC values provided by software such as vesafb-tng. You'll not be able
-+to adjust the refresh rate if you're using one of these boards.
- Configuration
- =============
--The VESA BIOS provides protected mode interface for changing
--some parameters.  vesafb can use it for palette changes and
--to pan the display.  It is turned off by default because it
--seems not to work with some BIOS versions, but there are options
--to turn it on.
--
--You can pass options to vesafb using "video=vesafb:option" on
--the kernel command line.  Multiple options should be separated
--by comma, like this: "video=vesafb:ypan,invers"
--
--Accepted options:
--
--invers        no comment...
--
--ypan  enable display panning using the VESA protected mode 
--      interface.  The visible screen is just a window of the
--      video memory, console scrolling is done by changing the
--      start of the window.
--      pro:    * scrolling (fullscreen) is fast, because there is
--                no need to copy around data.
--              * You'll get scrollback (the Shift-PgUp thing),
--                the video memory can be used as scrollback buffer
--      kontra: * scrolling only parts of the screen causes some
--                ugly flicker effects (boot logo flickers for
--                example).
--
--ywrap Same as ypan, but assumes your gfx board can wrap-around 
--      the video memory (i.e. starts reading from top if it
--      reaches the end of video memory).  Faster than ypan.
--
--redraw        scroll by redrawing the affected part of the screen, this
--      is the safe (and slow) default.
--
--
--vgapal        Use the standard vga registers for palette changes.
--      This is the default.
--pmipal        Use the protected mode interface for palette changes.
--
--mtrr:n        setup memory type range registers for the vesafb framebuffer
--      where n:
--            0 - disabled (equivalent to nomtrr) (default)
--            1 - uncachable
--            2 - write-back
--            3 - write-combining
--            4 - write-through
--
--      If you see the following in dmesg, choose the type that matches the
--      old one. In this example, use "mtrr:2".
-+The VESA BIOS provides protected mode interface for changing some parameters.
-+vesafb can use it for palette changes and to pan the display. It is turned
-+off by default because it seems not to work with some BIOS versions, but
-+there are options to turn it on.
-+
-+You can pass options to vesafb using "video=vesafb:option" on the kernel
-+command line. Multiple options should be separated by a comma, like this:
-+"video=vesafb:ypan,1024x768-32@85"
-+
-+Note that vesafb-tng still uses the "video=vesafb:option" format of the
-+kernel command line video parameter. "video=vesafb-tng:xxx" is incorrect.
-+
-+Accepted options (both vesafb and vesafb-tng):
-+
-+ypan    Enable display panning using the VESA protected mode interface
-+        The visible screen is just a window of the video memory,
-+        console scrolling is done by changing the start of the window.
-+        pro:    * scrolling (fullscreen) is fast, because there is
-+                  no need to copy around data.
-+                * you'll get scrollback (the Shift-PgUp thing),
-+                  the video memory can be used as scrollback buffer
-+        con:    * scrolling only parts of the screen causes some
-+                  ugly flicker effects (boot logo flickers for
-+                  example).
-+
-+ywrap   Same as ypan, but assumes your gfx board can wrap-around the video
-+        memory (i.e. starts reading from top if it reaches the end of
-+        video memory). Faster than ypan.
-+
-+redraw  Scroll by redrawing the affected part of the screen, this is the
-+        safe (and slow) default.
-+
-+vgapal  Use the standard VGA registers for palette changes.
-+
-+pmipal  Use the protected mode interface for palette changes.
-+        This is the default is the protected mode interface is available.
-+
-+mtrr:n  Setup memory type range registers for the vesafb framebuffer
-+        where n:
-+              0 - disabled (equivalent to nomtrr) (default)
-+              1 - uncachable
-+              2 - write-back
-+              3 - write-combining
-+              4 - write-through
-+
-+        If you see the following in dmesg, choose the type that matches
-+        the old one. In this example, use "mtrr:2".
- ...
- mtrr: type mismatch for e0000000,8000000 old: write-back new: write-combining
- ...
--nomtrr  disable mtrr
-+nomtrr  Do not use memory type range registers for vesafb.
- vremap:n
-         remap 'n' MiB of video RAM. If 0 or not specified, remap memory
--      according to video mode. (2.5.66 patch/idea by Antonino Daplas
--      reversed to give override possibility (allocate more fb memory
--      than the kernel would) to 2.4 by tmb@iki.fi)
-+        according to video mode. (2.5.66 patch/idea by Antonino Daplas
-+        reversed to give override possibility (allocate more fb memory
-+        than the kernel would) to 2.4 by tmb@iki.fi)
- vtotal:n
-         if the video BIOS of your card incorrectly determines the total
-         amount of video RAM, use this option to override the BIOS (in MiB).
--Have fun!
-+Options accepted only by vesafb-tng:
-+
-+<mode>  The mode you want to set, in the standard modedb format. Refer to
-+        modedb.txt for a detailed description. If you specify a mode that is
-+        not supported by your board's BIOS, vesafb-tng will attempt to set a
-+        similar mode. The list of supported modes can be found in
-+        /proc/fbx/modes, where x is the framebuffer number (usually 0).
-+        When vesafb-tng is compiled as a module, the mode string should be
-+        provided as a value of the parameter 'mode'.
-+
-+vbemode:x
-+        Force the use of VBE mode x. The mode will only be set if it's
-+        found in the VBE-provided list of supported modes.
-+        NOTE: The mode number 'x' should be specified in VESA mode number
-+        notation, not the Linux kernel one (eg. 257 instead of 769).
-+        HINT: If you use this option because normal <mode> parameter does
-+        not work for you and you use a X server, you'll probably want to
-+        set the 'nocrtc' option to ensure that the video mode is properly
-+        restored after console <-> X switches.
-+
-+nocrtc  Do not use CRTC timings while setting the video mode. This option
-+        makes sence only with VBE 3.0 compliant systems. Use it if you have
-+        problems with modes set in the standard way. Note that using this
-+              option means that any refresh rate adjustments will be ignored
-+              and the refresh rate will stay at your BIOS default (60 Hz).
-+
-+noedid  Do not try to fetch and use EDID-provided modes.
-+
-+noblank Disable hardware blanking.
-+
-+gtf     Force the use of VESA's GTF (Generalized Timing Formula). Specifying
-+        this will cause vesafb to skip its internal modedb and EDID-modedb
-+        and jump straight to the GTF part of the code (normally used only if
-+        everything else failed). This can be useful if you want to get as
-+        much as possible from your graphics board but your BIOS doesn't
-+        support modes with the refresh rates you require. Note that you may 
-+              need to specify the maxhf, maxvf and maxclk parameters if they are not
-+        provided by the EDID block.
-+
-+Additionally, the following parameters may be provided. They all override the
-+EDID-provided values and BIOS defaults. Refer to your monitor's specs to get
-+the correct values for maxhf, maxvf and maxclk for your hardware.
-+
-+maxhf:n     Maximum horizontal frequency (in kHz).
-+maxvf:n     Maximum vertical frequency (in Hz).
-+maxclk:n    Maximum pixel clock (in MHz).
--  Gerd
-+Have fun!
- --
-+Original document for the vesafb driver by
- Gerd Knorr <kraxel@goldbach.in-berlin.de>
--Minor (mostly typo) changes 
--by Nico Schmoigl <schmoigl@rumms.uni-mannheim.de>
-+Minor (mostly typo) changes by
-+Nico Schmoigl <schmoigl@rumms.uni-mannheim.de>
-+
-+Extended documentation for vm86, VBE 3.0 and vesafb-tng by
-+Michal Januszewski <spock@gentoo.org>
-+
-diff --git a/arch/i386/boot/video.S b/arch/i386/boot/video.S
-index 2c5b5cc..2c2d4b5 100644
---- a/arch/i386/boot/video.S
-+++ b/arch/i386/boot/video.S
-@@ -163,10 +163,12 @@ basret:  ret
- # parameters in the default 80x25 mode -- these are set directly,
- # because some very obscure BIOSes supply insane values.
- mode_params:
-+#ifdef CONFIG_FB_VESA_STD
- #ifdef CONFIG_VIDEO_SELECT
-       cmpb    $0, graphic_mode
-       jnz     mopar_gr
- #endif
-+#endif
-       movb    $0x03, %ah                      # Read cursor position
-       xorb    %bh, %bh
-       int     $0x10
-@@ -199,6 +201,7 @@ mopar2: movb       %al, %fs:(PARAM_VIDEO_LINES)
-       ret
- #ifdef CONFIG_VIDEO_SELECT
-+#ifdef CONFIG_FB_VESA_STD
- # Fetching of VESA frame buffer parameters
- mopar_gr:
-       leaw    modelist+1024, %di
-@@ -281,6 +284,7 @@ dac_done:
-       movw    %es, %fs:(PARAM_VESAPM_SEG)
-       movw    %di, %fs:(PARAM_VESAPM_OFF)
- no_pm:        ret
-+#endif
- # The video mode menu
- mode_menu:
-@@ -495,10 +499,12 @@ mode_set:
-       
-       cmpb    $VIDEO_FIRST_V7>>8, %ah
-       jz      setv7
--      
-+
-+#ifdef CONFIG_FB_VESA_STD
-       cmpb    $VIDEO_FIRST_VESA>>8, %ah
-       jnc     check_vesa
--      
-+#endif        
-+
-       orb     %ah, %ah
-       jz      setmenu
-       
-@@ -570,6 +576,7 @@ setr1:     lodsw
-       movw    -4(%si), %ax                    # Fetch mode ID
-       jmp     _m_s
-+#ifdef CONFIG_FB_VESA_STD
- check_vesa:
-       leaw    modelist+1024, %di
-       subb    $VIDEO_FIRST_VESA>>8, %bh
-@@ -603,6 +610,7 @@ check_vesa:
-       ret
- _setbad:      jmp     setbad                  # Ugly...
-+#endif
- # Recalculate vertical display end registers -- this fixes various
- # inconsistencies of extended modes on many adapters. Called when
-diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c
-index 1393523..8a05f95 100644
---- a/drivers/char/sysrq.c
-+++ b/drivers/char/sysrq.c
-@@ -240,7 +240,7 @@ static void send_sig_all(int sig)
-       struct task_struct *p;
-       for_each_process(p) {
--              if (p->mm && !is_init(p))
-+              if (p->mm && !is_init(p) && !(p->flags & PF_BORROWED_MM))
-                       /* Not swapper, init nor kernel thread */
-                       force_sig(sig, p);
-       }
-diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
-index 4e83f01..ae122fd 100644
---- a/drivers/video/Kconfig
-+++ b/drivers/video/Kconfig
-@@ -547,8 +547,22 @@ config FB_TGA
-         cards. Say Y if you have one of those.
- config FB_VESA
--      bool "VESA VGA graphics support"
--      depends on (FB = y) && X86
-+      tristate "VESA VGA graphics support"
-+      depends on (FB = y) && (X86 || X86_64)
-+      help
-+        This is the frame buffer device driver for generic VESA 2.0
-+        compliant graphic cards. The older VESA 1.2 cards are not supported.
-+        You will get a boot time penguin logo at no additional cost. Please
-+        read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-+
-+choice 
-+      prompt "VESA driver type"
-+      depends on FB_VESA
-+      default FB_VESA_STD if X86_64
-+      default FB_VESA_TNG if X86
-+
-+config FB_VESA_STD
-+      bool "vesafb"
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-@@ -557,7 +571,43 @@ config FB_VESA
-         This is the frame buffer device driver for generic VESA 2.0
-         compliant graphic cards. The older VESA 1.2 cards are not supported.
-         You will get a boot time penguin logo at no additional cost. Please
--        read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-+        read <file:Documentation/fb/vesafb.txt>. Choose this driver if you
-+        are experiencing problems with vesafb-tng or if you own a 64-bit system.
-+
-+        Note that this driver cannot be compiled as a module.
-+
-+config FB_VESA_TNG
-+      bool "vesafb-tng"
-+      depends on !X86_64
-+      select FB_MODE_HELPERS
-+      select FB_CFB_FILLRECT
-+      select FB_CFB_COPYAREA
-+      select FB_CFB_IMAGEBLIT
-+      help
-+        This is an enhanced generic frame buffer device driver for
-+        VBE 2.0 compliant graphic cards. It can take advantage of VBE 3.0
-+        features (refresh rate adjustment) when these are available.
-+        The driver also makes it possible to change the video mode
-+        on the fly and to switch back to text mode when it's unloaded.
-+
-+        If the driver is compiled as a module, the module will be called
-+        vesafb-tng.
-+
-+endchoice
-+
-+config FB_VESA_DEFAULT_MODE
-+      string "VESA default mode"
-+      depends on FB_VESA_TNG
-+      default "640x480@60"
-+      help 
-+        This option is used to determine the default mode vesafb is
-+        supposed to switch to in case no mode is provided as a kernel
-+        command line parameter.
-+
-+config VIDEO_SELECT
-+      bool
-+      depends on FB_VESA
-+      default y
- config FB_IMAC
-       bool "Intel-based Macintosh Framebuffer Support"
-diff --git a/drivers/video/Makefile b/drivers/video/Makefile
-index 309a26d..e57b0e7 100644
---- a/drivers/video/Makefile
-+++ b/drivers/video/Makefile
-@@ -102,7 +102,11 @@ obj-$(CONFIG_FB_PNX4008_DUM_RGB)  += pnx4008/
- obj-$(CONFIG_FB_IBM_GXT4500)    += gxt4500.o
- # Platform or fallback drivers go here
--obj-$(CONFIG_FB_VESA)             += vesafb.o
-+ifeq ($(CONFIG_FB_VESA_STD),y)
-+  obj-y                                 += vesafb.o
-+else
-+  obj-$(CONFIG_FB_VESA)                 += vesafb-thread.o vesafb-tng.o
-+endif
- obj-$(CONFIG_FB_IMAC)             += imacfb.o
- obj-$(CONFIG_FB_VGA16)            += vga16fb.o vgastate.o
- obj-$(CONFIG_FB_OF)               += offb.o
-diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
-index 3cfea31..bfb39cc 100644
---- a/drivers/video/fbmem.c
-+++ b/drivers/video/fbmem.c
-@@ -1408,6 +1408,7 @@ fbmem_init(void)
-               printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
-               fb_class = NULL;
-       }
-+
-       return 0;
- }
-diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
-index 5df41f6..f838a53 100644
---- a/drivers/video/modedb.c
-+++ b/drivers/video/modedb.c
-@@ -674,6 +674,7 @@ void fb_var_to_videomode(struct fb_videomode *mode,
- {
-       u32 pixclock, hfreq, htotal, vtotal;
-+      mode->refresh = 0;
-       mode->name = NULL;
-       mode->xres = var->xres;
-       mode->yres = var->yres;
-@@ -1025,3 +1026,4 @@ EXPORT_SYMBOL(fb_find_best_mode);
- EXPORT_SYMBOL(fb_find_nearest_mode);
- EXPORT_SYMBOL(fb_videomode_to_modelist);
- EXPORT_SYMBOL(fb_find_mode);
-+EXPORT_SYMBOL(fb_destroy_modelist);
-diff --git a/drivers/video/vesafb-thread.c b/drivers/video/vesafb-thread.c
-new file mode 100644
-index 0000000..543e202
---- /dev/null
-+++ b/drivers/video/vesafb-thread.c
-@@ -0,0 +1,751 @@
-+/*
-+ * Framebuffer driver for VBE 2.0+ compliant graphic boards.
-+ * Kernel thread and vm86 routines.
-+ *
-+ * (c) 2004-2006 Michal Januszewski <spock@gentoo.org>
-+ *
-+ */
-+
-+#include <linux/workqueue.h>
-+#include <linux/completion.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/delay.h>
-+#include <linux/signal.h>
-+#include <linux/freezer.h>
-+#include <linux/suspend.h>
-+#include <linux/unistd.h>
-+#include <video/vesa.h>
-+#include <video/edid.h>
-+#include <asm/mman.h>
-+#include <asm/page.h>
-+#include <asm/vm86.h>
-+#include <asm/thread_info.h>
-+#include <asm/uaccess.h>
-+#include <asm/mmu_context.h>
-+#include "edid.h"
-+
-+static int errno;
-+
-+static DECLARE_COMPLETION(vesafb_th_completion);
-+static DECLARE_MUTEX(vesafb_task_list_sem);
-+static LIST_HEAD(vesafb_task_list);
-+static DECLARE_WAIT_QUEUE_HEAD(vesafb_wait);
-+
-+static struct vm86_struct vm86;
-+static int vesafb_pid = 0;
-+
-+#define DEFAULT_VM86_FLAGS (IF_MASK | IOPL_MASK)
-+#define VM86_PUSHW(x)                                 \
-+do {                                                  \
-+      vm86.regs.esp -= 2;                             \
-+      *(u16*)(STACK_ADDR + vm86.regs.esp) = x;        \
-+} while(0);
-+
-+/* Stack, the return code and buffers will be put into
-+ * one contiguous memory chunk:
-+ *
-+ * [ STACK | RET_CODE | BUFFER ]
-+ *
-+ * Some video BIOSes (sis6326) try to store data somewhere
-+ * in 0x7000-0x7fff, so we zeromap more memory to be safe.
-+ */
-+#define IVTBDA_SIZE   PAGE_SIZE
-+#define RET_CODE_SIZE 0x0010
-+#define STACK_SIZE    0x0500
-+#define BUFFER_SIZE   0x10000
-+
-+/* The amount of memory that will be allocated should be a multiple
-+ * of PAGE_SIZE. */
-+#define __MEM_SIZE    (RET_CODE_SIZE + STACK_SIZE + BUFFER_SIZE)
-+#define REAL_MEM_SIZE (((__MEM_SIZE / PAGE_SIZE) + 1) * PAGE_SIZE)
-+
-+#define IVTBDA_ADDR   0x00000
-+#define STACK_ADDR    (IVTBDA_ADDR + IVTBDA_SIZE)
-+#define RET_CODE_ADDR (STACK_ADDR + STACK_SIZE)
-+#define BUF_ADDR      (RET_CODE_ADDR + RET_CODE_SIZE)
-+
-+#define FLAG_D                (1 << 10)
-+
-+/* Syscalls used by the vesafb thread */
-+static int vm86old(struct vm86_struct __user* v86)
-+{
-+      long res;
-+      __asm__ volatile ("push %%ebx; movl %2, %%ebx ; int $0x80 ; pop %%ebx"
-+                      : "=a" (res)
-+                      : "0" (__NR_vm86old), "ri" ((long)(v86)) : "memory");
-+
-+      if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) {
-+              errno = -res;
-+              res = -1;
-+      }
-+      return (int)res;
-+}
-+
-+static int ioperm(unsigned long a, unsigned long b, unsigned long c)
-+{
-+      long res;
-+      __asm__ volatile ("push %%ebx; movl %2, %%ebx ; int $0x80 ; pop %%ebx"
-+                      : "=a" (res)
-+                      : "0" (__NR_ioperm), "ri" ((long)(a)), "c" ((long)(b)),
-+                        "d" ((long)(c)) : "memory");
-+
-+      if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) {
-+              errno = -res;
-+              res = -1;
-+      }
-+      return (int)res;
-+}
-+
-+/* Segment prefix opcodes */
-+enum {
-+      P_CS = 0x2e,
-+      P_SS = 0x36,
-+      P_DS = 0x3e,
-+      P_ES = 0x26,
-+      P_FS = 0x64,
-+      P_GS = 0x65
-+};
-+
-+/* Emulated vm86 ins instruction */
-+static void vm86_ins(int size)
-+{
-+      u32 edx, edi;
-+      edx = vm86.regs.edx & 0xffff;
-+      edi = (vm86.regs.edi & 0xffff) + (u32)(vm86.regs.es << 4);
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("std\n");
-+      else
-+              asm volatile ("cld\n");
-+
-+      switch (size) {
-+      case 4:
-+              asm volatile ("insl\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      case 2:
-+              asm volatile ("insw\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      case 1:
-+              asm volatile ("insb\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      }
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("cld\n");
-+
-+      edi -= (u32)(vm86.regs.es << 4);
-+
-+      vm86.regs.edi &= 0xffff0000;
-+      vm86.regs.edi |= edi & 0xffff;
-+}
-+
-+static void vm86_rep_ins(int size)
-+{
-+      u16 cx = vm86.regs.ecx;
-+      while (cx--)
-+              vm86_ins(size);
-+
-+      vm86.regs.ecx &= 0xffff0000;
-+}
-+
-+/* Emulated vm86 outs instruction */
-+static void vm86_outs(int size, int segment)
-+{
-+      u32 edx, esi, base;
-+
-+      edx = vm86.regs.edx & 0xffff;
-+      esi = vm86.regs.esi & 0xffff;
-+
-+      switch (segment) {
-+      case P_CS: base = vm86.regs.cs; break;
-+      case P_SS: base = vm86.regs.ss; break;
-+      case P_ES: base = vm86.regs.es; break;
-+      case P_FS: base = vm86.regs.fs; break;
-+      case P_GS: base = vm86.regs.gs; break;
-+      default:   base = vm86.regs.ds; break;
-+      }
-+
-+      esi += base << 4;
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("std\n");
-+      else
-+              asm volatile ("cld\n");
-+
-+      switch (size) {
-+      case 4:
-+              asm volatile ("outsl\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      case 2:
-+              asm volatile ("outsw\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      case 1:
-+              asm volatile ("outsb\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      }
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("cld");
-+
-+      esi -= base << 4;
-+      vm86.regs.esi &= 0xffff0000;
-+      vm86.regs.esi |= (esi & 0xffff);
-+}
-+
-+static void vm86_rep_outs(int size, int segment)
-+{
-+      u16 cx = vm86.regs.ecx;
-+      while (cx--)
-+              vm86_outs(size, segment);
-+
-+      vm86.regs.ecx &= 0xffff0000;
-+}
-+
-+static int vm86_do_unknown(void)
-+{
-+      u8 data32 = 0, segment = P_DS, rep = 0;
-+      u8 *instr;
-+      int ret = 0, i = 0;
-+
-+      instr = (u8*)((vm86.regs.cs << 4) + vm86.regs.eip);
-+
-+      while (1) {
-+              switch(instr[i]) {
-+              case 0x66:      /* operand size prefix */
-+                      data32 = 1 - data32;
-+                      i++;
-+                      break;
-+              case 0xf2:      /* repnz */
-+              case 0xf3:      /* rep */
-+                      rep = 1;
-+                      i++;
-+                      break;
-+              case P_CS:      /* segment prefix */
-+              case P_SS:
-+              case P_DS:
-+              case P_ES:
-+              case P_FS:
-+              case P_GS:
-+                      segment = instr[i];
-+                      i++;
-+                      break;
-+              case 0xf0:      /* LOCK - ignored */
-+              case 0x67:      /* address size prefix - ignored */
-+                      i++;
-+                      break;
-+              case 0x6c:      /* insb */
-+                      if (rep)
-+                              vm86_rep_ins(1);
-+                      else
-+                              vm86_ins(1);
-+                      i++;
-+                      goto out;
-+              case 0x6d:      /* insw / insd */
-+                      if (rep) {
-+                              if (data32)
-+                                      vm86_rep_ins(4);
-+                              else
-+                                      vm86_rep_ins(2);
-+                      } else {
-+                              if (data32)
-+                                      vm86_ins(4);
-+                              else
-+                                      vm86_ins(2);
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0x6e:      /* outsb */
-+                      if (rep)
-+                              vm86_rep_outs(1, segment);
-+                      else
-+                              vm86_outs(1, segment);
-+                      i++;
-+                      goto out;
-+              case 0x6f:      /* outsw / outsd */
-+                      if (rep) {
-+                              if (data32)
-+                                      vm86_rep_outs(4, segment);
-+                              else
-+                                      vm86_rep_outs(2, segment);
-+                      } else {
-+                              if (data32)
-+                                      vm86_outs(4, segment);
-+                              else
-+                                      vm86_outs(2, segment);
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0xe4:      /* inb xx */
-+                      asm volatile (
-+                              "inb %w1, %b0"
-+                              : "=a" (vm86.regs.eax)
-+                              : "d" (instr[i+1]), "0" (vm86.regs.eax));
-+                      i += 2;
-+                      goto out;
-+              case 0xe5:      /* inw xx / ind xx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "inl %w1, %0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (instr[i+1]),
-+                                        "0" (vm86.regs.eax));
-+                      } else {
-+                              asm volatile (
-+                                      "inw %w1, %w0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (instr[i+1]),
-+                                        "0" (vm86.regs.eax));
-+                      }
-+                      i += 2;
-+                      goto out;
-+
-+              case 0xec:      /* inb dx */
-+                      asm volatile (
-+                              "inb %w1, %b0"
-+                              : "=a" (vm86.regs.eax)
-+                              : "d" (vm86.regs.edx), "0" (vm86.regs.eax));
-+                      i++;
-+                      goto out;
-+              case 0xed:      /* inw dx / ind dx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "inl %w1, %0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (vm86.regs.edx));
-+                      } else {
-+                              asm volatile (
-+                                      "inw %w1, %w0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (vm86.regs.edx));
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0xe6:      /* outb xx */
-+                      asm volatile (
-+                              "outb %b0, %w1"
-+                              : /* no return value */
-+                              : "a" (vm86.regs.eax), "d" (instr[i+1]));
-+                      i += 2;
-+                      goto out;
-+              case 0xe7:      /* outw xx / outd xx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "outl %0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (instr[i+1]));
-+                      } else {
-+                              asm volatile (
-+                                      "outw %w0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (instr[i+1]));
-+                      }
-+                      i += 2;
-+                      goto out;
-+              case 0xee:      /* outb dx */
-+                      asm volatile (
-+                              "outb %b0, %w1"
-+                              : /* no return value */
-+                              : "a" (vm86.regs.eax), "d" (vm86.regs.edx));
-+                      i++;
-+                      goto out;
-+              case 0xef:      /* outw dx / outd dx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "outl %0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (vm86.regs.edx));
-+                      } else {
-+                              asm volatile (
-+                                      "outw %w0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (vm86.regs.edx));
-+                      }
-+                      i++;
-+                      goto out;
-+              default:
-+                      printk(KERN_ERR "vesafb: BUG, opcode 0x%x emulation "
-+                                      "not supported (EIP: 0x%lx)\n",
-+                                      instr[i], (u32)(vm86.regs.cs << 4) +
-+                                      vm86.regs.eip);
-+                      ret = 1;
-+                      goto out;
-+              }
-+      }
-+out:  vm86.regs.eip += i;
-+      return ret;
-+}
-+
-+void vesafb_do_vm86(struct vm86_regs *regs)
-+{
-+      unsigned int ret;
-+      u8 *retcode = (void*)RET_CODE_ADDR;
-+
-+      memset(&vm86,0,sizeof(vm86));
-+      memcpy(&vm86.regs, regs, sizeof(struct vm86_regs));
-+
-+      /* The return code */
-+      retcode[0] = 0xcd;              /* int opcode */
-+      retcode[1] = 0xff;              /* int number (255) */
-+
-+        /* We use int 0xff to get back to protected mode */
-+      memset(&vm86.int_revectored, 0, sizeof(vm86.int_revectored));
-+        ((unsigned char *)&vm86.int_revectored)[0xff / 8] |= (1 << (0xff % 8));
-+
-+      /*
-+       * We want to call int 0x10, so we set:
-+       *   CS = 0x42 = 0x10 * 4 + 2
-+       *   IP = 0x40 = 0x10 * 4
-+       * and SS:ESP. It's up to the caller to set the rest of the registers.
-+       */
-+      vm86.regs.eflags = DEFAULT_VM86_FLAGS;
-+      vm86.regs.cs = *(unsigned short *)0x42;
-+      vm86.regs.eip = *(unsigned short *)0x40;
-+      vm86.regs.ss = (STACK_ADDR >> 4);
-+      vm86.regs.esp = ((STACK_ADDR & 0x0000f) + STACK_SIZE);
-+
-+      /* These will be fetched off the stack when we come to an iret in the
-+       * int's 0x10 code. */
-+      VM86_PUSHW(DEFAULT_VM86_FLAGS);
-+      VM86_PUSHW((RET_CODE_ADDR >> 4));       /* return code segment */
-+      VM86_PUSHW((RET_CODE_ADDR & 0x0000f));  /* return code offset */
-+
-+      while(1) {
-+              ret = vm86old(&vm86);
-+
-+              if (VM86_TYPE(ret) == VM86_INTx) {
-+                      int vint = VM86_ARG(ret);
-+
-+                      /* If exit from vm86 was caused by int 0xff, then
-+                       * we're done.. */
-+                      if (vint == 0xff)
-+                              goto out;
-+
-+                      /* .. otherwise, we have to call the int handler
-+                       * manually */
-+                      VM86_PUSHW(vm86.regs.eflags);
-+                      VM86_PUSHW(vm86.regs.cs);
-+                      VM86_PUSHW(vm86.regs.eip);
-+
-+                      vm86.regs.cs = *(u16 *)((vint << 2) + 2);
-+                      vm86.regs.eip = *(u16 *)(vint << 2);
-+                      vm86.regs.eflags &= ~(VIF_MASK | TF_MASK);
-+              } else if (VM86_TYPE(ret) == VM86_UNKNOWN) {
-+                      if (vm86_do_unknown())
-+                              goto out;
-+              } else {
-+                      printk(KERN_ERR "vesafb: BUG, returned from "
-+                                      "vm86 with %x (EIP: 0x%lx)\n",
-+                                      ret, (u32)(vm86.regs.cs << 4) +
-+                                      vm86.regs.eip);
-+                      goto out;
-+              }
-+      }
-+
-+out:  /* copy the registers' state back to the caller's struct */
-+      memcpy(regs, &vm86.regs, sizeof(struct vm86_regs));
-+}
-+
-+static int vesafb_remap_pfn_range(unsigned long start, unsigned long end,
-+                                unsigned long pgoff, unsigned long prot,
-+                                int type)
-+{
-+      struct vm_area_struct *vma;
-+      struct mm_struct *mm = current->mm;
-+      int ret = 0;
-+
-+      vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
-+      if (!vma)
-+              return -ENOMEM;
-+      memset(vma, 0, sizeof(*vma));
-+      down_write(&mm->mmap_sem);
-+      vma->vm_mm = mm;
-+      vma->vm_start = start;
-+      vma->vm_end = end;
-+      vma->vm_flags = VM_READ | VM_WRITE | VM_EXEC;
-+      vma->vm_flags |= mm->def_flags;
-+      vma->vm_page_prot.pgprot = prot;
-+      vma->vm_pgoff = pgoff;
-+
-+      if ((ret = insert_vm_struct(mm, vma))) {
-+              up_write(&mm->mmap_sem);
-+              kmem_cache_free(vm_area_cachep, vma);
-+              return ret;
-+      }
-+
-+      if (type) {
-+              ret = zeromap_page_range(vma,
-+                                       vma->vm_start,
-+                                       vma->vm_end - vma->vm_start,
-+                                       vma->vm_page_prot);
-+      } else {
-+              vma->vm_flags |= VM_SHARED;
-+              ret = remap_pfn_range(vma,
-+                                    vma->vm_start,
-+                                    vma->vm_pgoff,
-+                                    vma->vm_end - vma->vm_start,
-+                                    vma->vm_page_prot);
-+      }
-+      up_write(&mm->mmap_sem);
-+      return ret;
-+}
-+
-+static inline int vesafb_init_mem(void)
-+{
-+      int ret = 0;
-+
-+      /* The memory chunks we're remapping here should be multiples
-+       * of PAGE_SIZE. */
-+      ret += vesafb_remap_pfn_range(0x00000, IVTBDA_SIZE, 0,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 0);
-+      ret += vesafb_remap_pfn_range(IVTBDA_SIZE, REAL_MEM_SIZE, 0,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 1);
-+      ret += vesafb_remap_pfn_range(0x9f000, 0x100000, 
-+                                    0x9f000 >> PAGE_SHIFT,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 0);
-+      if (ret)
-+              printk(KERN_ERR "vesafb thread: memory remapping failed\n");
-+
-+      return ret;
-+}
-+
-+#define vesafb_get_string(str) \
-+{                                                                     \
-+      /* The address is in the form ssssoooo, where oooo = offset,    \
-+       * ssss = segment */                                            \
-+      addr = ((p_vbe(tsk->buf)->str & 0xffff0000) >> 12) +            \
-+              (p_vbe(tsk->buf)->str & 0x0000ffff);                    \
-+                                                                      \
-+      /* The data is in ROM which is shared between processes, so we  \
-+       * just translate the real mode address into one visible from   \
-+       * kernel space */                                              \
-+      if (addr >= 0xa0000) {                                          \
-+              p_vbe(tsk->buf)->str = (u32) __va(addr);                \
-+                                                                      \
-+      /* The data is in the buffer, we just have to convert the       \
-+       * address so that it points into the buffer user provided. */  \
-+      } else if (addr > BUF_ADDR && addr < BUF_ADDR +                 \
-+                 sizeof(struct vesafb_vbe_ib)) {                      \
-+              addr -= BUF_ADDR;                                       \
-+              p_vbe(tsk->buf)->str = (u32) (tsk->buf + addr);         \
-+                                                                      \
-+      /* This should never happen: someone was insane enough to put   \
-+       * the data somewhere in RAM.. */                               \
-+      } else {                                                        \
-+              p_vbe(tsk->buf)->str = (u32) "";                        \
-+      }                                                               \
-+}
-+
-+void vesafb_handle_getvbeib(struct vesafb_task *tsk)
-+{
-+      int addr, res;
-+
-+      tsk->regs.es  = (BUF_ADDR >> 4);
-+      tsk->regs.edi = (BUF_ADDR & 0x000f);
-+      strncpy(p_vbe(BUF_ADDR)->vbe_signature, "VBE2", 4);
-+
-+      vesafb_do_vm86(&tsk->regs);
-+      memcpy(tsk->buf, (void*)(BUF_ADDR), sizeof(struct vesafb_vbe_ib));
-+
-+      /* The OEM fields were not defined prior to VBE 2.0 */
-+      if (p_vbe(tsk->buf)->vbe_version >= 0x200) {
-+              vesafb_get_string(oem_string_ptr);
-+              vesafb_get_string(oem_vendor_name_ptr);
-+              vesafb_get_string(oem_product_name_ptr);
-+              vesafb_get_string(oem_product_rev_ptr);
-+      }
-+
-+      /* This is basically the same as vesafb_get_string() */
-+      addr = ((p_vbe(tsk->buf)->mode_list_ptr & 0xffff0000) >> 12) +
-+              (p_vbe(tsk->buf)->mode_list_ptr & 0x0000ffff);
-+
-+      if (addr >= 0xa0000) {
-+              p_vbe(tsk->buf)->mode_list_ptr = (u32) __va(addr);
-+      } else if (addr > BUF_ADDR && addr < BUF_ADDR +
-+                 sizeof(struct vesafb_vbe_ib)) {
-+              addr -= BUF_ADDR;
-+              p_vbe(tsk->buf)->mode_list_ptr = (u32) (tsk->buf + addr);
-+      } else {
-+              res = 0;
-+              printk(KERN_WARNING "vesafb: warning, copying modelist "
-+                                  "from somewhere in RAM!\n");
-+              while (*(u16*)(addr+res) != 0xffff &&
-+                     res < (sizeof(p_vbe(tsk->buf)->reserved) - 2)) {
-+                      *(u16*) ((u32)&(p_vbe(tsk->buf)->reserved) + res) =
-+                              *(u16*)(addr+res);
-+                      res += 2;
-+              }
-+              *(u16*) ((u32)&(p_vbe(tsk->buf)->reserved) + res) = 0xffff;
-+      }
-+}
-+
-+int vesafb_handle_tasks(void)
-+{
-+      struct vesafb_task *tsk;
-+      struct list_head *curr, *next;
-+      int ret = 0;
-+
-+      down(&vesafb_task_list_sem);
-+      list_for_each_safe(curr, next, &vesafb_task_list) {
-+              tsk = list_entry(curr, struct vesafb_task, node);
-+
-+              if (tsk->flags & TF_EXIT) {
-+                      ret = 1;
-+                      goto task_done;
-+              }
-+              if (tsk->flags & TF_GETVBEIB) {
-+                      vesafb_handle_getvbeib(tsk);
-+                      goto task_done;
-+              }
-+              /* Do we need to store a pointer to the buffer in ES:EDI? */
-+              if (tsk->flags & TF_BUF_DI) {
-+                      tsk->regs.es  = (BUF_ADDR >> 4);
-+                      tsk->regs.edi = (BUF_ADDR & 0x000f);
-+              }
-+              /* Sometimes the pointer has to be in ES:EBX. */
-+              if (tsk->flags & TF_BUF_BX) {
-+                      tsk->regs.es  = (BUF_ADDR >> 4);
-+                      tsk->regs.ebx = (BUF_ADDR & 0x000f);
-+              }
-+              if (tsk->flags & (TF_BUF_DI | TF_BUF_BX))
-+                      memcpy((void*)BUF_ADDR, tsk->buf, tsk->buf_len);
-+
-+              vesafb_do_vm86(&tsk->regs);
-+
-+              if (tsk->flags & TF_RETURN_BUF)
-+                      memcpy(tsk->buf, (void*)BUF_ADDR, tsk->buf_len);
-+
-+task_done:    list_del(curr);
-+              complete(&tsk->done);
-+      }
-+
-+      /* If we're going to kill this thread, don't allow any elements
-+       * to be added to the task list. */
-+      if (!ret)
-+              up(&vesafb_task_list_sem);
-+
-+      return ret;
-+}
-+
-+/*
-+ * This 'hybrid' thread serves as a backend for vesafb-tng, handling all vm86
-+ * calls. It is started as a kernel thread. It then creates its own mm struct,
-+ * thus separating itself from any userspace processes. At this moment, it
-+ * stops being a kernel thread (kernel threads have mm = NULL) and becomes
-+ * a 'hybrid' thread -- one that has full access to kernel space, yet runs
-+ * with its own address space.
-+ *
-+ * This is necessary because in order to make vm86 calls some parts of the
-+ * first 1MB of RAM have to be setup to mimic the real mode. These are:
-+ *  - interrupt vector table  [0x00000-0x003ff]
-+ *  - BIOS data area          [0x00400-0x004ff]
-+ *  - Extended BIOS data area [0x9fc00-0x9ffff]
-+ *  - the video RAM           [0xa0000-0xbffff]
-+ *  - video BIOS              [0xc0000-0xcffff]
-+ *  - motherboard BIOS                [0xf0000-0xfffff]
-+ */
-+int vesafb_thread(void *unused)
-+{
-+      int err = 0;
-+
-+      set_fs(KERNEL_DS);
-+      daemonize("vesafb");
-+
-+      if (set_new_mm()) {
-+              err = -ENOMEM;
-+              goto thr_end;
-+      }
-+      if (vesafb_init_mem()) {
-+              err = -ENOMEM;
-+              goto thr_end;
-+      }
-+
-+      DPRINTK("started vesafb thread\n");
-+
-+      /* Having an IO bitmap makes things faster as we avoid GPFs
-+       * when running vm86 code. We can live if it fails, though,
-+       * so don't bother checking for errors. */
-+      ioperm(0,1024,1);
-+      set_user_nice(current, -10);
-+
-+      complete(&vesafb_th_completion);
-+
-+      while (1) {
-+              if (vesafb_handle_tasks())
-+                      break;
-+              wait_event_interruptible(vesafb_wait,
-+                                       !list_empty(&vesafb_task_list));
-+              try_to_freeze();
-+      }
-+
-+out:  DPRINTK("exiting the vesafb thread\n");
-+      vesafb_pid = -1;
-+
-+      /* Now that all callers know this thread is no longer running
-+       * (pid < 0), allow them to continue. */
-+      up(&vesafb_task_list_sem);
-+      return err;
-+thr_end:
-+      down(&vesafb_task_list_sem);
-+      complete(&vesafb_th_completion);
-+      goto out;       
-+}
-+
-+int vesafb_queue_task(struct vesafb_task *tsk)
-+{
-+      down(&vesafb_task_list_sem);
-+      if (vesafb_pid < 0)
-+              return -1;
-+      list_add_tail(&tsk->node, &vesafb_task_list);
-+      up(&vesafb_task_list_sem);
-+      wake_up(&vesafb_wait);
-+      return 0;
-+}
-+
-+int vesafb_wait_for_thread(void)
-+{
-+      /* PID 0 means that the thread is still initializing. */
-+      if (vesafb_pid < 0)
-+              return -1;
-+      wait_for_completion(&vesafb_th_completion);
-+      return 0;
-+}
-+
-+int __init vesafb_init_thread(void)
-+{
-+      vesafb_pid = kernel_thread(vesafb_thread,NULL,0);
-+      return 0;
-+}
-+
-+#ifdef MODULE
-+void __exit vesafb_kill_thread(void)
-+{
-+      struct vesafb_task *tsk;
-+      if (vesafb_pid <= 0)
-+              return;
-+
-+      vesafb_create_task(tsk);
-+      if (!tsk)
-+              return;
-+      tsk->flags |= TF_EXIT;
-+      vesafb_queue_task(tsk);
-+      vesafb_wait_for_task(tsk);
-+      kfree(tsk);
-+      return;
-+}
-+module_exit(vesafb_kill_thread);
-+#endif
-+module_init(vesafb_init_thread);
-+
-+EXPORT_SYMBOL_GPL(vesafb_queue_task);
-+EXPORT_SYMBOL_GPL(vesafb_wait_for_thread);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Michal Januszewski");
-+
-diff --git a/drivers/video/vesafb-tng.c b/drivers/video/vesafb-tng.c
-new file mode 100644
-index 0000000..b4d4394
---- /dev/null
-+++ b/drivers/video/vesafb-tng.c
-@@ -0,0 +1,1586 @@
-+/*
-+ * Framebuffer driver for VBE 2.0+ compliant graphic boards
-+ *
-+ * (c) 2004-2006 Michal Januszewski <spock@gentoo.org>
-+ *     Based upon vesafb code by Gerd Knorr <kraxel@goldbach.in-berlin.de>
-+ *
-+ */
-+
-+#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/delay.h>
-+#include <linux/fb.h>
-+#include <linux/ioport.h>
-+#include <linux/init.h>
-+#include <linux/proc_fs.h>
-+#include <linux/completion.h>
-+#include <linux/platform_device.h>
-+#include <video/edid.h>
-+#include <video/vesa.h>
-+#include <video/vga.h>
-+#include <asm/io.h>
-+#include <asm/mtrr.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include "edid.h"
-+
-+#define dac_reg       (0x3c8)
-+#define dac_val       (0x3c9)
-+
-+#define VESAFB_NEED_EXACT_RES         1
-+#define VESAFB_NEED_EXACT_DEPTH 2
-+
-+/* --------------------------------------------------------------------- */
-+
-+static struct fb_var_screeninfo vesafb_defined __initdata = {
-+      .activate       = FB_ACTIVATE_NOW,
-+      .height         = 0,
-+      .width          = 0,
-+      .right_margin   = 32,
-+      .upper_margin   = 16,
-+      .lower_margin   = 4,
-+      .vsync_len      = 4,
-+      .vmode          = FB_VMODE_NONINTERLACED,
-+};
-+
-+static struct fb_fix_screeninfo vesafb_fix __initdata = {
-+      .id     = "VESA VGA",
-+      .type   = FB_TYPE_PACKED_PIXELS,
-+      .accel  = FB_ACCEL_NONE,
-+};
-+
-+static int  mtrr       = 0;   /* disable mtrr by default */
-+static int  blank      = 1;     /* enable blanking by default */
-+static int  ypan       = 0;   /* 0 - nothing, 1 - ypan, 2 - ywrap */
-+static int  pmi_setpal = 1;   /* pmi for palette changes */
-+static u16  *pmi_base  = NULL;  /* protected mode interface location */
-+static void (*pmi_start)(void) = NULL;
-+static void (*pmi_pal)(void)   = NULL;
-+static struct vesafb_vbe_ib  vbe_ib;
-+static struct vesafb_mode_ib *vbe_modes;
-+static int                   vbe_modes_cnt = 0;
-+static struct fb_info      *vesafb_info = NULL;
-+static int  nocrtc                = 0; /* ignore CRTC settings */
-+static int  noedid       __initdata = 0; /* don't try DDC transfers */
-+static int  vram_remap   __initdata = 0; /* set amount of memory to be used */
-+static int  vram_total   __initdata = 0; /* set total amount of memory */
-+static u16  maxclk       __initdata = 0; /* maximum pixel clock */
-+static u16  maxvf        __initdata = 0; /* maximum vertical frequency */
-+static u16  maxhf        __initdata = 0; /* maximum horizontal frequency */
-+static int  gtf          __initdata = 0; /* forces use of the GTF */
-+static char *mode_option __initdata = NULL;
-+static u16  vbemode      __initdata = 0;
-+
-+/* --------------------------------------------------------------------- */
-+
-+static int vesafb_find_vbe_mode(int xres, int yres, int depth,
-+                              unsigned char flags)
-+{
-+      int i, match = -1, h = 0, d = 0x7fffffff;
-+
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              h = abs(vbe_modes[i].x_res - xres) +
-+                  abs(vbe_modes[i].y_res - yres) +
-+                  abs(depth - vbe_modes[i].depth);
-+              if (h == 0)
-+                      return i;
-+              if (h < d || (h == d && vbe_modes[i].depth > depth)) {
-+                      d = h;
-+                      match = i;
-+              }
-+      }
-+      i = 1;
-+
-+      if (flags & VESAFB_NEED_EXACT_DEPTH && vbe_modes[match].depth != depth)
-+              i = 0;
-+      if (flags & VESAFB_NEED_EXACT_RES && d > 24)
-+              i = 0;
-+      if (i != 0)
-+              return match;
-+      else
-+              return -1;
-+}
-+
-+static int vesafb_pan_display(struct fb_var_screeninfo *var,
-+                              struct fb_info *info)
-+{
-+      int offset;
-+
-+      offset = (var->yoffset * info->fix.line_length + var->xoffset) / 4;
-+
-+      /* It turns out it's not the best idea to do panning via vm86,
-+       * so we only allow it if we have a PMI. */
-+      if (pmi_start) {
-+              __asm__ __volatile__(
-+                      "call *(%%edi)"
-+                      : /* no return value */
-+                      : "a" (0x4f07),         /* EAX */
-+                        "b" (0),              /* EBX */
-+                        "c" (offset),         /* ECX */
-+                        "d" (offset >> 16),   /* EDX */
-+                        "D" (&pmi_start));    /* EDI */
-+      }
-+      return 0;
-+}
-+
-+static int vesafb_blank(int blank, struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int err = 1;
-+
-+      if (vbe_ib.capabilities & VBE_CAP_VGACOMPAT) {
-+              int loop = 10000;
-+              u8 seq = 0, crtc17 = 0;
-+
-+              if (blank == FB_BLANK_POWERDOWN) {
-+                      seq = 0x20;
-+                      crtc17 = 0x00;
-+                      err = 0;
-+              } else {
-+                      seq = 0x00;
-+                      crtc17 = 0x80;
-+                      err = (blank == FB_BLANK_UNBLANK) ? 0 : -EINVAL;
-+              }
-+
-+              vga_wseq(NULL, 0x00, 0x01);
-+              seq |= vga_rseq(NULL, 0x01) & ~0x20;
-+              vga_wseq(NULL, 0x00, seq);
-+
-+              crtc17 |= vga_rcrt(NULL, 0x17) & ~0x80;
-+              while (loop--);
-+              vga_wcrt(NULL, 0x17, crtc17);
-+              vga_wseq(NULL, 0x00, 0x03);
-+      } else {
-+              vesafb_create_task (tsk);
-+              if (!tsk)
-+                      return -ENOMEM;
-+              tsk->regs.eax = 0x4f10;
-+              switch (blank) {
-+              case FB_BLANK_UNBLANK:
-+                      tsk->regs.ebx = 0x0001;
-+                      break;
-+              case FB_BLANK_NORMAL:
-+                      tsk->regs.ebx = 0x0101; /* standby */
-+                      break;
-+              case FB_BLANK_POWERDOWN:
-+                      tsk->regs.ebx = 0x0401; /* powerdown */
-+                      break;
-+              default:
-+                      goto out;
-+              }
-+              tsk->flags = TF_CALL;
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) == 0x004f)
-+                      err = 0;
-+out:          kfree(tsk);
-+      }
-+      return err;
-+}
-+
-+static int vesafb_setpalette(struct vesafb_pal_entry *entries, int count,
-+                           int start, struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int i = ((struct vesafb_par*)info->par)->mode_idx;
-+      int ret = 0;
-+
-+      /* We support palette modifications for 8 bpp modes only, so
-+       * there can never be more than 256 entries. */
-+      if (start + count > 256)
-+              return -EINVAL;
-+
-+      /* Use VGA registers if mode is VGA-compatible. */
-+      if (i >= 0 && i < vbe_modes_cnt &&
-+          vbe_modes[i].mode_attr & VBE_MODE_VGACOMPAT) {
-+              for (i = 0; i < count; i++) {
-+                      outb_p(start + i,        dac_reg);
-+                      outb_p(entries[i].red,   dac_val);
-+                      outb_p(entries[i].green, dac_val);
-+                      outb_p(entries[i].blue,  dac_val);
-+              }
-+      } else if (pmi_setpal) {
-+              __asm__ __volatile__(
-+              "call *(%%esi)"
-+              : /* no return value */
-+              : "a" (0x4f09),         /* EAX */
-+                "b" (0),              /* EBX */
-+                "c" (count),          /* ECX */
-+                "d" (start),          /* EDX */
-+                "D" (entries),        /* EDI */
-+                "S" (&pmi_pal));      /* ESI */
-+      } else {
-+              vesafb_create_task (tsk);
-+              if (!tsk)
-+                      return -ENOMEM;
-+              tsk->regs.eax = 0x4f09;
-+              tsk->regs.ebx = 0x0;
-+              tsk->regs.ecx = count;
-+              tsk->regs.edx = start;
-+              tsk->buf = entries;
-+              tsk->buf_len = sizeof(struct vesafb_pal_entry) * count;
-+              tsk->flags = TF_CALL | TF_BUF_DI;
-+
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+              if ((tsk->regs.eax & 0xffff) != 0x004f)
-+                      ret = 1;
-+              kfree(tsk);
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_setcolreg(unsigned regno, unsigned red, unsigned green,
-+                          unsigned blue, unsigned transp,
-+                          struct fb_info *info)
-+{
-+      struct vesafb_pal_entry entry;
-+      int shift = 16 - info->var.green.length;
-+      int ret = 0;
-+
-+      if (regno >= info->cmap.len)
-+              return -EINVAL;
-+
-+      if (info->var.bits_per_pixel == 8) {
-+              entry.red   = red   >> shift;
-+              entry.green = green >> shift;
-+              entry.blue  = blue  >> shift;
-+              entry.pad   = 0;
-+
-+              ret = vesafb_setpalette(&entry, 1, regno, info);
-+      } else if (regno < 16) {
-+              switch (info->var.bits_per_pixel) {
-+              case 16:
-+                      if (info->var.red.offset == 10) {
-+                              /* 1:5:5:5 */
-+                              ((u32*) (info->pseudo_palette))[regno] =
-+                                              ((red   & 0xf800) >>  1) |
-+                                              ((green & 0xf800) >>  6) |
-+                                              ((blue  & 0xf800) >> 11);
-+                      } else {
-+                              /* 0:5:6:5 */
-+                              ((u32*) (info->pseudo_palette))[regno] =
-+                                              ((red   & 0xf800)      ) |
-+                                              ((green & 0xfc00) >>  5) |
-+                                              ((blue  & 0xf800) >> 11);
-+                      }
-+                      break;
-+
-+              case 24:
-+              case 32:
-+                      red   >>= 8;
-+                      green >>= 8;
-+                      blue  >>= 8;
-+                      ((u32 *)(info->pseudo_palette))[regno] =
-+                              (red   << info->var.red.offset)   |
-+                              (green << info->var.green.offset) |
-+                              (blue  << info->var.blue.offset);
-+                      break;
-+              }
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
-+{
-+      struct vesafb_pal_entry *entries;
-+      int shift = 16 - info->var.green.length;
-+      int i, ret = 0;
-+
-+      if (info->var.bits_per_pixel == 8) {
-+              if (cmap->start + cmap->len > info->cmap.start +
-+                  info->cmap.len || cmap->start < info->cmap.start)
-+                      return -EINVAL;
-+
-+              entries = vmalloc(sizeof(struct vesafb_pal_entry) * cmap->len);
-+              if (!entries)
-+                      return -ENOMEM;
-+              for (i = 0; i < cmap->len; i++) {
-+                      entries[i].red   = cmap->red[i]   >> shift;
-+                      entries[i].green = cmap->green[i] >> shift;
-+                      entries[i].blue  = cmap->blue[i]  >> shift;
-+                      entries[i].pad   = 0;
-+              }
-+              ret = vesafb_setpalette(entries, cmap->len, cmap->start, info);
-+              vfree(entries);
-+      } else {
-+              /* For modes with bpp > 8, we only set the pseudo palette in
-+               * the fb_info struct. We rely on vesafb_setcolreg to do all
-+               * sanity checking. */
-+              for (i = 0; i < cmap->len; i++) {
-+                      ret += vesafb_setcolreg(cmap->start + i, cmap->red[i],
-+                                              cmap->green[i], cmap->blue[i],
-+                                              0, info);
-+              }
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_set_par(struct fb_info *info)
-+{
-+      struct vesafb_par *par = (struct vesafb_par *) info->par;
-+      struct vesafb_task *tsk;
-+      struct vesafb_crtc_ib *crtc = NULL;
-+      struct vesafb_mode_ib *mode = NULL;
-+      int i, err = 0, depth = info->var.bits_per_pixel;
-+
-+      if (depth > 8 && depth != 32)
-+              depth = info->var.red.length + info->var.green.length +
-+                      info->var.blue.length;
-+
-+      i = vesafb_find_vbe_mode(info->var.xres, info->var.yres, depth,
-+                               VESAFB_NEED_EXACT_RES |
-+                               VESAFB_NEED_EXACT_DEPTH);
-+      if (i >= 0)
-+              mode = &vbe_modes[i];
-+      else
-+              return -EINVAL;
-+
-+      vesafb_create_task (tsk);
-+      if (!tsk)
-+              return -ENOMEM;
-+      tsk->regs.eax = 0x4f02;
-+      tsk->regs.ebx = mode->mode_id | 0x4000;         /* use LFB */
-+      tsk->flags = TF_CALL;
-+
-+      if (vbe_ib.vbe_version >= 0x0300 && !nocrtc &&
-+          info->var.pixclock != 0) {
-+              tsk->regs.ebx |= 0x0800;                /* use CRTC data */
-+              tsk->flags |= TF_BUF_DI;
-+              crtc = kmalloc(sizeof(struct vesafb_crtc_ib), GFP_KERNEL);
-+              if (!crtc) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+              crtc->horiz_start = info->var.xres + info->var.right_margin;
-+              crtc->horiz_end   = crtc->horiz_start + info->var.hsync_len;
-+              crtc->horiz_total = crtc->horiz_end + info->var.left_margin;
-+
-+              crtc->vert_start  = info->var.yres + info->var.lower_margin;
-+              crtc->vert_end    = crtc->vert_start + info->var.vsync_len;
-+              crtc->vert_total  = crtc->vert_end + info->var.upper_margin;
-+
-+              crtc->pixel_clock = PICOS2KHZ(info->var.pixclock) * 1000;
-+              crtc->refresh_rate = (u16)(100 * (crtc->pixel_clock /
-+                                   (crtc->vert_total * crtc->horiz_total)));
-+              crtc->flags = 0;
-+
-+              if (info->var.vmode & FB_VMODE_DOUBLE)
-+                      crtc->flags |= 0x1;
-+              if (info->var.vmode & FB_VMODE_INTERLACED)
-+                      crtc->flags |= 0x2;
-+              if (!(info->var.sync & FB_SYNC_HOR_HIGH_ACT))
-+                      crtc->flags |= 0x4;
-+              if (!(info->var.sync & FB_SYNC_VERT_HIGH_ACT))
-+                      crtc->flags |= 0x8;
-+              memcpy(&par->crtc, crtc, sizeof(struct vesafb_crtc_ib));
-+      } else
-+              memset(&par->crtc, 0, sizeof(struct vesafb_crtc_ib));
-+
-+      tsk->buf = (void*)crtc;
-+      tsk->buf_len = sizeof(struct vesafb_crtc_ib);
-+
-+      if (vesafb_queue_task (tsk)) {
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+              printk(KERN_ERR "vesafb: mode switch failed (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      par->mode_idx = i;
-+
-+      /* For 8bpp modes, always try to set the DAC to 8 bits. */
-+      if (vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC &&
-+          mode->bits_per_pixel <= 8) {
-+              vesafb_reset_task(tsk);
-+              tsk->flags = TF_CALL;
-+              tsk->regs.eax = 0x4f08;
-+              tsk->regs.ebx = 0x0800;
-+
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f ||
-+                  ((tsk->regs.ebx & 0xff00) >> 8) != 8) {
-+                      /* We've failed to set the DAC palette format -
-+                       * time to correct var. */
-+                      info->var.red.length    = 6;
-+                      info->var.green.length  = 6;
-+                      info->var.blue.length   = 6;
-+              }
-+      }
-+
-+      info->fix.visual = (info->var.bits_per_pixel == 8) ?
-+                         FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
-+      info->fix.line_length = mode->bytes_per_scan_line;
-+
-+      DPRINTK("set new mode %dx%d-%d (0x%x)\n",
-+              info->var.xres, info->var.yres, info->var.bits_per_pixel,
-+              mode->mode_id);
-+
-+out:  if (crtc != NULL)
-+              kfree(crtc);
-+      kfree(tsk);
-+
-+      return err;
-+}
-+
-+static void vesafb_setup_var(struct fb_var_screeninfo *var, struct fb_info *info,
-+                           struct vesafb_mode_ib *mode)
-+{
-+      var->xres = mode->x_res;
-+      var->yres = mode->y_res;
-+      var->xres_virtual = mode->x_res;
-+      var->yres_virtual = (ypan) ?
-+                            info->fix.smem_len / mode->bytes_per_scan_line :
-+                            mode->y_res;
-+      var->xoffset = 0;
-+      var->yoffset = 0;
-+      var->bits_per_pixel = mode->bits_per_pixel;
-+
-+      if (var->bits_per_pixel == 15)
-+              var->bits_per_pixel = 16;
-+
-+      if (var->bits_per_pixel > 8) {
-+              var->red.offset    = mode->red_off;
-+              var->red.length    = mode->red_len;
-+              var->green.offset  = mode->green_off;
-+              var->green.length  = mode->green_len;
-+              var->blue.offset   = mode->blue_off;
-+              var->blue.length   = mode->blue_len;
-+              var->transp.offset = mode->rsvd_off;
-+              var->transp.length = mode->rsvd_len;
-+
-+              DPRINTK("directcolor: size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n",
-+                      mode->rsvd_len,
-+                      mode->red_len,
-+                      mode->green_len,
-+                      mode->blue_len,
-+                      mode->rsvd_off,
-+                      mode->red_off,
-+                      mode->green_off,
-+                      mode->blue_off);
-+      } else {
-+              var->red.offset    = 0;
-+              var->green.offset  = 0;
-+              var->blue.offset   = 0;
-+              var->transp.offset = 0;
-+
-+              /* We're assuming that we can switch the DAC to 8 bits. If
-+               * this proves to be incorrect, we'll update the fields
-+               * later in set_par(). */
-+              if (vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC) {
-+                      var->red.length    = 8;
-+                      var->green.length  = 8;
-+                      var->blue.length   = 8;
-+                      var->transp.length = 0;
-+              } else {
-+                      var->red.length    = 6;
-+                      var->green.length  = 6;
-+                      var->blue.length   = 6;
-+                      var->transp.length = 0;
-+              }
-+      }
-+}
-+
-+static void inline vesafb_check_limits(struct fb_var_screeninfo *var,
-+                                     struct fb_info *info)
-+{
-+      struct fb_videomode *mode;
-+
-+      if (!var->pixclock)
-+              return;
-+      if (vbe_ib.vbe_version < 0x0300) {
-+              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60, var, info);
-+              return;
-+      }
-+      if (!fb_validate_mode(var, info))
-+              return;
-+      mode = fb_find_best_mode(var, &info->modelist);
-+      if (mode) {
-+              DPRINTK("find_best_mode: %d %d @ %d (vmode: %d)\n",
-+                      mode->xres, mode->yres, mode->refresh, mode->vmode);
-+              if (mode->xres == var->xres && mode->yres == var->yres &&
-+                  !(mode->vmode & (FB_VMODE_INTERLACED | FB_VMODE_DOUBLE))) {
-+                      fb_videomode_to_var(var, mode);
-+                      return;
-+              }
-+      }
-+      if (info->monspecs.gtf && !fb_get_mode(FB_MAXTIMINGS, 0, var, info))
-+              return;
-+      /* Use default refresh rate */
-+      var->pixclock = 0;
-+}
-+
-+static int vesafb_check_var(struct fb_var_screeninfo *var,
-+                          struct fb_info *info)
-+{
-+      int match = -1;
-+      int depth = var->red.length + var->green.length + var->blue.length;
-+
-+      /* Various apps will use bits_per_pixel to set the color depth,
-+       * which is theoretically incorrect, but which we'll try to handle
-+       * here. */
-+      if (depth == 0 || abs(depth - var->bits_per_pixel) >= 8)
-+              depth = var->bits_per_pixel;
-+      match = vesafb_find_vbe_mode(var->xres, var->yres, depth,
-+                                   VESAFB_NEED_EXACT_RES);
-+
-+      if (match == -1) {
-+              DPRINTK("vesafb: mode %dx%d-%d not found\n", var->xres,
-+                      var->yres, depth);
-+              return -EINVAL;
-+      }
-+
-+      vesafb_setup_var(var, info, &vbe_modes[match]);
-+      DPRINTK("found mode 0x%x (%dx%d-%dbpp)\n",
-+              vbe_modes[match].mode_id, vbe_modes[match].x_res,
-+              vbe_modes[match].y_res, vbe_modes[match].depth);
-+
-+      /* Check whether we have remapped enough memory for this mode. */
-+      if (var->yres * vbe_modes[match].bytes_per_scan_line >
-+          info->fix.smem_len) {
-+              return -EINVAL;
-+      }
-+
-+      if ((var->vmode & FB_VMODE_DOUBLE) &&
-+          !(vbe_modes[match].mode_attr & 0x100))
-+              var->vmode &= ~FB_VMODE_DOUBLE;
-+      if ((var->vmode & FB_VMODE_INTERLACED) &&
-+          !(vbe_modes[match].mode_attr & 0x200))
-+              var->vmode &= ~FB_VMODE_INTERLACED;
-+      vesafb_check_limits(var, info);
-+      return 0;
-+}
-+
-+static int vesafb_open(struct fb_info *info, int user)
-+{
-+      struct vesafb_task *tsk = NULL;
-+      struct vesafb_par *par = info->par;
-+      int cnt = atomic_read(&par->ref_count);
-+
-+      if (!cnt) {
-+              vesafb_create_task(tsk);
-+              if (!tsk)
-+                      goto out;
-+
-+              /* Get the VBE state buffer size. We want all available
-+               * hardware state data (CL = 0x0f). */
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0000;
-+              tsk->flags = TF_CALL;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+              
-+              if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+                      printk(KERN_WARNING "vesafb: VBE state buffer size "
-+                              "cannot be determined (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+                      goto out;
-+              }
-+
-+              par->vbe_state_size = 64 * (tsk->regs.ebx & 0xffff);
-+              par->vbe_state = kzalloc(par->vbe_state_size, GFP_KERNEL);
-+              if (!par->vbe_state) 
-+                      goto out;
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0001;
-+              tsk->flags = TF_CALL | TF_BUF_BX | TF_RETURN_BUF;
-+              tsk->buf = (void*)(par->vbe_state);
-+              tsk->buf_len = par->vbe_state_size;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto getstate_failed;
-+              vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+                      printk(KERN_WARNING "vesafb: VBE get state call "
-+                              "failed (eax: 0x%lx)\n", tsk->regs.eax);
-+                      goto getstate_failed;
-+              }
-+      }
-+out:
-+      atomic_inc(&par->ref_count);
-+      if (tsk)
-+              kfree(tsk);
-+      return 0;
-+
-+getstate_failed:
-+      kfree(par->vbe_state);
-+      par->vbe_state = NULL;
-+      par->vbe_state_size = 0;
-+      goto out;
-+}
-+
-+static int vesafb_release(struct fb_info *info, int user)
-+{
-+      struct vesafb_task *tsk = NULL;
-+      struct vesafb_par *par = info->par;
-+      int cnt = atomic_read(&par->ref_count);
-+
-+      if (!cnt)
-+              return -EINVAL;
-+      
-+      if (cnt == 1 && par->vbe_state && par->vbe_state_size) {
-+              vesafb_create_task(tsk);
-+              if (!tsk)
-+                      goto out;
-+
-+              tsk->regs.eax = 0x0003;
-+              tsk->regs.ebx = 0x0000;
-+              tsk->flags = TF_CALL;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0002;
-+              tsk->buf = (void*)(par->vbe_state);
-+              tsk->buf_len = par->vbe_state_size;
-+              tsk->flags = TF_CALL | TF_BUF_BX;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f)
-+                      printk(KERN_WARNING "vesafb: VBE state restore call "
-+                              "failed (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+      }
-+out:
-+      atomic_dec(&par->ref_count);
-+      if (tsk)
-+              kfree(tsk);
-+      return 0;
-+}
-+
-+static int __init vesafb_probe(struct platform_device *device);
-+
-+static struct fb_ops vesafb_ops = {
-+      .owner          = THIS_MODULE,
-+      .fb_open        = vesafb_open,
-+      .fb_release     = vesafb_release,
-+      .fb_setcolreg   = vesafb_setcolreg,
-+      .fb_setcmap     = vesafb_setcmap,
-+      .fb_pan_display = vesafb_pan_display,
-+      .fb_blank       = vesafb_blank,
-+      .fb_fillrect    = cfb_fillrect,
-+      .fb_copyarea    = cfb_copyarea,
-+      .fb_imageblit   = cfb_imageblit,
-+      .fb_check_var   = vesafb_check_var,
-+      .fb_set_par     = vesafb_set_par
-+};
-+
-+static struct platform_driver vesafb_driver = {
-+      .probe  = vesafb_probe,
-+      .driver = {
-+              .name   = "vesafb",
-+      },
-+};
-+
-+static struct platform_device *vesafb_device;
-+ 
-+#ifndef MODULE
-+int __init vesafb_setup(char *options)
-+{
-+      char *this_opt;
-+
-+      if (!options || !*options)
-+              return 0;
-+
-+      DPRINTK("options %s\n",options);
-+
-+      while ((this_opt = strsep(&options, ",")) != NULL) {
-+              if (!*this_opt) continue;
-+
-+              DPRINTK("this_opt: %s\n",this_opt);
-+
-+              if (! strcmp(this_opt, "redraw"))
-+                      ypan=0;
-+              else if (! strcmp(this_opt, "ypan"))
-+                      ypan=1;
-+              else if (! strcmp(this_opt, "ywrap"))
-+                      ypan=2;
-+              else if (! strcmp(this_opt, "vgapal"))
-+                      pmi_setpal=0;
-+              else if (! strcmp(this_opt, "pmipal"))
-+                      pmi_setpal=1;
-+              else if (! strncmp(this_opt, "mtrr:", 5))
-+                      mtrr = simple_strtoul(this_opt+5, NULL, 0);
-+              else if (! strcmp(this_opt, "nomtrr"))
-+                      mtrr=0;
-+              else if (! strcmp(this_opt, "nocrtc"))
-+                      nocrtc=1;
-+              else if (! strcmp(this_opt, "noedid"))
-+                      noedid=1;
-+              else if (! strcmp(this_opt, "noblank"))
-+                      blank=0;
-+              else if (! strcmp(this_opt, "gtf"))
-+                      gtf=1;
-+              else if (! strncmp(this_opt, "vtotal:", 7))
-+                      vram_total = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "vremap:", 7))
-+                      vram_remap = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "maxhf:", 6))
-+                      maxhf = simple_strtoul(this_opt + 6, NULL, 0);
-+              else if (! strncmp(this_opt, "maxvf:", 6))
-+                      maxvf = simple_strtoul(this_opt + 6, NULL, 0);
-+              else if (! strncmp(this_opt, "maxclk:", 7))
-+                      maxclk = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "vbemode:", 8))
-+                      vbemode = simple_strtoul(this_opt + 8, NULL,0);
-+              else if (this_opt[0] >= '0' && this_opt[0] <= '9') {
-+                      DPRINTK("mode_option: %s\n",this_opt);
-+                      mode_option = this_opt;
-+              } else {
-+                      printk(KERN_WARNING
-+                             "vesafb: unrecognized option %s\n", this_opt);
-+              }
-+      }
-+
-+      return 0;
-+}
-+#endif /* !MODULE */
-+
-+static int vesafb_read_proc_modes(char *buf, char **start, off_t offset,
-+                                int len, int *eof, void *private)
-+{
-+      int clen = 0, i;
-+
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              clen += min(snprintf(buf + clen, len - clen, "%dx%d-%d\n", vbe_modes[i].x_res,
-+                              vbe_modes[i].y_res, vbe_modes[i].depth), len - clen);
-+      }
-+      *eof = 1;
-+      return clen;
-+}
-+
-+static int vesafb_read_proc_vbe_info(char *buf, char **start, off_t offset,
-+                                   int len, int *eof, void *private)
-+{
-+      int clen = 0;
-+
-+      clen += min(snprintf(buf + clen, len, "Version:    %d.%d\n",
-+                      ((vbe_ib.vbe_version & 0xff00) >> 8),
-+                      vbe_ib.vbe_version & 0xff), len);
-+      clen += min(snprintf(buf + clen, len - clen, "Vendor:     %s\n",
-+                      (char*)vbe_ib.oem_vendor_name_ptr), len - clen);
-+      clen += min(snprintf(buf + clen, len - clen, "Product:    %s\n",
-+                      (char*)vbe_ib.oem_product_name_ptr), len - clen);
-+      clen += min(snprintf(buf + clen, len - clen, "OEM rev:    %s\n",
-+                      (char*)vbe_ib.oem_product_rev_ptr), len - clen);
-+      clen += min(snprintf(buf + clen, len - clen, "OEM string: %s\n",
-+                      (char*)vbe_ib.oem_string_ptr), len - clen);
-+
-+      *eof = 1;
-+      return clen;
-+}
-+
-+static int __init inline vesafb_vbe_getinfo(struct vesafb_task *tsk)
-+{
-+      tsk->regs.eax = 0x4f00;
-+      tsk->flags = TF_CALL | TF_GETVBEIB;
-+      tsk->buf = &vbe_ib;
-+      tsk->buf_len = sizeof(vbe_ib);
-+      if (vesafb_queue_task (tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if (vbe_ib.vbe_version < 0x0200) {
-+              printk(KERN_ERR "vesafb: Sorry, pre-VBE 2.0 cards are "
-+                              "not supported.\n");
-+              return -EINVAL;
-+      }
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+              printk(KERN_ERR "vesafb: Getting mode info block failed "
-+                              "(eax=0x%x)\n", (u32)tsk->regs.eax);
-+              return -EINVAL;
-+      }
-+
-+      printk(KERN_INFO "vesafb: %s, %s, %s (OEM: %s)\n",
-+              (char*)vbe_ib.oem_vendor_name_ptr,
-+              (char*)vbe_ib.oem_product_name_ptr,
-+              (char*)vbe_ib.oem_product_rev_ptr,
-+              (char*)vbe_ib.oem_string_ptr);
-+
-+      printk(KERN_INFO "vesafb: VBE version: %d.%d\n",
-+                       ((vbe_ib.vbe_version & 0xff00) >> 8),
-+                       vbe_ib.vbe_version & 0xff);
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getmodes(struct vesafb_task *tsk)
-+{
-+      u16 *mode = 0;
-+      int off = 0;
-+
-+      /* Count available modes. */
-+      mode = (u16*)vbe_ib.mode_list_ptr;
-+      while (*mode != 0xffff) {
-+              vbe_modes_cnt++;
-+              mode++;
-+      }
-+
-+      vbe_modes = kmalloc(sizeof(struct vesafb_mode_ib)*
-+                          vbe_modes_cnt, GFP_KERNEL);
-+      if (!vbe_modes)
-+              return -ENOMEM;
-+
-+      /* Get mode info for all available modes. */
-+      mode = (u16*)vbe_ib.mode_list_ptr;
-+
-+      while (*mode != 0xffff) {
-+              struct vesafb_mode_ib *mib;
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f01;
-+              tsk->regs.ecx = (u32) *mode;
-+              tsk->flags = TF_CALL | TF_RETURN_BUF | TF_BUF_DI;
-+              tsk->buf = vbe_modes+off;
-+              tsk->buf_len = sizeof(struct vesafb_mode_ib);
-+              if (vesafb_queue_task(tsk))
-+                      return -EINVAL;
-+              vesafb_wait_for_task(tsk);
-+              mib = p_mode(tsk->buf);
-+              mib->mode_id = *mode;
-+
-+              /* We only want modes that are supported with the currennt
-+               * hardware configuration (D0), color (D3), graphics (D4)
-+               * and that have support for the LFB (D7). */
-+              if ((mib->mode_attr & 0x99) == 0x99 &&
-+                  mib->bits_per_pixel >= 8) {
-+                      off++;
-+              } else {
-+                      vbe_modes_cnt--;
-+              }
-+              mode++;
-+              mib->depth = mib->red_len + mib->green_len + mib->blue_len;
-+              /* Handle 8bpp modes and modes with broken color component
-+               * lengths. */
-+              if (mib->depth == 0 ||
-+                  (mib->depth == 24 && mib->bits_per_pixel == 32))
-+                      mib->depth = mib->bits_per_pixel;
-+      }
-+
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getpmi(struct vesafb_task *tsk)
-+{
-+      int i;
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f0a;
-+      tsk->regs.ebx = 0x0;
-+      tsk->flags = TF_CALL;
-+      if (vesafb_queue_task(tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f || tsk->regs.es < 0xc000) {
-+              pmi_setpal = ypan = 0;
-+      } else {
-+              pmi_base  = (u16*)phys_to_virt(((u32)tsk->regs.es << 4) +
-+                           tsk->regs.edi);
-+              pmi_start = (void*)((char*)pmi_base + pmi_base[1]);
-+              pmi_pal   = (void*)((char*)pmi_base + pmi_base[2]);
-+              printk(KERN_INFO "vesafb: protected mode interface info at "
-+                               "%04x:%04x\n",
-+                               (u16)tsk->regs.es, (u16)tsk->regs.edi);
-+              printk(KERN_INFO "vesafb: pmi: set display start = %p, "
-+                               "set palette = %p\n", pmi_start, pmi_pal);
-+
-+              if (pmi_base[3]) {
-+                      printk(KERN_INFO "vesafb: pmi: ports = ");
-+                      for (i = pmi_base[3]/2; pmi_base[i] != 0xffff; i++)
-+                              printk("%x ",pmi_base[i]);
-+                      printk("\n");
-+
-+                      /*
-+                       * memory areas not supported (yet?)
-+                       *
-+                       * Rules are: we have to set up a descriptor for the
-+                       * requested memory area and pass it in the ES register
-+                       * to the BIOS function.
-+                       */
-+                      if (pmi_base[i] != 0xffff) {
-+                              printk(KERN_INFO "vesafb: can't handle memory "
-+                                               "requests, pmi disabled\n");
-+                              ypan = pmi_setpal = 0;
-+                      }
-+              }
-+      }
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getedid(struct vesafb_task *tsk,
-+                                          struct fb_info *info)
-+{
-+      int res = 0;
-+
-+      if (noedid || vbe_ib.vbe_version < 0x0300)
-+              return -EINVAL;
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f15;
-+      tsk->regs.ebx = 0;
-+      tsk->regs.ecx = 0;
-+      if (vesafb_queue_task(tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f)
-+              return -EINVAL;
-+
-+      if ((tsk->regs.ebx & 0x3) == 3) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports both "
-+                               "DDC1 and DDC2 transfers\n");
-+      } else if ((tsk->regs.ebx & 0x3) == 2) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports DDC2 "
-+                               "transfers\n");
-+      } else if ((tsk->regs.ebx & 0x3) == 1) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports DDC1 "
-+                               "transfers\n");
-+      } else {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware doesn't support "
-+                               "DDC transfers\n");
-+              return -EINVAL;
-+      }
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f15;
-+      tsk->regs.ebx = 1;
-+      tsk->regs.ecx = tsk->regs.edx = 0;
-+      tsk->flags = TF_CALL | TF_RETURN_BUF | TF_BUF_DI;
-+      tsk->buf = kmalloc(EDID_LENGTH, GFP_KERNEL);
-+      tsk->buf_len = EDID_LENGTH;
-+
-+      if (vesafb_queue_task(tsk)) {
-+              res = -EINVAL;
-+              goto out;
-+      }
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) == 0x004f) {
-+              fb_edid_to_monspecs(tsk->buf, &info->monspecs);
-+              fb_videomode_to_modelist(info->monspecs.modedb,
-+                              info->monspecs.modedb_len, &info->modelist);
-+              if (info->monspecs.vfmax && info->monspecs.hfmax) {
-+                      /* If the maximum pixel clock wasn't specified in
-+                       * the EDID block, set it to 300 MHz. */
-+                      if (info->monspecs.dclkmax == 0)
-+                              info->monspecs.dclkmax = 300 * 1000000;
-+                      info->monspecs.gtf = 1;
-+              } else {
-+                      res = -EINVAL;
-+              }
-+      }
-+
-+out:  kfree(tsk->buf);
-+      return res;
-+}
-+
-+static void __init inline vesafb_vbe_getmonspecs(struct vesafb_task *tsk,
-+                                               struct fb_info *info)
-+{
-+      struct fb_var_screeninfo var;
-+      int i;
-+      memset(&info->monspecs, 0, sizeof(struct fb_monspecs));
-+
-+      /* If we didn't get all necessary data from the EDID block,
-+       * mark it as incompatible with the GTF. */
-+      if (vesafb_vbe_getedid(tsk, info))
-+              info->monspecs.gtf = 0;
-+
-+      /* Kernel command line overrides. */
-+      if (maxclk)
-+              info->monspecs.dclkmax = maxclk * 1000000;
-+      if (maxvf)
-+              info->monspecs.vfmax = maxvf;
-+      if (maxhf)
-+              info->monspecs.hfmax = maxhf * 1000;
-+
-+      /* In case DDC transfers are not supported the user can provide
-+       * monitor limits manually. Lower limits are set to "safe" values. */
-+      if (info->monspecs.gtf == 0 && maxclk && maxvf && maxhf) {
-+              info->monspecs.dclkmin = 0;
-+              info->monspecs.vfmin = 60;
-+              info->monspecs.hfmin = 29000;
-+              info->monspecs.gtf = 1;
-+      }
-+
-+      if (info->monspecs.gtf) {
-+              printk(KERN_INFO
-+                      "vesafb: monitor limits: vf = %d Hz, hf = %d kHz, "
-+                      "clk = %d MHz\n", info->monspecs.vfmax,
-+                      (int)(info->monspecs.hfmax / 1000),
-+                      (int)(info->monspecs.dclkmax / 1000000));
-+              /* Add valid VESA video modes to our modelist. */
-+              for (i = 0; i < VESA_MODEDB_SIZE; i++) {
-+                      fb_videomode_to_var(&var, (struct fb_videomode *)
-+                                          &vesa_modes[i]);
-+                      if (!fb_validate_mode(&var, info))
-+                              fb_add_videomode((struct fb_videomode *)
-+                                               &vesa_modes[i],
-+                                               &info->modelist);
-+              }
-+      } else {
-+              /* Add all VESA video modes to our modelist. */
-+              fb_videomode_to_modelist((struct fb_videomode *)vesa_modes,
-+                                       VESA_MODEDB_SIZE, &info->modelist);
-+              printk(KERN_INFO "vesafb: no monitor limits have been set\n");
-+      }
-+      return;
-+}
-+
-+static int __init inline vesafb_vbe_init(struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int res = 0;
-+
-+      vesafb_create_task(tsk);
-+      if (!tsk)
-+              return -EINVAL;
-+      if ((res = vesafb_vbe_getinfo(tsk)) != 0)
-+              goto out;
-+      if ((res = vesafb_vbe_getmodes(tsk)) != 0)
-+              goto out;
-+      if (pmi_setpal || ypan)
-+              vesafb_vbe_getpmi(tsk);
-+
-+      INIT_LIST_HEAD(&info->modelist);
-+      vesafb_vbe_getmonspecs(tsk, info);
-+
-+out:  kfree(tsk);
-+      return res;
-+}
-+
-+static int __init decode_mode(u32 *xres, u32 *yres, u32 *bpp, u32 *refresh)
-+{
-+      int len = strlen(mode_option), i, err = 0;
-+      u8 res_specified = 0, bpp_specified = 0, refresh_specified = 0,
-+         yres_specified = 0;
-+
-+      for (i = len-1; i >= 0; i--) {
-+              switch (mode_option[i]) {
-+              case '@':
-+                      len = i;
-+                      if (!refresh_specified && !bpp_specified &&
-+                          !yres_specified) {
-+                              *refresh = simple_strtoul(&mode_option[i+1],
-+                                                        NULL, 0);
-+                              refresh_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case '-':
-+                      len = i;
-+                      if (!bpp_specified && !yres_specified) {
-+                              *bpp = simple_strtoul(&mode_option[i+1],
-+                                                    NULL, 0);
-+                              bpp_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case 'x':
-+                      if (!yres_specified) {
-+                              *yres = simple_strtoul(&mode_option[i+1],
-+                                                     NULL, 0);
-+                              yres_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case '0'...'9':
-+                      break;
-+              default:
-+                      goto out;
-+              }
-+      }
-+
-+      if (i < 0 && yres_specified) {
-+              *xres = simple_strtoul(mode_option, NULL, 0);
-+              res_specified = 1;
-+      }
-+
-+out:  if (!res_specified || !yres_specified) {
-+              printk(KERN_ERR "vesafb: invalid resolution, "
-+                              "%s not specified\n",
-+                              (!res_specified) ? "width" : "height");
-+              err = -EINVAL;
-+      }
-+
-+      return err;
-+}
-+
-+static int __init vesafb_init_set_mode(struct fb_info *info)
-+{
-+      struct fb_videomode *fbmode;
-+      struct fb_videomode mode;
-+      int i, modeid, refresh = 0;
-+      u8 refresh_specified = 0;
-+
-+      if (!mode_option)
-+              mode_option = CONFIG_FB_VESA_DEFAULT_MODE;
-+
-+      if (vbemode > 0) {
-+              for (i = 0; i < vbe_modes_cnt; i++) {
-+                      if (vbe_modes[i].mode_id == vbemode) {
-+                              info->var.vmode = FB_VMODE_NONINTERLACED;
-+                              info->var.sync = FB_SYNC_VERT_HIGH_ACT;
-+                              vesafb_setup_var(&info->var, info,
-+                                               &vbe_modes[i]);
-+                              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON,
-+                                          60, &info->var, info);
-+                              /* With pixclock set to 0, the default BIOS
-+                               * timings will be used in set_par(). */
-+                              info->var.pixclock = 0;
-+                              modeid = i;
-+                              goto out;
-+                      }
-+              }
-+              printk(KERN_INFO "specified VBE mode %d not found\n",
-+                               vbemode);
-+              vbemode = 0;
-+      }
-+
-+      /* Decode the mode specified on the kernel command line. We save
-+       * the depth into bits_per_pixel, which is wrong, but will work
-+       * anyway. */
-+      if (decode_mode(&info->var.xres, &info->var.yres,
-+                      &info->var.bits_per_pixel, &refresh))
-+              return -EINVAL;
-+      if (refresh)
-+              refresh_specified = 1;
-+      else
-+              refresh = 60;
-+
-+      /* Look for a matching VBE mode. We can live if an exact match
-+       * cannot be found. */
-+      modeid = vesafb_find_vbe_mode(info->var.xres, info->var.yres,
-+                                    info->var.bits_per_pixel, 0);
-+
-+      if (modeid == -1) {
-+              return -EINVAL;
-+      } else {
-+              info->var.vmode = FB_VMODE_NONINTERLACED;
-+              info->var.sync = FB_SYNC_VERT_HIGH_ACT;
-+              vesafb_setup_var(&info->var, info, &vbe_modes[modeid]);
-+      }
-+      if (vbe_ib.vbe_version < 0x0300) {
-+              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60,
-+                          &info->var, info);
-+              goto out;
-+      }
-+      if (!gtf) {
-+              struct fb_videomode tmode;
-+
-+              if (refresh_specified) {
-+                      fb_var_to_videomode(&tmode, &info->var);
-+                      tmode.refresh = refresh;
-+                      fbmode = fb_find_nearest_mode(&tmode, 
-+                                                    &info->modelist);
-+              } else
-+                      fbmode = fb_find_best_mode(&info->var, 
-+                                                 &info->modelist);
-+
-+              if (fbmode->xres == info->var.xres &&
-+                  fbmode->yres == info->var.yres &&
-+                  !(fbmode->vmode & (FB_VMODE_INTERLACED | FB_VMODE_DOUBLE))
-+                  && (!refresh_specified || 
-+                  abs(refresh - fbmode->refresh) <= 5)) {
-+                      fb_videomode_to_var(&info->var, fbmode);
-+                      return modeid;
-+              }
-+      }
-+      i = FB_MAXTIMINGS;
-+      if (!info->monspecs.gtf)
-+              i = FB_IGNOREMON | FB_VSYNCTIMINGS;
-+      else if (refresh_specified)
-+              i = FB_VSYNCTIMINGS;
-+      if (!fb_get_mode(i, refresh, &info->var, info))
-+              goto out;
-+      if (info->monspecs.gtf &&
-+          !fb_get_mode(FB_MAXTIMINGS, 0, &info->var, info))
-+              goto out;
-+      /* Use default refresh rate */
-+      printk(KERN_WARNING "vesafb: using default BIOS refresh rate\n");
-+      info->var.pixclock = 0;
-+
-+out:
-+      fb_var_to_videomode(&mode, &info->var);
-+      fb_add_videomode(&mode, &info->modelist);
-+      return modeid;
-+}
-+
-+static int __init vesafb_probe(struct platform_device *dev)
-+{
-+      char entry[16];
-+      struct fb_info *info;
-+      struct vesafb_mode_ib *mode = NULL;
-+      int err = 0, i, h;
-+      unsigned int size_vmode;
-+      unsigned int size_remap;
-+      unsigned int size_total;
-+
-+      vesafb_info = info = framebuffer_alloc(sizeof(struct vesafb_par) +
-+                                             sizeof(u32) * 256, &dev->dev);
-+      if (!info)
-+              return -ENOMEM;
-+
-+      if (vesafb_wait_for_thread()) {
-+              printk(KERN_ERR "vesafb: vesafb thread not running\n");
-+              framebuffer_release(info);
-+              return -EINVAL;
-+      }
-+
-+      if (vesafb_vbe_init(info)) {
-+              printk(KERN_ERR "vesafb: vbe_init failed\n");
-+              err = -EINVAL;
-+              goto out;
-+      }
-+
-+      vesafb_fix.ypanstep  = ypan     ? 1 : 0;
-+      vesafb_fix.ywrapstep = (ypan>1) ? 1 : 0;
-+
-+      info->pseudo_palette = ((u8*)info->par + sizeof(struct vesafb_par));
-+      info->fbops = &vesafb_ops;
-+      info->var = vesafb_defined;
-+      info->fix = vesafb_fix;
-+
-+      if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
-+              err = -ENXIO;
-+              goto out;
-+      }
-+
-+      i = vesafb_init_set_mode(info);
-+      if (i < 0) {
-+              err = -EINVAL;
-+              goto out_cmap;
-+      } else
-+              mode = &vbe_modes[i];
-+
-+      /* Disable blanking if the user requested so. */
-+      if (!blank) {
-+              info->fbops->fb_blank = NULL;
-+      }
-+
-+      /* Find out how much IO memory is required for the mode with
-+       * the highest resolution. */
-+      size_remap = 0;
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              h = vbe_modes[i].bytes_per_scan_line * vbe_modes[i].y_res;
-+              if (h > size_remap)
-+                      size_remap = h;
-+      }
-+      size_remap *= 2;
-+
-+      /*   size_vmode -- that is the amount of memory needed for the
-+       *                 used video mode, i.e. the minimum amount of
-+       *                 memory we need. */
-+      if (mode != NULL) {
-+              size_vmode = info->var.yres * mode->bytes_per_scan_line;
-+      } else {
-+              size_vmode = info->var.yres * info->var.xres *
-+                           ((info->var.bits_per_pixel + 7) >> 3);
-+      }
-+
-+      /*   size_total -- all video memory we have. Used for mtrr
-+       *                 entries, ressource allocation and bounds
-+       *                 checking. */
-+      size_total = vbe_ib.total_memory * 65536;
-+      if (vram_total)
-+              size_total = vram_total * 1024 * 1024;
-+      if (size_total < size_vmode)
-+              size_total = size_vmode;
-+      ((struct vesafb_par*)(info->par))->mem_total = size_total;
-+
-+      /*   size_remap -- the amount of video memory we are going to
-+       *                 use for vesafb.  With modern cards it is no
-+       *                 option to simply use size_total as th
-+       *                 wastes plenty of kernel address space. */
-+      if (vram_remap)
-+              size_remap = vram_remap * 1024 * 1024;
-+      if (size_remap < size_vmode)
-+              size_remap = size_vmode;
-+      if (size_remap > size_total)
-+              size_remap = size_total;
-+
-+      info->fix.smem_len = size_remap;
-+      info->fix.smem_start = mode->phys_base_ptr;
-+
-+      /* We have to set it here, because when setup_var() was called,
-+       * smem_len wasn't defined yet. */
-+      info->var.yres_virtual = info->fix.smem_len /
-+                               mode->bytes_per_scan_line;
-+
-+      if (ypan && info->var.yres_virtual > info->var.yres) {
-+              printk(KERN_INFO "vesafb: scrolling: %s "
-+                     "using protected mode interface, "
-+                     "yres_virtual=%d\n",
-+                     (ypan > 1) ? "ywrap" : "ypan",info->var.yres_virtual);
-+      } else {
-+              printk(KERN_INFO "vesafb: scrolling: redraw\n");
-+              info->var.yres_virtual = info->var.yres;
-+              ypan = 0;
-+      }
-+
-+      info->flags = FBINFO_FLAG_DEFAULT |
-+              (ypan) ? FBINFO_HWACCEL_YPAN : 0;
-+
-+      if (!ypan)
-+              info->fbops->fb_pan_display = NULL;
-+
-+      if (!request_mem_region(info->fix.smem_start, size_total, "vesafb")) {
-+              printk(KERN_WARNING "vesafb: cannot reserve video memory at "
-+                     "0x%lx\n", info->fix.smem_start);
-+              /* We cannot make this fatal. Sometimes this comes from magic
-+                 spaces our resource handlers simply don't know about. */
-+      }
-+
-+      info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len);
-+
-+      if (!info->screen_base) {
-+              printk(KERN_ERR
-+                     "vesafb: abort, cannot ioremap video memory "
-+                     "0x%x @ 0x%lx\n",
-+                     info->fix.smem_len, info->fix.smem_start);
-+              err = -EIO;
-+              goto out_mem;
-+      }
-+
-+      /* Request failure does not faze us, as vgacon probably has this
-+         region already (FIXME) */
-+      request_region(0x3c0, 32, "vesafb");
-+
-+#ifdef CONFIG_MTRR
-+      if (mtrr && !(info->fix.smem_start & (PAGE_SIZE - 1))) {
-+              int temp_size = size_total;
-+              unsigned int type = 0;
-+
-+              switch (mtrr) {
-+              case 1:
-+                      type = MTRR_TYPE_UNCACHABLE;
-+                      break;
-+              case 2:
-+                      type = MTRR_TYPE_WRBACK;
-+                      break;
-+              case 3:
-+                      type = MTRR_TYPE_WRCOMB;
-+                      break;
-+              case 4:
-+                      type = MTRR_TYPE_WRTHROUGH;
-+                      break;
-+              default:
-+                      type = 0;
-+                      break;
-+              }
-+
-+              if (type) {
-+                      int rc;
-+
-+                      /* Find the largest power-of-two */
-+                      while (temp_size & (temp_size - 1))
-+                              temp_size &= (temp_size - 1);
-+
-+                      /* Try and find a power of two to add */
-+                      do {
-+                              rc = mtrr_add(info->fix.smem_start,
-+                                            temp_size, type, 1);
-+                              temp_size >>= 1;
-+                      } while (temp_size >= PAGE_SIZE && rc == -EINVAL);
-+              }
-+      }
-+#endif /* CONFIG_MTRR */
-+
-+      if (register_framebuffer(info) < 0) {
-+              printk(KERN_ERR
-+                     "vesafb: failed to register framebuffer device\n");
-+              err = -EINVAL;
-+              goto out_mem;
-+      }
-+
-+      printk(KERN_INFO "vesafb: framebuffer at 0x%lx, mapped to 0x%p, "
-+             "using %dk, total %dk\n", info->fix.smem_start,
-+             info->screen_base, size_remap/1024, size_total/1024);
-+      printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node,
-+             info->fix.id);
-+
-+      sprintf(entry, "fb%d", info->node);
-+      proc_mkdir(entry, 0);
-+
-+      sprintf(entry, "fb%d/modes", info->node);
-+      create_proc_read_entry(entry, 0, 0, vesafb_read_proc_modes, NULL);
-+
-+      sprintf(entry, "fb%d/vbe_info", info->node);
-+      create_proc_read_entry(entry, 0, 0, vesafb_read_proc_vbe_info, NULL);
-+      return 0;
-+
-+out_mem:
-+      release_mem_region(info->fix.smem_start, size_total);
-+      if (!list_empty(&info->modelist))
-+              fb_destroy_modelist(&info->modelist);
-+      fb_destroy_modedb(info->monspecs.modedb);
-+out_cmap:
-+      fb_dealloc_cmap(&info->cmap);
-+out:
-+      framebuffer_release(info);
-+      vesafb_info = NULL;
-+      kfree(vbe_modes);
-+      vbe_modes = NULL;
-+      return err;
-+}
-+
-+int __init vesafb_init(void)
-+{
-+      int ret;
-+#ifndef MODULE
-+      char *option = NULL;
-+
-+      if (fb_get_options("vesafb", &option))
-+              return -ENODEV;
-+      vesafb_setup(option);
-+#endif
-+      ret = platform_driver_register(&vesafb_driver);
-+
-+      if (!ret) {
-+              vesafb_device = platform_device_alloc("vesafb", 0);
-+
-+              if (vesafb_device)
-+                      ret = platform_device_add(vesafb_device);
-+              else
-+                      ret = -ENOMEM;
-+
-+              if (ret) {
-+                      platform_device_put(vesafb_device);
-+                      platform_driver_unregister(&vesafb_driver);
-+              }
-+      }
-+      return ret;
-+}
-+
-+module_init(vesafb_init);
-+
-+#ifdef MODULE
-+void __exit vesafb_exit(void)
-+{
-+      char entry[16];
-+
-+      if (vesafb_info)
-+              unregister_framebuffer(vesafb_info);
-+
-+      platform_device_unregister(vesafb_device);
-+      platform_driver_unregister(&vesafb_driver);
-+
-+      if (vesafb_info) {
-+              struct vesafb_par *par = (struct vesafb_par*)vesafb_info->par;
-+
-+              sprintf(entry, "fb%d/modes", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              sprintf(entry, "fb%d/vbe_info", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              sprintf(entry, "fb%d", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              iounmap(vesafb_info->screen_base);
-+              release_mem_region(vesafb_info->fix.smem_start,
-+                                 par->mem_total);
-+              fb_dealloc_cmap(&vesafb_info->cmap);
-+              if (!list_empty(&vesafb_info->modelist))
-+                      fb_destroy_modelist(&vesafb_info->modelist);
-+              fb_destroy_modedb(vesafb_info->monspecs.modedb);
-+              framebuffer_release(vesafb_info);
-+      }
-+
-+      if (vbe_modes != NULL)
-+              kfree(vbe_modes);
-+}
-+
-+module_exit(vesafb_exit);
-+
-+static inline int param_get_scroll(char *buffer, struct kernel_param *kp)
-+{
-+      return 0;
-+}
-+static inline int param_set_scroll(const char *val, struct kernel_param *kp)
-+{
-+      ypan = 0;
-+
-+      if (! strcmp(val, "redraw"))
-+              ypan = 0;
-+      else if (! strcmp(val, "ypan"))
-+              ypan = 1;
-+      else if (! strcmp(val, "ywrap"))
-+              ypan = 2;
-+
-+      return 0;
-+}
-+
-+#define param_check_scroll(name, p) __param_check(name, p, void);
-+
-+module_param_named(scroll, ypan, scroll, 0);
-+MODULE_PARM_DESC(scroll,"Scrolling mode, set to 'redraw', 'ypan' or 'ywrap'");
-+module_param_named(vgapal, pmi_setpal, invbool, 0);
-+MODULE_PARM_DESC(vgapal,"bool: set palette using VGA registers");
-+module_param_named(pmipal, pmi_setpal, bool, 0);
-+MODULE_PARM_DESC(pmipal,"bool: set palette using PMI calls");
-+module_param(mtrr, uint, 0);
-+MODULE_PARM_DESC(mtrr,"Memory Type Range Registers setting. Use 0 to disable.");
-+module_param(blank, bool, 1);
-+MODULE_PARM_DESC(blank,"bool: enable hardware blanking");
-+module_param(nocrtc, bool, 0);
-+MODULE_PARM_DESC(nocrtc,"bool: ignore CRTC timings when setting modes");
-+module_param(noedid, bool, 0);
-+MODULE_PARM_DESC(noedid,"bool: ignore EDID-provided monitor limits "
-+                      "when setting modes");
-+module_param(gtf, bool, 0);
-+MODULE_PARM_DESC(gtf,"bool: force use of VESA GTF to calculate mode timings");
-+module_param(vram_remap, uint, 0);
-+MODULE_PARM_DESC(vram_remap,"Set amount of video memory to be used [MiB]");
-+module_param(vram_total, uint, 0);
-+MODULE_PARM_DESC(vram_total,"Set total amount of video memoery [MiB]");
-+module_param(maxclk, ushort, 0);
-+MODULE_PARM_DESC(maxclk,"Maximum pixelclock [MHz], overrides EDID data");
-+module_param(maxhf, ushort, 0);
-+MODULE_PARM_DESC(maxhf,"Maximum horizontal frequency [kHz], "
-+                     "overrides EDID data");
-+module_param(maxvf, ushort, 0);
-+MODULE_PARM_DESC(maxvf,"Maximum vertical frequency [Hz], "
-+                     "overrides EDID data");
-+module_param_named(mode, mode_option, charp, 0);
-+MODULE_PARM_DESC(mode, "Specify resolution as "
-+                     "\"<xres>x<yres>[-<bpp>][@<refresh>]\"");
-+module_param(vbemode, ushort, 0);
-+MODULE_PARM_DESC(vbemode,"VBE mode number to set, overrides 'mode' setting");
-+
-+#endif /* MODULE */
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Michal Januszewski");
-+MODULE_DESCRIPTION("Framebuffer driver for VBE2.0+ compliant graphics boards");
-+
-diff --git a/include/linux/sched.h b/include/linux/sched.h
-index 4463735..7283e48 100644
---- a/include/linux/sched.h
-+++ b/include/linux/sched.h
-@@ -1390,6 +1390,8 @@ extern void mmput(struct mm_struct *);
- extern struct mm_struct *get_task_mm(struct task_struct *task);
- /* Remove the current tasks stale references to the old mm_struct */
- extern void mm_release(struct task_struct *, struct mm_struct *);
-+/* Create a new mm for a kernel thread */
-+extern int set_new_mm(void);
- extern int  copy_thread(int, unsigned long, unsigned long, unsigned long, struct task_struct *, struct pt_regs *);
- extern void flush_thread(void);
-diff --git a/include/video/vesa.h b/include/video/vesa.h
-new file mode 100644
-index 0000000..bb5abcf
---- /dev/null
-+++ b/include/video/vesa.h
-@@ -0,0 +1,150 @@
-+#if 0
-+#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , \
-+                                                ## args)
-+#else
-+#define DPRINTK(fmt, args...)
-+#endif
-+
-+#define p_crtc(arg) ((struct vesafb_crtc_ib*)(arg))
-+#define p_vbe(arg)  ((struct vesafb_vbe_ib*)(arg))
-+#define p_mode(arg) ((struct vesafb_mode_ib*)(arg))
-+
-+struct vesafb_task {
-+      u8 flags;
-+      void *buf;
-+      int buf_len;
-+      struct vm86_regs regs;
-+      struct list_head node;
-+      struct completion done;
-+};
-+
-+/* Vesafb task flags and masks */
-+#define TF_CALL               0x00
-+#define TF_EXIT               0x01
-+#define TF_GETVBEIB   0x02
-+#define TF_BUF_DI     0x04
-+#define TF_BUF_BX     0x08
-+#define TF_RETURN_BUF 0x10
-+
-+/* Macros and functions for manipulating vesafb tasks */
-+#define vesafb_create_task(task)                              \
-+do {                                                          \
-+      task = kmalloc(sizeof(struct vesafb_task), GFP_ATOMIC); \
-+      if (task)                                               \
-+              memset(task, 0, sizeof(struct vesafb_task));    \
-+      init_completion(&task->done);                           \
-+} while (0)
-+
-+#define vesafb_wait_for_task(task)    wait_for_completion(&task->done);
-+#define vesafb_reset_task(task)               init_completion(&task->done);
-+int vesafb_queue_task(struct vesafb_task *task);
-+
-+/* Functions for controlling the vesafb thread */
-+int vesafb_wait_for_thread(void);
-+
-+#define VBE_CAP_CAN_SWITCH_DAC        0x01
-+#define VBE_CAP_VGACOMPAT     0x02
-+
-+/* This struct is 512 bytes long */
-+struct vesafb_vbe_ib {
-+      char vbe_signature[4];
-+      u16  vbe_version;
-+      u32  oem_string_ptr;
-+      u32  capabilities;
-+      u32  mode_list_ptr;
-+      u16  total_memory;
-+      u16  oem_software_rev;
-+      u32  oem_vendor_name_ptr;
-+      u32  oem_product_name_ptr;
-+      u32  oem_product_rev_ptr;
-+      u8   reserved[222];
-+      char oem_data[256];
-+} __attribute__ ((packed));
-+
-+struct vesafb_crtc_ib {
-+      u16 horiz_total;
-+      u16 horiz_start;
-+      u16 horiz_end;
-+      u16 vert_total;
-+      u16 vert_start;
-+      u16 vert_end;
-+      u8  flags;
-+      u32 pixel_clock;
-+      u16 refresh_rate;
-+      u8  reserved[40];
-+} __attribute__ ((packed));
-+
-+#define VBE_MODE_VGACOMPAT    0x20
-+
-+struct vesafb_mode_ib {
-+      /* for all VBE revisions */
-+      u16 mode_attr;
-+      u8  winA_attr;
-+      u8  winB_attr;
-+      u16 win_granularity;
-+      u16 win_size;
-+      u16 winA_seg;
-+      u16 winB_seg;
-+      u32 win_func_ptr;
-+      u16 bytes_per_scan_line;
-+
-+      /* for VBE 1.2+ */
-+      u16 x_res;
-+      u16 y_res;
-+      u8  x_char_size;
-+      u8  y_char_size;
-+      u8  planes;
-+      u8  bits_per_pixel;
-+      u8  banks;
-+      u8  memory_model;
-+      u8  bank_size;
-+      u8  image_pages;
-+      u8  reserved1;
-+
-+      /* Direct color fields for direct/6 and YUV/7 memory models. */
-+      /* Offsets are bit positions of lsb in the mask. */
-+      u8  red_len;
-+      u8  red_off;
-+      u8  green_len;
-+      u8  green_off;
-+      u8  blue_len;
-+      u8  blue_off;
-+      u8  rsvd_len;
-+      u8  rsvd_off;
-+      u8  direct_color_info;  /* direct color mode attributes */
-+
-+      /* for VBE 2.0+ */
-+      u32 phys_base_ptr;
-+      u8  reserved2[6];
-+
-+      /* for VBE 3.0+ */
-+      u16 lin_bytes_per_scan_line;
-+      u8  bnk_image_pages;
-+      u8  lin_image_pages;
-+      u8  lin_red_len;
-+      u8  lin_red_off;
-+      u8  lin_green_len;
-+      u8  lin_green_off;
-+      u8  lin_blue_len;
-+      u8  lin_blue_off;
-+      u8  lin_rsvd_len;
-+      u8  lin_rsvd_off;
-+      u32 max_pixel_clock;
-+      u16 mode_id;
-+      u8  depth;
-+} __attribute__ ((packed));
-+
-+struct vesafb_pal_entry {
-+      u_char blue, green, red, pad;
-+} __attribute__ ((packed));
-+
-+struct vesafb_par {
-+      u8 *vbe_state;
-+      int vbe_state_size;
-+      atomic_t ref_count;
-+      
-+      u32 mem_total;
-+      int mode_idx;
-+      struct vesafb_crtc_ib crtc;
-+};
-+
-diff --git a/kernel/fork.c b/kernel/fork.c
-index fc723e5..dc8f93b 100644
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -100,6 +100,7 @@ struct kmem_cache *fs_cachep;
- /* SLAB cache for vm_area_struct structures */
- struct kmem_cache *vm_area_cachep;
-+EXPORT_SYMBOL_GPL(vm_area_cachep);
- /* SLAB cache for mm_struct structures (tsk->mm) */
- static struct kmem_cache *mm_cachep;
-@@ -399,6 +400,40 @@ void mmput(struct mm_struct *mm)
- EXPORT_SYMBOL_GPL(mmput);
- /**
-+ * set_new_mm - allocate, init and activate a new mm for a kernel thread
-+ */
-+int set_new_mm(void)
-+{
-+      struct mm_struct *mm;
-+      struct task_struct *tsk = current;
-+      struct mm_struct *active_mm;
-+
-+      mm = mm_alloc();
-+      if (!mm)
-+              goto fail_nomem;
-+      if (init_new_context(current,mm))
-+              goto fail_nocontext;
-+
-+      task_lock(tsk);
-+      tsk->flags |= PF_BORROWED_MM;   
-+      active_mm = tsk->active_mm;
-+      current->mm = mm;
-+      current->active_mm = mm;
-+      activate_mm(active_mm, mm);
-+      task_unlock(current);
-+
-+      /* Drop the previous active_mm */
-+      mmdrop(active_mm);
-+      return 0;
-+      
-+fail_nocontext:
-+      mmdrop(mm);
-+fail_nomem:
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL_GPL(set_new_mm);
-+
-+/**
-  * get_task_mm - acquire a reference to the task's mm
-  *
-  * Returns %NULL if the task has no mm.  Checks PF_BORROWED_MM (meaning
-diff --git a/mm/memory.c b/mm/memory.c
-index 563792f..a9519ea 100644
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -1193,6 +1193,7 @@ int zeromap_page_range(struct vm_area_struct *vma,
-       } while (pgd++, addr = next, addr != end);
-       return err;
- }
-+EXPORT_SYMBOL_GPL(zeromap_page_range);
- pte_t * fastcall get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)
- {
-diff --git a/mm/mmap.c b/mm/mmap.c
-index 9717337..6fa5b1c 100644
---- a/mm/mmap.c
-+++ b/mm/mmap.c
-@@ -2024,6 +2024,7 @@ int insert_vm_struct(struct mm_struct * mm, struct vm_area_struct * vma)
-       vma_link(mm, vma, prev, rb_link, rb_parent);
-       return 0;
- }
-+EXPORT_SYMBOL_GPL(insert_vm_struct);
- /*
-  * Copy the vma structure to a new location in the same mm,
diff --git a/meta/packages/linux/linux-rp-2.6.21/wm97xx-lcdnoise-r0.patch b/meta/packages/linux/linux-rp-2.6.21/wm97xx-lcdnoise-r0.patch
deleted file mode 100644 (file)
index 191de3a..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-Index: linux-tosa/drivers/input/touchscreen/wm9712.c
-===================================================================
---- linux-tosa.orig/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/drivers/input/touchscreen/wm9712.c      2006-08-29 16:52:50.923275896 +0100
-@@ -1,7 +1,7 @@
- /*
-  * wm9712.c  --  Codec driver for Wolfson WM9712 AC97 Codecs.
-  *
-- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC.
-  * Author: Liam Girdwood
-  *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-  * Parts Copyright : Ian Molton <spyro@f2s.com>
-@@ -13,6 +13,12 @@
-  *  Free Software Foundation;  either version 2 of the  License, or (at your
-  *  option) any later version.
-  *
-+ *  Revision history
-+ *     4th Jul 2005  Initial version.
-+ *    29th Aug 2006  Mike Arthur <mike@mikearthur.co.uk>
-+ *                   Added fixes for Sharp SL-6000 (Tosa) LCD noise causing
-+ *                   touchscreen interference.
-+ *
-  */
- #include <linux/module.h>
-@@ -28,6 +34,10 @@
- #define WM9705_VERSION                "0.60"
- #define DEFAULT_PRESSURE      0xb0c0
-+#define CCNT(a)     asm volatile ("mrc p14, 0, %0, C1, C1, 0" : "=r"(a))
-+#define CCNT_ON()   asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1))
-+#define CCNT_OFF()  asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1))
-+
- /*
-  * Debug
-  */
-@@ -243,6 +253,36 @@
-       return wm->dig[2] & WM9712_PDEN;
- }
-+
-+#ifdef CONFIG_MACH_TOSA
-+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait
-+ * before sampling the Y axis of the touchscreen */
-+static inline void wm9712_lcd_sync_on(struct wm97xx* wm, int adcsel) {
-+    unsigned long timer1 = 0, timer2 = 0, wait_time = 0;
-+    if (adcsel == WM97XX_ADCSEL_Y) {
-+        wait_time = wm97xx_calc_lcd_waittime(wm);
-+
-+        CCNT_ON();
-+
-+        if (wait_time) {
-+            /* wait for LCD rising edge */
-+            wm_machinfo->wait_hsync();
-+            /* get clock */
-+            CCNT(timer1);
-+            CCNT(timer2);
-+
-+            while ((timer2 - timer1) < wait_time) {
-+                CCNT(timer2);
-+            }
-+        }
-+    }
-+}
-+
-+static inline void wm9712_lcd_sync_off(void) {
-+    CCNT_OFF();
-+}
-+#endif
-+
- /*
-  * Read a sample from the WM9712 adc in polling mode.
-  */
-@@ -260,6 +300,9 @@
-       /* set up digitiser */
-       if (adcsel & 0x8000)
-               adcsel = ((adcsel & 0x7fff) + 3) << 12;
-+    #ifdef CONFIG_MACH_TOSA
-+    wm9712_lcd_sync_on(wm, adcsel);
-+    #endif
-       wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay));
-       
-       /* wait 3 AC97 time slots + delay for conversion */
-@@ -282,6 +325,10 @@
-       
-       *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD);
-       
-+    #ifdef CONFIG_MACH_TOSA
-+    wm9712_lcd_sync_off();
-+    #endif
-+
-       /* check we have correct sample */
-       if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) {
-               dbg ("adc wrong sample, read %x got %x", adcsel,
-@@ -303,11 +350,12 @@
- static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data)
- {
-       int rc;
--      
-       if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID)
-               return rc;
-+
-       if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID)
-               return rc;
-+
-       if (pil && !five_wire) {
-               if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID)
-                       return rc;
-Index: linux-tosa/drivers/input/touchscreen/wm97xx-core.c
-===================================================================
---- linux-tosa.orig/drivers/input/touchscreen/wm97xx-core.c    2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:50.924275744 +0100
-@@ -2,7 +2,7 @@
-  * wm97xx-core.c  --  Touch screen driver core for Wolfson WM9705, WM9712
-  *                           and WM9713 AC97 Codecs.
-  *
-- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC.
-  * Author: Liam Girdwood
-  *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-  * Parts Copyright : Ian Molton <spyro@f2s.com>
-@@ -67,6 +67,9 @@
-  *                   GPIOs) and 2.6 power management. 
-  *    29th Nov 2004  Added WM9713 support.
-  *     4th Jul 2005  Moved codec specific code out to seperate files.
-+ *    29th Aug 2006  Mike Arthur <mike@mikearthur.co.uk>
-+ *                   Added fixes for Sharp SL-6000 (Tosa) LCD noise causing
-+ *                   touchscreen interference.
-  */  
-     
- #include <linux/module.h>
-@@ -94,6 +97,7 @@
- static DECLARE_MUTEX(gpio_sem);
- static LIST_HEAD(wm97xx_misc_list);
- static struct wm97xx* wm_codec = NULL;
-+struct wm97xx_machinfo *wm_machinfo;
- /*
-  * WM97xx - enable/disable AUX ADC sysfs 
-@@ -832,6 +836,23 @@
-               mdev->remove(wm_codec);
- }
-+#ifdef CONFIG_MACH_TOSA
-+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait
-+ * before sampling the Y axis of the touchscreen */
-+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm) {
-+    unsigned long hsync_time = wm_machinfo->get_hsync_time();
-+    return hsync_time;
-+}
-+
-+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo) {
-+    wm_machinfo = machinfo;
-+}
-+
-+void wm97xx_unset_machinfo() {
-+    wm_machinfo = NULL;
-+}
-+#endif
-+
- static struct device_driver wm97xx_driver = {
-       .name =         "ac97", 
-       .bus =          &ac97_bus_type, 
-@@ -861,6 +882,9 @@
- EXPORT_SYMBOL_GPL(wm97xx_reg_write);
- EXPORT_SYMBOL_GPL(wm97xx_register_misc_dev);
- EXPORT_SYMBOL_GPL(wm97xx_unregister_misc_dev);
-+EXPORT_SYMBOL_GPL(wm97xx_calc_lcd_waittime);
-+EXPORT_SYMBOL_GPL(wm97xx_set_machinfo);
-+EXPORT_SYMBOL_GPL(wm97xx_unset_machinfo);
- module_init(wm97xx_init); 
- module_exit(wm97xx_exit);
-Index: linux-tosa/include/linux/wm97xx.h
-===================================================================
---- linux-tosa.orig/include/linux/wm97xx.h     2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/include/linux/wm97xx.h  2006-08-29 16:52:50.924275744 +0100
-@@ -207,6 +207,7 @@
- struct wm97xx;
- extern struct wm97xx_codec_drv wm97xx_codec;
-+extern struct wm97xx_machinfo *wm_machinfo;
- /*
-  * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs
-@@ -253,6 +254,11 @@
-       struct list_head list;
- };
-+struct wm97xx_machinfo {
-+    unsigned long (*get_hsync_time)(void);
-+    void (*wait_hsync)(void);
-+};
-+
- int wm97xx_register_misc_dev(struct wm97xx_misc_dev* mdev);
- void wm97xx_unregister_misc_dev(struct wm97xx_misc_dev* mdev);
-@@ -281,4 +287,9 @@
- int wm97xx_acc_startup(struct wm97xx* wm);
- void wm97xx_acc_shutdown(struct wm97xx* wm);
-+
-+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm);
-+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo);
-+void wm97xx_unset_machinfo(void);
-+
- #endif
diff --git a/meta/packages/linux/linux-rp-2.6.22/connectplus-remove-ide-HACK.patch b/meta/packages/linux/linux-rp-2.6.22/connectplus-remove-ide-HACK.patch
deleted file mode 100644 (file)
index 4414b21..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Index: linux-2.6.13/drivers/ide/legacy/ide-cs.c
-===================================================================
---- linux-2.6.13.orig/drivers/ide/legacy/ide-cs.c      2005-09-01 22:43:46.000000000 +0100
-+++ linux-2.6.13/drivers/ide/legacy/ide-cs.c   2005-09-01 22:45:46.000000000 +0100
-@@ -488,7 +488,6 @@
-       PCMCIA_DEVICE_PROD_ID123("KODAK Picture Card       ", "KODAK  ", "V100K", 0x94a0d8f3, 0xe4fc3ea0, 0xe5e7eed4),
-       PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
-       PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
--      PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
-       PCMCIA_DEVICE_NULL,
- };
- MODULE_DEVICE_TABLE(pcmcia, ide_ids);
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-akita b/meta/packages/linux/linux-rp-2.6.22/defconfig-akita
deleted file mode 100644 (file)
index dd8cb85..0000000
+++ /dev/null
@@ -1,1747 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20
-# Thu Mar 29 12:24:24 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_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_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_SYSFS_DEPRECATED=y
-# CONFIG_RELAY is not set
-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_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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL=y
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-# CONFIG_PXA_SHARPSL_25x is not set
-CONFIG_PXA_SHARPSL_27x=y
-CONFIG_MACH_AKITA=y
-CONFIG_MACH_SPITZ=y
-CONFIG_MACH_BORZOI=y
-CONFIG_PXA27x=y
-CONFIG_PXA_SHARP_Cxx00=y
-CONFIG_PXA_SSP=y
-# CONFIG_PXA_KEYS 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_XSCALE_PMU=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2  fbcon=rotate:1 dyntick=enable quiet"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=y
-
-#
-# 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=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=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_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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Dongle support
-#
-
-#
-# 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=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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 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_WLAN_80211=y
-CONFIG_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_KEYBOARD_CORGI is not set
-CONFIG_KEYBOARD_SPITZ=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_SPITZ=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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_S1D13XXX is not set
-CONFIG_FB_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-# CONFIG_FB_PXA_OVERLAY is not set
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX is not set
-# CONFIG_FB_W100 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=y
-CONFIG_FONTS=y
-# CONFIG_FONT_8x8 is not set
-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
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 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_CORGI=y
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# PCMCIA devices
-#
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_PDAUDIOCF is not set
-
-#
-# SoC audio support
-#
-CONFIG_SND_SOC=m
-
-
-#
-# Soc Platforms
-#
-CONFIG_SND_PXA2xx_SOC=m
-CONFIG_SND_PXA2xx_SOC_I2S=m
-CONFIG_SND_PXA2xx_SOC_SPITZ=m
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2XX_SOC=m
-CONFIG_SND_PXA2XX_SOC_I2S=m
-CONFIG_SND_PXA2XX_SOC_SPITZ=m
-# CONFIG_SND_PXA2XX_SOC_MAGICIAN is not set
-
-#
-# SoC Audio for the Atmel AT91
-#
-
-#
-# SoC Audio for the Freescale i.MX
-#
-
-#
-# SoC Audio for the Samsung S3C24XX
-#
-
-#
-# Soc Codecs
-#
-# 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=m
-# 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_WM9713 is not set
-# CONFIG_SND_SOC_WM9712 is not set
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 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=y
-# CONFIG_USB_ARCH_HAS_EHCI is not set
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# 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_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-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 is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 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=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=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_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X 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
-
-#
-# 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_UNSAFE_RESUME=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
-
-#
-# 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=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 is not set
-# CONFIG_EXT4DEV_FS is not set
-CONFIG_JBD=m
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-CONFIG_FS_POSIX_ACL=y
-# 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=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_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_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_TIMER_STATS=y
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-CONFIG_SHARPSL_RC=m
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-bootcdx86 b/meta/packages/linux/linux-rp-2.6.22/defconfig-bootcdx86
deleted file mode 100644 (file)
index 833f72a..0000000
+++ /dev/null
@@ -1,1607 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.21
-# Mon Jun 11 12:01:43 2007
-#
-CONFIG_X86_32=y
-CONFIG_GENERIC_TIME=y
-CONFIG_CLOCKSOURCE_WATCHDOG=y
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_X86=y
-CONFIG_MMU=y
-CONFIG_ZONE_DMA=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_GENERIC_BUG=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=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 is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_UTS_NS is not set
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-# CONFIG_IKCONFIG is not set
-# CONFIG_CPUSETS is not set
-# CONFIG_SYSFS_DEPRECATED is not set
-# CONFIG_RELAY is not set
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-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=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 is not set
-# 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 is not set
-# CONFIG_IOSCHED_DEADLINE is not set
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_DEFAULT_AS is not set
-# CONFIG_DEFAULT_DEADLINE is not set
-CONFIG_DEFAULT_CFQ=y
-# CONFIG_DEFAULT_NOOP is not set
-CONFIG_DEFAULT_IOSCHED="cfq"
-
-#
-# Processor type and features
-#
-CONFIG_TICK_ONESHOT=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
-CONFIG_SMP=y
-CONFIG_X86_PC=y
-# CONFIG_X86_ELAN is not set
-# CONFIG_X86_VOYAGER is not set
-# CONFIG_X86_NUMAQ is not set
-# CONFIG_X86_SUMMIT is not set
-# CONFIG_X86_BIGSMP is not set
-# CONFIG_X86_VISWS is not set
-# CONFIG_X86_GENERICARCH is not set
-# CONFIG_X86_ES7000 is not set
-# CONFIG_PARAVIRT is not set
-# CONFIG_M386 is not set
-# CONFIG_M486 is not set
-# CONFIG_M586 is not set
-# CONFIG_M586TSC is not set
-# CONFIG_M586MMX is not set
-# CONFIG_M686 is not set
-CONFIG_MPENTIUMII=y
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUMM is not set
-# CONFIG_MCORE2 is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK6 is not set
-# CONFIG_MK7 is not set
-# CONFIG_MK8 is not set
-# CONFIG_MCRUSOE is not set
-# CONFIG_MEFFICEON is not set
-# CONFIG_MWINCHIPC6 is not set
-# CONFIG_MWINCHIP2 is not set
-# CONFIG_MWINCHIP3D is not set
-# CONFIG_MGEODEGX1 is not set
-# CONFIG_MGEODE_LX is not set
-# CONFIG_MCYRIXIII is not set
-# CONFIG_MVIAC3_2 is not set
-CONFIG_X86_GENERIC=y
-CONFIG_X86_CMPXCHG=y
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_WP_WORKS_OK=y
-CONFIG_X86_INVLPG=y
-CONFIG_X86_BSWAP=y
-CONFIG_X86_POPAD_OK=y
-CONFIG_X86_CMPXCHG64=y
-CONFIG_X86_GOOD_APIC=y
-CONFIG_X86_INTEL_USERCOPY=y
-CONFIG_X86_USE_PPRO_CHECKSUM=y
-CONFIG_X86_TSC=y
-CONFIG_HPET_TIMER=y
-CONFIG_NR_CPUS=8
-CONFIG_SCHED_SMT=y
-CONFIG_SCHED_MC=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_X86_IO_APIC=y
-CONFIG_X86_MCE=y
-CONFIG_X86_MCE_NONFATAL=y
-CONFIG_X86_MCE_P4THERMAL=y
-CONFIG_VM86=y
-# CONFIG_TOSHIBA is not set
-# CONFIG_I8K is not set
-# CONFIG_X86_REBOOTFIXUPS is not set
-# CONFIG_MICROCODE is not set
-# CONFIG_X86_MSR is not set
-# CONFIG_X86_CPUID is not set
-
-#
-# Firmware Drivers
-#
-# CONFIG_EDD is not set
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-CONFIG_NOHIGHMEM=y
-# CONFIG_HIGHMEM4G is not set
-# CONFIG_HIGHMEM64G is not set
-CONFIG_VMSPLIT_3G=y
-# CONFIG_VMSPLIT_3G_OPT is not set
-# CONFIG_VMSPLIT_2G is not set
-# CONFIG_VMSPLIT_1G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_POPULATES_NODE_MAP=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=y
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_RESOURCES_64BIT is not set
-CONFIG_ZONE_DMA_FLAG=1
-# CONFIG_MATH_EMULATION is not set
-CONFIG_MTRR=y
-# CONFIG_EFI is not set
-CONFIG_IRQBALANCE=y
-CONFIG_SECCOMP=y
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_300 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-# CONFIG_KEXEC is not set
-CONFIG_PHYSICAL_START=0x100000
-# CONFIG_RELOCATABLE is not set
-CONFIG_PHYSICAL_ALIGN=0x100000
-# CONFIG_HOTPLUG_CPU is not set
-# CONFIG_COMPAT_VDSO is not set
-
-#
-# Power management options (ACPI, APM)
-#
-CONFIG_PM=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_PROCFS=y
-CONFIG_ACPI_AC=y
-CONFIG_ACPI_BATTERY=y
-CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_FAN=y
-# CONFIG_ACPI_DOCK is not set
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_THERMAL=y
-# CONFIG_ACPI_ASUS is not set
-# CONFIG_ACPI_IBM is not set
-# CONFIG_ACPI_TOSHIBA is not set
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_X86_PM_TIMER=y
-# CONFIG_ACPI_CONTAINER is not set
-
-#
-# APM (Advanced Power Management) BIOS Support
-#
-# CONFIG_APM is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-#
-CONFIG_PCI=y
-# CONFIG_PCI_GOBIOS is not set
-# CONFIG_PCI_GOMMCONFIG is not set
-# CONFIG_PCI_GODIRECT is not set
-CONFIG_PCI_GOANY=y
-CONFIG_PCI_BIOS=y
-CONFIG_PCI_DIRECT=y
-CONFIG_PCI_MMCONFIG=y
-CONFIG_PCIEPORTBUS=y
-CONFIG_PCIEAER=y
-CONFIG_PCI_MSI=y
-CONFIG_HT_IRQ=y
-CONFIG_ISA_DMA_API=y
-CONFIG_ISA=y
-# CONFIG_EISA is not set
-# CONFIG_MCA is not set
-# CONFIG_SCx200 is not set
-CONFIG_K8_NB=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_AOUT is not set
-# CONFIG_BINFMT_MISC 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=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 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=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 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
-# 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_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-# CONFIG_ISAPNP is not set
-# CONFIG_PNPBIOS is not set
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-# CONFIG_BLK_DEV_FD is not set
-# CONFIG_BLK_DEV_XD 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
-# 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_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=65536
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# Misc devices
-#
-# CONFIG_IBM_ASM is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_TIFM_CORE is not set
-# CONFIG_SONY_LAPTOP is not set
-
-#
-# ATA/ATAPI/MFM/RLL support
-#
-# CONFIG_IDE is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-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=y
-# 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
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_7000FASST is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 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_AIC94XX is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH 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_STEX is not set
-# CONFIG_SCSI_SYM53C8XX_2 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_1280 is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_SEAGATE 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_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_SRP is not set
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA 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
-# 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
-
-#
-# Macintosh device drivers
-#
-# CONFIG_MAC_EMUMOUSEBTN 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
-# 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_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-CONFIG_NET_VENDOR_3COM=y
-# CONFIG_EL1 is not set
-# CONFIG_EL2 is not set
-# CONFIG_ELPLUS is not set
-# CONFIG_EL16 is not set
-# CONFIG_EL3 is not set
-# CONFIG_3C515 is not set
-CONFIG_VORTEX=m
-CONFIG_TYPHOON=m
-CONFIG_LANCE=m
-CONFIG_NET_VENDOR_SMC=y
-CONFIG_WD80x3=m
-CONFIG_ULTRA=m
-CONFIG_SMC9194=m
-# CONFIG_NET_VENDOR_RACAL is not set
-
-#
-# Tulip family network device support
-#
-CONFIG_NET_TULIP=y
-# CONFIG_DE2104X is not set
-CONFIG_TULIP=m
-CONFIG_TULIP_MWI=y
-CONFIG_TULIP_MMIO=y
-CONFIG_TULIP_NAPI=y
-CONFIG_TULIP_NAPI_HW_MITIGATION=y
-CONFIG_DE4X5=m
-CONFIG_WINBOND_840=m
-CONFIG_DM9102=m
-CONFIG_ULI526X=m
-CONFIG_AT1700=m
-CONFIG_DEPCA=m
-CONFIG_HP100=m
-CONFIG_NET_ISA=y
-# CONFIG_E2100 is not set
-# CONFIG_EWRK3 is not set
-# CONFIG_EEXPRESS is not set
-# CONFIG_EEXPRESS_PRO is not set
-# CONFIG_HPLAN_PLUS is not set
-# CONFIG_HPLAN is not set
-# CONFIG_LP486E is not set
-# CONFIG_ETH16I is not set
-CONFIG_NE2000=y
-# CONFIG_ZNET is not set
-# CONFIG_SEEQ8005 is not set
-CONFIG_NET_PCI=y
-CONFIG_PCNET32=m
-CONFIG_PCNET32_NAPI=y
-CONFIG_AMD8111_ETH=m
-CONFIG_AMD8111E_NAPI=y
-CONFIG_ADAPTEC_STARFIRE=m
-CONFIG_ADAPTEC_STARFIRE_NAPI=y
-CONFIG_AC3200=m
-CONFIG_APRICOT=m
-CONFIG_B44=m
-CONFIG_FORCEDETH=m
-CONFIG_FORCEDETH_NAPI=y
-CONFIG_CS89x0=m
-CONFIG_DGRS=m
-CONFIG_EEPRO100=m
-CONFIG_E100=m
-CONFIG_FEALNX=m
-CONFIG_NATSEMI=m
-CONFIG_NE2K_PCI=y
-CONFIG_8139CP=m
-CONFIG_8139TOO=m
-CONFIG_8139TOO_PIO=y
-CONFIG_8139TOO_TUNE_TWISTER=y
-CONFIG_8139TOO_8129=y
-# CONFIG_8139_OLD_RX_RESET is not set
-CONFIG_SIS900=m
-CONFIG_EPIC100=m
-CONFIG_SUNDANCE=m
-CONFIG_SUNDANCE_MMIO=y
-CONFIG_TLAN=m
-CONFIG_VIA_RHINE=m
-CONFIG_VIA_RHINE_MMIO=y
-CONFIG_VIA_RHINE_NAPI=y
-CONFIG_SC92031=m
-
-#
-# Ethernet (1000 Mbit)
-#
-CONFIG_ACENIC=m
-CONFIG_ACENIC_OMIT_TIGON_I=y
-CONFIG_DL2K=m
-CONFIG_E1000=m
-CONFIG_E1000_NAPI=y
-# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
-CONFIG_NS83820=m
-CONFIG_HAMACHI=m
-CONFIG_YELLOWFIN=m
-CONFIG_R8169=m
-CONFIG_R8169_NAPI=y
-CONFIG_SIS190=m
-CONFIG_SKGE=m
-CONFIG_SKY2=m
-CONFIG_SK98LIN=m
-CONFIG_VIA_VELOCITY=m
-CONFIG_TIGON3=m
-CONFIG_BNX2=m
-CONFIG_QLA3XXX=m
-CONFIG_ATL1=m
-
-#
-# Ethernet (10000 Mbit)
-#
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NETXEN_NIC 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_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
-# CONFIG_INPUT_FF_MEMLESS is not set
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# 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=y
-# CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_POWER is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TOUCHSCREEN is not set
-# CONFIG_INPUT_MISC is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-CONFIG_SERIO_I8042=y
-# 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
-# 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 is not set
-CONFIG_SERIAL_8250_PCI=y
-CONFIG_SERIAL_8250_PNP=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_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_HW_RANDOM is not set
-# CONFIG_NVRAM 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
-# CONFIG_SONYPI is not set
-CONFIG_AGP=m
-CONFIG_AGP_ALI=m
-CONFIG_AGP_ATI=m
-CONFIG_AGP_AMD=m
-CONFIG_AGP_AMD64=m
-CONFIG_AGP_INTEL=m
-CONFIG_AGP_NVIDIA=m
-CONFIG_AGP_SIS=m
-CONFIG_AGP_SWORKS=m
-CONFIG_AGP_VIA=m
-CONFIG_AGP_EFFICEON=m
-# CONFIG_DRM is not set
-# CONFIG_DRM_I830 is not set
-# CONFIG_DRM_I915 is not set
-# CONFIG_MWAVE is not set
-# CONFIG_PC8736x_GPIO is not set
-# CONFIG_NSC_GPIO is not set
-# CONFIG_CS5535_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER 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 is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Multifunction device drivers
-#
-# CONFIG_MFD_SM501 is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-# CONFIG_BACKLIGHT_LCD_SUPPORT 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=y
-# CONFIG_FB_TILEBLITTING is not set
-
-#
-# Frame buffer hardware drivers
-#
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-CONFIG_FB_VGA16=y
-CONFIG_FB_VESA=y
-# CONFIG_FB_VESA_STD is not set
-CONFIG_FB_VESA_TNG=y
-CONFIG_FB_VESA_DEFAULT_MODE="640x480-16@60"
-CONFIG_VIDEO_SELECT=y
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_I810 is not set
-# CONFIG_FB_INTEL is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_S3 is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# 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_GEODE is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-CONFIG_FONTS=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
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_SEQUENCER=y
-# CONFIG_SND_SEQ_DUMMY 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_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=y
-# 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
-
-#
-# ISA devices
-#
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_WAVEFRONT is not set
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-CONFIG_SND_INTEL8X0=y
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-CONFIG_SND_AC97_POWER_SAVE=y
-
-#
-# USB devices
-#
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_USX2Y 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=y
-CONFIG_USB=y
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_DYNAMIC_MINORS is not set
-CONFIG_USB_SUSPEND=y
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-CONFIG_USB_EHCI_HCD=y
-CONFIG_USB_EHCI_SPLIT_ISO=y
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_EHCI_BIG_ENDIAN_MMIO is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# 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_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV is not set
-# CONFIG_USB_AIPTEK is not set
-CONFIG_USB_WACOM=y
-# 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
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-# CONFIG_USB_USBNET_MII is not set
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_MON is not set
-
-#
-# 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_SISUSBVGA is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_IOWARRIOR 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)
-#
-# CONFIG_EDAC is not set
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# Auxiliary Display support
-#
-
-#
-# Virtualization
-#
-# CONFIG_KVM 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=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS 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_PROC_SYSCTL=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_TMPFS_POSIX_ACL is not set
-# 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_SQUASHFS 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=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 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=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
-
-#
-# Instrumentation Support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# 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_LOG_BUF_SHIFT=15
-CONFIG_TIMER_STATS=y
-# CONFIG_DEBUG_BUGVERBOSE is not set
-CONFIG_EARLY_PRINTK=y
-CONFIG_X86_FIND_SMP_CONFIG=y
-CONFIG_X86_MPPARSE=y
-CONFIG_DOUBLEFAULT=y
-
-#
-# 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=m
-# 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_TWOFISH_586 is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_AES_586 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_LZO 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
-#
-CONFIG_CRYPTO_DEV_PADLOCK=m
-CONFIG_CRYPTO_DEV_PADLOCK_AES=m
-CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
-CONFIG_CRYPTO_DEV_GEODE=m
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_AUDIT_GENERIC=y
-# CONFIG_LZO is not set
-CONFIG_ZLIB_INFLATE=m
-CONFIG_PLIST=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_X86_SMP=y
-CONFIG_X86_HT=y
-CONFIG_X86_BIOS_REBOOT=y
-CONFIG_X86_TRAMPOLINE=y
-CONFIG_KTIME_SCALAR=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-c7x0 b/meta/packages/linux/linux-rp-2.6.22/defconfig-c7x0
deleted file mode 100644 (file)
index d9b3e2b..0000000
+++ /dev/null
@@ -1,1789 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20
-# Thu Mar 29 13:32:11 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_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_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_SYSFS_DEPRECATED=y
-# CONFIG_RELAY is not set
-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_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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL=y
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-# CONFIG_MACH_POODLE is not set
-CONFIG_MACH_CORGI=y
-CONFIG_MACH_SHEPHERD=y
-CONFIG_MACH_HUSKY=y
-# CONFIG_MACH_TOSA is not set
-CONFIG_PXA25x=y
-CONFIG_PXA_SHARP_C7xx=y
-CONFIG_PXA_SSP=y
-# CONFIG_PXA_KEYS 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_XSCALE_PMU=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable quiet"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_CPU_FREQ_PXA25x=y
-CONFIG_KEXEC=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 is not set
-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=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=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=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-# 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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Dongle support
-#
-
-#
-# 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=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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 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_WLAN_80211=y
-CONFIG_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_KEYBOARD_CORGI=y
-# CONFIG_KEYBOARD_SPITZ is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# 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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_CORGI=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT 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_VIVI is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_USBVISION is not set
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-CONFIG_USB_DSBR=m
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-# CONFIG_FB_DDC is not set
-CONFIG_FB_CFB_FILLRECT=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# CONFIG_FB_MACMODES is not set
-# CONFIG_FB_BACKLIGHT is not set
-# CONFIG_FB_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_MBX is not set
-CONFIG_FB_W100=y
-# 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 is not set
-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
-#
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-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
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# 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 Intel PXA2xx
-#
-CONFIG_SND_PXA2XX_SOC=m
-CONFIG_SND_PXA2XX_SOC_I2S=m
-CONFIG_SND_PXA2XX_SOC_CORGI=m
-# CONFIG_SND_PXA2XX_SOC_MAGICIAN is not set
-
-#
-# SoC Audio for the Atmel AT91
-#
-
-#
-# SoC Audio for the Freescale i.MX
-#
-
-#
-# SoC Audio for the Samsung S3C24XX
-#
-
-#
-# Soc Codecs
-#
-# 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=m
-# 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_WM9713 is not set
-# CONFIG_SND_SOC_WM9712 is not set
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 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=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# 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_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-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 is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 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=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=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_LH7A40X 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
-
-#
-# 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_UNSAFE_RESUME=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
-
-#
-# 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=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=y
-# 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=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_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_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-CONFIG_TIMER_STATS=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-collie b/meta/packages/linux/linux-rp-2.6.22/defconfig-collie
deleted file mode 100644 (file)
index 49d9596..0000000
+++ /dev/null
@@ -1,1741 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20.4
-# Fri Apr  6 23:20:59 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_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_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_SYSFS_DEPRECATED is not set
-# CONFIG_RELAY is not set
-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_ALL is not set
-# 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=m
-CONFIG_IOSCHED_CFQ=m
-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 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
-
-#
-# SA11x0 Implementations
-#
-# CONFIG_SA1100_ASSABET is not set
-# CONFIG_SA1100_CERF is not set
-CONFIG_SA1100_COLLIE=y
-# 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_JORNADA720 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
-
-#
-# 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_SHARP_LOCOMO=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-CONFIG_ISA=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
-
-#
-# PC-card bridges
-#
-# CONFIG_I82365 is not set
-# CONFIG_TCIC is not set
-CONFIG_PCMCIA_SA1100=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-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_LEDS is not set
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=y
-
-#
-# 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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=m
-CONFIG_PACKET_MMAP=y
-CONFIG_UNIX=y
-CONFIG_XFRM=y
-CONFIG_XFRM_USER=m
-# 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=y
-# 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
-
-#
-# 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=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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 is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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 is not set
-
-#
-# Old Serial dongle support
-#
-
-#
-# FIR device drivers
-#
-CONFIG_USB_IRDA=m
-# CONFIG_SIGMATEL_FIR is not set
-CONFIG_SA1100_FIR=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=m
-CONFIG_BT_HCIBT3C=m
-CONFIG_BT_HCIBLUECARD=m
-CONFIG_BT_HCIBTUART=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_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_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS 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=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=y
-# CONFIG_MTD_ABSENT is not set
-CONFIG_MTD_OBSOLETE_CHIPS=y
-CONFIG_MTD_SHARP=y
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SA1100=y
-# 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_PNP 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_UB 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=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 is not set
-CONFIG_BLK_DEV_IDEDISK=m
-# CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECS=m
-# 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 is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-# 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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GENERIC_NCR5380 is not set
-# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_PAS16 is not set
-# CONFIG_SCSI_PSI240I is not set
-# CONFIG_SCSI_QLOGIC_FAS is not set
-# CONFIG_SCSI_SYM53C416 is not set
-# CONFIG_SCSI_T128 is not set
-# CONFIG_SCSI_DEBUG is not set
-
-#
-# 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
-
-#
-# Serial ATA (prod) and Parallel ATA (experimental) drivers
-#
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-#
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=m
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_NET_VENDOR_SMC is not set
-# CONFIG_SMC91X is not set
-# CONFIG_DM9000 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_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 is not set
-
-#
-# Obsolete Wireless cards support (pre-802.11)
-#
-# CONFIG_STRIP is not set
-# CONFIG_ARLAN is not set
-# CONFIG_WAVELAN is not set
-# 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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-CONFIG_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=y
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_LOCOMO=y
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY 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_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_SA1100=y
-CONFIG_SERIAL_SA1100_CONSOLE=y
-CONFIG_SERIAL_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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=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_ELEKTOR 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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-CONFIG_SPI=y
-# CONFIG_SPI_DEBUG is not set
-CONFIG_SPI_MASTER=y
-
-#
-# SPI Master Controller Drivers
-#
-# CONFIG_SPI_BITBANG is not set
-CONFIG_SPI_LOCOMO=m
-
-#
-# SPI Protocol Masters
-#
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multimedia Capabilities Port drivers
-#
-CONFIG_MCP=y
-CONFIG_MCP_SA11X0=y
-CONFIG_MCP_UCB1200=y
-CONFIG_MCP_UCB1200_TS=m
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=m
-
-#
-# LED drivers
-#
-CONFIG_LEDS_LOCOMO=m
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=m
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=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_VIVI is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_USBVISION is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_CADET is not set
-# CONFIG_RADIO_RTRACK is not set
-# CONFIG_RADIO_RTRACK2 is not set
-# CONFIG_RADIO_AZTECH is not set
-# CONFIG_RADIO_GEMTEK is not set
-# CONFIG_RADIO_SF16FMI is not set
-# CONFIG_RADIO_SF16FMR2 is not set
-# CONFIG_RADIO_TERRATEC is not set
-# CONFIG_RADIO_TRUST is not set
-# CONFIG_RADIO_TYPHOON is not set
-# CONFIG_RADIO_ZOLTRIX is not set
-# CONFIG_USB_DSBR is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-CONFIG_FIRMWARE_EDID=y
-CONFIG_FB=y
-CONFIG_FB_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_SA1100=y
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-# CONFIG_VGA_CONSOLE is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=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
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-CONFIG_BACKLIGHT_LOCOMO=y
-
-#
-# 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=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-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
-#
-
-#
-# 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
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# 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=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=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
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-
-#
-# USB Network Adapters
-#
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_RTL8150 is not set
-CONFIG_USB_USBNET_MII=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-CONFIG_USB_NET_CDC_SUBSET=m
-# CONFIG_USB_ALI_M5632 is not set
-# CONFIG_USB_AN2720 is not set
-CONFIG_USB_BELKIN=y
-CONFIG_USB_ARMLINUX=y
-# CONFIG_USB_EPSON2888 is not set
-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 is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 is not set
-# CONFIG_USB_SERIAL_NAVMAN is not set
-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 is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_SERIAL_DEBUG is not set
-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_LED is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-# CONFIG_USB_CYTHERM is not set
-# CONFIG_USB_PHIDGET is not set
-# CONFIG_USB_IDMOUSE is not set
-# CONFIG_USB_FTDI_ELAN is not set
-# CONFIG_USB_APPLEDISPLAY is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-# 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_LH7A40X 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=m
-CONFIG_MMC_DEBUG=y
-CONFIG_MMC_BLOCK=m
-# CONFIG_MMC_TIFM_SD is not set
-CONFIG_MMC_SPI=m
-CONFIG_MMC_UNSAFE_RESUME=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
-
-#
-# RTC drivers
-#
-# CONFIG_RTC_DRV_X1205 is not set
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1553 is not set
-# CONFIG_RTC_DRV_ISL1208 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_DS1742 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-# CONFIG_RTC_DRV_RS5C348 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-# CONFIG_RTC_DRV_M48T86 is not set
-CONFIG_RTC_DRV_SA1100=y
-# 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=m
-# 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=m
-
-#
-# 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_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 is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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="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=m
-
-#
-# 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=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK 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 is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=m
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=m
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=m
-CONFIG_CRC16=m
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_LZO=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-htcuniversal b/meta/packages/linux/linux-rp-2.6.22/defconfig-htcuniversal
deleted file mode 100644 (file)
index 04e9070..0000000
+++ /dev/null
@@ -1,1305 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.22
-# Thu Aug 23 16:10:44 2007
-#
-CONFIG_ARM=y
-CONFIG_SYS_SUPPORTS_APM_EMULATION=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_TIME=y
-# CONFIG_GENERIC_CLOCKEVENTS is not set
-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_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_LOG_BUF_SHIFT=16
-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=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_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=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_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=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_DAVINCI 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_PXA_SHARPSL is not set
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-CONFIG_MACH_HTCUNIVERSAL=y
-
-#
-# HTC Universal support
-#
-CONFIG_HTCUNIVERSAL_CORE=y
-CONFIG_HTCUNIVERSAL_UDC=y
-CONFIG_HTCUNIVERSAL_POWER=y
-CONFIG_HTCUNIVERSAL_BACKLIGHT=y
-CONFIG_HTCUNIVERSAL_LCD=y
-CONFIG_HTCUNIVERSAL_TS2=y
-CONFIG_HTCUNIVERSAL_BUTTONS=y
-CONFIG_HTCUNIVERSAL_BLUETOOTH=m
-CONFIG_HTCUNIVERSAL_ASIC3_LEDS=y
-CONFIG_HTCUNIVERSAL_PHONE=m
-# CONFIG_HTCUNIVERSAL_AK4641 is not set
-CONFIG_PXA27x=y
-# CONFIG_PXA_KEYS 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
-#
-# 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_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="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable debug"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=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 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
-
-#
-# 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_PM_SYSFS_DEPRECATED=y
-CONFIG_APM_EMULATION=y
-
-#
-# 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 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
-# 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_NF_CONNTRACK 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
-# 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=y
-
-#
-# IrDA protocols
-#
-CONFIG_IRLAN=y
-# CONFIG_IRNET is not set
-CONFIG_IRCOMM=y
-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=y
-
-#
-# 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=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_HCIVHCI is not set
-# CONFIG_AF_RXRPC is not set
-
-#
-# Wireless
-#
-# CONFIG_CFG80211 is not set
-CONFIG_WIRELESS_EXT=y
-# 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=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
-CONFIG_MTD=y
-CONFIG_MTD_DEBUG=y
-CONFIG_MTD_DEBUG_VERBOSE=0
-# CONFIG_MTD_CONCAT is not set
-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 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
-
-#
-# 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=4096
-CONFIG_MTDRAM_ERASE_SIZE=128
-# 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 is not set
-# CONFIG_MTD_ONENAND is not set
-
-#
-# UBI - Unsorted block images
-#
-# CONFIG_MTD_UBI 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
-# 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
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-# CONFIG_MD 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
-
-#
-# Ethernet (10 or 100Mbit)
-#
-# CONFIG_NET_ETHERNET is not set
-CONFIG_NETDEV_1000=y
-CONFIG_NETDEV_10000=y
-
-#
-# Wireless LAN
-#
-CONFIG_NET_RADIO=y
-# CONFIG_NET_WIRELESS_RTNETLINK is not set
-# CONFIG_WLAN_PRE80211 is not set
-# CONFIG_WLAN_80211 is not set
-CONFIG_ACX=m
-CONFIG_ACX_MEM=y
-# CONFIG_ACX_CS is not set
-CONFIG_ACX_HTCUNIVERSAL=m
-# 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
-# CONFIG_INPUT_POLLDEV 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_POWER 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_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_APPLETOUCH is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-# CONFIG_INPUT_TABLET 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_USB_COMPOSITE is not set
-CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_YEALINK is not set
-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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=32
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-# 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=m
-CONFIG_I2C_BOARDINFO=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_GPIO is not set
-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_SIMTEC is not set
-# CONFIG_I2C_STUB 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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-CONFIG_POWER_SUPPLY=y
-# CONFIG_POWER_SUPPLY_DEBUG is not set
-CONFIG_PDA_POWER=y
-CONFIG_APM_POWER=y
-CONFIG_BATTERY_DS2760=y
-# CONFIG_HWMON is not set
-
-#
-# Misc devices
-#
-
-#
-# Multifunction device drivers
-#
-# CONFIG_MFD_SM501 is not set
-CONFIG_HTC_ASIC3=y
-CONFIG_HTC_ASIC3_DS1WM=y
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_ASIC3=y
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-
-#
-# 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_CORGI=y
-
-#
-# Display device support
-#
-# CONFIG_DISPLAY_SUPPORT is not set
-# CONFIG_VGASTATE 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_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_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-# CONFIG_FB_PXA_OVERLAY is not set
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX 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=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
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-# CONFIG_SND_SEQUENCER is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=y
-CONFIG_SND_PCM_OSS=y
-CONFIG_SND_PCM_OSS_PLUGINS=y
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-CONFIG_SND_VERBOSE_PROCFS=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_MPU401 is not set
-
-#
-# ALSA ARM devices
-#
-# CONFIG_SND_PXA2XX_AC97 is not set
-
-#
-# System on Chip 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_FSL_USB2 is not set
-# 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_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X 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_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_UNSAFE_RESUME=y
-
-#
-# MMC/SD Card Drivers
-#
-CONFIG_MMC_BLOCK=y
-
-#
-# MMC/SD Host Controller Drivers
-#
-# CONFIG_MMC_PXA 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
-# CONFIG_RTC_DRV_TEST is not set
-
-#
-# I2C RTC drivers
-#
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1672 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_X1205 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-
-#
-# SPI RTC drivers
-#
-
-#
-# 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_SA1100=y
-
-#
-# 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=y
-CONFIG_INOTIFY_USER=y
-# CONFIG_QUOTA is not set
-CONFIG_DNOTIFY=y
-# CONFIG_AUTOFS_FS is not set
-# CONFIG_AUTOFS4_FS is not set
-# CONFIG_FUSE_FS is not set
-
-#
-# CD-ROM/DVD Filesystems
-#
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
-
-#
-# DOS/FAT/NT Filesystems
-#
-CONFIG_FAT_FS=y
-CONFIG_MSDOS_FS=y
-CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=437
-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-# CONFIG_NTFS_FS is not set
-
-#
-# Pseudo filesystems
-#
-CONFIG_PROC_FS=y
-CONFIG_PROC_SYSCTL=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_TMPFS_POSIX_ACL is not set
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS2_FS is not set
-# CONFIG_CRAMFS is not set
-# CONFIG_SQUASHFS 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 is not set
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_BIND34 is not set
-# 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 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=y
-# 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_DEBUG_KERNEL=y
-# CONFIG_DEBUG_SHIRQ is not set
-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_LOCK_ALLOC is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO 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=y
-CONFIG_CRYPTO_BLKCIPHER=m
-CONFIG_CRYPTO_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# 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=y
-# CONFIG_CRYPTO_SHA256 is not set
-# CONFIG_CRYPTO_SHA512 is not set
-# CONFIG_CRYPTO_WP512 is not set
-# CONFIG_CRYPTO_TGR192 is not set
-# CONFIG_CRYPTO_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_CRYPTD is not set
-CONFIG_CRYPTO_DES=y
-# 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=y
-# CONFIG_CRYPTO_LZO 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_CRC_ITU_T 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
-CONFIG_HAS_DMA=y
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-hx2000 b/meta/packages/linux/linux-rp-2.6.22/defconfig-hx2000
deleted file mode 100644 (file)
index ee05db4..0000000
+++ /dev/null
@@ -1,1168 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc2
-# Mon Jan  1 01:49:04 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_LOCK_KERNEL=y
-CONFIG_INIT_ENV_ARG_LIMIT=32
-
-#
-# General setup
-#
-CONFIG_LOCALVERSION=""
-CONFIG_LOCALVERSION_AUTO=y
-# CONFIG_SWAP is not set
-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=""
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
-CONFIG_SYSCTL=y
-CONFIG_EMBEDDED=y
-CONFIG_UID16=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_EPOLL=y
-CONFIG_SHMEM=y
-CONFIG_SLAB=y
-CONFIG_VM_EVENT_COUNTERS=y
-CONFIG_RT_MUTEXES=y
-# CONFIG_TINY_SHMEM is not set
-CONFIG_BASE_SMALL=0
-# CONFIG_SLOB is not set
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODVERSIONS 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=m
-CONFIG_IOSCHED_CFQ=m
-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_PXA_SHARPSL is not set
-# CONFIG_MACH_TRIZEPS4 is not set
-CONFIG_MACH_HX2750=y
-CONFIG_PXA27x=y
-CONFIG_PXA_SSP=y
-CONFIG_PXA_KEYS=y
-
-#
-# 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_XSCALE_PMU=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# 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_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable debug"
-# 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 is not set
-# CONFIG_BINFMT_MISC is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-CONFIG_PM_DEBUG=y
-# CONFIG_DISABLE_CONSOLE_SUSPEND is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_NETDEBUG is not set
-CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=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=y
-# 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 is not set
-# CONFIG_BT is not set
-CONFIG_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-# CONFIG_IEEE80211_CRYPT_CCMP is not set
-# CONFIG_IEEE80211_CRYPT_TKIP is not set
-# CONFIG_IEEE80211_SOFTMAC is not set
-CONFIG_WIRELESS_EXT=y
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-# CONFIG_PREVENT_FIRMWARE_BUILD is not set
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-# CONFIG_SYS_HYPERVISOR is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-CONFIG_MTD_CONCAT=y
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-# CONFIG_SSFDC is not set
-
-#
-# RAM/ROM/Flash chip drivers
-#
-CONFIG_MTD_CFI=y
-# CONFIG_MTD_JEDECPROBE 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_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 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=8192
-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=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_IDEDMA_AUTO is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_NETLINK is not set
-
-#
-# 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 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 is not set
-# 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=m
-# 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_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# Input Device Drivers
-#
-# CONFIG_INPUT_KEYBOARD 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_UCB1400 is not set
-CONFIG_TOUCHSCREEN_TSC2101=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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_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
-
-#
-# Misc devices
-#
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multi-Function Devices
-#
-CONFIG_MFD_TSC2101=y
-
-#
-# LED devices
-#
-# CONFIG_NEW_LEDS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# 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_S1D13XXX is not set
-CONFIG_FB_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-# CONFIG_FB_PXA_OVERLAY is not set
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX 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
-
-#
-# Logo configuration
-#
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 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_HX2750=y
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# HID Devices
-#
-CONFIG_HID=y
-
-#
-# 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 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_UNSAFE_RESUME=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
-
-#
-# 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=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=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_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_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-# CONFIG_JFFS2_SUMMARY is not set
-# CONFIG_JFFS2_FS_XATTR is not set
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=y
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="cp437"
-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 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=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_TIMER_STATS=y
-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_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-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=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 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 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=y
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
-CONFIG_CRYPTO_CRC32C=y
-# 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=y
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-poodle b/meta/packages/linux/linux-rp-2.6.22/defconfig-poodle
deleted file mode 100644 (file)
index 387b5e9..0000000
+++ /dev/null
@@ -1,1659 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.17
-# Mon Jul 10 23:38:56 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=y
-CONFIG_VECTORS_BASE=0xffff0000
-
-#
-# 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 is not set
-# 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=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_BLK_DEV_IO_TRACE is not set
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_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_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX 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_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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 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_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-CONFIG_MACH_POODLE=y
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-# CONFIG_MACH_TOSA is not set
-CONFIG_PXA25x=y
-# CONFIG_PXA_KEYS is not set
-CONFIG_PXA_SSP=y
-
-#
-# 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_LOCOMO=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-CONFIG_HZ=100
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2  fbcon=rotate:1 dyntick=enable debug"
-# CONFIG_XIP_KERNEL 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 is not set
-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=y
-CONFIG_CPU_FREQ_GOV_USERSPACE=y
-CONFIG_CPU_FREQ_GOV_ONDEMAND=y
-CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
-CONFIG_CPU_FREQ_PXA25x=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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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_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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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_H323 is not set
-CONFIG_IP_NF_QUEUE=m
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_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 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
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-# CONFIG_FTL is not set
-# CONFIG_NFTL is not set
-# CONFIG_INFTL is not set
-# CONFIG_RFD_FTL is not set
-
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# 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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# 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_HERMES=m
-# CONFIG_ATMEL is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# 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_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_LOCOMO=y
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_CORGI is not set
-# CONFIG_KEYBOARD_SPITZ is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_CORGI=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_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_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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=y
-# CONFIG_I2C_CHARDEV is not set
-
-#
-# I2C Algorithms
-#
-CONFIG_I2C_ALGOBIT=y
-# 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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI 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
-
-#
-# Misc devices
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_LOCOMO=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# 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_VIVI is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-
-#
-# Encoders and Decoders
-#
-# CONFIG_VIDEO_MSP3400 is not set
-# CONFIG_VIDEO_CS53L32A is not set
-# CONFIG_VIDEO_WM8775 is not set
-# CONFIG_VIDEO_WM8739 is not set
-# CONFIG_VIDEO_CX25840 is not set
-# CONFIG_VIDEO_SAA711X is not set
-# CONFIG_VIDEO_SAA7127 is not set
-# CONFIG_VIDEO_UPD64031A is not set
-# CONFIG_VIDEO_UPD64083 is not set
-
-#
-# V4L USB devices
-#
-# CONFIG_VIDEO_EM28XX is not set
-CONFIG_USB_DSBR=m
-CONFIG_VIDEO_USBVIDEO=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_IBMCAM=m
-CONFIG_USB_KONICAWC=m
-# CONFIG_USB_ET61X251 is not set
-CONFIG_USB_OV511=m
-CONFIG_USB_SE401=m
-CONFIG_USB_SN9C102=m
-CONFIG_USB_STV680=m
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# Digital Video Broadcasting Devices
-#
-# CONFIG_DVB is not set
-CONFIG_USB_DABUSB=m
-
-#
-# 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=y
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-CONFIG_FB_PXA=y
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_W100 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=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=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-# CONFIG_LOGO_OHAND_CLUT224 is not set
-CONFIG_LOGO_OZ240_CLUT224=y
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=m
-CONFIG_LCD_DEVICE=y
-# CONFIG_BACKLIGHT_CORGI is not set
-CONFIG_BACKLIGHT_LOCOMO=y
-
-#
-# 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=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
-
-#
-# 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=m
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=m
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8731 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8974 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_MAINSTONE_BASEBAND is not set
-# CONFIG_SND_MAINSTONE_BLUETOOTH is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-# CONFIG_SND_PXA2xx_SOC_CORGI is not set
-# CONFIG_SND_PXA2xx_SOC_SPITZ is not set
-CONFIG_SND_PXA2xx_SOC_POODLE=m
-# CONFIG_SND_PXA2xx_SOC_TOSA is not set
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC is not set
-CONFIG_SND_SOC_WM8731=m
-# 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_WM8974 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 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-# CONFIG_USB_ARCH_HAS_OHCI 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=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-# CONFIG_USB_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Network Adapters
-#
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_USB_NET_ZAURUS=m
-# 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 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_NAVMAN is not set
-CONFIG_USB_SERIAL_PL2303=m
-# CONFIG_USB_SERIAL_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST 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_LH7A40X 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-CONFIG_MMC_UNSAFE_RESUME=y
-
-
-#
-# 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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 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
-
-#
-# 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_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 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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-CONFIG_TIMER_STATS=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT 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_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_UNWIND_INFO is not set
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-qemuarm b/meta/packages/linux/linux-rp-2.6.22/defconfig-qemuarm
deleted file mode 100644 (file)
index 1b63428..0000000
+++ /dev/null
@@ -1,1386 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.22
-# Wed Sep  5 17:01:33 2007
-#
-CONFIG_ARM=y
-CONFIG_SYS_SUPPORTS_APM_EMULATION=y
-# CONFIG_GENERIC_GPIO is not set
-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 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_LOG_BUF_SHIFT=14
-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_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_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=y
-CONFIG_MODULE_UNLOAD=y
-# CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-CONFIG_BLOCK=y
-# CONFIG_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=y
-# 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 is not set
-
-#
-# Versatile platform type
-#
-CONFIG_ARCH_VERSATILE_PB=y
-# CONFIG_MACH_VERSATILE_AB is not set
-
-#
-# Processor Type
-#
-CONFIG_CPU_32=y
-CONFIG_CPU_ARM926T=y
-CONFIG_CPU_32v5=y
-CONFIG_CPU_ABRT_EV5TJ=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_CPU_CACHE_ROUND_ROBIN is not set
-# CONFIG_OUTER_CACHE is not set
-CONFIG_ARM_VIC=y
-CONFIG_ICST307=y
-
-#
-# Bus support
-#
-CONFIG_ARM_AMBA=y
-CONFIG_PCI=y
-# CONFIG_ARCH_SUPPORTS_MSI is not set
-# CONFIG_PCI_DEBUG 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_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_LEDS=y
-CONFIG_LEDS_CPU=y
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=ttyAMA0,115200n8 console=tty1 noinitrd root=/dev/mtdblock2 rootfstype=jffs2   dyntick=enable debug"
-# CONFIG_XIP_KERNEL is not set
-# CONFIG_KEXEC is not set
-
-#
-# Floating point emulation
-#
-
-#
-# At least one emulation must be selected
-#
-CONFIG_FPE_NWFPE=y
-# CONFIG_FPE_NWFPE_XP is not set
-# CONFIG_FPE_FASTFPE is not set
-CONFIG_VFP=y
-
-#
-# 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_PM_SYSFS_DEPRECATED is not set
-# CONFIG_APM_EMULATION is not set
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-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=y
-CONFIG_IP_PNP_BOOTP=y
-# CONFIG_IP_PNP_RARP is not set
-# CONFIG_NET_IPIP is not set
-# CONFIG_NET_IPGRE is not set
-# CONFIG_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=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
-# 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_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
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_AFS_PARTS=y
-
-#
-# 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 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_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
-
-#
-# 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_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
-# CONFIG_MTD_NAND is not set
-# CONFIG_MTD_ONENAND is not set
-
-#
-# UBI - Unsorted block images
-#
-# CONFIG_MTD_UBI is not set
-
-#
-# Parallel port support
-#
-# CONFIG_PARPORT is not set
-
-#
-# Plug and Play support
-#
-# CONFIG_PNPACPI 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=51200
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-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 is not set
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-CONFIG_SCSI_WAIT_SCAN=m
-
-#
-# SCSI Transports
-#
-CONFIG_SCSI_SPI_ATTRS=y
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_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_AIC94XX is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_HPTIOP 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_STEX is not set
-CONFIG_SCSI_SYM53C8XX_2=y
-CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
-CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
-CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
-CONFIG_SCSI_SYM53C8XX_MMIO=y
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI 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
-# CONFIG_SCSI_SRP is not set
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-# CONFIG_DM_DELAY 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_FIREWIRE is not set
-# 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
-# CONFIG_ARCNET is not set
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-CONFIG_SMC91X=y
-# CONFIG_DM9000 is not set
-
-#
-# Tulip family network device support
-#
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
-# CONFIG_NET_PCI is not set
-CONFIG_NETDEV_1000=y
-# 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
-# CONFIG_QLA3XXX is not set
-# CONFIG_ATL1 is not set
-CONFIG_NETDEV_10000=y
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_IXGB is not set
-# CONFIG_S2IO is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NETXEN_NIC is not set
-# CONFIG_MLX4_CORE is not set
-# CONFIG_TR is not set
-
-#
-# Wireless LAN
-#
-# CONFIG_WLAN_PRE80211 is not set
-# CONFIG_WLAN_80211 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_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
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_POLLDEV 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_POWER is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-CONFIG_MOUSE_PS2_ALPS=y
-CONFIG_MOUSE_PS2_LOGIPS2PP=y
-CONFIG_MOUSE_PS2_SYNAPTICS=y
-CONFIG_MOUSE_PS2_LIFEBOOK=y
-CONFIG_MOUSE_PS2_TRACKPOINT=y
-# CONFIG_MOUSE_PS2_TOUCHKIT is not set
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_APPLETOUCH is not set
-# CONFIG_MOUSE_VSXXXAA is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TABLET=y
-# CONFIG_TABLET_USB_ACECAD is not set
-# CONFIG_TABLET_USB_AIPTEK is not set
-# CONFIG_TABLET_USB_GTCO is not set
-# CONFIG_TABLET_USB_KBTAB is not set
-CONFIG_TABLET_USB_WACOM=y
-# CONFIG_INPUT_TOUCHSCREEN is not set
-CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_YEALINK is not set
-# CONFIG_INPUT_UINPUT is not set
-
-#
-# Hardware I/O ports
-#
-CONFIG_SERIO=y
-# CONFIG_SERIO_SERPORT is not set
-CONFIG_SERIO_AMBAKMI=y
-# 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
-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_AMBA_PL011=y
-CONFIG_SERIAL_AMBA_PL011_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
-# CONFIG_WATCHDOG is not set
-CONFIG_HW_RANDOM=m
-# CONFIG_NVRAM is not set
-# CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-# CONFIG_DRM is not set
-# CONFIG_RAW_DRIVER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-CONFIG_DEVPORT=y
-# 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
-# CONFIG_POWER_SUPPLY 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_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
-#
-# CONFIG_PHANTOM is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_TIFM_CORE is not set
-
-#
-# Multifunction device drivers
-#
-# CONFIG_MFD_SM501 is not set
-# CONFIG_HTC_ASIC3 is not set
-# CONFIG_HTC_ASIC3_DS1WM is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-# CONFIG_LEDS_CLASS is not set
-
-#
-# LED drivers
-#
-
-#
-# LED Triggers
-#
-# CONFIG_LEDS_TRIGGERS is not set
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-CONFIG_VIDEO_CAPTURE_DRIVERS=y
-# CONFIG_VIDEO_ADV_DEBUG is not set
-CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_STRADIS is not set
-CONFIG_V4L_USB_DRIVERS=y
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-# CONFIG_USB_ZR364XX is not set
-CONFIG_RADIO_ADAPTERS=y
-# CONFIG_RADIO_GEMTEK_PCI is not set
-# CONFIG_RADIO_MAXIRADIO is not set
-# CONFIG_RADIO_MAESTRO is not set
-# CONFIG_USB_DSBR is not set
-# CONFIG_DVB_CORE is not set
-CONFIG_DAB=y
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Display device support
-#
-# CONFIG_DISPLAY_SUPPORT is not set
-# CONFIG_VGASTATE 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_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=y
-CONFIG_FB_TILEBLITTING=y
-
-#
-# Frame buffer hardware drivers
-#
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-CONFIG_FB_ARMCLCD=y
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT 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 is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_S3 is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_VT8623 is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_ARK is not set
-# CONFIG_FB_PM3 is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-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=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-
-#
-# Sound
-#
-# CONFIG_SOUND is not set
-
-#
-# HID Devices
-#
-CONFIG_HID=y
-# CONFIG_HID_DEBUG is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV 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 is not set
-CONFIG_USB_DEVICE_CLASS=y
-# 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_EHCI_HCD is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# 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_UHCI_HCD is not set
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK 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 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
-#
-
-#
-# 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_PL031 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_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=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_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_SYSFS is not set
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
-CONFIG_CRAMFS=y
-# CONFIG_SQUASHFS 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 is not set
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_BIND34 is not set
-# CONFIG_RPCSEC_GSS_KRB5 is not set
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=y
-# 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
-# CONFIG_SYSV68_PARTITION is not set
-
-#
-# Native Language Support
-#
-CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS_CODEPAGE_437 is not set
-# CONFIG_NLS_CODEPAGE_737 is not set
-# CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
-# CONFIG_NLS_CODEPAGE_855 is not set
-# CONFIG_NLS_CODEPAGE_857 is not set
-# CONFIG_NLS_CODEPAGE_860 is not set
-# CONFIG_NLS_CODEPAGE_861 is not set
-# CONFIG_NLS_CODEPAGE_862 is not set
-# CONFIG_NLS_CODEPAGE_863 is not set
-# CONFIG_NLS_CODEPAGE_864 is not set
-# CONFIG_NLS_CODEPAGE_865 is not set
-# CONFIG_NLS_CODEPAGE_866 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_ISO8859_1 is not set
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-# CONFIG_DEBUG_SHIRQ is not set
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-CONFIG_TIMER_STATS=y
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-CONFIG_DEBUG_INFO=y
-# CONFIG_DEBUG_VM is not set
-# 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 is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_CRYPTD 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 is not set
-# CONFIG_CRYPTO_KHAZAD is not set
-# CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_DEFLATE is not set
-# CONFIG_CRYPTO_LZO 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 is not set
-# CONFIG_CRC16 is not set
-# CONFIG_CRC_ITU_T is not set
-CONFIG_CRC32=y
-# CONFIG_LIBCRC32C is not set
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_LZO_COMPRESS=y
-CONFIG_LZO_DECOMPRESS=y
-CONFIG_PLIST=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAS_DMA=y
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-qemux86 b/meta/packages/linux/linux-rp-2.6.22/defconfig-qemux86
deleted file mode 100644 (file)
index d2a9fa3..0000000
+++ /dev/null
@@ -1,1753 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.22
-# Wed Sep  5 17:48:44 2007
-#
-CONFIG_X86_32=y
-CONFIG_GENERIC_TIME=y
-CONFIG_CLOCKSOURCE_WATCHDOG=y
-CONFIG_GENERIC_CLOCKEVENTS=y
-CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
-CONFIG_LOCKDEP_SUPPORT=y
-CONFIG_STACKTRACE_SUPPORT=y
-CONFIG_SEMAPHORE_SLEEPERS=y
-CONFIG_X86=y
-CONFIG_MMU=y
-CONFIG_ZONE_DMA=y
-CONFIG_QUICKLIST=y
-CONFIG_GENERIC_ISA_DMA=y
-CONFIG_GENERIC_IOMAP=y
-CONFIG_GENERIC_BUG=y
-CONFIG_GENERIC_HWEIGHT=y
-CONFIG_ARCH_MAY_HAVE_PC_FDC=y
-CONFIG_DMI=y
-CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=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 is not set
-# CONFIG_TASKSTATS is not set
-# CONFIG_UTS_NS is not set
-CONFIG_AUDIT=y
-CONFIG_AUDITSYSCALL=y
-# CONFIG_IKCONFIG is not set
-CONFIG_LOG_BUF_SHIFT=15
-# CONFIG_CPUSETS 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 is not set
-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=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=y
-# CONFIG_MODULE_UNLOAD is not set
-# CONFIG_MODVERSIONS is not set
-# CONFIG_MODULE_SRCVERSION_ALL is not set
-CONFIG_KMOD=y
-
-#
-# Block layer
-#
-CONFIG_BLOCK=y
-CONFIG_LBD=y
-# 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"
-
-#
-# Processor type and features
-#
-# CONFIG_TICK_ONESHOT is not set
-# CONFIG_NO_HZ is not set
-# CONFIG_HIGH_RES_TIMERS is not set
-CONFIG_SMP=y
-CONFIG_X86_PC=y
-# CONFIG_X86_ELAN is not set
-# CONFIG_X86_VOYAGER is not set
-# CONFIG_X86_NUMAQ is not set
-# CONFIG_X86_SUMMIT is not set
-# CONFIG_X86_BIGSMP is not set
-# CONFIG_X86_VISWS is not set
-# CONFIG_X86_GENERICARCH is not set
-# CONFIG_X86_ES7000 is not set
-# CONFIG_PARAVIRT is not set
-CONFIG_M386=y
-# CONFIG_M486 is not set
-# CONFIG_M586 is not set
-# CONFIG_M586TSC is not set
-# CONFIG_M586MMX is not set
-# CONFIG_M686 is not set
-# CONFIG_MPENTIUMII is not set
-# CONFIG_MPENTIUMIII is not set
-# CONFIG_MPENTIUMM is not set
-# CONFIG_MCORE2 is not set
-# CONFIG_MPENTIUM4 is not set
-# CONFIG_MK6 is not set
-# CONFIG_MK7 is not set
-# CONFIG_MK8 is not set
-# CONFIG_MCRUSOE is not set
-# CONFIG_MEFFICEON is not set
-# CONFIG_MWINCHIPC6 is not set
-# CONFIG_MWINCHIP2 is not set
-# CONFIG_MWINCHIP3D is not set
-# CONFIG_MGEODEGX1 is not set
-# CONFIG_MGEODE_LX is not set
-# CONFIG_MCYRIXIII is not set
-# CONFIG_MVIAC3_2 is not set
-# CONFIG_MVIAC7 is not set
-CONFIG_X86_GENERIC=y
-CONFIG_X86_L1_CACHE_SHIFT=7
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_X86_PPRO_FENCE=y
-CONFIG_X86_F00F_BUG=y
-CONFIG_X86_INTEL_USERCOPY=y
-CONFIG_X86_MINIMUM_CPU_MODEL=0
-# CONFIG_HPET_TIMER is not set
-CONFIG_NR_CPUS=8
-CONFIG_SCHED_SMT=y
-CONFIG_SCHED_MC=y
-CONFIG_PREEMPT_NONE=y
-# CONFIG_PREEMPT_VOLUNTARY is not set
-# CONFIG_PREEMPT is not set
-CONFIG_PREEMPT_BKL=y
-CONFIG_X86_LOCAL_APIC=y
-CONFIG_X86_IO_APIC=y
-CONFIG_X86_MCE=y
-CONFIG_X86_MCE_NONFATAL=y
-CONFIG_X86_MCE_P4THERMAL=y
-CONFIG_VM86=y
-# CONFIG_TOSHIBA is not set
-# CONFIG_I8K is not set
-# CONFIG_X86_REBOOTFIXUPS is not set
-# CONFIG_MICROCODE is not set
-# CONFIG_X86_MSR is not set
-# CONFIG_X86_CPUID is not set
-
-#
-# Firmware Drivers
-#
-# CONFIG_EDD is not set
-# CONFIG_DELL_RBU is not set
-# CONFIG_DCDBAS is not set
-CONFIG_NOHIGHMEM=y
-# CONFIG_HIGHMEM4G is not set
-# CONFIG_HIGHMEM64G is not set
-CONFIG_VMSPLIT_3G=y
-# CONFIG_VMSPLIT_3G_OPT is not set
-# CONFIG_VMSPLIT_2G is not set
-# CONFIG_VMSPLIT_2G_OPT is not set
-# CONFIG_VMSPLIT_1G is not set
-CONFIG_PAGE_OFFSET=0xC0000000
-CONFIG_ARCH_FLATMEM_ENABLE=y
-CONFIG_ARCH_SPARSEMEM_ENABLE=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
-CONFIG_ARCH_POPULATES_NODE_MAP=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=y
-CONFIG_SPLIT_PTLOCK_CPUS=4
-# CONFIG_RESOURCES_64BIT is not set
-CONFIG_ZONE_DMA_FLAG=1
-CONFIG_NR_QUICK=1
-# CONFIG_MATH_EMULATION is not set
-CONFIG_MTRR=y
-# CONFIG_EFI is not set
-CONFIG_IRQBALANCE=y
-CONFIG_SECCOMP=y
-# CONFIG_HZ_100 is not set
-CONFIG_HZ_250=y
-# CONFIG_HZ_300 is not set
-# CONFIG_HZ_1000 is not set
-CONFIG_HZ=250
-# CONFIG_KEXEC is not set
-CONFIG_PHYSICAL_START=0x100000
-# CONFIG_RELOCATABLE is not set
-CONFIG_PHYSICAL_ALIGN=0x100000
-# CONFIG_HOTPLUG_CPU is not set
-CONFIG_COMPAT_VDSO=y
-
-#
-# Power management options (ACPI, APM)
-#
-CONFIG_PM=y
-CONFIG_PM_LEGACY=y
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-
-#
-# ACPI (Advanced Configuration and Power Interface) Support
-#
-CONFIG_ACPI=y
-CONFIG_ACPI_PROCFS=y
-CONFIG_ACPI_AC=y
-CONFIG_ACPI_BATTERY=y
-CONFIG_ACPI_BUTTON=y
-CONFIG_ACPI_FAN=y
-# CONFIG_ACPI_DOCK is not set
-CONFIG_ACPI_PROCESSOR=y
-CONFIG_ACPI_THERMAL=y
-# CONFIG_ACPI_ASUS is not set
-# CONFIG_ACPI_TOSHIBA is not set
-CONFIG_ACPI_BLACKLIST_YEAR=0
-# CONFIG_ACPI_DEBUG is not set
-CONFIG_ACPI_EC=y
-CONFIG_ACPI_POWER=y
-CONFIG_ACPI_SYSTEM=y
-CONFIG_X86_PM_TIMER=y
-# CONFIG_ACPI_CONTAINER is not set
-# CONFIG_ACPI_SBS is not set
-# CONFIG_APM is not set
-
-#
-# CPU Frequency scaling
-#
-# CONFIG_CPU_FREQ is not set
-
-#
-# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
-#
-CONFIG_PCI=y
-# CONFIG_PCI_GOBIOS is not set
-# CONFIG_PCI_GOMMCONFIG is not set
-# CONFIG_PCI_GODIRECT is not set
-CONFIG_PCI_GOANY=y
-CONFIG_PCI_BIOS=y
-CONFIG_PCI_DIRECT=y
-CONFIG_PCI_MMCONFIG=y
-# CONFIG_PCIEPORTBUS is not set
-CONFIG_ARCH_SUPPORTS_MSI=y
-# CONFIG_PCI_MSI is not set
-CONFIG_HT_IRQ=y
-CONFIG_ISA_DMA_API=y
-CONFIG_ISA=y
-# CONFIG_EISA is not set
-# CONFIG_MCA is not set
-# CONFIG_SCx200 is not set
-
-#
-# PCCARD (PCMCIA/CardBus) support
-#
-# CONFIG_PCCARD is not set
-# CONFIG_HOTPLUG_PCI is not set
-
-#
-# Executable file formats
-#
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_AOUT=y
-CONFIG_BINFMT_MISC=y
-
-#
-# 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 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 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=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_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_NF_CONNTRACK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=y
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_ARPTABLES 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=m
-# 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=y
-CONFIG_PARPORT_PC=y
-# CONFIG_PARPORT_SERIAL is not set
-# CONFIG_PARPORT_PC_FIFO is not set
-# CONFIG_PARPORT_PC_SUPERIO is not set
-# CONFIG_PARPORT_GSC is not set
-# CONFIG_PARPORT_AX88796 is not set
-# CONFIG_PARPORT_1284 is not set
-
-#
-# Plug and Play support
-#
-CONFIG_PNP=y
-# CONFIG_PNP_DEBUG is not set
-
-#
-# Protocols
-#
-# CONFIG_ISAPNP is not set
-# CONFIG_PNPBIOS is not set
-CONFIG_PNPACPI=y
-
-#
-# Block devices
-#
-CONFIG_BLK_DEV_FD=y
-# CONFIG_BLK_DEV_XD is not set
-# CONFIG_PARIDE 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
-# 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_UB is not set
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=51200
-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-
-#
-# Misc devices
-#
-# CONFIG_IBM_ASM is not set
-# CONFIG_PHANTOM is not set
-# CONFIG_SGI_IOC4 is not set
-# CONFIG_TIFM_CORE is not set
-# CONFIG_SONY_LAPTOP is not set
-# CONFIG_THINKPAD_ACPI is not set
-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_HD_IDE is not set
-CONFIG_BLK_DEV_IDEDISK=y
-CONFIG_IDEDISK_MULTI_MODE=y
-CONFIG_BLK_DEV_IDECD=y
-# CONFIG_BLK_DEV_IDETAPE is not set
-# CONFIG_BLK_DEV_IDEFLOPPY is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_BLK_DEV_IDEACPI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-CONFIG_IDE_PROC_FS=y
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-CONFIG_BLK_DEV_CMD640=y
-# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
-# CONFIG_BLK_DEV_IDEPNP is not set
-CONFIG_BLK_DEV_IDEPCI=y
-CONFIG_IDEPCI_SHARE_IRQ=y
-CONFIG_IDEPCI_PCIBUS_ORDER=y
-# CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_BLK_DEV_GENERIC=y
-# CONFIG_BLK_DEV_OPTI621 is not set
-CONFIG_BLK_DEV_RZ1000=y
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
-# CONFIG_IDEDMA_ONLYDISK is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_BLK_DEV_ATIIXP 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_CS5535 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_JMICRON is not set
-# CONFIG_BLK_DEV_SC1200 is not set
-CONFIG_BLK_DEV_PIIX=y
-# CONFIG_BLK_DEV_IT8213 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_SIS5513 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_BLK_DEV_TC86C001 is not set
-# CONFIG_IDE_ARM is not set
-# CONFIG_IDE_CHIPSETS is not set
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_IVB is not set
-# CONFIG_BLK_DEV_HD is not set
-
-#
-# SCSI device support
-#
-# CONFIG_RAID_ATTRS is not set
-CONFIG_SCSI=y
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-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=y
-# 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
-# CONFIG_SCSI_SCAN_ASYNC is not set
-CONFIG_SCSI_WAIT_SCAN=m
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_7000FASST is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AHA152X is not set
-# CONFIG_SCSI_AHA1542 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_AIC94XX is not set
-CONFIG_SCSI_DPT_I2O=m
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_IN2000 is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_BUSLOGIC is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_DTC3280 is not set
-# CONFIG_SCSI_EATA is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_GDTH 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_PPA is not set
-# CONFIG_SCSI_IMM is not set
-# CONFIG_SCSI_NCR53C406A is not set
-# CONFIG_SCSI_STEX is not set
-# CONFIG_SCSI_SYM53C8XX_2 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_1280 is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_SEAGATE 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_U14_34F is not set
-# CONFIG_SCSI_ULTRASTOR is not set
-# CONFIG_SCSI_NSP32 is not set
-# CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_SRP is not set
-# CONFIG_ATA 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 is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-# CONFIG_DM_DELAY 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_FIREWIRE is not set
-CONFIG_IEEE1394=y
-
-#
-# Subsystem Options
-#
-# CONFIG_IEEE1394_VERBOSEDEBUG is not set
-
-#
-# Controllers
-#
-
-#
-# Texas Instruments PCILynx requires I2C
-#
-CONFIG_IEEE1394_OHCI1394=y
-
-#
-# Protocols
-#
-# CONFIG_IEEE1394_VIDEO1394 is not set
-# CONFIG_IEEE1394_SBP2 is not set
-# CONFIG_IEEE1394_ETH1394_ROM_ENTRY is not set
-# CONFIG_IEEE1394_ETH1394 is not set
-# CONFIG_IEEE1394_DV1394 is not set
-CONFIG_IEEE1394_RAWIO=y
-
-#
-# I2O device support
-#
-# CONFIG_I2O is not set
-# CONFIG_MACINTOSH_DRIVERS is not set
-
-#
-# Network device support
-#
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-# CONFIG_BONDING is not set
-# CONFIG_EQUALIZER is not set
-# CONFIG_TUN is not set
-# CONFIG_NET_SB1000 is not set
-# CONFIG_ARCNET is not set
-# CONFIG_PHYLIB is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-CONFIG_MII=y
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_LANCE is not set
-# CONFIG_NET_VENDOR_SMC 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=y
-# CONFIG_E2100 is not set
-# CONFIG_EWRK3 is not set
-# CONFIG_EEXPRESS is not set
-# CONFIG_EEXPRESS_PRO is not set
-# CONFIG_HPLAN_PLUS is not set
-# CONFIG_HPLAN is not set
-# CONFIG_LP486E is not set
-# CONFIG_ETH16I is not set
-CONFIG_NE2000=y
-# CONFIG_ZNET is not set
-# CONFIG_SEEQ8005 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=y
-# CONFIG_8139CP is not set
-CONFIG_8139TOO=y
-CONFIG_8139TOO_PIO=y
-# 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
-# CONFIG_SC92031 is not set
-# CONFIG_NET_POCKET is not set
-CONFIG_NETDEV_1000=y
-# 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
-# CONFIG_QLA3XXX is not set
-# CONFIG_ATL1 is not set
-CONFIG_NETDEV_10000=y
-# CONFIG_CHELSIO_T1 is not set
-# CONFIG_CHELSIO_T3 is not set
-# CONFIG_IXGB is not set
-CONFIG_S2IO=m
-# CONFIG_S2IO_NAPI is not set
-# CONFIG_MYRI10GE is not set
-# CONFIG_NETXEN_NIC is not set
-# CONFIG_MLX4_CORE is not set
-# CONFIG_TR is not set
-
-#
-# Wireless LAN
-#
-# CONFIG_WLAN_PRE80211 is not set
-# CONFIG_WLAN_80211 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_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-# CONFIG_PLIP 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
-# CONFIG_INPUT_FF_MEMLESS is not set
-# CONFIG_INPUT_POLLDEV 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_POWER is not set
-
-#
-# Input Device Drivers
-#
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TABLET=y
-# CONFIG_TABLET_USB_ACECAD is not set
-# CONFIG_TABLET_USB_AIPTEK is not set
-# CONFIG_TABLET_USB_GTCO is not set
-# CONFIG_TABLET_USB_KBTAB is not set
-CONFIG_TABLET_USB_WACOM=y
-# 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 is not set
-# CONFIG_SERIO_CT82C710 is not set
-# CONFIG_SERIO_PARKBD 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
-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 is not set
-CONFIG_SERIAL_8250_PCI=y
-CONFIG_SERIAL_8250_PNP=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_JSM is not set
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-CONFIG_PRINTER=y
-# CONFIG_LP_CONSOLE is not set
-# CONFIG_PPDEV is not set
-# CONFIG_TIPAR is not set
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-# CONFIG_WATCHDOG is not set
-# CONFIG_HW_RANDOM is not set
-# CONFIG_NVRAM 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
-# CONFIG_SONYPI is not set
-CONFIG_AGP=y
-# CONFIG_AGP_ALI is not set
-# CONFIG_AGP_ATI is not set
-# CONFIG_AGP_AMD is not set
-# CONFIG_AGP_AMD64 is not set
-CONFIG_AGP_INTEL=y
-# CONFIG_AGP_NVIDIA is not set
-# CONFIG_AGP_SIS is not set
-# CONFIG_AGP_SWORKS is not set
-# CONFIG_AGP_VIA is not set
-# CONFIG_AGP_EFFICEON is not set
-CONFIG_DRM=y
-# CONFIG_DRM_TDFX is not set
-# CONFIG_DRM_R128 is not set
-# CONFIG_DRM_RADEON is not set
-# CONFIG_DRM_I810 is not set
-# CONFIG_DRM_I830 is not set
-# CONFIG_DRM_I915 is not set
-# CONFIG_DRM_MGA is not set
-# CONFIG_DRM_SIS is not set
-# CONFIG_DRM_VIA is not set
-# CONFIG_DRM_SAVAGE is not set
-# CONFIG_MWAVE is not set
-# CONFIG_PC8736x_GPIO is not set
-# CONFIG_NSC_GPIO is not set
-# CONFIG_CS5535_GPIO is not set
-# CONFIG_RAW_DRIVER is not set
-# CONFIG_HPET is not set
-# CONFIG_HANGCHECK_TIMER is not set
-
-#
-# TPM devices
-#
-# CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
-CONFIG_DEVPORT=y
-# 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
-# CONFIG_POWER_SUPPLY is not set
-CONFIG_HWMON=y
-# CONFIG_HWMON_VID is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_K8TEMP is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_CORETEMP 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_SENSORS_HDAPS is not set
-# CONFIG_SENSORS_APPLESMC is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
-
-#
-# Multifunction device drivers
-#
-# CONFIG_MFD_SM501 is not set
-# CONFIG_HTC_ASIC3 is not set
-# CONFIG_HTC_ASIC3_DS1WM is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-CONFIG_VIDEO_CAPTURE_DRIVERS=y
-# CONFIG_VIDEO_ADV_DEBUG is not set
-CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
-# CONFIG_VIDEO_VIVI is not set
-# CONFIG_VIDEO_PMS is not set
-# CONFIG_VIDEO_BWQCAM is not set
-# CONFIG_VIDEO_CQCAM is not set
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_STRADIS is not set
-CONFIG_V4L_USB_DRIVERS=y
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-# CONFIG_USB_ZR364XX is not set
-CONFIG_RADIO_ADAPTERS=y
-# 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
-# CONFIG_USB_DSBR is not set
-# CONFIG_DVB_CORE is not set
-CONFIG_DAB=y
-# CONFIG_USB_DABUSB is not set
-
-#
-# Graphics support
-#
-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-
-#
-# Display device support
-#
-# CONFIG_DISPLAY_SUPPORT is not set
-CONFIG_VGASTATE=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_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=y
-# CONFIG_FB_TILEBLITTING is not set
-
-#
-# Frame buffer hardware drivers
-#
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ARC is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
-CONFIG_FB_VGA16=y
-CONFIG_FB_VESA=y
-# CONFIG_FB_VESA_STD is not set
-CONFIG_FB_VESA_TNG=y
-CONFIG_FB_VESA_DEFAULT_MODE="640x480-32@60"
-CONFIG_VIDEO_SELECT=y
-# CONFIG_FB_HECUBA is not set
-# CONFIG_FB_HGA is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_I810 is not set
-# CONFIG_FB_LE80578 is not set
-# CONFIG_FB_INTEL is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_S3 is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_VT8623 is not set
-# CONFIG_FB_CYBLA is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_ARK is not set
-# CONFIG_FB_PM3 is not set
-# CONFIG_FB_GEODE is not set
-# CONFIG_FB_VIRTUAL is not set
-
-#
-# Console display driver support
-#
-CONFIG_VGA_CONSOLE=y
-# CONFIG_VGACON_SOFT_SCROLLBACK is not set
-# CONFIG_MDA_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
-CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-CONFIG_FONTS=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
-CONFIG_LOGO=y
-# CONFIG_LOGO_LINUX_MONO is not set
-# CONFIG_LOGO_LINUX_VGA16 is not set
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_SEQUENCER=y
-# CONFIG_SND_SEQ_DUMMY 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_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=y
-# CONFIG_SND_DUMMY is not set
-# CONFIG_SND_VIRMIDI is not set
-# CONFIG_SND_MTPAV is not set
-# CONFIG_SND_MTS64 is not set
-# CONFIG_SND_SERIAL_U16550 is not set
-# CONFIG_SND_MPU401 is not set
-# CONFIG_SND_PORTMAN2X4 is not set
-
-#
-# ISA devices
-#
-# CONFIG_SND_ADLIB is not set
-# CONFIG_SND_AD1816A is not set
-# CONFIG_SND_AD1848 is not set
-# CONFIG_SND_ALS100 is not set
-# CONFIG_SND_AZT2320 is not set
-# CONFIG_SND_CMI8330 is not set
-# CONFIG_SND_CS4231 is not set
-# CONFIG_SND_CS4232 is not set
-# CONFIG_SND_CS4236 is not set
-# CONFIG_SND_DT019X is not set
-# CONFIG_SND_ES968 is not set
-# CONFIG_SND_ES1688 is not set
-# CONFIG_SND_ES18XX is not set
-# CONFIG_SND_GUSCLASSIC is not set
-# CONFIG_SND_GUSEXTREME is not set
-# CONFIG_SND_GUSMAX is not set
-# CONFIG_SND_INTERWAVE is not set
-# CONFIG_SND_INTERWAVE_STB is not set
-# CONFIG_SND_OPL3SA2 is not set
-# CONFIG_SND_OPTI92X_AD1848 is not set
-# CONFIG_SND_OPTI92X_CS4231 is not set
-# CONFIG_SND_OPTI93X is not set
-# CONFIG_SND_MIRO is not set
-# CONFIG_SND_SB8 is not set
-# CONFIG_SND_SB16 is not set
-# CONFIG_SND_SBAWE is not set
-# CONFIG_SND_SGALAXY is not set
-# CONFIG_SND_SSCAPE is not set
-# CONFIG_SND_WAVEFRONT is not set
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALS4000 is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_CS5535AUDIO is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-CONFIG_SND_INTEL8X0=y
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-
-#
-# USB devices
-#
-# CONFIG_SND_USB_AUDIO is not set
-# CONFIG_SND_USB_USX2Y is not set
-# CONFIG_SND_USB_CAIAQ is not set
-
-#
-# System on Chip 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 Input Devices
-#
-CONFIG_USB_HID=y
-# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-# CONFIG_HID_FF is not set
-# CONFIG_USB_HIDDEV 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_DEVICE_CLASS=y
-# 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_EHCI_HCD=y
-# CONFIG_USB_EHCI_SPLIT_ISO is not set
-# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
-# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-# CONFIG_USB_EHCI_BIG_ENDIAN_MMIO is not set
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=y
-# 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_UHCI_HCD=y
-# CONFIG_USB_SL811_HCD is not set
-
-#
-# USB Device Class drivers
-#
-# CONFIG_USB_ACM is not set
-CONFIG_USB_PRINTER=y
-
-#
-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-#
-
-#
-# may also be needed; see USB_STORAGE Help for more information
-#
-CONFIG_USB_STORAGE=y
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Imaging devices
-#
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_MICROTEK is not set
-CONFIG_USB_MON=y
-
-#
-# USB port drivers
-#
-# CONFIG_USB_USS720 is not set
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-
-#
-# USB Miscellaneous drivers
-#
-# CONFIG_USB_EMI62 is not set
-# CONFIG_USB_EMI26 is not set
-# CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_AUERSWALD is not set
-# CONFIG_USB_RIO500 is not set
-# CONFIG_USB_LEGOTOWER is not set
-# CONFIG_USB_LCD is not set
-# CONFIG_USB_BERRY_CHARGE is not set
-# CONFIG_USB_LED is not set
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# 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_SISUSBVGA is not set
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TRANCEVIBRATOR is not set
-# CONFIG_USB_IOWARRIOR is not set
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-# CONFIG_USB_GADGET is not set
-# 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)
-#
-# CONFIG_EDAC is not set
-
-#
-# Real Time Clock
-#
-# CONFIG_RTC_CLASS is not set
-
-#
-# DMA Engine support
-#
-# CONFIG_DMA_ENGINE is not set
-
-#
-# DMA Clients
-#
-
-#
-# DMA Devices
-#
-
-#
-# Auxiliary Display support
-#
-# CONFIG_KS0108 is not set
-
-#
-# Virtualization
-#
-# CONFIG_KVM is not set
-
-#
-# File systems
-#
-CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-# CONFIG_EXT3_FS_POSIX_ACL is not set
-# CONFIG_EXT3_FS_SECURITY is not set
-# CONFIG_EXT4DEV_FS is not set
-CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
-CONFIG_FS_MBCACHE=y
-# CONFIG_REISERFS_FS is not set
-# CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
-# CONFIG_XFS_FS is not set
-# CONFIG_GFS2_FS is not set
-# CONFIG_OCFS2_FS is not set
-# CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS 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=y
-CONFIG_JOLIET=y
-# CONFIG_ZISOFS is not set
-CONFIG_UDF_FS=y
-CONFIG_UDF_NLS=y
-
-#
-# 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_KCORE=y
-CONFIG_PROC_SYSCTL=y
-CONFIG_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_TMPFS_POSIX_ACL is not set
-# 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_SQUASHFS is not set
-# CONFIG_VXFS_FS is not set
-# CONFIG_HPFS_FS is not set
-# CONFIG_QNX4FS_FS is not set
-# CONFIG_SYSV_FS is not set
-# CONFIG_UFS_FS is not set
-
-#
-# Network File Systems
-#
-CONFIG_NFS_FS=y
-# CONFIG_NFS_V3 is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=y
-# CONFIG_NFSD_V3 is not set
-CONFIG_NFSD_TCP=y
-CONFIG_ROOT_NFS=y
-CONFIG_LOCKD=y
-CONFIG_EXPORTFS=y
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_BIND34 is not set
-# 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 is not set
-# CONFIG_NLS_CODEPAGE_869 is not set
-# CONFIG_NLS_CODEPAGE_936 is not set
-# CONFIG_NLS_CODEPAGE_950 is not set
-# CONFIG_NLS_CODEPAGE_932 is not set
-# CONFIG_NLS_CODEPAGE_949 is not set
-# CONFIG_NLS_CODEPAGE_874 is not set
-# CONFIG_NLS_ISO8859_8 is not set
-# CONFIG_NLS_CODEPAGE_1250 is not set
-# CONFIG_NLS_CODEPAGE_1251 is not set
-# CONFIG_NLS_ASCII is not set
-CONFIG_NLS_ISO8859_1=y
-# CONFIG_NLS_ISO8859_2 is not set
-# CONFIG_NLS_ISO8859_3 is not set
-# CONFIG_NLS_ISO8859_4 is not set
-# CONFIG_NLS_ISO8859_5 is not set
-# CONFIG_NLS_ISO8859_6 is not set
-# CONFIG_NLS_ISO8859_7 is not set
-# CONFIG_NLS_ISO8859_9 is not set
-# CONFIG_NLS_ISO8859_13 is not set
-# CONFIG_NLS_ISO8859_14 is not set
-# CONFIG_NLS_ISO8859_15 is not set
-# CONFIG_NLS_KOI8_R is not set
-# CONFIG_NLS_KOI8_U is not set
-# CONFIG_NLS_UTF8 is not set
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Instrumentation Support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=y
-# CONFIG_KPROBES is not set
-
-#
-# Kernel hacking
-#
-CONFIG_TRACE_IRQFLAGS_SUPPORT=y
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-# CONFIG_MAGIC_SYSRQ is not set
-CONFIG_UNUSED_SYMBOLS=y
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-# CONFIG_DEBUG_KERNEL is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-CONFIG_EARLY_PRINTK=y
-CONFIG_X86_FIND_SMP_CONFIG=y
-CONFIG_X86_MPPARSE=y
-CONFIG_DOUBLEFAULT=y
-
-#
-# 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=m
-# 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_CRYPTD 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_TWOFISH_586 is not set
-# CONFIG_CRYPTO_SERPENT is not set
-# CONFIG_CRYPTO_AES is not set
-# CONFIG_CRYPTO_AES_586 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_LZO 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
-#
-CONFIG_CRYPTO_DEV_PADLOCK=m
-CONFIG_CRYPTO_DEV_PADLOCK_AES=m
-CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
-CONFIG_CRYPTO_DEV_GEODE=m
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
-# CONFIG_CRC_ITU_T is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_AUDIT_GENERIC=y
-CONFIG_PLIST=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAS_DMA=y
-CONFIG_GENERIC_HARDIRQS=y
-CONFIG_GENERIC_IRQ_PROBE=y
-CONFIG_GENERIC_PENDING_IRQ=y
-CONFIG_X86_SMP=y
-CONFIG_X86_HT=y
-CONFIG_X86_BIOS_REBOOT=y
-CONFIG_X86_TRAMPOLINE=y
-CONFIG_KTIME_SCALAR=y
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-spitz b/meta/packages/linux/linux-rp-2.6.22/defconfig-spitz
deleted file mode 100644 (file)
index 6d833ac..0000000
+++ /dev/null
@@ -1,1723 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.22-rc6
-# Sun Jul  1 22:44:06 2007
-#
-CONFIG_ARM=y
-CONFIG_SYS_SUPPORTS_APM_EMULATION=y
-CONFIG_GENERIC_GPIO=y
-CONFIG_GENERIC_TIME=y
-# CONFIG_GENERIC_CLOCKEVENTS is not set
-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_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=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=y
-CONFIG_UID16=y
-CONFIG_SYSCTL_SYSCALL=y
-CONFIG_KALLSYMS=y
-# CONFIG_KALLSYMS_ALL is not set
-# CONFIG_KALLSYMS_EXTRA_PASS is not set
-CONFIG_HOTPLUG=y
-CONFIG_PRINTK=y
-CONFIG_BUG=y
-CONFIG_ELF_CORE=y
-CONFIG_BASE_FULL=y
-CONFIG_FUTEX=y
-CONFIG_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=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=m
-CONFIG_IOSCHED_CFQ=m
-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_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=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_DAVINCI 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_PXA_SHARPSL=y
-# CONFIG_MACH_TRIZEPS4 is not set
-# CONFIG_MACH_HX2750 is not set
-# CONFIG_PXA_SHARPSL_25x is not set
-CONFIG_PXA_SHARPSL_27x=y
-CONFIG_MACH_AKITA=y
-CONFIG_MACH_SPITZ=y
-CONFIG_MACH_BORZOI=y
-CONFIG_PXA27x=y
-CONFIG_PXA_SHARP_Cxx00=y
-CONFIG_PXA_SSP=y
-# CONFIG_PXA_KEYS 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
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-
-#
-# Bus support
-#
-# CONFIG_ARCH_SUPPORTS_MSI 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=y
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-# CONFIG_TICK_ONESHOT is not set
-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="console=ttyS0,115200n8 console=tty1 noinitrd root=/dev/hda1 rootfstype=ext3 rootdelay=1 rw  fbcon=rotate:1 dyntick=enable debug"
-# CONFIG_XIP_KERNEL is not set
-CONFIG_KEXEC=y
-
-#
-# 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=m
-CONFIG_BINFMT_MISC=m
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-# CONFIG_PM_SYSFS_DEPRECATED is not set
-CONFIG_APM_EMULATION=y
-
-#
-# Networking
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-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 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=y
-# 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=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_IP_VS is not set
-CONFIG_IPV6=m
-# CONFIG_IPV6_PRIVACY is not set
-# CONFIG_IPV6_ROUTER_PREF is not set
-# CONFIG_IPV6_OPTIMISTIC_DAD is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-# CONFIG_IPV6_MIP6 is not set
-CONFIG_INET6_XFRM_TUNNEL=m
-CONFIG_INET6_TUNNEL=m
-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=m
-# 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_NF_CONNTRACK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_QUEUE=m
-# CONFIG_IP_NF_IPTABLES is not set
-# CONFIG_IP_NF_ARPTABLES is not set
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE is not set
-# CONFIG_IP6_NF_IPTABLES 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=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 is not set
-
-#
-# Dongle support
-#
-# CONFIG_KINGSUN_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=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_AF_RXRPC is not set
-
-#
-# Wireless
-#
-# CONFIG_CFG80211 is not set
-CONFIG_WIRELESS_EXT=y
-# CONFIG_MAC80211 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 is not set
-# CONFIG_RFKILL 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
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
-# CONFIG_MTD_AFS_PARTS is not set
-
-#
-# User Modules And Translation Layers
-#
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_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=y
-# CONFIG_MTD_ABSENT is not set
-
-#
-# Mapping drivers for chip access
-#
-CONFIG_MTD_COMPLEX_MAPPINGS=y
-# CONFIG_MTD_PHYSMAP is not set
-CONFIG_MTD_SHARP_SL=y
-# 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=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_ECC_SMC is not set
-# CONFIG_MTD_NAND_MUSEUM_IDS is not set
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_IDS=y
-# CONFIG_MTD_NAND_DISKONCHIP is not set
-CONFIG_MTD_NAND_SHARPSL=y
-# CONFIG_MTD_NAND_NANDSIM is not set
-# CONFIG_MTD_NAND_PLATFORM is not set
-# CONFIG_MTD_ONENAND is not set
-
-#
-# UBI - Unsorted block images
-#
-# CONFIG_MTD_UBI 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_UB is not set
-# CONFIG_BLK_DEV_RAM is not set
-# CONFIG_CDROM_PKTCDVD is not set
-# CONFIG_ATA_OVER_ETH is not set
-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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-CONFIG_IDE_PROC_FS=y
-
-#
-# IDE chipset support/bugfixes
-#
-CONFIG_IDE_GENERIC=y
-# CONFIG_IDEPCI_PCIBUS_ORDER is not set
-# 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=m
-# CONFIG_SCSI_TGT is not set
-# CONFIG_SCSI_NETLINK is not set
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=y
-# CONFIG_SCSI_CONSTANTS is not set
-# CONFIG_SCSI_LOGGING is not set
-# CONFIG_SCSI_SCAN_ASYNC is not set
-CONFIG_SCSI_WAIT_SCAN=m
-
-#
-# SCSI Transports
-#
-# CONFIG_SCSI_SPI_ATTRS is not set
-# CONFIG_SCSI_FC_ATTRS is not set
-# CONFIG_SCSI_ISCSI_ATTRS is not set
-# CONFIG_SCSI_SAS_ATTRS is not set
-# CONFIG_SCSI_SAS_LIBSAS is not set
-
-#
-# SCSI low-level drivers
-#
-# CONFIG_ISCSI_TCP is not set
-# CONFIG_SCSI_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
-# CONFIG_ATA is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-# CONFIG_BLK_DEV_MD is not set
-CONFIG_BLK_DEV_DM=m
-# CONFIG_DM_DEBUG is not set
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-# CONFIG_DM_DELAY 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
-# 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
-CONFIG_NETDEV_1000=y
-CONFIG_NETDEV_10000=y
-
-#
-# Wireless LAN
-#
-CONFIG_WLAN_PRE80211=y
-# CONFIG_STRIP is not set
-# CONFIG_PCMCIA_WAVELAN is not set
-# CONFIG_PCMCIA_NETWAVE is not set
-CONFIG_WLAN_80211=y
-# CONFIG_PCMCIA_RAYCS is not set
-# CONFIG_LIBERTAS is not set
-CONFIG_HERMES=m
-# CONFIG_ATMEL is not set
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-CONFIG_AIRO_CS=m
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_USB_ZD1201 is not set
-CONFIG_HOSTAP=m
-CONFIG_HOSTAP_FIRMWARE=y
-# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set
-CONFIG_HOSTAP_CS=m
-
-#
-# 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 is not set
-# CONFIG_USB_NET_GL620A is not set
-CONFIG_USB_NET_NET1080=m
-# CONFIG_USB_NET_PLUSB is not set
-# CONFIG_USB_NET_MCS7830 is not set
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_USB_NET_ZAURUS=m
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET is not set
-# 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 is not set
-# 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
-# CONFIG_INPUT_POLLDEV is not set
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_KEYBOARD_CORGI is not set
-CONFIG_KEYBOARD_SPITZ=y
-# CONFIG_KEYBOARD_PXA27x is not set
-# CONFIG_KEYBOARD_GPIO 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_CORGI=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_USB_COMPOSITE is not set
-CONFIG_INPUT_MISC=y
-# CONFIG_INPUT_ATI_REMOTE is not set
-# CONFIG_INPUT_ATI_REMOTE2 is not set
-# CONFIG_INPUT_KEYSPAN_REMOTE is not set
-# CONFIG_INPUT_POWERMATE is not set
-# CONFIG_INPUT_YEALINK is not set
-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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-CONFIG_UNIX98_PTYS=y
-# CONFIG_LEGACY_PTYS is not set
-
-#
-# IPMI
-#
-# CONFIG_IPMI_HANDLER is not set
-# CONFIG_WATCHDOG is not set
-CONFIG_HW_RANDOM=m
-# CONFIG_NVRAM 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
-CONFIG_I2C=y
-CONFIG_I2C_BOARDINFO=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_GPIO is not set
-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_SIMTEC is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_TINY_USB 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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Dallas's 1-wire bus
-#
-# CONFIG_W1 is not set
-# CONFIG_HWMON is not set
-
-#
-# Misc devices
-#
-# CONFIG_BLINK is not set
-
-#
-# Multifunction device drivers
-#
-# CONFIG_MFD_SM501 is not set
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-
-#
-# LED drivers
-#
-CONFIG_LEDS_SPITZ=y
-# CONFIG_LEDS_TOSA is not set
-
-#
-# LED Triggers
-#
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TRIGGER_TIMER=y
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-CONFIG_VIDEO_CAPTURE_DRIVERS=y
-# CONFIG_VIDEO_ADV_DEBUG is not set
-CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
-# CONFIG_VIDEO_CPIA is not set
-# CONFIG_VIDEO_CPIA2 is not set
-# CONFIG_VIDEO_SAA5246A is not set
-# CONFIG_VIDEO_SAA5249 is not set
-# CONFIG_TUNER_3036 is not set
-CONFIG_V4L_USB_DRIVERS=y
-# CONFIG_VIDEO_PVRUSB2 is not set
-# CONFIG_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_USBVISION is not set
-# CONFIG_USB_VICAM is not set
-# CONFIG_USB_IBMCAM is not set
-# CONFIG_USB_KONICAWC is not set
-# CONFIG_USB_QUICKCAM_MESSENGER is not set
-# CONFIG_USB_ET61X251 is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_USB_W9968CF is not set
-# CONFIG_USB_OV511 is not set
-# CONFIG_USB_SE401 is not set
-# CONFIG_USB_SN9C102 is not set
-# CONFIG_USB_STV680 is not set
-# CONFIG_USB_ZC0301 is not set
-# CONFIG_USB_PWC is not set
-# CONFIG_USB_ZR364XX is not set
-CONFIG_RADIO_ADAPTERS=y
-# CONFIG_USB_DSBR is not set
-# CONFIG_DVB_CORE is not set
-CONFIG_DAB=y
-CONFIG_USB_DABUSB=m
-
-#
-# Graphics support
-#
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
-CONFIG_LCD_CLASS_DEVICE=y
-CONFIG_BACKLIGHT_CORGI=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=y
-CONFIG_FB_CFB_COPYAREA=y
-CONFIG_FB_CFB_IMAGEBLIT=y
-# 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_PXA=y
-CONFIG_FB_PXA_LCD_QVGA=y
-# CONFIG_FB_PXA_LCD_VGA is not set
-CONFIG_FB_PXA_OVERLAY=y
-# CONFIG_FB_PXA_PARAMETERS is not set
-# CONFIG_FB_MBX is not set
-# CONFIG_FB_W100 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=y
-CONFIG_FONTS=y
-# CONFIG_FONT_8x8 is not set
-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
-CONFIG_LOGO=y
-CONFIG_LOGO_LINUX_MONO=y
-CONFIG_LOGO_LINUX_VGA16=y
-# CONFIG_LOGO_LINUX_CLUT224 is not set
-CONFIG_LOGO_OHAND_CLUT224=y
-# CONFIG_LOGO_OZ240_CLUT224 is not set
-# CONFIG_LOGO_OZ480_CLUT224 is not set
-# CONFIG_LOGO_OZ640_CLUT224 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=m
-CONFIG_SND_TIMER=m
-CONFIG_SND_PCM=m
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=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=y
-CONFIG_SND_VERBOSE_PRINTK=y
-CONFIG_SND_DEBUG=y
-# CONFIG_SND_DEBUG_DETECT is not set
-# CONFIG_SND_PCM_XRUN_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_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-# CONFIG_SND_USB_CAIAQ is not set
-
-#
-# PCMCIA devices
-#
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_PDAUDIOCF is not set
-
-#
-# System on Chip audio support
-#
-CONFIG_SND_SOC=m
-CONFIG_SND_PXA2XX_SOC=m
-CONFIG_SND_PXA2XX_SOC_I2S=m
-CONFIG_SND_PXA2XX_SOC_SPITZ=m
-CONFIG_SND_SOC_WM8750=m
-
-#
-# 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 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=m
-CONFIG_USB_MOUSE=m
-
-#
-# 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=y
-CONFIG_USB_DEVICE_CLASS=y
-# 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=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_STORAGE=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_STORAGE_KARMA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Imaging devices
-#
-CONFIG_USB_MDC800=m
-CONFIG_USB_MICROTEK=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 is not set
-# CONFIG_USB_SERIAL_AIRPRIME is not set
-# CONFIG_USB_SERIAL_ARK3116 is not set
-CONFIG_USB_SERIAL_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-# CONFIG_USB_SERIAL_FUNSOFT is not set
-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 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-# CONFIG_USB_SERIAL_MOS7720 is not set
-# CONFIG_USB_SERIAL_MOS7840 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=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-# CONFIG_USB_SERIAL_DEBUG is not set
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-# CONFIG_USB_ADUTUX is not set
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-# CONFIG_USB_BERRY_CHARGE is not set
-CONFIG_USB_LED=m
-# CONFIG_USB_CYPRESS_CY7C63 is not set
-CONFIG_USB_CYTHERM=m
-# CONFIG_USB_PHIDGET is not set
-CONFIG_USB_IDMOUSE=m
-# 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
-# CONFIG_USB_TEST is not set
-
-#
-# USB DSL modem support
-#
-
-#
-# USB Gadget Support
-#
-CONFIG_USB_GADGET=m
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-CONFIG_USB_GADGET_SELECTED=y
-# CONFIG_USB_GADGET_FSL_USB2 is not set
-# 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_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X 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_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_UNSAFE_RESUME=y
-
-#
-# MMC/SD Card Drivers
-#
-CONFIG_MMC_BLOCK=y
-
-#
-# MMC/SD Host Controller Drivers
-#
-CONFIG_MMC_PXA=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
-#
-# CONFIG_RTC_DRV_DS1307 is not set
-# CONFIG_RTC_DRV_DS1672 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_X1205 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_PCF8583 is not set
-
-#
-# SPI RTC drivers
-#
-
-#
-# 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_SA1100=y
-
-#
-# 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=y
-# 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=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_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_JFFS2_FS=m
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
-# CONFIG_JFFS2_SYSFS is not set
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_LZO=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-# CONFIG_JFFS2_CMODE_FAVOURLZO is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# CONFIG_NFS_DIRECTIO is not set
-CONFIG_NFSD=m
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V3_ACL is not set
-CONFIG_NFSD_V4=y
-CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
-CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_NFS_COMMON=y
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-# CONFIG_SUNRPC_BIND34 is not set
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
-# 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=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=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
-
-#
-# Distributed Lock Manager
-#
-# CONFIG_DLM is not set
-
-#
-# Profiling support
-#
-CONFIG_PROFILING=y
-CONFIG_OPROFILE=m
-
-#
-# Kernel hacking
-#
-# CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_TIMER_STATS=y
-# CONFIG_DEBUG_SHIRQ is not set
-# CONFIG_DETECT_SOFTLOCKUP is not set
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_TIMER_STATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_LOCK_ALLOC is not set
-# CONFIG_PROVE_LOCKING is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
-CONFIG_DEBUG_BUGVERBOSE=y
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_FAULT_INJECTION is not set
-# CONFIG_DEBUG_USER is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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_HASH=y
-CONFIG_CRYPTO_MANAGER=y
-CONFIG_CRYPTO_HMAC=y
-# CONFIG_CRYPTO_XCBC is not set
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# 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_CRYPTD is not set
-CONFIG_CRYPTO_DES=m
-# CONFIG_CRYPTO_FCRYPT is not set
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_TWOFISH_COMMON=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-# CONFIG_CRYPTO_LZO is not set
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-# CONFIG_CRYPTO_CAMELLIA is not set
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_BITREVERSE=y
-CONFIG_CRC_CCITT=y
-# CONFIG_CRC16 is not set
-# CONFIG_CRC_ITU_T is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=m
-CONFIG_ZLIB_DEFLATE=m
-CONFIG_LZO_COMPRESS=m
-CONFIG_LZO_DECOMPRESS=m
-CONFIG_PLIST=y
-CONFIG_HAS_IOMEM=y
-CONFIG_HAS_IOPORT=y
-CONFIG_HAS_DMA=y
diff --git a/meta/packages/linux/linux-rp-2.6.22/defconfig-tosa b/meta/packages/linux/linux-rp-2.6.22/defconfig-tosa
deleted file mode 100644 (file)
index 74fc076..0000000
+++ /dev/null
@@ -1,1614 +0,0 @@
-#
-# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.16-rc5-git5
-# Tue Mar 14 09:05:26 2006
-#
-CONFIG_ARM=y
-CONFIG_MMU=y
-CONFIG_RWSEM_GENERIC_SPINLOCK=y
-CONFIG_GENERIC_CALIBRATE_DELAY=y
-CONFIG_ARCH_MTD_XIP=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 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=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
-#
-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
-
-#
-# Block layer
-#
-
-#
-# IO Schedulers
-#
-CONFIG_IOSCHED_NOOP=y
-CONFIG_IOSCHED_AS=y
-CONFIG_IOSCHED_DEADLINE=m
-CONFIG_IOSCHED_CFQ=m
-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_CLPS7500 is not set
-# CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
-# CONFIG_ARCH_EBSA110 is not set
-# CONFIG_ARCH_FOOTBRIDGE is not set
-# CONFIG_ARCH_INTEGRATOR is not set
-# CONFIG_ARCH_IOP3XX is not set
-# CONFIG_ARCH_IXP4XX is not set
-# CONFIG_ARCH_IXP2000 is not set
-# CONFIG_ARCH_L7200 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_ARCH_VERSATILE is not set
-# CONFIG_ARCH_REALVIEW is not set
-# CONFIG_ARCH_IMX is not set
-# CONFIG_ARCH_H720X is not set
-# CONFIG_ARCH_AAEC2000 is not set
-# CONFIG_ARCH_AT91RM9200 is not set
-
-#
-# Intel PXA2xx Implementations
-#
-# CONFIG_ARCH_LUBBOCK is not set
-# CONFIG_MACH_MAINSTONE is not set
-# CONFIG_ARCH_PXA_IDP is not set
-CONFIG_PXA_SHARPSL=y
-# CONFIG_MACH_HX2750 is not set
-CONFIG_PXA_SHARPSL_25x=y
-# CONFIG_PXA_SHARPSL_27x is not set
-# CONFIG_MACH_POODLE is not set
-# CONFIG_MACH_CORGI is not set
-# CONFIG_MACH_SHEPHERD is not set
-# CONFIG_MACH_HUSKY is not set
-CONFIG_MACH_TOSA=y
-CONFIG_PXA25x=y
-# CONFIG_PXA_KEYS 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
-
-#
-# Processor Features
-#
-CONFIG_ARM_THUMB=y
-CONFIG_XSCALE_PMU=y
-CONFIG_KEXEC=y
-CONFIG_SHARP_PARAM=y
-CONFIG_SHARPSL_PM=y
-CONFIG_SHARP_SCOOP=y
-CONFIG_TOSHIBA_TC6393XB=y
-
-#
-# Bus support
-#
-
-#
-# 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
-
-#
-# PC-card bridges
-#
-CONFIG_PCMCIA_PXA2XX=y
-
-#
-# Kernel Features
-#
-CONFIG_PREEMPT=y
-CONFIG_NO_IDLE_HZ=y
-# CONFIG_AEABI is not set
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
-# CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
-CONFIG_FLAT_NODE_MEM_MAP=y
-# CONFIG_SPARSEMEM_STATIC is not set
-CONFIG_SPLIT_PTLOCK_CPUS=4096
-CONFIG_ALIGNMENT_TRAP=y
-
-#
-# Boot options
-#
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-# 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=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_PXA25x=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=m
-CONFIG_BINFMT_MISC=m
-# CONFIG_ARTHUR is not set
-
-#
-# Power management options
-#
-CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
-# CONFIG_PM_DEBUG is not set
-CONFIG_APM=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=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=y
-# 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=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=m
-# CONFIG_IPV6_PRIVACY is not set
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_INET6_TUNNEL=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-# CONFIG_NETFILTER_DEBUG is not set
-
-#
-# Core Netfilter Configuration
-#
-# CONFIG_NETFILTER_NETLINK is not set
-# CONFIG_NETFILTER_XTABLES is not set
-
-#
-# IP: Netfilter Configuration
-#
-CONFIG_IP_NF_CONNTRACK=m
-# CONFIG_IP_NF_CT_ACCT is not set
-# CONFIG_IP_NF_CONNTRACK_MARK is not set
-# CONFIG_IP_NF_CONNTRACK_EVENTS is not set
-CONFIG_IP_NF_CT_PROTO_SCTP=m
-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
-
-#
-# IPv6: Netfilter Configuration (EXPERIMENTAL)
-#
-# CONFIG_IP6_NF_QUEUE 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=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_USB_IRDA is not set
-# CONFIG_SIGMATEL_FIR is not set
-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_HCIUSB=m
-# CONFIG_BT_HCIUSB_SCO is not set
-CONFIG_BT_HCIUART=m
-CONFIG_BT_HCIUART_H4=y
-CONFIG_BT_HCIUART_BCSP=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_IEEE80211=m
-# CONFIG_IEEE80211_DEBUG is not set
-CONFIG_IEEE80211_CRYPT_WEP=m
-CONFIG_IEEE80211_CRYPT_CCMP=m
-CONFIG_IEEE80211_CRYPT_TKIP=m
-
-#
-# Device Drivers
-#
-
-#
-# Generic Driver Options
-#
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
-
-#
-# Connector - unified userspace <-> kernelspace linker
-#
-# CONFIG_CONNECTOR is not set
-
-#
-# Memory Technology Devices (MTD)
-#
-CONFIG_MTD=y
-# CONFIG_MTD_DEBUG is not set
-# CONFIG_MTD_CONCAT is not set
-CONFIG_MTD_PARTITIONS=y
-# CONFIG_MTD_REDBOOT_PARTS 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_BLOCK=y
-# 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
-#
-# 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=y
-# CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_OBSOLETE_CHIPS is not set
-
-#
-# Mapping drivers for chip access
-#
-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_SHARP_SL=y
-# 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_BLKMTD is not set
-# CONFIG_MTD_BLOCK2MTD is not set
-
-#
-# Disk-On-Chip Device Drivers
-#
-# CONFIG_MTD_DOC2000 is not set
-# CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOC2001PLUS is not set
-
-#
-# NAND Flash Device Drivers
-#
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_VERIFY_WRITE=y
-# CONFIG_MTD_NAND_H1900 is not set
-CONFIG_MTD_NAND_TMIO=y
-CONFIG_MTD_NAND_IDS=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
-#
-
-#
-# 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_UB 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_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_BLK_DEV_IDESCSI is not set
-# CONFIG_IDE_TASK_IOCTL is not set
-
-#
-# IDE chipset support/bugfixes
-#
-# CONFIG_IDE_GENERIC is not set
-# 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=m
-CONFIG_SCSI_PROC_FS=y
-
-#
-# SCSI support type (disk, tape, CD-ROM)
-#
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-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=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_ISCSI_TCP is not set
-# CONFIG_SCSI_SATA 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
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_DM=m
-CONFIG_DM_CRYPT=m
-CONFIG_DM_SNAPSHOT=m
-CONFIG_DM_MIRROR=m
-CONFIG_DM_ZERO=m
-CONFIG_DM_MULTIPATH=m
-CONFIG_DM_MULTIPATH_EMC=m
-
-#
-# 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
-
-#
-# Ethernet (1000 Mbit)
-#
-
-#
-# Ethernet (10000 Mbit)
-#
-
-#
-# Token Ring devices
-#
-
-#
-# Wireless LAN (non-hamradio)
-#
-CONFIG_NET_RADIO=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 is not set
-
-#
-# Wireless 802.11b Pcmcia/Cardbus cards support
-#
-CONFIG_PCMCIA_HERMES=m
-CONFIG_PCMCIA_SPECTRUM=m
-# 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_NET_WIRELESS=y
-
-#
-# PCMCIA network device support
-#
-CONFIG_NET_PCMCIA=y
-# CONFIG_PCMCIA_3C589 is not set
-# CONFIG_PCMCIA_3C574 is not set
-# CONFIG_PCMCIA_FMVJ18X is not set
-CONFIG_PCMCIA_PCNET=m
-# CONFIG_PCMCIA_NMCLAN is not set
-# CONFIG_PCMCIA_SMC91C92 is not set
-# CONFIG_PCMCIA_XIRC2PS is not set
-# CONFIG_PCMCIA_AXNET 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 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
-#
-# CONFIG_ISDN is not set
-
-#
-# Input device support
-#
-CONFIG_INPUT=y
-
-#
-# Userland interfaces
-#
-CONFIG_INPUT_MOUSEDEV=m
-# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
-CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-CONFIG_INPUT_EVDEV=y
-# CONFIG_INPUT_EVBUG is not set
-CONFIG_INPUT_POWER=y
-
-#
-# 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_CORGI is not set
-# CONFIG_KEYBOARD_SPITZ is not set
-CONFIG_KEYBOARD_TOSA=y
-# CONFIG_INPUT_MOUSE is not set
-# CONFIG_INPUT_JOYSTICK is not set
-CONFIG_INPUT_TOUCHSCREEN=y
-# CONFIG_TOUCHSCREEN_CORGI 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_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 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=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_CORE=y
-CONFIG_SERIAL_CORE_CONSOLE=y
-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_NVRAM 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=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_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_PCF8591 is not set
-# CONFIG_SENSORS_MAX6875 is not set
-# CONFIG_I2C_DEBUG_CORE is not set
-# CONFIG_I2C_DEBUG_ALGO is not set
-# CONFIG_I2C_DEBUG_BUS is not set
-# CONFIG_I2C_DEBUG_CHIP is not set
-
-#
-# SPI support
-#
-# CONFIG_SPI is not set
-# CONFIG_SPI_MASTER is not set
-
-#
-# Hardware Monitoring support
-#
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
-
-#
-# Misc devices
-#
-
-#
-# Multimedia Capabilities Port drivers
-#
-
-#
-# Multi-Function Devices
-#
-
-#
-# LED devices
-#
-CONFIG_NEW_LEDS=y
-CONFIG_LEDS_CLASS=y
-CONFIG_LEDS_TRIGGERS=y
-CONFIG_LEDS_TOSA=y
-CONFIG_LEDS_TRIGGER_TIMER=m
-CONFIG_LEDS_TRIGGER_IDE_DISK=y
-
-#
-# Multimedia devices
-#
-CONFIG_VIDEO_DEV=m
-CONFIG_VIDEO_V4L1=y
-CONFIG_VIDEO_V4L1_COMPAT=y
-CONFIG_VIDEO_V4L2=y
-
-#
-# Video For Linux
-#
-
-#
-# Video Adapters
-#
-# CONFIG_VIDEO_ADV_DEBUG is not set
-# 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_VIDEO_EM28XX is not set
-# CONFIG_VIDEO_OVCAMCHIP is not set
-# CONFIG_VIDEO_AUDIO_DECODER is not set
-# CONFIG_VIDEO_DECODER is not set
-
-#
-# Radio Adapters
-#
-# CONFIG_RADIO_MAESTRO is not set
-
-#
-# 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_MODE_HELPERS is not set
-# CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_PXA is not set
-# CONFIG_FB_W100 is not set
-CONFIG_FB_TMIO=y
-# 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 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
-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_HP680 is not set
-
-#
-# Sound
-#
-CONFIG_SOUND=y
-
-#
-# Advanced Linux Sound Architecture
-#
-CONFIG_SND=y
-CONFIG_SND_TIMER=y
-CONFIG_SND_PCM=y
-CONFIG_SND_HWDEP=m
-CONFIG_SND_RAWMIDI=m
-# CONFIG_SND_SEQUENCER is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-# CONFIG_SND_DYNAMIC_MINORS is not set
-CONFIG_SND_SUPPORT_OLD_API=y
-# CONFIG_SND_VERBOSE_PRINTK is not set
-# CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_AC97_BUS=y
-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_AC97 is not set
-
-#
-# USB devices
-#
-CONFIG_SND_USB_AUDIO=m
-
-#
-# PCMCIA devices
-#
-
-#
-# SoC audio support
-#
-CONFIG_SND_SOC=y
-
-#
-# Soc Platforms
-#
-
-#
-# SoC Audio for the Intel PXA2xx
-#
-CONFIG_SND_PXA2xx_SOC=y
-CONFIG_SND_PXA2xx_SOC_AC97=y
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM8753 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9713 is not set
-# CONFIG_SND_PXA2xx_SOC_MAINSTONE_WM9712 is not set
-# CONFIG_SND_PXA2xx_SOC_CORGI is not set
-# CONFIG_SND_PXA2xx_SOC_SPITZ is not set
-CONFIG_SND_PXA2xx_SOC_TOSA=y
-
-#
-# Soc Codecs
-#
-# CONFIG_SND_SOC_AC97_CODEC 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_WM9713 is not set
-CONFIG_SND_SOC_WM9712=y
-# CONFIG_SND_SOC_UDA1380 is not set
-# CONFIG_SND_SOC_AK4535 is not set
-
-#
-# Open Sound System
-#
-# CONFIG_SOUND_PRIME is not set
-
-#
-# USB support
-#
-CONFIG_USB_ARCH_HAS_HCD=y
-CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB=m
-# CONFIG_USB_DEBUG is not set
-
-#
-# Miscellaneous USB options
-#
-CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
-# CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_OTG is not set
-
-#
-# USB Host Controller Drivers
-#
-# CONFIG_USB_ISP116X_HCD is not set
-CONFIG_USB_OHCI_HCD=m
-# CONFIG_USB_OHCI_BIG_ENDIAN is not set
-CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_SL811_CS=m
-
-#
-# USB Device Class drivers
-#
-# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
-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=m
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_USBAT is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_SDDR55 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_STORAGE_ALAUDA is not set
-# CONFIG_USB_LIBUSUAL is not set
-
-#
-# USB Input Devices
-#
-CONFIG_USB_HID=m
-CONFIG_USB_HIDINPUT=y
-# 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=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB_AIPTEK=m
-CONFIG_USB_WACOM=m
-# CONFIG_USB_ACECAD is not set
-CONFIG_USB_KBTAB=m
-CONFIG_USB_POWERMATE=m
-CONFIG_USB_MTOUCH=m
-# CONFIG_USB_ITMTOUCH is not set
-CONFIG_USB_EGALAX=m
-# CONFIG_USB_YEALINK is not set
-CONFIG_USB_XPAD=m
-CONFIG_USB_ATI_REMOTE=m
-# 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=m
-CONFIG_USB_MICROTEK=m
-
-#
-# USB Multimedia devices
-#
-CONFIG_USB_DABUSB=m
-CONFIG_USB_VICAM=m
-CONFIG_USB_DSBR=m
-# CONFIG_USB_ET61X251 is not set
-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 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=m
-CONFIG_USB_NET_AX8817X=m
-CONFIG_USB_NET_CDCETHER=m
-CONFIG_USB_NET_GL620A=m
-CONFIG_USB_NET_NET1080=m
-CONFIG_USB_NET_PLUSB=m
-# CONFIG_USB_NET_RNDIS_HOST is not set
-# CONFIG_USB_NET_CDC_SUBSET is not set
-# CONFIG_USB_NET_ZAURUS 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_BELKIN=m
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-# CONFIG_USB_SERIAL_CP2101 is not set
-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_KEYSPAN_MPR is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QW is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19QI is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49WLC is not set
-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_HP4X is not set
-CONFIG_USB_SERIAL_SAFE=m
-# CONFIG_USB_SERIAL_SAFE_PADDED is not set
-CONFIG_USB_SERIAL_TI=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-# CONFIG_USB_SERIAL_OPTION is not set
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_EZUSB=y
-
-#
-# USB Miscellaneous drivers
-#
-CONFIG_USB_EMI62=m
-CONFIG_USB_EMI26=m
-CONFIG_USB_AUERSWALD=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_PHIDGETKIT=m
-CONFIG_USB_PHIDGETSERVO=m
-CONFIG_USB_IDMOUSE=m
-# CONFIG_USB_LD is not set
-# CONFIG_USB_TEST 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_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP 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
-
-#
-# MMC/SD Card support
-#
-CONFIG_MMC=y
-# CONFIG_MMC_DEBUG is not set
-CONFIG_MMC_BLOCK=y
-CONFIG_MMC_PXA=y
-CONFIG_MMC_UNSAFE_RESUME=y
-
-#
-# Real Time Clock
-#
-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_X1205 is not set
-# CONFIG_RTC_DRV_DS1672 is not set
-# CONFIG_RTC_DRV_PCF8563 is not set
-# CONFIG_RTC_DRV_RS5C372 is not set
-CONFIG_RTC_DRV_SA1100=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 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_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 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_SYSFS=y
-CONFIG_TMPFS=y
-# CONFIG_HUGETLB_PAGE is not set
-CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
-# CONFIG_CONFIGFS_FS is not set
-
-#
-# Miscellaneous filesystems
-#
-# CONFIG_ADFS_FS is not set
-# CONFIG_AFFS_FS is not set
-# CONFIG_HFS_FS is not set
-# CONFIG_HFSPLUS_FS is not set
-# CONFIG_BEFS_FS is not set
-# CONFIG_BFS_FS is not set
-# CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
-CONFIG_JFFS2_FS=y
-CONFIG_JFFS2_FS_DEBUG=0
-CONFIG_JFFS2_FS_WRITEBUFFER=y
-CONFIG_JFFS2_SUMMARY=y
-CONFIG_JFFS2_COMPRESSION_OPTIONS=y
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
-CONFIG_JFFS2_RUBIN=y
-# CONFIG_JFFS2_CMODE_NONE is not set
-CONFIG_JFFS2_CMODE_PRIORITY=y
-# CONFIG_JFFS2_CMODE_SIZE is not set
-CONFIG_CRAMFS=m
-CONFIG_SQUASHFS=m
-# CONFIG_SQUASHFS_EMBEDDED is not set
-CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
-# CONFIG_SQUASHFS_VMALLOC 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=y
-# 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_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
-CONFIG_SMB_FS=m
-CONFIG_SMB_NLS_DEFAULT=y
-CONFIG_SMB_NLS_REMOTE="cp437"
-CONFIG_CIFS=m
-# CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_XATTR 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=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="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
-
-#
-# 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=14
-CONFIG_DETECT_SOFTLOCKUP=y
-CONFIG_TIMER_STATS=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_PREEMPT 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_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_FS is not set
-# CONFIG_DEBUG_VM is not set
-CONFIG_FRAME_POINTER=y
-# CONFIG_FORCED_INLINING is not set
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUG_USER is not set
-# CONFIG_DEBUG_WAITQ is not set
-CONFIG_DEBUG_ERRORS=y
-# CONFIG_DEBUG_LL 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=m
-CONFIG_CRYPTO_SHA1=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-# CONFIG_CRYPTO_TGR192 is not set
-CONFIG_CRYPTO_DES=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_AES=m
-CONFIG_CRYPTO_CAST5=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_ARC4=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_DEFLATE=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_CRC32C=m
-CONFIG_CRYPTO_TEST=m
-
-#
-# Hardware crypto devices
-#
-
-#
-# Library routines
-#
-CONFIG_CRC_CCITT=m
-# CONFIG_CRC16 is not set
-CONFIG_CRC32=y
-CONFIG_LIBCRC32C=m
-CONFIG_ZLIB_INFLATE=y
-CONFIG_ZLIB_DEFLATE=y
-CONFIG_GENERIC_ALLOCATOR=y
-# CONFIG_SHARPSL_RC is not set
diff --git a/meta/packages/linux/linux-rp-2.6.22/hostap-monitor-mode.patch b/meta/packages/linux/linux-rp-2.6.22/hostap-monitor-mode.patch
deleted file mode 100644 (file)
index 641fd19..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-This is a patch that I've been maintaining for a few years, and I'd 
-really like to see it added to the mainstream zaurus kernel so I can 
-finally stop distributing my own.
-
-This patch only effects the card while in monitor mode, and does not 
-cause any known stability issues.
-
-http://patches.aircrack-ng.org/hostap-kernel-2.6.18.patch
-
-Rick Farina (Zero_Chaos)
-
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_80211_tx.c  2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_80211_tx.c    2006-09-21 01:30:18.000000000 -0400
-@@ -69,6 +69,9 @@
-       iface = netdev_priv(dev);
-       local = iface->local;
-+      if (local->iw_mode == IW_MODE_MONITOR)
-+              goto xmit;
-+
-       if (skb->len < ETH_HLEN) {
-               printk(KERN_DEBUG "%s: hostap_data_start_xmit: short skb "
-                      "(len=%d)\n", dev->name, skb->len);
-@@ -234,6 +237,7 @@
-               memcpy(skb_put(skb, ETH_ALEN), &hdr.addr4, ETH_ALEN);
-       }
-+xmit:
-       iface->stats.tx_packets++;
-       iface->stats.tx_bytes += skb->len;
-@@ -404,8 +408,6 @@
-       }
-       if (skb->len < 24) {
--              printk(KERN_DEBUG "%s: hostap_master_start_xmit: short skb "
--                     "(len=%d)\n", dev->name, skb->len);
-               ret = 0;
-               iface->stats.tx_dropped++;
-               goto fail;
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.orig
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_cs.c.rej
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_hw.c        2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_hw.c  2006-09-21 01:30:18.000000000 -0400
-@@ -1005,6 +1005,35 @@
-       return fid;
- }
-+static int prism2_monitor_enable(struct net_device *dev)
-+{
-+      if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE, 5)) {
-+              printk(KERN_DEBUG "Port type setting for monitor mode "
-+                      "failed\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      if (hfa384x_cmd(dev, HFA384X_CMDCODE_TEST | (0x0a << 8),
-+                           0, NULL, NULL)) {
-+              printk(KERN_DEBUG "Could not enter testmode 0x0a\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS,
-+                          HFA384X_WEPFLAGS_PRIVACYINVOKED |
-+                          HFA384X_WEPFLAGS_HOSTENCRYPT |
-+                          HFA384X_WEPFLAGS_HOSTDECRYPT)) {
-+              printk(KERN_DEBUG "WEP flags setting failed\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      if (hostap_set_word(dev, HFA384X_RID_PROMISCUOUSMODE, 1)) {
-+              printk(KERN_DEBUG "Could not set promiscuous mode\n");
-+              return -EOPNOTSUPP;
-+      }
-+
-+      return 0;
-+}
- static int prism2_reset_port(struct net_device *dev)
- {
-@@ -1031,6 +1060,10 @@
-                              "port\n", dev->name);
-       }
-+      if (local->iw_mode == IW_MODE_MONITOR)
-+              /* force mode 0x0a after port 0 reset */
-+              return prism2_monitor_enable(dev);
-+
-       /* It looks like at least some STA firmware versions reset
-        * fragmentation threshold back to 2346 after enable command. Restore
-        * the configured value, if it differs from this default. */
-@@ -1466,6 +1499,10 @@
-               return 1;
-       }
-+      if (local->iw_mode == IW_MODE_MONITOR)
-+              /* force mode 0x0a after port 0 reset */
-+              prism2_monitor_enable(dev);
-+
-       local->hw_ready = 1;
-       local->hw_reset_tries = 0;
-       local->hw_resetting = 0;
-@@ -3156,6 +3193,7 @@
-       local->func->hw_config = prism2_hw_config;
-       local->func->hw_reset = prism2_hw_reset;
-       local->func->hw_shutdown = prism2_hw_shutdown;
-+      local->func->monitor_enable = prism2_monitor_enable;
-       local->func->reset_port = prism2_reset_port;
-       local->func->schedule_reset = prism2_schedule_reset;
- #ifdef PRISM2_DOWNLOAD_SUPPORT
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_hw.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_ioctl.c     2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_ioctl.c       2006-09-21 01:30:18.000000000 -0400
-@@ -1104,33 +1104,7 @@
-       printk(KERN_DEBUG "Enabling monitor mode\n");
-       hostap_monitor_set_type(local);
--
--      if (hostap_set_word(dev, HFA384X_RID_CNFPORTTYPE,
--                          HFA384X_PORTTYPE_PSEUDO_IBSS)) {
--              printk(KERN_DEBUG "Port type setting for monitor mode "
--                     "failed\n");
--              return -EOPNOTSUPP;
--      }
--
--      /* Host decrypt is needed to get the IV and ICV fields;
--       * however, monitor mode seems to remove WEP flag from frame
--       * control field */
--      if (hostap_set_word(dev, HFA384X_RID_CNFWEPFLAGS,
--                          HFA384X_WEPFLAGS_HOSTENCRYPT |
--                          HFA384X_WEPFLAGS_HOSTDECRYPT)) {
--              printk(KERN_DEBUG "WEP flags setting failed\n");
--              return -EOPNOTSUPP;
--      }
--
--      if (local->func->reset_port(dev) ||
--          local->func->cmd(dev, HFA384X_CMDCODE_TEST |
--                           (HFA384X_TEST_MONITOR << 8),
--                           0, NULL, NULL)) {
--              printk(KERN_DEBUG "Setting monitor mode failed\n");
--              return -EOPNOTSUPP;
--      }
--
--      return 0;
-+      return local->func->reset_port(dev);
- }
-@@ -1199,7 +1173,7 @@
-       local->iw_mode = *mode;
-       if (local->iw_mode == IW_MODE_MONITOR)
--              hostap_monitor_mode_enable(local);
-+              return hostap_monitor_mode_enable(local);
-       else if (local->iw_mode == IW_MODE_MASTER && !local->host_encrypt &&
-                !local->fw_encrypt_ok) {
-               printk(KERN_DEBUG "%s: defaulting to host-based encryption as "
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_main.c      2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_main.c        2006-09-21 01:30:18.000000000 -0400
-@@ -331,7 +331,7 @@
-       if (local->iw_mode == IW_MODE_REPEAT)
-               return HFA384X_PORTTYPE_WDS;
-       if (local->iw_mode == IW_MODE_MONITOR)
--              return HFA384X_PORTTYPE_PSEUDO_IBSS;
-+              return 5; /*HFA384X_PORTTYPE_PSEUDO_IBSS;*/
-       return HFA384X_PORTTYPE_HOSTAP;
- }
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_main.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_pci.c       2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_pci.c 2006-09-21 01:30:18.000000000 -0400
-@@ -48,6 +48,8 @@
-       { 0x1260, 0x3873, PCI_ANY_ID, PCI_ANY_ID },
-       /* Samsung MagicLAN SWL-2210P */
-       { 0x167d, 0xa000, PCI_ANY_ID, PCI_ANY_ID },
-+      /* NETGEAR MA311 */
-+      { 0x1385, 0x3872, PCI_ANY_ID, PCI_ANY_ID },
-       { 0 }
- };
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_pci.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_plx.c       2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_plx.c 2006-09-21 01:30:18.000000000 -0400
-@@ -101,6 +101,7 @@
-       { 0xc250, 0x0002 } /* EMTAC A2424i */,
-       { 0xd601, 0x0002 } /* Z-Com XI300 */,
-       { 0xd601, 0x0005 } /* Zcomax XI-325H 200mW */,
-+      { 0xd601, 0x0010 } /* Zcomax XI-325H 100mW */,
-       { 0, 0}
- };
-Only in linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap: hostap_plx.c.orig
-diff -ur linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h
---- linux-2.6.18-gentoo/drivers/net/wireless/hostap/hostap_wlan.h      2006-09-21 01:26:27.000000000 -0400
-+++ linux-2.6.18-gentoo-rawtx/drivers/net/wireless/hostap/hostap_wlan.h        2006-09-21 01:30:18.000000000 -0400
-@@ -575,6 +575,7 @@
-       int (*hw_config)(struct net_device *dev, int initial);
-       void (*hw_reset)(struct net_device *dev);
-       void (*hw_shutdown)(struct net_device *dev, int no_disable);
-+      int (*monitor_enable)(struct net_device *dev);
-       int (*reset_port)(struct net_device *dev);
-       void (*schedule_reset)(local_info_t *local);
-       int (*download)(local_info_t *local,
diff --git a/meta/packages/linux/linux-rp-2.6.22/htcuni-acx.patch b/meta/packages/linux/linux-rp-2.6.22/htcuni-acx.patch
deleted file mode 100644 (file)
index 769674c..0000000
+++ /dev/null
@@ -1,33526 +0,0 @@
----
- drivers/net/wireless/Kconfig                |   31 
- drivers/net/wireless/Makefile               |    2 
- drivers/net/wireless/acx/Kconfig            |  113 
- drivers/net/wireless/acx/Makefile           |   21 
- drivers/net/wireless/acx/acx.h              |   14 
- drivers/net/wireless/acx/acx_config.h       |   50 
- drivers/net/wireless/acx/acx_func.h         |  710 ++
- drivers/net/wireless/acx/acx_hw.h           |   18 
- drivers/net/wireless/acx/acx_struct.h       | 2114 ++++++++
- drivers/net/wireless/acx/common.c           | 7388 ++++++++++++++++++++++++++++
- drivers/net/wireless/acx/conv.c             |  504 +
- drivers/net/wireless/acx/cs.c               | 5703 +++++++++++++++++++++
- drivers/net/wireless/acx/htcsable_acx.c     |  118 
- drivers/net/wireless/acx/htcuniversal_acx.c |  108 
- drivers/net/wireless/acx/hx4700_acx.c       |  108 
- drivers/net/wireless/acx/ioctl.c            | 2748 ++++++++++
- drivers/net/wireless/acx/mem.c              | 5363 ++++++++++++++++++++
- drivers/net/wireless/acx/pci.c              | 4234 ++++++++++++++++
- drivers/net/wireless/acx/rx3000_acx.c       |  110 
- drivers/net/wireless/acx/setrate.c          |  213 
- drivers/net/wireless/acx/usb.c              | 1922 +++++++
- drivers/net/wireless/acx/wlan.c             |  424 +
- drivers/net/wireless/acx/wlan_compat.h      |  260 
- drivers/net/wireless/acx/wlan_hdr.h         |  497 +
- drivers/net/wireless/acx/wlan_mgmt.h        |  582 ++
- 25 files changed, 33355 insertions(+)
-
-Index: linux-2.6.22/drivers/net/wireless/acx/acx_config.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/acx_config.h 2007-08-23 18:46:40.000000000 +0200
-@@ -0,0 +1,50 @@
-+#define ACX_RELEASE "v0.3.36"
-+
-+/*
-+ * Test out all the channels in reg domain 0x10
-+ */
-+#define ACX_ALLOW_ALLCHANNELS
-+
-+/* set to 0 if you don't want any debugging code to be compiled in */
-+/* set to 1 if you want some debugging */
-+/* set to 2 if you want extensive debug log */
-+#define ACX_DEBUG 0
-+
-+/*
-+ * Since we'll be changing channels a lot
-+#define ACX_DEFAULT_MSG (L_ASSOC|L_INIT)
-+*/
-+#define ACX_DEFAULT_MSG (L_ASSOC|L_INIT)
-+
-+/* assume 32bit I/O width
-+ * (16bit is also compatible with Compact Flash) */
-+#define ACX_IO_WIDTH 32
-+
-+/* Set this to 1 if you want monitor mode to use
-+ * phy header. Currently it is not useful anyway since we
-+ * don't know what useful info (if any) is in phy header.
-+ * If you want faster/smaller code, say 0 here */
-+#define WANT_PHY_HDR 0
-+
-+/* whether to do Tx descriptor cleanup in softirq (i.e. not in IRQ
-+ * handler) or not. Note that doing it later does slightly increase
-+ * system load, so still do that stuff in the IRQ handler for now,
-+ * even if that probably means worse latency */
-+#define TX_CLEANUP_IN_SOFTIRQ 0
-+
-+/* if you want very experimental 802.11 power save mode features */
-+#define POWER_SAVE_80211 0
-+
-+/* if you want very early packet fragmentation bits and pieces */
-+#define ACX_FRAGMENTATION 0
-+
-+/* Locking: */
-+/* very talkative */
-+/* #define PARANOID_LOCKING 1 */
-+/* normal (use when bug-free) */
-+#define DO_LOCKING 1
-+/* else locking is disabled! */
-+
-+/* 0 - normal mode */
-+/* 1 - development/debug: probe for IEs on modprobe */
-+#define CMD_DISCOVERY 0
-Index: linux-2.6.22/drivers/net/wireless/acx/acx_func.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/acx_func.h   2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,710 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+
-+/***********************************************************************
-+** LOGGING
-+**
-+** - Avoid SHOUTING needlessly. Avoid excessive verbosity.
-+**   Gradually remove messages which are old debugging aids.
-+**
-+** - Use printk() for messages which are to be always logged.
-+**   Supply either 'acx:' or '<devname>:' prefix so that user
-+**   can figure out who's speaking among other kernel chatter.
-+**   acx: is for general issues (e.g. "acx: no firmware image!")
-+**   while <devname>: is related to a particular device
-+**   (think about multi-card setup). Double check that message
-+**   is not confusing to the average user.
-+**
-+** - use printk KERN_xxx level only if message is not a WARNING
-+**   but is INFO, ERR etc.
-+**
-+** - Use printk_ratelimited() for messages which may flood
-+**   (e.g. "rx DUP pkt!").
-+**
-+** - Use log() for messages which may be omitted (and they
-+**   _will_ be omitted in non-debug builds). Note that
-+**   message levels may be disabled at compile-time selectively,
-+**   thus select them wisely. Example: L_DEBUG is the lowest
-+**   (most likely to be compiled out) -> use for less important stuff.
-+**
-+** - Do not print important stuff with log(), or else people
-+**   will never build non-debug driver.
-+**
-+** Style:
-+** hex: capital letters, zero filled (e.g. 0x02AC)
-+** str: dont start from capitals, no trailing periods ("tx: queue is stopped")
-+*/
-+#if ACX_DEBUG > 1
-+
-+void log_fn_enter(const char *funcname);
-+void log_fn_exit(const char *funcname);
-+void log_fn_exit_v(const char *funcname, int v);
-+
-+#define FN_ENTER \
-+      do { \
-+              if (unlikely(acx_debug & L_FUNC)) { \
-+                      log_fn_enter(__func__); \
-+              } \
-+      } while (0)
-+
-+#define FN_EXIT1(v) \
-+      do { \
-+              if (unlikely(acx_debug & L_FUNC)) { \
-+                      log_fn_exit_v(__func__, v); \
-+              } \
-+      } while (0)
-+#define FN_EXIT0 \
-+      do { \
-+              if (unlikely(acx_debug & L_FUNC)) { \
-+                      log_fn_exit(__func__); \
-+              } \
-+      } while (0)
-+
-+#else
-+
-+#define FN_ENTER
-+#define FN_EXIT1(v)
-+#define FN_EXIT0
-+
-+#endif /* ACX_DEBUG > 1 */
-+
-+
-+#if ACX_DEBUG
-+
-+#define log(chan, args...) \
-+      do { \
-+              if (acx_debug & (chan)) \
-+                      printk(KERN_DEBUG args); \
-+      } while (0)
-+#define printk_ratelimited(args...) printk(args)
-+
-+#else /* Non-debug build: */
-+
-+#define log(chan, args...)
-+/* Standard way of log flood prevention */
-+#define printk_ratelimited(args...) \
-+do { \
-+      if (printk_ratelimit()) \
-+              printk(args); \
-+} while (0)
-+
-+#endif /* ACX_DEBUG */
-+
-+void acx_print_mac(const char *head, const u8 *mac, const char *tail);
-+
-+/* Optimized out to nothing in non-debug build */
-+static inline void
-+acxlog_mac(int level, const char *head, const u8 *mac, const char *tail)
-+{
-+      if (acx_debug & level) {
-+              acx_print_mac(head, mac, tail);
-+      }
-+}
-+
-+
-+/***********************************************************************
-+** MAC address helpers
-+*/
-+static inline void
-+MAC_COPY(u8 *mac, const u8 *src)
-+{
-+      *(u32*)mac = *(u32*)src;
-+      ((u16*)mac)[2] = ((u16*)src)[2];
-+      /* kernel's memcpy will do the same: memcpy(dst, src, ETH_ALEN); */
-+}
-+
-+static inline void
-+MAC_FILL(u8 *mac, u8 val)
-+{
-+      memset(mac, val, ETH_ALEN);
-+}
-+
-+static inline void
-+MAC_BCAST(u8 *mac)
-+{
-+      ((u16*)mac)[2] = *(u32*)mac = -1;
-+}
-+
-+static inline void
-+MAC_ZERO(u8 *mac)
-+{
-+      ((u16*)mac)[2] = *(u32*)mac = 0;
-+}
-+
-+static inline int
-+mac_is_equal(const u8 *a, const u8 *b)
-+{
-+      /* can't beat this */
-+      return memcmp(a, b, ETH_ALEN) == 0;
-+}
-+
-+static inline int
-+mac_is_bcast(const u8 *mac)
-+{
-+      /* AND together 4 first bytes with sign-extended 2 last bytes
-+      ** Only bcast address gives 0xffffffff. +1 gives 0 */
-+      return ( *(s32*)mac & ((s16*)mac)[2] ) + 1 == 0;
-+}
-+
-+static inline int
-+mac_is_zero(const u8 *mac)
-+{
-+      return ( *(u32*)mac | ((u16*)mac)[2] ) == 0;
-+}
-+
-+static inline int
-+mac_is_directed(const u8 *mac)
-+{
-+      return (mac[0] & 1)==0;
-+}
-+
-+static inline int
-+mac_is_mcast(const u8 *mac)
-+{
-+      return (mac[0] & 1) && !mac_is_bcast(mac);
-+}
-+
-+#define MACSTR "%02X:%02X:%02X:%02X:%02X:%02X"
-+#define MAC(bytevector) \
-+      ((unsigned char *)bytevector)[0], \
-+      ((unsigned char *)bytevector)[1], \
-+      ((unsigned char *)bytevector)[2], \
-+      ((unsigned char *)bytevector)[3], \
-+      ((unsigned char *)bytevector)[4], \
-+      ((unsigned char *)bytevector)[5]
-+
-+
-+/***********************************************************************
-+** Random helpers
-+*/
-+#define TO_STRING(x)  #x
-+#define STRING(x)     TO_STRING(x)
-+
-+#define CLEAR_BIT(val, mask) ((val) &= ~(mask))
-+#define SET_BIT(val, mask) ((val) |= (mask))
-+
-+/* undefined if v==0 */
-+static inline unsigned int
-+lowest_bit(u16 v)
-+{
-+      unsigned int n = 0;
-+      while (!(v & 0xf)) { v>>=4; n+=4; }
-+      while (!(v & 1)) { v>>=1; n++; }
-+      return n;
-+}
-+
-+/* undefined if v==0 */
-+static inline unsigned int
-+highest_bit(u16 v)
-+{
-+      unsigned int n = 0;
-+      while (v>0xf) { v>>=4; n+=4; }
-+      while (v>1) { v>>=1; n++; }
-+      return n;
-+}
-+
-+/* undefined if v==0 */
-+static inline int
-+has_only_one_bit(u16 v)
-+{
-+      return ((v-1) ^ v) >= v;
-+}
-+
-+
-+static inline int
-+is_hidden_essid(char *essid)
-+{
-+      return (('\0' == essid[0]) ||
-+              ((' ' == essid[0]) && ('\0' == essid[1])));
-+}
-+
-+/***********************************************************************
-+** LOCKING
-+** We have adev->sem and adev->lock.
-+**
-+** We employ following naming convention in order to get locking right:
-+**
-+** acx_e_xxxx - external entry points called from process context.
-+**    It is okay to sleep. adev->sem is to be taken on entry.
-+** acx_i_xxxx - external entry points possibly called from atomic context.
-+**    Sleeping is not allowed (and thus down(sem) is not legal!)
-+** acx_s_xxxx - potentially sleeping functions. Do not ever call under lock!
-+** acx_l_xxxx - functions which expect lock to be already taken.
-+** rest       - non-sleeping functions which do not require locking
-+**            but may be run under lock
-+**
-+** A small number of local helpers do not have acx_[eisl]_ prefix.
-+** They are always close to caller and are to be reviewed locally.
-+**
-+** Theory of operation:
-+**
-+** All process-context entry points (_e_ functions) take sem
-+** immediately. IRQ handler and other 'atomic-context' entry points
-+** (_i_ functions) take lock immediately on entry, but dont take sem
-+** because that might sleep.
-+**
-+** Thus *all* code is either protected by sem or lock, or both.
-+**
-+** Code which must not run concurrently with IRQ takes lock.
-+** Such code is marked with _l_.
-+**
-+** This results in the following rules of thumb useful in code review:
-+**
-+** + If a function calls _s_ fn, it must be an _s_ itself.
-+** + You can call _l_ fn only (a) from another _l_ fn
-+**   or (b) from _s_, _e_ or _i_ fn by taking lock, calling _l_,
-+**   and dropping lock.
-+** + All IRQ code runs under lock.
-+** + Any _s_ fn is running under sem.
-+** + Code under sem can race only with IRQ code.
-+** + Code under sem+lock cannot race with anything.
-+*/
-+
-+/* These functions *must* be inline or they will break horribly on SPARC, due
-+ * to its weird semantics for save/restore flags */
-+
-+#if defined(PARANOID_LOCKING) /* Lock debugging */
-+
-+void acx_lock_debug(acx_device_t *adev, const char* where);
-+void acx_unlock_debug(acx_device_t *adev, const char* where);
-+void acx_down_debug(acx_device_t *adev, const char* where);
-+void acx_up_debug(acx_device_t *adev, const char* where);
-+void acx_lock_unhold(void);
-+void acx_sem_unhold(void);
-+
-+static inline void
-+acx_lock_helper(acx_device_t *adev, unsigned long *fp, const char* where)
-+{
-+      acx_lock_debug(adev, where);
-+      spin_lock_irqsave(&adev->lock, *fp);
-+}
-+static inline void
-+acx_unlock_helper(acx_device_t *adev, unsigned long *fp, const char* where)
-+{
-+      acx_unlock_debug(adev, where);
-+      spin_unlock_irqrestore(&adev->lock, *fp);
-+}
-+static inline void
-+acx_down_helper(acx_device_t *adev, const char* where)
-+{
-+      acx_down_debug(adev, where);
-+}
-+static inline void
-+acx_up_helper(acx_device_t *adev, const char* where)
-+{
-+      acx_up_debug(adev, where);
-+}
-+#define acx_lock(adev, flags) acx_lock_helper(adev, &(flags), __FILE__ ":" STRING(__LINE__))
-+#define acx_unlock(adev, flags)       acx_unlock_helper(adev, &(flags), __FILE__ ":" STRING(__LINE__))
-+#define acx_sem_lock(adev)    acx_down_helper(adev, __FILE__ ":" STRING(__LINE__))
-+#define acx_sem_unlock(adev)  acx_up_helper(adev, __FILE__ ":" STRING(__LINE__))
-+
-+#elif defined(DO_LOCKING)
-+
-+#define acx_lock(adev, flags) spin_lock_irqsave(&adev->lock, flags)
-+#define acx_unlock(adev, flags)       spin_unlock_irqrestore(&adev->lock, flags)
-+#define acx_sem_lock(adev)    down(&adev->sem)
-+#define acx_sem_unlock(adev)  up(&adev->sem)
-+#define acx_lock_unhold()     ((void)0)
-+#define acx_sem_unhold()      ((void)0)
-+
-+#else /* no locking! :( */
-+
-+#define acx_lock(adev, flags) ((void)0)
-+#define acx_unlock(adev, flags)       ((void)0)
-+#define acx_sem_lock(adev)    ((void)0)
-+#define acx_sem_unlock(adev)  ((void)0)
-+#define acx_lock_unhold()     ((void)0)
-+#define acx_sem_unhold()      ((void)0)
-+
-+#endif
-+
-+
-+/***********************************************************************
-+*/
-+
-+/* Can race with rx path (which is not protected by sem):
-+** rx -> process_[re]assocresp() -> set_status(ASSOCIATED) -> wake_queue()
-+** Can race with tx_complete IRQ:
-+** IRQ -> acxpci_l_clean_txdesc -> acx_wake_queue
-+** Review carefully all callsites */
-+static inline void
-+acx_stop_queue(struct net_device *ndev, const char *msg)
-+{
-+      if (netif_queue_stopped(ndev))
-+              return;
-+
-+      netif_stop_queue(ndev);
-+      if (msg)
-+              log(L_BUFT, "tx: stop queue %s\n", msg);
-+}
-+
-+static inline int
-+acx_queue_stopped(struct net_device *ndev)
-+{
-+      return netif_queue_stopped(ndev);
-+}
-+
-+/*
-+static inline void
-+acx_start_queue(struct net_device *ndev, const char *msg)
-+{
-+      netif_start_queue(ndev);
-+      if (msg)
-+              log(L_BUFT, "tx: start queue %s\n", msg);
-+}
-+*/
-+
-+static inline void
-+acx_wake_queue(struct net_device *ndev, const char *msg)
-+{
-+      netif_wake_queue(ndev);
-+      if (msg)
-+              log(L_BUFT, "tx: wake queue %s\n", msg);
-+}
-+
-+static inline void
-+acx_carrier_off(struct net_device *ndev, const char *msg)
-+{
-+      netif_carrier_off(ndev);
-+      if (msg)
-+              log(L_BUFT, "tx: carrier off %s\n", msg);
-+}
-+
-+static inline void
-+acx_carrier_on(struct net_device *ndev, const char *msg)
-+{
-+      netif_carrier_on(ndev);
-+      if (msg)
-+              log(L_BUFT, "tx: carrier on %s\n", msg);
-+}
-+
-+/* This function does not need locking UNLESS you call it
-+** as acx_set_status(ACX_STATUS_4_ASSOCIATED), bacause this can
-+** wake queue. This can race with stop_queue elsewhere. */
-+void acx_set_status(acx_device_t *adev, u16 status);
-+
-+
-+/***********************************************************************
-+** Communication with firmware
-+*/
-+#define CMD_TIMEOUT_MS(n)     (n)
-+#define ACX_CMD_TIMEOUT_DEFAULT       CMD_TIMEOUT_MS(50)
-+
-+#if ACX_DEBUG
-+
-+/* We want to log cmd names */
-+int acxpci_s_issue_cmd_timeo_debug(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout, const char* cmdstr);
-+int acxmem_s_issue_cmd_timeo_debug(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout, const char* cmdstr);
-+int acxusb_s_issue_cmd_timeo_debug(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout, const char* cmdstr);
-+static inline int
-+acx_s_issue_cmd_timeo_debug(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout, const char* cmdstr)
-+{
-+        if (IS_MEM(adev))
-+                return acxmem_s_issue_cmd_timeo_debug(adev, cmd, param, len, timeout, cmdstr);
-+      if (IS_PCI(adev))
-+              return acxpci_s_issue_cmd_timeo_debug(adev, cmd, param, len, timeout, cmdstr);
-+      return acxusb_s_issue_cmd_timeo_debug(adev, cmd, param, len, timeout, cmdstr);
-+}
-+#define acx_s_issue_cmd(adev,cmd,param,len) \
-+      acx_s_issue_cmd_timeo_debug(adev,cmd,param,len,ACX_CMD_TIMEOUT_DEFAULT,#cmd)
-+#define acx_s_issue_cmd_timeo(adev,cmd,param,len,timeo) \
-+      acx_s_issue_cmd_timeo_debug(adev,cmd,param,len,timeo,#cmd)
-+int acx_s_configure_debug(acx_device_t *adev, void *pdr, int type, const char* str);
-+#define acx_s_configure(adev,pdr,type) \
-+      acx_s_configure_debug(adev,pdr,type,#type)
-+int acx_s_interrogate_debug(acx_device_t *adev, void *pdr, int type, const char* str);
-+#define acx_s_interrogate(adev,pdr,type) \
-+      acx_s_interrogate_debug(adev,pdr,type,#type)
-+
-+#else
-+
-+int acxpci_s_issue_cmd_timeo(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout);
-+int acxmem_s_issue_cmd_timeo(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout);
-+int acxusb_s_issue_cmd_timeo(acx_device_t *adev, unsigned cmd, void *param, unsigned len, unsigned timeout);
-+static inline int
-+acx_s_issue_cmd_timeo(acx_device_t *adev, unsigned cmd,       void *param, unsigned len, unsigned timeout)
-+{
-+      if (IS_MEM(adev))
-+              return acxmem_s_issue_cmd_timeo(adev, cmd, param, len, timeout);
-+      if (IS_PCI(adev))
-+              return acxpci_s_issue_cmd_timeo(adev, cmd, param, len, timeout);
-+      return acxusb_s_issue_cmd_timeo(adev, cmd, param, len, timeout);
-+}
-+static inline int
-+acx_s_issue_cmd(acx_device_t *adev, unsigned cmd, void *param, unsigned len)
-+{
-+      if (IS_MEM(adev))
-+              return acxmem_s_issue_cmd_timeo(adev, cmd, param, len, ACX_CMD_TIMEOUT_DEFAULT);
-+      if (IS_PCI(adev))
-+              return acxpci_s_issue_cmd_timeo(adev, cmd, param, len, ACX_CMD_TIMEOUT_DEFAULT);
-+      return acxusb_s_issue_cmd_timeo(adev, cmd, param, len, ACX_CMD_TIMEOUT_DEFAULT);
-+}
-+int acx_s_configure(acx_device_t *adev, void *pdr, int type);
-+int acx_s_interrogate(acx_device_t *adev, void *pdr, int type);
-+
-+#endif
-+
-+void acx_s_cmd_start_scan(acx_device_t *adev);
-+
-+
-+/***********************************************************************
-+** Ioctls
-+*/
-+int
-+acx111pci_ioctl_info(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra);
-+int
-+acx100pci_ioctl_set_phy_amp_bias(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra);
-+int
-+acx100mem_ioctl_set_phy_amp_bias(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra);
-+
-+
-+/***********************************************************************
-+** /proc
-+*/
-+#ifdef CONFIG_PROC_FS
-+int acx_proc_register_entries(const struct net_device *ndev);
-+int acx_proc_unregister_entries(const struct net_device *ndev);
-+#else
-+static inline int
-+acx_proc_register_entries(const struct net_device *ndev) { return OK; }
-+static inline int
-+acx_proc_unregister_entries(const struct net_device *ndev) { return OK; }
-+#endif
-+
-+
-+/***********************************************************************
-+*/
-+firmware_image_t *acx_s_read_fw(struct device *dev, const char *file, u32 *size);
-+int acxpci_s_upload_radio(acx_device_t *adev);
-+int acxmem_s_upload_radio(acx_device_t *adev);
-+
-+
-+/***********************************************************************
-+** Unsorted yet :)
-+*/
-+int acxpci_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf);
-+int acxmem_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf);
-+int acxusb_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf);
-+static inline int
-+acx_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf)
-+{
-+      if (IS_MEM(adev))
-+              return acxmem_s_read_phy_reg(adev, reg, charbuf);
-+      if (IS_PCI(adev))
-+              return acxpci_s_read_phy_reg(adev, reg, charbuf);
-+      return acxusb_s_read_phy_reg(adev, reg, charbuf);
-+}
-+
-+int acxpci_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value);
-+int acxmem_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value);
-+int acxusb_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value);
-+static inline int
-+acx_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value)
-+{
-+      if (IS_MEM(adev))
-+              return acxmem_s_write_phy_reg(adev, reg, value);
-+      if (IS_PCI(adev))
-+              return acxpci_s_write_phy_reg(adev, reg, value);
-+      return acxusb_s_write_phy_reg(adev, reg, value);
-+}
-+
-+tx_t* acxpci_l_alloc_tx(acx_device_t *adev);
-+tx_t* acxmem_l_alloc_tx(acx_device_t *adev);
-+tx_t* acxusb_l_alloc_tx(acx_device_t *adev);
-+static inline tx_t*
-+acx_l_alloc_tx(acx_device_t *adev)
-+{
-+      if (IS_MEM(adev))
-+              return acxmem_l_alloc_tx(adev);
-+      if (IS_PCI(adev))
-+              return acxpci_l_alloc_tx(adev);
-+      return acxusb_l_alloc_tx(adev);
-+}
-+
-+void acxusb_l_dealloc_tx(tx_t *tx_opaque);
-+void acxmem_l_dealloc_tx(acx_device_t *adev, tx_t *tx_opaque);
-+static inline void
-+acx_l_dealloc_tx(acx_device_t *adev, tx_t *tx_opaque)
-+{
-+#ifdef ACX_MEM
-+  acxmem_l_dealloc_tx (adev, tx_opaque);
-+#else
-+      if (IS_USB(adev))
-+              acxusb_l_dealloc_tx(tx_opaque);
-+#endif
-+}
-+
-+void* acxpci_l_get_txbuf(acx_device_t *adev, tx_t *tx_opaque);
-+void* acxmem_l_get_txbuf(acx_device_t *adev, tx_t *tx_opaque);
-+void* acxusb_l_get_txbuf(acx_device_t *adev, tx_t *tx_opaque);
-+static inline void*
-+acx_l_get_txbuf(acx_device_t *adev, tx_t *tx_opaque)
-+{
-+#if defined (ACX_MEM)
-+              return acxmem_l_get_txbuf(adev, tx_opaque);
-+#else
-+      if (IS_PCI(adev))
-+              return acxpci_l_get_txbuf(adev, tx_opaque);
-+      return acxusb_l_get_txbuf(adev, tx_opaque);
-+#endif
-+}
-+
-+void acxpci_l_tx_data(acx_device_t *adev, tx_t *tx_opaque, int len);
-+void acxmem_l_tx_data(acx_device_t *adev, tx_t *tx_opaque, int len);
-+void acxusb_l_tx_data(acx_device_t *adev, tx_t *tx_opaque, int len);
-+static inline void
-+acx_l_tx_data(acx_device_t *adev, tx_t *tx_opaque, int len)
-+{
-+#if defined (ACX_MEM)
-+              acxmem_l_tx_data(adev, tx_opaque, len);
-+#else
-+      if (IS_PCI(adev))
-+              acxpci_l_tx_data(adev, tx_opaque, len);
-+      else
-+              acxusb_l_tx_data(adev, tx_opaque, len);
-+#endif
-+}
-+
-+static inline wlan_hdr_t*
-+acx_get_wlan_hdr(acx_device_t *adev, const rxbuffer_t *rxbuf)
-+{
-+      return (wlan_hdr_t*)((u8*)&rxbuf->hdr_a3 + adev->phy_header_len);
-+}
-+
-+void acxpci_l_power_led(acx_device_t *adev, int enable);
-+int acxpci_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf);
-+unsigned int acxpci_l_clean_txdesc(acx_device_t *adev);
-+void acxpci_l_clean_txdesc_emergency(acx_device_t *adev);
-+int acxpci_s_create_hostdesc_queues(acx_device_t *adev);
-+void acxpci_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start);
-+void acxpci_free_desc_queues(acx_device_t *adev);
-+char* acxpci_s_proc_diag_output(char *p, acx_device_t *adev);
-+int acxpci_proc_eeprom_output(char *p, acx_device_t *adev);
-+void acxpci_set_interrupt_mask(acx_device_t *adev);
-+int acx100pci_s_set_tx_level(acx_device_t *adev, u8 level_dbm);
-+
-+void acxmem_l_power_led(acx_device_t *adev, int enable);
-+int acxmem_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf);
-+unsigned int acxmem_l_clean_txdesc(acx_device_t *adev);
-+void acxmem_l_clean_txdesc_emergency(acx_device_t *adev);
-+int acxmem_s_create_hostdesc_queues(acx_device_t *adev);
-+void acxmem_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start);
-+void acxmem_free_desc_queues(acx_device_t *adev);
-+char* acxmem_s_proc_diag_output(char *p, acx_device_t *adev);
-+int acxmem_proc_eeprom_output(char *p, acx_device_t *adev);
-+void acxmem_set_interrupt_mask(acx_device_t *adev);
-+int acx100mem_s_set_tx_level(acx_device_t *adev, u8 level_dbm);
-+
-+void acx_s_msleep(int ms);
-+int acx_s_init_mac(acx_device_t *adev);
-+void acx_set_reg_domain(acx_device_t *adev, unsigned char reg_dom_id);
-+void acx_set_timer(acx_device_t *adev, int timeout_us);
-+void acx_update_capabilities(acx_device_t *adev);
-+void acx_s_start(acx_device_t *adev);
-+
-+void acx_s_update_card_settings(acx_device_t *adev);
-+void acx_s_parse_configoption(acx_device_t *adev, const acx111_ie_configoption_t *pcfg);
-+void acx_l_update_ratevector(acx_device_t *adev);
-+
-+void acx_init_task_scheduler(acx_device_t *adev);
-+void acx_schedule_task(acx_device_t *adev, unsigned int set_flag);
-+
-+int acx_e_ioctl_old(struct net_device *ndev, struct ifreq *ifr, int cmd);
-+
-+client_t *acx_l_sta_list_get(acx_device_t *adev, const u8 *address);
-+void acx_l_sta_list_del(acx_device_t *adev, client_t *clt);
-+
-+int acx_l_transmit_disassoc(acx_device_t *adev, client_t *clt);
-+void acx_i_timer(unsigned long a);
-+int acx_s_complete_scan(acx_device_t *adev);
-+
-+struct sk_buff *acx_rxbuf_to_ether(acx_device_t *adev, rxbuffer_t *rxbuf);
-+int acx_ether_to_txbuf(acx_device_t *adev, void *txbuf, const struct sk_buff *skb);
-+
-+u8 acx_signal_determine_quality(u8 signal, u8 noise);
-+
-+void acx_l_process_rxbuf(acx_device_t *adev, rxbuffer_t *rxbuf);
-+void acx_l_handle_txrate_auto(acx_device_t *adev, struct client *txc,
-+                      u16 intended_rate, u8 rate100, u16 rate111, u8 error,
-+                      int pkts_to_ignore);
-+
-+void acx_dump_bytes(const void *, int);
-+void acx_log_bad_eid(wlan_hdr_t* hdr, int len, wlan_ie_t* ie_ptr);
-+
-+u8 acx_rate111to100(u16);
-+
-+void acx_s_set_defaults(acx_device_t *adev);
-+
-+#if !ACX_DEBUG
-+static inline const char* acx_get_packet_type_string(u16 fc) { return ""; }
-+#else
-+const char* acx_get_packet_type_string(u16 fc);
-+#endif
-+const char* acx_cmd_status_str(unsigned int state);
-+
-+int acx_i_start_xmit(struct sk_buff *skb, struct net_device *ndev);
-+
-+void great_inquisitor(acx_device_t *adev);
-+
-+void acx_s_get_firmware_version(acx_device_t *adev);
-+void acx_display_hardware_details(acx_device_t *adev);
-+
-+int acx_e_change_mtu(struct net_device *ndev, int mtu);
-+struct net_device_stats* acx_e_get_stats(struct net_device *ndev);
-+struct iw_statistics* acx_e_get_wireless_stats(struct net_device *ndev);
-+
-+#ifdef ACX_MEM
-+int __init acxmem_e_init_module(void);
-+void __exit acxmem_e_cleanup_module(void);
-+void acxmem_e_release(struct device *dev);
-+#else
-+int __init acxpci_e_init_module(void);
-+int __init acxusb_e_init_module(void);
-+void __exit acxpci_e_cleanup_module(void);
-+void __exit acxusb_e_cleanup_module(void);
-+#endif
-+int __init acx_cs_init(void);
-+void __exit acx_cs_cleanup(void);
-Index: linux-2.6.22/drivers/net/wireless/acx/acx.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/acx.h        2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,14 @@
-+#if defined(CONFIG_ACX_MEM) && !defined(ACX_MEM)
-+#define ACX_MEM
-+#endif
-+
-+#if defined(CONFIG_ACX_CS) && !defined(ACX_MEM)
-+#define ACX_MEM
-+#endif
-+
-+#include "acx_config.h"
-+#include "wlan_compat.h"
-+#include "wlan_hdr.h"
-+#include "wlan_mgmt.h"
-+#include "acx_struct.h"
-+#include "acx_func.h"
-Index: linux-2.6.22/drivers/net/wireless/acx/acx_hw.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/acx_hw.h     2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,18 @@
-+/*
-+ * Interface for ACX slave memory driver
-+ *
-+ * Copyright (c) 2006 SDG Systems, LLC
-+ *
-+ * GPL
-+ *
-+ */
-+
-+#ifndef _ACX_HW_H
-+#define _ACX_HW_H
-+
-+struct acx_hardware_data {
-+      int (*start_hw)( void );
-+      int (*stop_hw)( void );
-+};
-+
-+#endif /* _ACX_HW_H */
-Index: linux-2.6.22/drivers/net/wireless/acx/acx_struct.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/acx_struct.h 2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,2114 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+/***********************************************************************
-+** Forward declarations of types
-+*/
-+typedef struct tx tx_t;
-+typedef struct acx_device acx_device_t;
-+typedef struct client client_t;
-+typedef struct rxdesc rxdesc_t;
-+typedef struct txdesc txdesc_t;
-+typedef struct rxhostdesc rxhostdesc_t;
-+typedef struct txhostdesc txhostdesc_t;
-+
-+
-+/***********************************************************************
-+** Debug / log functionality
-+*/
-+enum {
-+      L_LOCK          = (ACX_DEBUG>1)*0x0001, /* locking debug log */
-+      L_INIT          = (ACX_DEBUG>0)*0x0002, /* special card initialization logging */
-+      L_IRQ           = (ACX_DEBUG>0)*0x0004, /* interrupt stuff */
-+      L_ASSOC         = (ACX_DEBUG>0)*0x0008, /* assocation (network join) and station log */
-+      L_FUNC          = (ACX_DEBUG>1)*0x0020, /* logging of function enter / leave */
-+      L_XFER          = (ACX_DEBUG>1)*0x0080, /* logging of transfers and mgmt */
-+      L_DATA          = (ACX_DEBUG>1)*0x0100, /* logging of transfer data */
-+      L_DEBUG         = (ACX_DEBUG>1)*0x0200, /* log of debug info */
-+      L_IOCTL         = (ACX_DEBUG>0)*0x0400, /* log ioctl calls */
-+      L_CTL           = (ACX_DEBUG>1)*0x0800, /* log of low-level ctl commands */
-+      L_BUFR          = (ACX_DEBUG>1)*0x1000, /* debug rx buffer mgmt (ring buffer etc.) */
-+      L_XFER_BEACON   = (ACX_DEBUG>1)*0x2000, /* also log beacon packets */
-+      L_BUFT          = (ACX_DEBUG>1)*0x4000, /* debug tx buffer mgmt (ring buffer etc.) */
-+      L_USBRXTX       = (ACX_DEBUG>0)*0x8000, /* debug USB rx/tx operations */
-+      L_BUF           = L_BUFR + L_BUFT,
-+      L_ANY           = 0xffff
-+};
-+
-+#if ACX_DEBUG
-+extern unsigned int acx_debug;
-+#else
-+enum { acx_debug = 0 };
-+#endif
-+
-+
-+/***********************************************************************
-+** Random helpers
-+*/
-+#define ACX_PACKED __attribute__ ((packed))
-+
-+#define VEC_SIZE(a) (sizeof(a)/sizeof(a[0]))
-+
-+/* Use worker_queues for 2.5/2.6 kernels and queue tasks for 2.4 kernels
-+   (used for the 'bottom half' of the interrupt routine) */
-+
-+#include <linux/workqueue.h>
-+#define USE_WORKER_TASKS
-+#define WORK_STRUCT struct work_struct
-+#define SCHEDULE_WORK schedule_work
-+#define FLUSH_SCHEDULED_WORK flush_scheduled_work
-+
-+
-+/***********************************************************************
-+** Constants
-+*/
-+#define OK    0
-+#define NOT_OK        1
-+
-+/* The supported chip models */
-+#define CHIPTYPE_ACX100               1
-+#define CHIPTYPE_ACX111               2
-+
-+#define IS_ACX100(adev)       ((adev)->chip_type == CHIPTYPE_ACX100)
-+#define IS_ACX111(adev)       ((adev)->chip_type == CHIPTYPE_ACX111)
-+
-+/* Supported interfaces */
-+#define DEVTYPE_PCI           0
-+#define DEVTYPE_USB           1
-+#define DEVTYPE_MEM             2
-+
-+#if !defined(CONFIG_ACX_PCI) && !defined(CONFIG_ACX_USB) && !defined(CONFIG_ACX_MEM) && !defined(CONFIG_ACX_CS)
-+#error Driver must include PCI, USB, PCMCIA or memory mapped interface support. You selected none of them.
-+#endif
-+
-+#if defined(CONFIG_ACX_PCI)
-+ #if !defined(CONFIG_ACX_USB)
-+  #define IS_PCI(adev)        1
-+ #else
-+  #define IS_PCI(adev)        ((adev)->dev_type == DEVTYPE_PCI)
-+ #endif
-+#else
-+ #define IS_PCI(adev) 0
-+#endif
-+
-+#if defined(CONFIG_ACX_USB)
-+ #if !defined(CONFIG_ACX_PCI)
-+  #define IS_USB(adev)        1
-+ #else
-+  #define IS_USB(adev)        ((adev)->dev_type == DEVTYPE_USB)
-+ #endif
-+#else
-+ #define IS_USB(adev) 0
-+#endif
-+
-+#if defined(CONFIG_ACX_MEM) || defined(CONFIG_ACX_CS)
-+ #define IS_MEM(adev)  1
-+#else
-+ #define IS_MEM(adev)   0
-+#endif
-+
-+/* Driver defaults */
-+#define DEFAULT_DTIM_INTERVAL 10
-+/* used to be 2048, but FreeBSD driver changed it to 4096 to work properly
-+** in noisy wlans */
-+#define DEFAULT_MSDU_LIFETIME 4096
-+#define DEFAULT_RTS_THRESHOLD 2312    /* max. size: disable RTS mechanism */
-+#define DEFAULT_BEACON_INTERVAL       100
-+
-+#define ACX100_BAP_DATALEN_MAX                4096
-+#define ACX100_RID_GUESSING_MAXLEN    2048    /* I'm not really sure */
-+#define ACX100_RIDDATA_MAXLEN         ACX100_RID_GUESSING_MAXLEN
-+
-+/* Support Constants */
-+/* Radio type names, found in Win98 driver's TIACXLN.INF */
-+#define RADIO_MAXIM_0D                0x0d
-+#define RADIO_RFMD_11         0x11
-+#define RADIO_RALINK_15               0x15
-+/* used in ACX111 cards (WG311v2, WL-121, ...): */
-+#define RADIO_RADIA_16                0x16
-+/* most likely *sometimes* used in ACX111 cards: */
-+#define RADIO_UNKNOWN_17      0x17
-+/* FwRad19.bin was found in a Safecom driver; must be an ACX111 radio: */
-+#define RADIO_UNKNOWN_19      0x19
-+#define RADIO_UNKNOWN_1B      0x1b    /* radio in SafeCom SWLUT-54125 USB adapter; entirely unknown!! */
-+
-+/* Controller Commands */
-+/* can be found in table cmdTable in firmware "Rev. 1.5.0" (FW150) */
-+#define ACX1xx_CMD_RESET              0x00
-+#define ACX1xx_CMD_INTERROGATE                0x01
-+#define ACX1xx_CMD_CONFIGURE          0x02
-+#define ACX1xx_CMD_ENABLE_RX          0x03
-+#define ACX1xx_CMD_ENABLE_TX          0x04
-+#define ACX1xx_CMD_DISABLE_RX         0x05
-+#define ACX1xx_CMD_DISABLE_TX         0x06
-+#define ACX1xx_CMD_FLUSH_QUEUE                0x07
-+#define ACX1xx_CMD_SCAN                       0x08
-+#define ACX1xx_CMD_STOP_SCAN          0x09
-+#define ACX1xx_CMD_CONFIG_TIM         0x0a
-+#define ACX1xx_CMD_JOIN                       0x0b
-+#define ACX1xx_CMD_WEP_MGMT           0x0c
-+#ifdef OLD_FIRMWARE_VERSIONS
-+#define ACX100_CMD_HALT                       0x0e    /* mapped to unknownCMD in FW150 */
-+#else
-+#define ACX1xx_CMD_MEM_READ           0x0d
-+#define ACX1xx_CMD_MEM_WRITE          0x0e
-+#endif
-+#define ACX1xx_CMD_SLEEP              0x0f
-+#define ACX1xx_CMD_WAKE                       0x10
-+#define ACX1xx_CMD_UNKNOWN_11         0x11    /* mapped to unknownCMD in FW150 */
-+#define ACX100_CMD_INIT_MEMORY                0x12
-+#define ACX1FF_CMD_DISABLE_RADIO      0x12    /* new firmware? TNETW1450? */
-+#define ACX1xx_CMD_CONFIG_BEACON      0x13
-+#define ACX1xx_CMD_CONFIG_PROBE_RESPONSE      0x14
-+#define ACX1xx_CMD_CONFIG_NULL_DATA   0x15
-+#define ACX1xx_CMD_CONFIG_PROBE_REQUEST       0x16
-+#define ACX1xx_CMD_FCC_TEST           0x17
-+#define ACX1xx_CMD_RADIOINIT          0x18
-+#define ACX111_CMD_RADIOCALIB         0x19
-+#define ACX1FF_CMD_NOISE_HISTOGRAM    0x1c /* new firmware? TNETW1450? */
-+#define ACX1FF_CMD_RX_RESET           0x1d /* new firmware? TNETW1450? */
-+#define ACX1FF_CMD_LNA_CONTROL                0x20 /* new firmware? TNETW1450? */
-+#define ACX1FF_CMD_CONTROL_DBG_TRACE  0x21 /* new firmware? TNETW1450? */
-+
-+/* 'After Interrupt' Commands */
-+#define ACX_AFTER_IRQ_CMD_STOP_SCAN   0x01
-+#define ACX_AFTER_IRQ_CMD_ASSOCIATE   0x02
-+#define ACX_AFTER_IRQ_CMD_RADIO_RECALIB       0x04
-+#define ACX_AFTER_IRQ_UPDATE_CARD_CFG 0x08
-+#define ACX_AFTER_IRQ_TX_CLEANUP      0x10
-+#define ACX_AFTER_IRQ_COMPLETE_SCAN   0x20
-+#define ACX_AFTER_IRQ_RESTART_SCAN    0x40
-+
-+/***********************************************************************
-+** Tx/Rx buffer sizes and watermarks
-+**
-+** This will alloc and use DMAable buffers of
-+** WLAN_A4FR_MAXLEN_WEP_FCS * (RX_CNT + TX_CNT) bytes
-+** RX/TX_CNT=32 -> ~150k DMA buffers
-+** RX/TX_CNT=16 -> ~75k DMA buffers
-+**
-+** 2005-10-10: reduced memory usage by lowering both to 16
-+*/
-+#define RX_CNT 16
-+#define TX_CNT 16
-+
-+/* we clean up txdescs when we have N free txdesc: */
-+#define TX_CLEAN_BACKLOG (TX_CNT/4)
-+#define TX_START_CLEAN (TX_CNT - TX_CLEAN_BACKLOG)
-+#define TX_EMERG_CLEAN 2
-+/* we stop queue if we have < N free txbufs: */
-+#define TX_STOP_QUEUE 3
-+/* we start queue if we have >= N free txbufs: */
-+#define TX_START_QUEUE 5
-+
-+/***********************************************************************
-+** Interrogate/Configure cmd constants
-+**
-+** NB: length includes JUST the data part of the IE
-+** (does not include size of the (type,len) pair)
-+**
-+** TODO: seems that acx100, acx100usb, acx111 have some differences,
-+** fix code with regard to this!
-+*/
-+
-+#define DEF_IE(name, val, len) enum { ACX##name=val, ACX##name##_LEN=len }
-+
-+/* Information Elements: Network Parameters, Static Configuration Entities */
-+/* these are handled by real_cfgtable in firmware "Rev 1.5.0" (FW150) */
-+DEF_IE(1xx_IE_UNKNOWN_00              ,0x0000, -1);   /* mapped to cfgInvalid in FW150 */
-+DEF_IE(100_IE_ACX_TIMER                       ,0x0001, 0x10);
-+DEF_IE(1xx_IE_POWER_MGMT              ,0x0002, 0x06); /* TNETW1450: length 0x18!! */
-+DEF_IE(1xx_IE_QUEUE_CONFIG            ,0x0003, 0x1c);
-+DEF_IE(100_IE_BLOCK_SIZE              ,0x0004, 0x02);
-+DEF_IE(1FF_IE_SLOT_TIME                       ,0x0004, 0x08); /* later firmware versions only? */
-+DEF_IE(1xx_IE_MEMORY_CONFIG_OPTIONS   ,0x0005, 0x14);
-+DEF_IE(1FF_IE_QUEUE_HEAD              ,0x0005, 0x14 /* FIXME: length? */);
-+DEF_IE(1xx_IE_RATE_FALLBACK           ,0x0006, 0x01); /* TNETW1450: length 2 */
-+DEF_IE(100_IE_WEP_OPTIONS             ,0x0007, 0x03);
-+DEF_IE(111_IE_RADIO_BAND              ,0x0007, -1);
-+DEF_IE(1FF_IE_TIMING_CFG              ,0x0007, -1);   /* later firmware versions; TNETW1450 only? */
-+DEF_IE(100_IE_SSID                    ,0x0008, 0x20); /* huh? */
-+DEF_IE(1xx_IE_MEMORY_MAP              ,0x0008, 0x28); /* huh? TNETW1450 has length 0x40!! */
-+DEF_IE(1xx_IE_SCAN_STATUS             ,0x0009, 0x04); /* mapped to cfgInvalid in FW150 */
-+DEF_IE(1xx_IE_ASSOC_ID                        ,0x000a, 0x02);
-+DEF_IE(1xx_IE_UNKNOWN_0B              ,0x000b, -1);   /* mapped to cfgInvalid in FW150 */
-+DEF_IE(1FF_IE_TX_POWER_LEVEL_TABLE    ,0x000b, 0x18); /* later firmware versions; TNETW1450 only? */
-+DEF_IE(100_IE_UNKNOWN_0C              ,0x000c, -1);   /* very small implementation in FW150! */
-+/* ACX100 has an equivalent struct in the cmd mailbox directly after reset.
-+ * 0x14c seems extremely large, will trash stack on failure (memset!)
-+ * in case of small input struct --> OOPS! */
-+DEF_IE(111_IE_CONFIG_OPTIONS          ,0x000c, 0x14c);
-+DEF_IE(1xx_IE_FWREV                   ,0x000d, 0x18);
-+DEF_IE(1xx_IE_FCS_ERROR_COUNT         ,0x000e, 0x04);
-+DEF_IE(1xx_IE_MEDIUM_USAGE            ,0x000f, 0x08);
-+DEF_IE(1xx_IE_RXCONFIG                        ,0x0010, 0x04);
-+DEF_IE(100_IE_UNKNOWN_11              ,0x0011, -1);   /* NONBINARY: large implementation in FW150! link quality readings or so? */
-+DEF_IE(111_IE_QUEUE_THRESH            ,0x0011, -1);
-+DEF_IE(100_IE_UNKNOWN_12              ,0x0012, -1);   /* NONBINARY: VERY large implementation in FW150!! */
-+DEF_IE(111_IE_BSS_POWER_SAVE          ,0x0012, /* -1 */ 2);
-+DEF_IE(1xx_IE_FIRMWARE_STATISTICS     ,0x0013, 0x9c); /* TNETW1450: length 0x134!! */
-+DEF_IE(1FF_IE_RX_INTR_CONFIG          ,0x0014, 0x14); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1xx_IE_FEATURE_CONFIG          ,0x0015, 0x08);
-+DEF_IE(111_IE_KEY_CHOOSE              ,0x0016, 0x04); /* for rekeying. really len=4?? */
-+DEF_IE(1FF_IE_MISC_CONFIG_TABLE               ,0x0017, 0x04); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_WONE_CONFIG             ,0x0018, -1);   /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_TID_CONFIG              ,0x001a, 0x2c); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_CALIB_ASSESSMENT                ,0x001e, 0x04); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_BEACON_FILTER_OPTIONS   ,0x001f, 0x02); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_LOW_RSSI_THRESH_OPT     ,0x0020, 0x04); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_NOISE_HISTOGRAM_RESULTS ,0x0021, 0x30); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_PACKET_DETECT_THRESH    ,0x0023, 0x04); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_TX_CONFIG_OPTIONS               ,0x0024, 0x04); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_CCA_THRESHOLD           ,0x0025, 0x02); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_EVENT_MASK              ,0x0026, 0x08); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_DTIM_PERIOD             ,0x0027, 0x02); /* later firmware versions, TNETW1450 only? */
-+DEF_IE(1FF_IE_ACI_CONFIG_SET          ,0x0029, 0x06); /* later firmware versions; maybe TNETW1450 only? */
-+DEF_IE(1FF_IE_EEPROM_VER              ,0x0030, 0x04); /* later firmware versions; maybe TNETW1450 only? */
-+DEF_IE(1xx_IE_DOT11_STATION_ID                ,0x1001, 0x06);
-+DEF_IE(100_IE_DOT11_UNKNOWN_1002      ,0x1002, -1);   /* mapped to cfgInvalid in FW150 */
-+DEF_IE(111_IE_DOT11_FRAG_THRESH               ,0x1002, -1);   /* mapped to cfgInvalid in FW150; TNETW1450 has length 2!! */
-+DEF_IE(100_IE_DOT11_BEACON_PERIOD     ,0x1003, 0x02); /* mapped to cfgInvalid in FW150 */
-+DEF_IE(1xx_IE_DOT11_DTIM_PERIOD               ,0x1004, -1);   /* mapped to cfgInvalid in FW150 */
-+DEF_IE(1FF_IE_DOT11_MAX_RX_LIFETIME   ,0x1004, -1);   /* later firmware versions; maybe TNETW1450 only? */
-+DEF_IE(1xx_IE_DOT11_SHORT_RETRY_LIMIT ,0x1005, 0x01); /* TNETW1450: length 2 */
-+DEF_IE(1xx_IE_DOT11_LONG_RETRY_LIMIT  ,0x1006, 0x01); /* TNETW1450: length 2 */
-+DEF_IE(100_IE_DOT11_WEP_DEFAULT_KEY_WRITE     ,0x1007, 0x20); /* configure default keys; TNETW1450 has length 0x24!! */
-+DEF_IE(1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME    ,0x1008, 0x04);
-+DEF_IE(1xx_IE_DOT11_GROUP_ADDR                ,0x1009, -1);
-+DEF_IE(1xx_IE_DOT11_CURRENT_REG_DOMAIN        ,0x100a, 0x02);
-+/* It's harmless to have larger struct. Use USB case always. */
-+DEF_IE(1xx_IE_DOT11_CURRENT_ANTENNA   ,0x100b, 0x02); /* in fact len=1 for PCI */
-+DEF_IE(1xx_IE_DOT11_UNKNOWN_100C      ,0x100c, -1);   /* mapped to cfgInvalid in FW150 */
-+DEF_IE(1xx_IE_DOT11_TX_POWER_LEVEL    ,0x100d, 0x01); /* TNETW1450 has length 2!! */
-+DEF_IE(1xx_IE_DOT11_CURRENT_CCA_MODE  ,0x100e, 0x02); /* in fact len=1 for PCI */
-+/* USB doesn't return anything - len==0?! */
-+DEF_IE(100_IE_DOT11_ED_THRESHOLD      ,0x100f, 0x04);
-+DEF_IE(1xx_IE_DOT11_WEP_DEFAULT_KEY_SET       ,0x1010, 0x01); /* set default key ID; TNETW1450: length 2 */
-+DEF_IE(100_IE_DOT11_UNKNOWN_1011      ,0x1011, -1);   /* mapped to cfgInvalid in FW150 */
-+DEF_IE(1FF_IE_DOT11_CURR_5GHZ_REGDOM  ,0x1011, -1);   /* later firmware versions; maybe TNETW1450 only? */
-+DEF_IE(100_IE_DOT11_UNKNOWN_1012      ,0x1012, -1);   /* mapped to cfgInvalid in FW150 */
-+DEF_IE(100_IE_DOT11_UNKNOWN_1013      ,0x1013, -1);   /* mapped to cfgInvalid in FW150 */
-+
-+#if 0
-+/* Experimentally obtained on acx100, fw 1.9.8.b
-+** -1 means that fw returned 'invalid IE'
-+** 0200 FC00 nnnn... are test read contents: u16 type, u16 len, data
-+** (AA are poison bytes marking bytes not written by fw)
-+**
-+** Looks like acx100 fw does not update len field (thus len=256-4=FC here)
-+** A number of IEs seem to trash type,len fields
-+** IEs marked 'huge' return gobs of data (no poison bytes remain)
-+*/
-+DEF_IE(100_IE_INVAL_00,                       0x0000, -1);
-+DEF_IE(100_IE_INVAL_01,                       0x0001, -1);    /* IE_ACX_TIMER, len=16 on older fw */
-+DEF_IE(100_IE_POWER_MGMT,             0x0002, 4);     /* 0200FC00 00040000 AAAAAAAA */
-+DEF_IE(100_IE_QUEUE_CONFIG,           0x0003, 28);    /* 0300FC00 48060000 9CAD0000 0101AAAA DCB00000 E4B00000 9CAA0000 00AAAAAA */
-+DEF_IE(100_IE_BLOCK_SIZE,             0x0004, 2);     /* 0400FC00 0001AAAA AAAAAAAA AAAAAAAA */
-+/* write only: */
-+DEF_IE(100_IE_MEMORY_CONFIG_OPTIONS,  0x0005, 20);
-+DEF_IE(100_IE_RATE_FALLBACK,          0x0006, 1);     /* 0600FC00 00AAAAAA AAAAAAAA AAAAAAAA */
-+/* write only: */
-+DEF_IE(100_IE_WEP_OPTIONS,            0x0007, 3);
-+DEF_IE(100_IE_MEMORY_MAP,             0x0008, 40);    /* huge: 0800FC00 30000000 6CA20000 70A20000... */
-+/* gives INVAL on read: */
-+DEF_IE(100_IE_SCAN_STATUS,            0x0009, -1);
-+DEF_IE(100_IE_ASSOC_ID,                       0x000a, 2);     /* huge: 0A00FC00 00000000 01040800 00000000... */
-+DEF_IE(100_IE_INVAL_0B,                       0x000b, -1);
-+/* 'command rejected': */
-+DEF_IE(100_IE_CONFIG_OPTIONS,         0x000c, -3);
-+DEF_IE(100_IE_FWREV,                  0x000d, 24);    /* 0D00FC00 52657620 312E392E 382E6200 AAAAAAAA AAAAAAAA 05050201 AAAAAAAA */
-+DEF_IE(100_IE_FCS_ERROR_COUNT,                0x000e, 4);
-+DEF_IE(100_IE_MEDIUM_USAGE,           0x000f, 8);     /* E41F0000 2D780300 FCC91300 AAAAAAAA */
-+DEF_IE(100_IE_RXCONFIG,                       0x0010, 4);     /* 1000FC00 00280000 AAAAAAAA AAAAAAAA */
-+DEF_IE(100_IE_QUEUE_THRESH,           0x0011, 12);    /* 1100FC00 AAAAAAAA 00000000 00000000 */
-+DEF_IE(100_IE_BSS_POWER_SAVE,         0x0012, 1);     /* 1200FC00 00AAAAAA AAAAAAAA AAAAAAAA */
-+/* read only, variable len */
-+DEF_IE(100_IE_FIRMWARE_STATISTICS,    0x0013, 256); /* 0000AC00 00000000 ... */
-+DEF_IE(100_IE_INT_CONFIG,             0x0014, 20);    /* 00000000 00000000 00000000 00000000 5D74D105 00000000 AAAAAAAA AAAAAAAA */
-+DEF_IE(100_IE_FEATURE_CONFIG,         0x0015, 8);     /* 1500FC00 16000000 AAAAAAAA AAAAAAAA */
-+/* returns 'invalid MAC': */
-+DEF_IE(100_IE_KEY_CHOOSE,             0x0016, -4);
-+DEF_IE(100_IE_INVAL_17,                       0x0017, -1);
-+DEF_IE(100_IE_UNKNOWN_18,             0x0018, 0);     /* null len?! 1800FC00 AAAAAAAA AAAAAAAA AAAAAAAA */
-+DEF_IE(100_IE_UNKNOWN_19,             0x0019, 256);   /* huge: 1900FC00 9C1F00EA FEFFFFEA FEFFFFEA... */
-+DEF_IE(100_IE_INVAL_1A,                       0x001A, -1);
-+
-+DEF_IE(100_IE_DOT11_INVAL_1000,                       0x1000, -1);
-+DEF_IE(100_IE_DOT11_STATION_ID,                       0x1001, 6);     /* huge: 0110FC00 58B10E2F 03000000 00000000... */
-+DEF_IE(100_IE_DOT11_INVAL_1002,                       0x1002, -1);
-+DEF_IE(100_IE_DOT11_INVAL_1003,                       0x1003, -1);
-+DEF_IE(100_IE_DOT11_INVAL_1004,                       0x1004, -1);
-+DEF_IE(100_IE_DOT11_SHORT_RETRY_LIMIT,                0x1005, 1);
-+DEF_IE(100_IE_DOT11_LONG_RETRY_LIMIT,         0x1006, 1);
-+/* write only: */
-+DEF_IE(100_IE_DOT11_WEP_DEFAULT_KEY_WRITE,    0x1007, 32);
-+DEF_IE(100_IE_DOT11_MAX_XMIT_MSDU_LIFETIME,   0x1008, 4);     /* huge: 0810FC00 00020000 F4010000 00000000... */
-+/* undoc but returns something */
-+DEF_IE(100_IE_DOT11_GROUP_ADDR,                       0x1009, 12);    /* huge: 0910FC00 00000000 00000000 00000000... */
-+DEF_IE(100_IE_DOT11_CURRENT_REG_DOMAIN,               0x100a, 1);     /* 0A10FC00 30AAAAAA AAAAAAAA AAAAAAAA */
-+DEF_IE(100_IE_DOT11_CURRENT_ANTENNA,          0x100b, 1);     /* 0B10FC00 8FAAAAAA AAAAAAAA AAAAAAAA */
-+DEF_IE(100_IE_DOT11_INVAL_100C,                       0x100c, -1);
-+DEF_IE(100_IE_DOT11_TX_POWER_LEVEL,           0x100d, 2);     /* 00000000 0100AAAA AAAAAAAA AAAAAAAA */
-+DEF_IE(100_IE_DOT11_CURRENT_CCA_MODE,         0x100e, 1);     /* 0E10FC00 0DAAAAAA AAAAAAAA AAAAAAAA */
-+DEF_IE(100_IE_DOT11_ED_THRESHOLD,             0x100f, 4);     /* 0F10FC00 70000000 AAAAAAAA AAAAAAAA */
-+/* set default key ID  */
-+DEF_IE(100_IE_DOT11_WEP_DEFAULT_KEY_SET,      0x1010, 1);     /* 1010FC00 00AAAAAA AAAAAAAA AAAAAAAA */
-+DEF_IE(100_IE_DOT11_INVAL_1011,                       0x1011, -1);
-+DEF_IE(100_IE_DOT11_INVAL_1012,                       0x1012, -1);
-+DEF_IE(100_IE_DOT11_INVAL_1013,                       0x1013, -1);
-+DEF_IE(100_IE_DOT11_UNKNOWN_1014,             0x1014, 256);   /* huge */
-+DEF_IE(100_IE_DOT11_UNKNOWN_1015,             0x1015, 256);   /* huge */
-+DEF_IE(100_IE_DOT11_UNKNOWN_1016,             0x1016, 256);   /* huge */
-+DEF_IE(100_IE_DOT11_UNKNOWN_1017,             0x1017, 256);   /* huge */
-+DEF_IE(100_IE_DOT11_UNKNOWN_1018,             0x1018, 256);   /* huge */
-+DEF_IE(100_IE_DOT11_UNKNOWN_1019,             0x1019, 256);   /* huge */
-+#endif
-+
-+#if 0
-+/* Experimentally obtained on PCI acx111 Xterasys XN-2522g, fw 1.2.1.34
-+** -1 means that fw returned 'invalid IE'
-+** 0400 0800 nnnn... are test read contents: u16 type, u16 len, data
-+** (AA are poison bytes marking bytes not written by fw)
-+**
-+** Looks like acx111 fw reports real len!
-+*/
-+DEF_IE(111_IE_INVAL_00,                       0x0000, -1);
-+DEF_IE(111_IE_INVAL_01,                       0x0001, -1);
-+DEF_IE(111_IE_POWER_MGMT,             0x0002, 12);
-+/* write only, variable len: 12 + rxqueue_cnt*8 + txqueue_cnt*4: */
-+DEF_IE(111_IE_MEMORY_CONFIG,          0x0003, 24);
-+DEF_IE(111_IE_BLOCK_SIZE,             0x0004, 8); /* 04000800 AA00AAAA AAAAAAAA */
-+/* variable len: 8 + rxqueue_cnt*8 + txqueue_cnt*8: */
-+DEF_IE(111_IE_QUEUE_HEAD,             0x0005, 24);
-+DEF_IE(111_IE_RATE_FALLBACK,          0x0006, 1);
-+/* acx100 name:WEP_OPTIONS */
-+/* said to have len:1 (not true, actually returns 12 bytes): */
-+DEF_IE(111_IE_RADIO_BAND,             0x0007, 12); /* 07000C00 AAAA1F00 FF03AAAA AAAAAAAA */
-+DEF_IE(111_IE_MEMORY_MAP,             0x0008, 48);
-+/* said to have len:4, but gives INVAL on read: */
-+DEF_IE(111_IE_SCAN_STATUS,            0x0009, -1);
-+DEF_IE(111_IE_ASSOC_ID,                       0x000a, 2);
-+/* write only, len is not known: */
-+DEF_IE(111_IE_UNKNOWN_0B,             0x000b, 0);
-+/* read only, variable len. I see 67 byte reads: */
-+DEF_IE(111_IE_CONFIG_OPTIONS,         0x000c, 67); /* 0C004300 01160500 ... */
-+DEF_IE(111_IE_FWREV,                  0x000d, 24);
-+DEF_IE(111_IE_FCS_ERROR_COUNT,                0x000e, 4);
-+DEF_IE(111_IE_MEDIUM_USAGE,           0x000f, 8);
-+DEF_IE(111_IE_RXCONFIG,                       0x0010, 4);
-+DEF_IE(111_IE_QUEUE_THRESH,           0x0011, 12);
-+DEF_IE(111_IE_BSS_POWER_SAVE,         0x0012, 1);
-+/* read only, variable len. I see 240 byte reads: */
-+DEF_IE(111_IE_FIRMWARE_STATISTICS,    0x0013, 240); /* 1300F000 00000000 ... */
-+/* said to have len=17. looks like fw pads it to 20: */
-+DEF_IE(111_IE_INT_CONFIG,             0x0014, 20); /* 14001400 00000000 00000000 00000000 00000000 00000000 */
-+DEF_IE(111_IE_FEATURE_CONFIG,         0x0015, 8);
-+/* said to be name:KEY_INDICATOR, len:4, but gives INVAL on read: */
-+DEF_IE(111_IE_KEY_CHOOSE,             0x0016, -1);
-+/* said to have len:4, but in fact returns 8: */
-+DEF_IE(111_IE_MAX_USB_XFR,            0x0017, 8); /* 17000800 00014000 00000000 */
-+DEF_IE(111_IE_INVAL_18,                       0x0018, -1);
-+DEF_IE(111_IE_INVAL_19,                       0x0019, -1);
-+/* undoc but returns something: */
-+/* huh, fw indicates len=20 but uses 4 more bytes in buffer??? */
-+DEF_IE(111_IE_UNKNOWN_1A,             0x001A, 20); /* 1A001400 AA00AAAA 0000020F FF030000 00020000 00000007 04000000 */
-+
-+DEF_IE(111_IE_DOT11_INVAL_1000,                       0x1000, -1);
-+DEF_IE(111_IE_DOT11_STATION_ID,                       0x1001, 6);
-+DEF_IE(111_IE_DOT11_FRAG_THRESH,              0x1002, 2);
-+/* acx100 only? gives INVAL on read: */
-+DEF_IE(111_IE_DOT11_BEACON_PERIOD,            0x1003, -1);
-+/* said to be MAX_RECV_MSDU_LIFETIME: */
-+DEF_IE(111_IE_DOT11_DTIM_PERIOD,              0x1004, 4);
-+DEF_IE(111_IE_DOT11_SHORT_RETRY_LIMIT,                0x1005, 1);
-+DEF_IE(111_IE_DOT11_LONG_RETRY_LIMIT,         0x1006, 1);
-+/* acx100 only? gives INVAL on read: */
-+DEF_IE(111_IE_DOT11_WEP_DEFAULT_KEY_WRITE,    0x1007, -1);
-+DEF_IE(111_IE_DOT11_MAX_XMIT_MSDU_LIFETIME,   0x1008, 4);
-+/* undoc but returns something. maybe it's 2 multicast MACs to listen to? */
-+DEF_IE(111_IE_DOT11_GROUP_ADDR,                       0x1009, 12); /* 09100C00 00000000 00000000 00000000 */
-+DEF_IE(111_IE_DOT11_CURRENT_REG_DOMAIN,               0x100a, 1);
-+DEF_IE(111_IE_DOT11_CURRENT_ANTENNA,          0x100b, 2);
-+DEF_IE(111_IE_DOT11_INVAL_100C,                       0x100c, -1);
-+DEF_IE(111_IE_DOT11_TX_POWER_LEVEL,           0x100d, 1);
-+/* said to have len=1 but gives INVAL on read: */
-+DEF_IE(111_IE_DOT11_CURRENT_CCA_MODE,         0x100e, -1);
-+/* said to have len=4 but gives INVAL on read: */
-+DEF_IE(111_IE_DOT11_ED_THRESHOLD,             0x100f, -1);
-+/* set default key ID. write only: */
-+DEF_IE(111_IE_DOT11_WEP_DEFAULT_KEY_SET,      0x1010, 1);
-+/* undoc but returns something: */
-+DEF_IE(111_IE_DOT11_UNKNOWN_1011,             0x1011, 1); /* 11100100 20 */
-+DEF_IE(111_IE_DOT11_INVAL_1012,                       0x1012, -1);
-+DEF_IE(111_IE_DOT11_INVAL_1013,                       0x1013, -1);
-+#endif
-+
-+
-+/***********************************************************************
-+**Information Frames Structures
-+*/
-+
-+/* Used in beacon frames and the like */
-+#define DOT11RATEBYTE_1               (1*2)
-+#define DOT11RATEBYTE_2               (2*2)
-+#define DOT11RATEBYTE_5_5     (5*2+1)
-+#define DOT11RATEBYTE_11      (11*2)
-+#define DOT11RATEBYTE_22      (22*2)
-+#define DOT11RATEBYTE_6_G     (6*2)
-+#define DOT11RATEBYTE_9_G     (9*2)
-+#define DOT11RATEBYTE_12_G    (12*2)
-+#define DOT11RATEBYTE_18_G    (18*2)
-+#define DOT11RATEBYTE_24_G    (24*2)
-+#define DOT11RATEBYTE_36_G    (36*2)
-+#define DOT11RATEBYTE_48_G    (48*2)
-+#define DOT11RATEBYTE_54_G    (54*2)
-+#define DOT11RATEBYTE_BASIC   0x80    /* flags rates included in basic rate set */
-+
-+
-+/***********************************************************************
-+** rxbuffer_t
-+**
-+** This is the format of rx data returned by acx
-+*/
-+
-+/* I've hoped it's a 802.11 PHY header, but no...
-+ * so far, I've seen on acx111:
-+ * 0000 3a00 0000 0000 IBSS Beacons
-+ * 0000 3c00 0000 0000 ESS Beacons
-+ * 0000 2700 0000 0000 Probe requests
-+ * --vda
-+ */
-+typedef struct phy_hdr {
-+      u8      unknown[4];
-+      u8      acx111_unknown[4];
-+} ACX_PACKED phy_hdr_t;
-+
-+/* seems to be a bit similar to hfa384x_rx_frame.
-+ * These fields are still not quite obvious, though.
-+ * Some seem to have different meanings... */
-+
-+#define RXBUF_HDRSIZE 12
-+#define RXBUF_BYTES_RCVD(adev, rxbuf) \
-+              ((le16_to_cpu((rxbuf)->mac_cnt_rcvd) & 0xfff) - (adev)->phy_header_len)
-+#define RXBUF_BYTES_USED(rxbuf) \
-+              ((le16_to_cpu((rxbuf)->mac_cnt_rcvd) & 0xfff) + RXBUF_HDRSIZE)
-+/* USBism */
-+#define RXBUF_IS_TXSTAT(rxbuf) (le16_to_cpu((rxbuf)->mac_cnt_rcvd) & 0x8000)
-+/*
-+mac_cnt_rcvd:
-+    12 bits: length of frame from control field to first byte of FCS
-+    3 bits: reserved
-+    1 bit: 1 = it's a tx status info, not a rx packet (USB only)
-+
-+mac_cnt_mblks:
-+    6 bits: number of memory block used to store frame in adapter memory
-+    1 bit: Traffic Indicator bit in TIM of received Beacon was set
-+
-+mac_status: 1 byte (bitmap):
-+    7 Matching BSSID
-+    6 Matching SSID
-+    5 BDCST   Address 1 field is a broadcast
-+    4 VBM     received beacon frame has more than one set bit (?!)
-+    3 TIM Set bit representing this station is set in TIM of received beacon
-+    2 GROUP   Address 1 is a multicast
-+    1 ADDR1   Address 1 matches our MAC
-+    0 FCSGD   FSC is good
-+
-+phy_stat_baseband: 1 byte (bitmap):
-+    7 Preamble                frame had a long preamble
-+    6 PLCP Error      CRC16 error in PLCP header
-+    5 Unsup_Mod               unsupported modulation
-+    4 Selected Antenna        antenna 1 was used to receive this frame
-+    3 PBCC/CCK                frame used: 1=PBCC, 0=CCK modulation
-+    2 OFDM            frame used OFDM modulation
-+    1 TI Protection   protection frame was detected
-+    0 Reserved
-+
-+phy_plcp_signal: 1 byte:
-+    Receive PLCP Signal field from the Baseband Processor
-+
-+phy_level: 1 byte:
-+    receive AGC gain level (can be used to measure receive signal strength)
-+
-+phy_snr: 1 byte:
-+    estimated noise power of equalized receive signal
-+    at input of FEC decoder (can be used to measure receive signal quality)
-+
-+time: 4 bytes:
-+    timestamp sampled from either the Access Manager TSF counter
-+    or free-running microsecond counter when the MAC receives
-+    first byte of PLCP header.
-+*/
-+
-+typedef struct rxbuffer {
-+      u16     mac_cnt_rcvd;           /* only 12 bits are len! (0xfff) */
-+      u8      mac_cnt_mblks;
-+      u8      mac_status;
-+      u8      phy_stat_baseband;      /* bit 0x80: used LNA (Low-Noise Amplifier) */
-+      u8      phy_plcp_signal;
-+      u8      phy_level;              /* PHY stat */
-+      u8      phy_snr;                /* PHY stat */
-+      u32     time;                   /* timestamp upon MAC rcv first byte */
-+/* 4-byte (acx100) or 8-byte (acx111) phy header will be here
-+** if RX_CFG1_INCLUDE_PHY_HDR is in effect:
-+**    phy_hdr_t phy                   */
-+      wlan_hdr_a3_t hdr_a3;
-+      /* maximally sized data part of wlan packet */
-+      u8      data_a3[WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN];
-+      /* can add hdr/data_a4 if needed */
-+} ACX_PACKED rxbuffer_t;
-+
-+
-+/*--- Firmware statistics ----------------------------------------------------*/
-+
-+/* define a random 100 bytes more to catch firmware versions which
-+ * provide a bigger struct */
-+#define FW_STATS_FUTURE_EXTENSION     100
-+
-+typedef struct fw_stats_tx {
-+      u32     tx_desc_of;
-+} ACX_PACKED fw_stats_tx_t;
-+
-+typedef struct fw_stats_rx {
-+      u32     rx_oom;
-+      u32     rx_hdr_of;
-+      u32     rx_hw_stuck; /* old: u32        rx_hdr_use_next */
-+      u32     rx_dropped_frame;
-+      u32     rx_frame_ptr_err;
-+      u32     rx_xfr_hint_trig;
-+      u32     rx_aci_events; /* later versions only */
-+      u32     rx_aci_resets; /* later versions only */
-+} ACX_PACKED fw_stats_rx_t;
-+
-+typedef struct fw_stats_dma {
-+      u32     rx_dma_req;
-+      u32     rx_dma_err;
-+      u32     tx_dma_req;
-+      u32     tx_dma_err;
-+} ACX_PACKED fw_stats_dma_t;
-+
-+typedef struct fw_stats_irq {
-+      u32     cmd_cplt;
-+      u32     fiq;
-+      u32     rx_hdrs;
-+      u32     rx_cmplt;
-+      u32     rx_mem_of;
-+      u32     rx_rdys;
-+      u32     irqs;
-+      u32     tx_procs;
-+      u32     decrypt_done;
-+      u32     dma_0_done;
-+      u32     dma_1_done;
-+      u32     tx_exch_complet;
-+      u32     commands;
-+      u32     rx_procs;
-+      u32     hw_pm_mode_changes;
-+      u32     host_acks;
-+      u32     pci_pm;
-+      u32     acm_wakeups;
-+} ACX_PACKED fw_stats_irq_t;
-+
-+typedef struct fw_stats_wep {
-+      u32     wep_key_count;
-+      u32     wep_default_key_count;
-+      u32     dot11_def_key_mib;
-+      u32     wep_key_not_found;
-+      u32     wep_decrypt_fail;
-+      u32     wep_pkt_decrypt;
-+      u32     wep_decrypt_irqs;
-+} ACX_PACKED fw_stats_wep_t;
-+
-+typedef struct fw_stats_pwr {
-+      u32     tx_start_ctr;
-+      u32     no_ps_tx_too_short;
-+      u32     rx_start_ctr;
-+      u32     no_ps_rx_too_short;
-+      u32     lppd_started;
-+      u32     no_lppd_too_noisy;
-+      u32     no_lppd_too_short;
-+      u32     no_lppd_matching_frame;
-+} ACX_PACKED fw_stats_pwr_t;
-+
-+typedef struct fw_stats_mic {
-+      u32 mic_rx_pkts;
-+      u32 mic_calc_fail;
-+} ACX_PACKED fw_stats_mic_t;
-+
-+typedef struct fw_stats_aes {
-+      u32 aes_enc_fail;
-+      u32 aes_dec_fail;
-+      u32 aes_enc_pkts;
-+      u32 aes_dec_pkts;
-+      u32 aes_enc_irq;
-+      u32 aes_dec_irq;
-+} ACX_PACKED fw_stats_aes_t;
-+
-+typedef struct fw_stats_event {
-+      u32 heartbeat;
-+      u32 calibration;
-+      u32 rx_mismatch;
-+      u32 rx_mem_empty;
-+      u32 rx_pool;
-+      u32 oom_late;
-+      u32 phy_tx_err;
-+      u32 tx_stuck;
-+} ACX_PACKED fw_stats_event_t;
-+
-+/* mainly for size calculation only */
-+typedef struct fw_stats {
-+      u16                     type;
-+      u16                     len;
-+      fw_stats_tx_t           tx;
-+      fw_stats_rx_t           rx;
-+      fw_stats_dma_t          dma;
-+      fw_stats_irq_t          irq;
-+      fw_stats_wep_t          wep;
-+      fw_stats_pwr_t          pwr;
-+      fw_stats_mic_t          mic;
-+      fw_stats_aes_t          aes;
-+      fw_stats_event_t        evt;
-+      u8                      _padding[FW_STATS_FUTURE_EXTENSION];
-+} fw_stats_t;
-+
-+/* Firmware version struct */
-+
-+typedef struct fw_ver {
-+      u16     cmd;
-+      u16     size;
-+      char    fw_id[20];
-+      u32     hw_id;
-+} ACX_PACKED fw_ver_t;
-+
-+#define FW_ID_SIZE 20
-+
-+typedef struct shared_queueindicator {
-+        u32     indicator;
-+        u16     host_lock;
-+        u16     fw_lock;
-+} ACX_PACKED queueindicator_t;
-+
-+/*--- WEP stuff --------------------------------------------------------------*/
-+#define DOT11_MAX_DEFAULT_WEP_KEYS    4
-+
-+/* non-firmware struct, no packing necessary */
-+typedef struct wep_key {
-+      size_t  size; /* most often used member first */
-+      u8      index;
-+      u8      key[29];
-+      u16     strange_filler;
-+} wep_key_t;                  /* size = 264 bytes (33*8) */
-+/* FIXME: We don't have size 264! Or is there 2 bytes beyond the key
-+ * (strange_filler)? */
-+
-+/* non-firmware struct, no packing necessary */
-+typedef struct key_struct {
-+      u8      addr[ETH_ALEN]; /* 0x00 */
-+      u16     filler1;        /* 0x06 */
-+      u32     filler2;        /* 0x08 */
-+      u32     index;          /* 0x0c */
-+      u16     len;            /* 0x10 */
-+      u8      key[29];        /* 0x12; is this long enough??? */
-+} key_struct_t;                       /* size = 276. FIXME: where is the remaining space?? */
-+
-+
-+/*--- Client (peer) info -----------------------------------------------------*/
-+/* adev->sta_list[] is used for:
-+** accumulating and processing of scan results
-+** keeping client info in AP mode
-+** keeping AP info in STA mode (AP is the only one 'client')
-+** keeping peer info in ad-hoc mode
-+** non-firmware struct --> no packing necessary */
-+enum {
-+      CLIENT_EMPTY_SLOT_0 = 0,
-+      CLIENT_EXIST_1 = 1,
-+      CLIENT_AUTHENTICATED_2 = 2,
-+      CLIENT_ASSOCIATED_3 = 3,
-+      CLIENT_JOIN_CANDIDATE = 4
-+};
-+struct client {
-+      /* most frequent access first */
-+      u8      used;                   /* misnamed, more like 'status' */
-+      struct client*  next;
-+      unsigned long   mtime;          /* last time we heard it, in jiffies */
-+      size_t  essid_len;              /* length of ESSID (without '\0') */
-+      u32     sir;                    /* Standard IR */
-+      u32     snr;                    /* Signal to Noise Ratio */
-+      u16     aid;                    /* association ID */
-+      u16     seq;                    /* from client's auth req */
-+      u16     auth_alg;               /* from client's auth req */
-+      u16     cap_info;               /* from client's assoc req */
-+      u16     rate_cap;               /* what client supports (all rates) */
-+      u16     rate_bas;               /* what client supports (basic rates) */
-+      u16     rate_cfg;               /* what is allowed (by iwconfig etc) */
-+      u16     rate_cur;               /* currently used rate mask */
-+      u8      rate_100;               /* currently used rate byte (acx100 only) */
-+      u8      address[ETH_ALEN];
-+      u8      bssid[ETH_ALEN];        /* ad-hoc hosts can have bssid != mac */
-+      u8      channel;
-+      u8      auth_step;
-+      u8      ignore_count;
-+      u8      fallback_count;
-+      u8      stepup_count;
-+      char    essid[IW_ESSID_MAX_SIZE + 1];   /* ESSID and trailing '\0'  */
-+/* FIXME: this one is too damn big */
-+      char    challenge_text[WLAN_CHALLENGE_LEN];
-+};
-+
-+
-+/***********************************************************************
-+** Hardware structures
-+*/
-+
-+/* An opaque typesafe helper type
-+ *
-+ * Some hardware fields are actually pointers,
-+ * but they have to remain u32, since using ptr instead
-+ * (8 bytes on 64bit systems!) would disrupt the fixed descriptor
-+ * format the acx firmware expects in the non-user area.
-+ * Since we cannot cram an 8 byte ptr into 4 bytes, we need to
-+ * enforce that pointed to data remains in low memory
-+ * (address value needs to fit in 4 bytes) on 64bit systems.
-+ *
-+ * This is easy to get wrong, thus we are using a small struct
-+ * and special macros to access it. Macros will check for
-+ * attempts to overflow an acx_ptr with value > 0xffffffff.
-+ *
-+ * Attempts to use acx_ptr without macros result in compile-time errors */
-+
-+typedef struct {
-+      u32     v;
-+} ACX_PACKED acx_ptr;
-+
-+#if ACX_DEBUG
-+#define CHECK32(n) BUG_ON(sizeof(n)>4 && (long)(n)>0xffffff00)
-+#else
-+#define CHECK32(n) ((void)0)
-+#endif
-+
-+/* acx_ptr <-> integer conversion */
-+#define cpu2acx(n) ({ CHECK32(n); ((acx_ptr){ .v = cpu_to_le32(n) }); })
-+#define acx2cpu(a) (le32_to_cpu(a.v))
-+
-+/* acx_ptr <-> pointer conversion */
-+#define ptr2acx(p) ({ CHECK32(p); ((acx_ptr){ .v = cpu_to_le32((u32)(long)(p)) }); })
-+#define acx2ptr(a) ((void*)le32_to_cpu(a.v))
-+
-+/* Values for rate field (acx100 only) */
-+#define RATE100_1             10
-+#define RATE100_2             20
-+#define RATE100_5             55
-+#define RATE100_11            110
-+#define RATE100_22            220
-+/* This bit denotes use of PBCC:
-+** (PBCC encoding is usable with 11 and 22 Mbps speeds only) */
-+#define RATE100_PBCC511               0x80
-+
-+/* Bit values for rate111 field */
-+#define RATE111_1             0x0001  /* DBPSK */
-+#define RATE111_2             0x0002  /* DQPSK */
-+#define RATE111_5             0x0004  /* CCK or PBCC */
-+#define RATE111_6             0x0008  /* CCK-OFDM or OFDM */
-+#define RATE111_9             0x0010  /* CCK-OFDM or OFDM */
-+#define RATE111_11            0x0020  /* CCK or PBCC */
-+#define RATE111_12            0x0040  /* CCK-OFDM or OFDM */
-+#define RATE111_18            0x0080  /* CCK-OFDM or OFDM */
-+#define RATE111_22            0x0100  /* PBCC */
-+#define RATE111_24            0x0200  /* CCK-OFDM or OFDM */
-+#define RATE111_36            0x0400  /* CCK-OFDM or OFDM */
-+#define RATE111_48            0x0800  /* CCK-OFDM or OFDM */
-+#define RATE111_54            0x1000  /* CCK-OFDM or OFDM */
-+#define RATE111_RESERVED      0x2000
-+#define RATE111_PBCC511               0x4000  /* PBCC mod at 5.5 or 11Mbit (else CCK) */
-+#define RATE111_SHORTPRE      0x8000  /* short preamble */
-+/* Special 'try everything' value */
-+#define RATE111_ALL           0x1fff
-+/* These bits denote acx100 compatible settings */
-+#define RATE111_ACX100_COMPAT 0x0127
-+/* These bits denote 802.11b compatible settings */
-+#define RATE111_80211B_COMPAT 0x0027
-+
-+/* Descriptor Ctl field bits
-+ * init value is 0x8e, "idle" value is 0x82 (in idle tx descs)
-+ */
-+#define DESC_CTL_SHORT_PREAMBLE       0x01    /* preamble type: 0 = long; 1 = short */
-+#define DESC_CTL_FIRSTFRAG    0x02    /* this is the 1st frag of the frame */
-+#define DESC_CTL_AUTODMA      0x04
-+#define DESC_CTL_RECLAIM      0x08    /* ready to reuse */
-+#define DESC_CTL_HOSTDONE     0x20    /* host has finished processing */
-+#define DESC_CTL_ACXDONE      0x40    /* acx has finished processing */
-+/* host owns the desc [has to be released last, AFTER modifying all other desc fields!] */
-+#define DESC_CTL_HOSTOWN      0x80
-+#define       DESC_CTL_ACXDONE_HOSTOWN (DESC_CTL_ACXDONE | DESC_CTL_HOSTOWN)
-+
-+/* Descriptor Status field
-+ */
-+#define       DESC_STATUS_FULL        (1 << 31)
-+
-+/* NB: some bits may be interesting for Monitor mode tx (aka Raw tx): */
-+#define DESC_CTL2_SEQ         0x01    /* don't increase sequence field */
-+#define DESC_CTL2_FCS         0x02    /* don't add the FCS */
-+#define DESC_CTL2_MORE_FRAG   0x04
-+#define DESC_CTL2_RETRY               0x08    /* don't increase retry field */
-+#define DESC_CTL2_POWER               0x10    /* don't increase power mgmt. field */
-+#define DESC_CTL2_RTS         0x20    /* do RTS/CTS magic before sending */
-+#define DESC_CTL2_WEP         0x40    /* encrypt this frame */
-+#define DESC_CTL2_DUR         0x80    /* don't increase duration field */
-+
-+/***********************************************************************
-+** PCI structures
-+*/
-+/* IRQ Constants
-+** (outside of "#ifdef PCI" because USB (mis)uses HOST_INT_SCAN_COMPLETE) */
-+#define HOST_INT_RX_DATA      0x0001
-+#define HOST_INT_TX_COMPLETE  0x0002
-+#define HOST_INT_TX_XFER      0x0004
-+#define HOST_INT_RX_COMPLETE  0x0008
-+#define HOST_INT_DTIM         0x0010
-+#define HOST_INT_BEACON               0x0020
-+#define HOST_INT_TIMER                0x0040
-+#define HOST_INT_KEY_NOT_FOUND        0x0080
-+#define HOST_INT_IV_ICV_FAILURE       0x0100
-+#define HOST_INT_CMD_COMPLETE 0x0200
-+#define HOST_INT_INFO         0x0400
-+#define HOST_INT_OVERFLOW     0x0800
-+#define HOST_INT_PROCESS_ERROR        0x1000
-+#define HOST_INT_SCAN_COMPLETE        0x2000
-+#define HOST_INT_FCS_THRESHOLD        0x4000
-+#define HOST_INT_UNKNOWN      0x8000
-+
-+/* Outside of "#ifdef PCI" because USB needs to know sizeof()
-+** of txdesc and rxdesc: */
-+struct txdesc {
-+      acx_ptr pNextDesc;      /* pointer to next txdesc */
-+      acx_ptr HostMemPtr;                     /* 0x04 */
-+      acx_ptr AcxMemPtr;                      /* 0x08 */
-+      u32     tx_time;                        /* 0x0c */
-+      u16     total_length;           /* 0x10 */
-+      u16     Reserved;                       /* 0x12 */
-+
-+/* The following 16 bytes do not change when acx100 owns the descriptor */
-+/* BUG: fw clears last byte of this area which is supposedly reserved
-+** for driver use. amd64 blew up. We dare not use it now */
-+      u32     dummy[4];
-+
-+      u8      Ctl_8;                  /* 0x24, 8bit value */
-+      u8      Ctl2_8;                 /* 0x25, 8bit value */
-+      u8      error;                  /* 0x26 */
-+      u8      ack_failures;           /* 0x27 */
-+
-+      union {
-+        /*
-+         * Packing doesn't work correctly on ARM unless unions are on
-+         * 4 byte boundaries.
-+         */
-+              struct {
-+                      u8      rts_failures;           /* 0x28 */
-+                      u8      rts_ok;                 /* 0x29 */
-+                      u16     d1;
-+              } ACX_PACKED rts;
-+              struct {
-+                      u16     d1;
-+                      u8      rate;   /* 0x2a */
-+                      u8      queue_ctrl;     /* 0x2b */
-+              } ACX_PACKED r1;
-+              struct {
-+                      u16     d1;
-+                      u16     rate111;        /* 0x2a */
-+              } ACX_PACKED r2;
-+      } ACX_PACKED u;
-+      u32     queue_info;                     /* 0x2c (acx100, reserved on acx111) */
-+} ACX_PACKED;         /* size : 48 = 0x30 */
-+/* NB: acx111 txdesc structure is 4 byte larger */
-+/* All these 4 extra bytes are reserved. tx alloc code takes them into account */
-+
-+struct rxdesc {
-+      acx_ptr pNextDesc;                      /* 0x00 */
-+      acx_ptr HostMemPtr;                     /* 0x04 */
-+      acx_ptr ACXMemPtr;                      /* 0x08 */
-+      u32     rx_time;                        /* 0x0c */
-+      u16     total_length;           /* 0x10 */
-+      u16     WEP_length;                     /* 0x12 */
-+      u32     WEP_ofs;                        /* 0x14 */
-+
-+/* the following 16 bytes do not change when acx100 owns the descriptor */
-+      u8      driverWorkspace[16];            /* 0x18 */
-+
-+      u8      Ctl_8;
-+      u8      rate;
-+      u8      error;
-+      u8      SNR;                            /* Signal-to-Noise Ratio */
-+      u8      RxLevel;
-+      u8      queue_ctrl;
-+      u16     unknown;
-+      u32     unknown2;
-+} ACX_PACKED;         /* size 52 = 0x34 */
-+
-+#if defined(ACX_PCI) || defined(ACX_MEM)
-+
-+/* Register I/O offsets */
-+#define ACX100_EEPROM_ID_OFFSET       0x380
-+
-+/* please add further ACX hardware register definitions only when
-+   it turns out you need them in the driver, and please try to use
-+   firmware functionality instead, since using direct I/O access instead
-+   of letting the firmware do it might confuse the firmware's state
-+   machine */
-+
-+/* ***** ABSOLUTELY ALWAYS KEEP OFFSETS IN SYNC WITH THE INITIALIZATION
-+** OF THE I/O ARRAYS!!!! (grep for '^IO_ACX') ***** */
-+enum {
-+      IO_ACX_SOFT_RESET = 0,
-+
-+      IO_ACX_SLV_MEM_ADDR,
-+      IO_ACX_SLV_MEM_DATA,
-+      IO_ACX_SLV_MEM_CTL,
-+      IO_ACX_SLV_END_CTL,
-+
-+      IO_ACX_FEMR,            /* Function Event Mask */
-+
-+      IO_ACX_INT_TRIG,
-+      IO_ACX_IRQ_MASK,
-+      IO_ACX_IRQ_STATUS_NON_DES,
-+      IO_ACX_IRQ_STATUS_CLEAR, /* CLEAR = clear on read */
-+      IO_ACX_IRQ_ACK,
-+      IO_ACX_HINT_TRIG,
-+
-+      IO_ACX_ENABLE,
-+
-+      IO_ACX_EEPROM_CTL,
-+      IO_ACX_EEPROM_ADDR,
-+      IO_ACX_EEPROM_DATA,
-+      IO_ACX_EEPROM_CFG,
-+
-+      IO_ACX_PHY_ADDR,
-+      IO_ACX_PHY_DATA,
-+      IO_ACX_PHY_CTL,
-+
-+      IO_ACX_GPIO_OE,
-+
-+      IO_ACX_GPIO_OUT,
-+
-+      IO_ACX_CMD_MAILBOX_OFFS,
-+      IO_ACX_INFO_MAILBOX_OFFS,
-+      IO_ACX_EEPROM_INFORMATION,
-+
-+      IO_ACX_EE_START,
-+      IO_ACX_SOR_CFG,
-+      IO_ACX_ECPU_CTRL
-+};
-+/* ***** ABSOLUTELY ALWAYS KEEP OFFSETS IN SYNC WITH THE INITIALIZATION
-+** OF THE I/O ARRAYS!!!! (grep for '^IO_ACX') ***** */
-+
-+/* Values for IO_ACX_INT_TRIG register: */
-+/* inform hw that rxdesc in queue needs processing */
-+#define INT_TRIG_RXPRC                0x08
-+/* inform hw that txdesc in queue needs processing */
-+#define INT_TRIG_TXPRC                0x04
-+/* ack that we received info from info mailbox */
-+#define INT_TRIG_INFOACK      0x02
-+/* inform hw that we have filled command mailbox */
-+#define INT_TRIG_CMD          0x01
-+
-+struct txhostdesc {
-+      acx_ptr data_phy;                       /* 0x00 [u8 *] */
-+      u16     data_offset;                    /* 0x04 */
-+      u16     reserved;                       /* 0x06 */
-+      u16     Ctl_16; /* 16bit value, endianness!! */
-+      u16     length;                 /* 0x0a */
-+      acx_ptr desc_phy_next;          /* 0x0c [txhostdesc *] */
-+      acx_ptr pNext;                  /* 0x10 [txhostdesc *] */
-+      u32     Status;                 /* 0x14, unused on Tx */
-+/* From here on you can use this area as you want (variable length, too!) */
-+      u8      *data;
-+} ACX_PACKED;
-+
-+struct rxhostdesc {
-+      acx_ptr data_phy;                       /* 0x00 [rxbuffer_t *] */
-+      u16     data_offset;                    /* 0x04 */
-+      u16     reserved;                       /* 0x06 */
-+      u16     Ctl_16;                 /* 0x08; 16bit value, endianness!! */
-+      u16     length;                 /* 0x0a */
-+      acx_ptr desc_phy_next;          /* 0x0c [rxhostdesc_t *] */
-+      acx_ptr pNext;                  /* 0x10 [rxhostdesc_t *] */
-+      u32     Status;                 /* 0x14 */
-+/* From here on you can use this area as you want (variable length, too!) */
-+      rxbuffer_t *data;
-+} ACX_PACKED;
-+
-+#endif /* ACX_PCI */
-+
-+/***********************************************************************
-+** USB structures and constants
-+*/
-+#ifdef ACX_USB
-+
-+/* Used for usb_txbuffer.desc field */
-+#define USB_TXBUF_TXDESC      0xA
-+/* Size of header (everything up to data[]) */
-+#define USB_TXBUF_HDRSIZE     14
-+typedef struct usb_txbuffer {
-+      u16     desc;
-+      u16     mpdu_len;
-+      u8      queue_index;
-+      u8      rate;
-+      u32     hostdata;
-+      u8      ctrl1;
-+      u8      ctrl2;
-+      u16     data_len;
-+      /* wlan packet content is placed here: */
-+      u8      data[WLAN_A4FR_MAXLEN_WEP_FCS];
-+} ACX_PACKED usb_txbuffer_t;
-+
-+/* USB returns either rx packets (see rxbuffer) or
-+** these "tx status" structs: */
-+typedef struct usb_txstatus {
-+      u16     mac_cnt_rcvd;           /* only 12 bits are len! (0xfff) */
-+      u8      queue_index;
-+      u8      mac_status;             /* seen 0x20 on tx failure */
-+      u32     hostdata;
-+      u8      rate;
-+      u8      ack_failures;
-+      u8      rts_failures;
-+      u8      rts_ok;
-+} ACX_PACKED usb_txstatus_t;
-+
-+typedef struct usb_tx {
-+      unsigned        busy:1;
-+      struct urb      *urb;
-+      acx_device_t    *adev;
-+      /* actual USB bulk output data block is here: */
-+      usb_txbuffer_t  bulkout;
-+} usb_tx_t;
-+
-+struct usb_rx_plain {
-+      unsigned        busy:1;
-+      struct urb      *urb;
-+      acx_device_t    *adev;
-+      rxbuffer_t      bulkin;
-+};
-+
-+typedef struct usb_rx {
-+      unsigned        busy:1;
-+      struct urb      *urb;
-+      acx_device_t    *adev;
-+      rxbuffer_t      bulkin;
-+ /* Make entire structure 4k. Report if it breaks something. */
-+      u8 padding[4*1024 - sizeof(struct usb_rx_plain)];
-+} usb_rx_t;
-+#endif /* ACX_USB */
-+
-+
-+/* Config Option structs */
-+
-+typedef struct co_antennas {
-+      u8      type;
-+      u8      len;
-+      u8      list[2];
-+} ACX_PACKED co_antennas_t;
-+
-+typedef struct co_powerlevels {
-+      u8      type;
-+      u8      len;
-+      u16     list[8];
-+} ACX_PACKED co_powerlevels_t;
-+
-+typedef struct co_datarates {
-+      u8      type;
-+      u8      len;
-+      u8      list[8];
-+} ACX_PACKED co_datarates_t;
-+
-+typedef struct co_domains {
-+      u8      type;
-+      u8      len;
-+      u8      list[6];
-+} ACX_PACKED co_domains_t;
-+
-+typedef struct co_product_id {
-+      u8      type;
-+      u8      len;
-+      u8      list[128];
-+} ACX_PACKED co_product_id_t;
-+
-+typedef struct co_manuf_id {
-+      u8      type;
-+      u8      len;
-+      u8      list[128];
-+} ACX_PACKED co_manuf_t;
-+
-+typedef struct co_fixed {
-+      char    NVSv[8];
-+/*    u16     NVS_vendor_offs;        ACX111-only */
-+/*    u16     unknown;                ACX111-only */
-+      u8      MAC[6]; /* ACX100-only */
-+      u16     probe_delay;    /* ACX100-only */
-+      u32     eof_memory;
-+      u8      dot11CCAModes;
-+      u8      dot11Diversity;
-+      u8      dot11ShortPreambleOption;
-+      u8      dot11PBCCOption;
-+      u8      dot11ChannelAgility;
-+      u8      dot11PhyType; /* FIXME: does 802.11 call it "dot11PHYType"? */
-+      u8      dot11TempType;
-+      u8      table_count;
-+} ACX_PACKED co_fixed_t;
-+
-+typedef struct acx111_ie_configoption {
-+      u16                     type;
-+      u16                     len;
-+/* Do not access below members directly, they are in fact variable length */
-+      co_fixed_t              fixed;
-+      co_antennas_t           antennas;
-+      co_powerlevels_t        power_levels;
-+      co_datarates_t          data_rates;
-+      co_domains_t            domains;
-+      co_product_id_t         product_id;
-+      co_manuf_t              manufacturer;
-+      u8                      _padding[4];
-+} ACX_PACKED acx111_ie_configoption_t;
-+
-+
-+/***********************************************************************
-+** Main acx per-device data structure
-+*/
-+#define ACX_STATE_FW_LOADED   0x01
-+#define ACX_STATE_IFACE_UP    0x02
-+
-+/* MAC mode (BSS type) defines
-+ * Note that they shouldn't be redefined, since they are also used
-+ * during communication with firmware */
-+#define ACX_MODE_0_ADHOC      0
-+#define ACX_MODE_1_UNUSED     1
-+#define ACX_MODE_2_STA                2
-+#define ACX_MODE_3_AP         3
-+/* These are our own inventions. Sending these to firmware
-+** makes it stop emitting beacons, which is exactly what we want
-+** for these modes */
-+#define ACX_MODE_MONITOR      0xfe
-+#define ACX_MODE_OFF          0xff
-+/* 'Submode': identifies exact status of ADHOC/STA host */
-+#define ACX_STATUS_0_STOPPED          0
-+#define ACX_STATUS_1_SCANNING         1
-+#define ACX_STATUS_2_WAIT_AUTH                2
-+#define ACX_STATUS_3_AUTHENTICATED    3
-+#define ACX_STATUS_4_ASSOCIATED               4
-+
-+/* FIXME: this should be named something like struct acx_priv (typedef'd to
-+ * acx_priv_t) */
-+
-+/* non-firmware struct, no packing necessary */
-+struct acx_device {
-+      /* most frequent accesses first (dereferencing and cache line!) */
-+
-+      /*** Locking ***/
-+      /* FIXME: try to convert semaphore to more efficient mutex according
-+         to Ingo Molnar's docs (but not before driver is in mainline or
-+               pre-mutex Linux 2.6.10 is very outdated). */
-+      struct semaphore        sem;
-+      spinlock_t              lock;
-+#if defined(PARANOID_LOCKING) /* Lock debugging */
-+      const char              *last_sem;
-+      const char              *last_lock;
-+      unsigned long           sem_time;
-+      unsigned long           lock_time;
-+#endif
-+#ifdef ACX_MEM
-+        spinlock_t              txbuf_lock;
-+#endif
-+
-+      /*** Linux network device ***/
-+      struct net_device       *ndev;          /* pointer to linux netdevice */
-+
-+      /*** Device statistics ***/
-+      struct net_device_stats stats;          /* net device statistics */
-+#ifdef WIRELESS_EXT
-+      struct iw_statistics    wstats;         /* wireless statistics */
-+#endif
-+      /*** Power managment ***/
-+      struct pm_dev           *pm;            /* PM crap */
-+
-+      /*** Management timer ***/
-+      struct timer_list       mgmt_timer;
-+
-+      /*** Hardware identification ***/
-+      const char              *chip_name;
-+      u8                      dev_type;
-+      u8                      chip_type;
-+      u8                      form_factor;
-+      u8                      radio_type;
-+      u8                      eeprom_version;
-+
-+      /*** Config retrieved from EEPROM ***/
-+      char                    cfgopt_NVSv[8];
-+      u16                     cfgopt_NVS_vendor_offs;
-+      u8                      cfgopt_MAC[6];
-+      u16                     cfgopt_probe_delay;
-+      u32                     cfgopt_eof_memory;
-+      u8                      cfgopt_dot11CCAModes;
-+      u8                      cfgopt_dot11Diversity;
-+      u8                      cfgopt_dot11ShortPreambleOption;
-+      u8                      cfgopt_dot11PBCCOption;
-+      u8                      cfgopt_dot11ChannelAgility;
-+      u8                      cfgopt_dot11PhyType;
-+      u8                      cfgopt_dot11TempType;
-+      co_antennas_t           cfgopt_antennas;
-+      co_powerlevels_t        cfgopt_power_levels;
-+      co_datarates_t          cfgopt_data_rates;
-+      co_domains_t            cfgopt_domains;
-+      co_product_id_t         cfgopt_product_id;
-+      co_manuf_t              cfgopt_manufacturer;
-+
-+      /*** Firmware identification ***/
-+      char            firmware_version[FW_ID_SIZE+1];
-+      u32             firmware_numver;
-+      u32             firmware_id;
-+      const u16       *ie_len;
-+      const u16       *ie_len_dot11;
-+
-+      /*** Device state ***/
-+      u16             dev_state_mask;
-+      u8              led_power;              /* power LED status */
-+      u32             get_mask;               /* mask of settings to fetch from the card */
-+      u32             set_mask;               /* mask of settings to write to the card */
-+
-+      /* Barely used in USB case */
-+      u16             irq_status;
-+
-+      u8              after_interrupt_jobs;   /* mini job list for doing actions after an interrupt occurred */
-+      WORK_STRUCT     after_interrupt_task;   /* our task for after interrupt actions */
-+
-+      /*** scanning ***/
-+      u16             scan_count;             /* number of times to do channel scan */
-+      u8              scan_mode;              /* 0 == active, 1 == passive, 2 == background */
-+      u8              scan_rate;
-+      u16             scan_duration;
-+      u16             scan_probe_delay;
-+#if WIRELESS_EXT > 15
-+      struct iw_spy_data      spy_data;       /* FIXME: needs to be implemented! */
-+#endif
-+
-+      /*** Wireless network settings ***/
-+      /* copy of the device address (ifconfig hw ether) that we actually use
-+      ** for 802.11; copied over from the network device's MAC address
-+      ** (ifconfig) when it makes sense only */
-+      u8              dev_addr[MAX_ADDR_LEN];
-+      u8              bssid[ETH_ALEN];        /* the BSSID after having joined */
-+      u8              ap[ETH_ALEN];           /* The AP we want, FF:FF:FF:FF:FF:FF is any */
-+      u16             aid;                    /* The Association ID sent from the AP / last used AID if we're an AP */
-+      u16             mode;                   /* mode from iwconfig */
-+      int             monitor_type;           /* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_PRISM */
-+      u16             status;                 /* 802.11 association status */
-+      u8              essid_active;           /* specific ESSID active, or select any? */
-+      u8              essid_len;              /* to avoid dozens of strlen() */
-+      /* INCLUDES \0 termination for easy printf - but many places
-+      ** simply want the string data memcpy'd plus a length indicator!
-+      ** Keep that in mind... */
-+      char            essid[IW_ESSID_MAX_SIZE+1];
-+      /* essid we are going to use for association, in case of "essid 'any'"
-+      ** and in case of hidden ESSID (use configured ESSID then) */
-+      char            essid_for_assoc[IW_ESSID_MAX_SIZE+1];
-+      char            nick[IW_ESSID_MAX_SIZE+1]; /* see essid! */
-+      u8              channel;
-+      u8              reg_dom_id;             /* reg domain setting */
-+      u16             reg_dom_chanmask;
-+      u16             auth_or_assoc_retries;
-+      u16             scan_retries;
-+      unsigned long   scan_start;             /* YES, jiffies is defined as "unsigned long" */
-+
-+      /* stations known to us (if we're an ap) */
-+      client_t        sta_list[32];           /* tab is larger than list, so that */
-+      client_t        *sta_hash_tab[64];      /* hash collisions are not likely */
-+      client_t        *ap_client;             /* this one is our AP (STA mode only) */
-+
-+      int             dup_count;
-+      int             nondup_count;
-+      unsigned long   dup_msg_expiry;
-+      u16             last_seq_ctrl;          /* duplicate packet detection */
-+
-+      /* 802.11 power save mode */
-+      u8              ps_wakeup_cfg;
-+      u8              ps_listen_interval;
-+      u8              ps_options;
-+      u8              ps_hangover_period;
-+      u32             ps_enhanced_transition_time;
-+      u32             ps_beacon_rx_time;
-+
-+      /*** PHY settings ***/
-+      u8              fallback_threshold;
-+      u8              stepup_threshold;
-+      u16             rate_basic;
-+      u16             rate_oper;
-+      u16             rate_bcast;
-+      u16             rate_bcast100;
-+      u8              rate_auto;              /* false if "iwconfig rate N" (WITHOUT 'auto'!) */
-+      u8              preamble_mode;          /* 0 == Long Preamble, 1 == Short, 2 == Auto */
-+      u8              preamble_cur;
-+
-+      u8              tx_disabled;
-+      u8              tx_level_dbm;
-+      /* u8           tx_level_val; */
-+      /* u8           tx_level_auto;          whether to do automatic power adjustment */
-+
-+      unsigned long   recalib_time_last_success;
-+      unsigned long   recalib_time_last_attempt;
-+      int             recalib_failure_count;
-+      int             recalib_msg_ratelimit;
-+      int             retry_errors_msg_ratelimit;
-+
-+      unsigned long   brange_time_last_state_change;  /* time the power LED was last changed */
-+      u8              brange_last_state;      /* last state of the LED */
-+      u8              brange_max_quality;     /* maximum quality that equates to full speed */
-+
-+      u8              sensitivity;
-+      u8              antenna;                /* antenna settings */
-+      u8              ed_threshold;           /* energy detect threshold */
-+      u8              cca;                    /* clear channel assessment */
-+
-+      u16             rts_threshold;
-+      u16             frag_threshold;
-+      u32             short_retry;
-+      u32             long_retry;
-+      u16             msdu_lifetime;
-+      u16             listen_interval;        /* given in units of beacon interval */
-+      u32             beacon_interval;
-+
-+      u16             capabilities;
-+      u8              rate_supported_len;
-+      u8              rate_supported[13];
-+
-+      /*** Encryption settings (WEP) ***/
-+      u32             auth_alg;               /* used in transmit_authen1 */
-+      u8              wep_enabled;
-+      u8              wep_restricted;
-+      u8              wep_current_index;
-+      wep_key_t       wep_keys[DOT11_MAX_DEFAULT_WEP_KEYS];   /* the default WEP keys */
-+      key_struct_t    wep_key_struct[10];
-+
-+      /*** Unknown ***/
-+      u8              dtim_interval;
-+
-+#ifdef ACX_MEM
-+        u32 acx_txbuf_start;
-+        int acx_txbuf_numblocks;
-+        u32 acx_txbuf_free;                    /* addr of head of free list          */
-+        int acx_txbuf_blocks_free;             /* how many are still open            */
-+        queueindicator_t *acx_queue_indicator;
-+#endif
-+
-+      /*** Card Rx/Tx management ***/
-+      u16             rx_config_1;
-+      u16             rx_config_2;
-+      u16             memblocksize;
-+      unsigned int    tx_free;
-+      unsigned int    tx_head; /* keep as close as possible to Tx stuff below (cache line) */
-+      u16             phy_header_len;
-+
-+/*************************************************************************
-+ *** PCI/USB/... must be last or else hw agnostic code breaks horribly ***
-+ *************************************************************************/
-+
-+      /* hack to let common code compile. FIXME */
-+      dma_addr_t      rxhostdesc_startphy;
-+
-+      /*** PCI stuff ***/
-+#if defined(ACX_PCI) || defined(ACX_MEM)
-+      /* pointers to tx buffers, tx host descriptors (in host memory)
-+      ** and tx descs in device memory */
-+      unsigned int    tx_tail;
-+      u8              *txbuf_start;
-+      txhostdesc_t    *txhostdesc_start;
-+      txdesc_t        *txdesc_start;  /* points to PCI-mapped memory */
-+      dma_addr_t      txbuf_startphy;
-+      dma_addr_t      txhostdesc_startphy;
-+      /* sizes of above host memory areas */
-+      unsigned int    txbuf_area_size;
-+      unsigned int    txhostdesc_area_size;
-+
-+      unsigned int    txdesc_size;    /* size of txdesc; ACX111 = ACX100 + 4 */
-+      client_t        *txc[TX_CNT];
-+      u16             txr[TX_CNT];
-+
-+      /* same for rx */
-+      unsigned int    rx_tail;
-+      rxbuffer_t      *rxbuf_start;
-+      rxhostdesc_t    *rxhostdesc_start;
-+      rxdesc_t        *rxdesc_start;
-+      /* physical addresses of above host memory areas */
-+      dma_addr_t      rxbuf_startphy;
-+      /* dma_addr_t   rxhostdesc_startphy; */
-+      unsigned int    rxbuf_area_size;
-+      unsigned int    rxhostdesc_area_size;
-+
-+      u8              need_radio_fw;
-+      u8              irqs_active;    /* whether irq sending is activated */
-+
-+      const u16       *io;            /* points to ACX100 or ACX111 PCI I/O register address set */
-+
-+#ifdef ACX_PCI
-+      struct pci_dev  *pdev;
-+#endif
-+#ifdef ACX_MEM
-+      struct device   *dev;
-+#endif
-+
-+#ifdef ACX_PCI
-+      unsigned long   membase;
-+#endif
-+#ifdef ACX_MEM
-+      volatile u32    *membase;
-+#endif
-+      unsigned long   membase2;
-+#ifdef ACX_PCI
-+      void __iomem    *iobase;
-+#endif
-+#ifdef ACX_MEM
-+      volatile u32    *iobase;
-+#endif
-+      void __iomem    *iobase2;
-+      /* command interface */
-+      u8 __iomem      *cmd_area;
-+      u8 __iomem      *info_area;
-+
-+      u16             irq_mask;               /* interrupt types to mask out (not wanted) with many IRQs activated */
-+      u16             irq_mask_off;           /* interrupt types to mask out (not wanted) with IRQs off */
-+      unsigned int    irq_loops_this_jiffy;
-+      unsigned long   irq_last_jiffies;
-+#endif
-+
-+      /*** USB stuff ***/
-+#ifdef ACX_USB
-+      struct usb_device       *usbdev;
-+
-+      rxbuffer_t      rxtruncbuf;
-+
-+      usb_tx_t        *usb_tx;
-+      usb_rx_t        *usb_rx;
-+
-+      int             bulkinep;       /* bulk-in endpoint */
-+      int             bulkoutep;      /* bulk-out endpoint */
-+      int             rxtruncsize;
-+#endif
-+
-+};
-+
-+static inline acx_device_t*
-+ndev2adev(struct net_device *ndev)
-+{
-+      return netdev_priv(ndev);
-+}
-+
-+
-+/* For use with ACX1xx_IE_RXCONFIG */
-+/*  bit     description
-+ *    13   include additional header (length etc.) *required*
-+ *            struct is defined in 'struct rxbuffer'
-+ *            is this bit acx100 only? does acx111 always put the header,
-+ *            and bit setting is irrelevant? --vda
-+ *    10   receive frames only with SSID used in last join cmd
-+ *     9   discard broadcast
-+ *     8   receive packets for multicast address 1
-+ *     7   receive packets for multicast address 0
-+ *     6   discard all multicast packets
-+ *     5   discard frames from foreign BSSID
-+ *     4   discard frames with foreign destination MAC address
-+ *     3   promiscuous mode (receive ALL frames, disable filter)
-+ *     2   include FCS
-+ *     1   include phy header
-+ *     0   ???
-+ */
-+#define RX_CFG1_INCLUDE_RXBUF_HDR     0x2000 /* ACX100 only */
-+#define RX_CFG1_FILTER_SSID           0x0400
-+#define RX_CFG1_FILTER_BCAST          0x0200
-+#define RX_CFG1_RCV_MC_ADDR1          0x0100
-+#define RX_CFG1_RCV_MC_ADDR0          0x0080
-+#define RX_CFG1_FILTER_ALL_MULTI      0x0040
-+#define RX_CFG1_FILTER_BSSID          0x0020
-+#define RX_CFG1_FILTER_MAC            0x0010
-+#define RX_CFG1_RCV_PROMISCUOUS               0x0008
-+#define RX_CFG1_INCLUDE_FCS           0x0004
-+#define RX_CFG1_INCLUDE_PHY_HDR               (WANT_PHY_HDR ? 0x0002 : 0)
-+/*  bit     description
-+ *    11   receive association requests etc.
-+ *    10   receive authentication frames
-+ *     9   receive beacon frames
-+ *     8   receive contention free packets
-+ *     7   receive control frames
-+ *     6   receive data frames
-+ *     5   receive broken frames
-+ *     4   receive management frames
-+ *     3   receive probe requests
-+ *     2   receive probe responses
-+ *     1   receive RTS/CTS/ACK frames
-+ *     0   receive other
-+ */
-+#define RX_CFG2_RCV_ASSOC_REQ         0x0800
-+#define RX_CFG2_RCV_AUTH_FRAMES               0x0400
-+#define RX_CFG2_RCV_BEACON_FRAMES     0x0200
-+#define RX_CFG2_RCV_CONTENTION_FREE   0x0100
-+#define RX_CFG2_RCV_CTRL_FRAMES               0x0080
-+#define RX_CFG2_RCV_DATA_FRAMES               0x0040
-+#define RX_CFG2_RCV_BROKEN_FRAMES     0x0020
-+#define RX_CFG2_RCV_MGMT_FRAMES               0x0010
-+#define RX_CFG2_RCV_PROBE_REQ         0x0008
-+#define RX_CFG2_RCV_PROBE_RESP                0x0004
-+#define RX_CFG2_RCV_ACK_FRAMES                0x0002
-+#define RX_CFG2_RCV_OTHER             0x0001
-+
-+/* For use with ACX1xx_IE_FEATURE_CONFIG */
-+#define FEATURE1_80MHZ_CLOCK  0x00000040L
-+#define FEATURE1_4X           0x00000020L
-+#define FEATURE1_LOW_RX               0x00000008L
-+#define FEATURE1_EXTRA_LOW_RX 0x00000001L
-+
-+#define FEATURE2_SNIFFER      0x00000080L
-+#define FEATURE2_NO_TXCRYPT   0x00000001L
-+
-+/*-- get and set mask values --*/
-+#define GETSET_LED_POWER      0x00000001L
-+#define GETSET_STATION_ID     0x00000002L
-+#define SET_TEMPLATES         0x00000004L
-+#define SET_STA_LIST          0x00000008L
-+#define GETSET_TX             0x00000010L
-+#define GETSET_RX             0x00000020L
-+#define SET_RXCONFIG          0x00000040L
-+#define GETSET_ANTENNA                0x00000080L
-+#define GETSET_SENSITIVITY    0x00000100L
-+#define GETSET_TXPOWER                0x00000200L
-+#define GETSET_ED_THRESH      0x00000400L
-+#define GETSET_CCA            0x00000800L
-+#define GETSET_POWER_80211    0x00001000L
-+#define GETSET_RETRY          0x00002000L
-+#define GETSET_REG_DOMAIN     0x00004000L
-+#define GETSET_CHANNEL                0x00008000L
-+/* Used when ESSID changes etc and we need to scan for AP anew */
-+#define GETSET_RESCAN         0x00010000L
-+#define GETSET_MODE           0x00020000L
-+#define GETSET_WEP            0x00040000L
-+#define SET_WEP_OPTIONS               0x00080000L
-+#define SET_MSDU_LIFETIME     0x00100000L
-+#define SET_RATE_FALLBACK     0x00200000L
-+
-+/* keep in sync with the above */
-+#define GETSET_ALL    (0 \
-+/* GETSET_LED_POWER */        | 0x00000001L \
-+/* GETSET_STATION_ID */       | 0x00000002L \
-+/* SET_TEMPLATES */   | 0x00000004L \
-+/* SET_STA_LIST */    | 0x00000008L \
-+/* GETSET_TX */               | 0x00000010L \
-+/* GETSET_RX */               | 0x00000020L \
-+/* SET_RXCONFIG */    | 0x00000040L \
-+/* GETSET_ANTENNA */  | 0x00000080L \
-+/* GETSET_SENSITIVITY */| 0x00000100L \
-+/* GETSET_TXPOWER */  | 0x00000200L \
-+/* GETSET_ED_THRESH */        | 0x00000400L \
-+/* GETSET_CCA */      | 0x00000800L \
-+/* GETSET_POWER_80211 */| 0x00001000L \
-+/* GETSET_RETRY */    | 0x00002000L \
-+/* GETSET_REG_DOMAIN */       | 0x00004000L \
-+/* GETSET_CHANNEL */  | 0x00008000L \
-+/* GETSET_RESCAN */   | 0x00010000L \
-+/* GETSET_MODE */     | 0x00020000L \
-+/* GETSET_WEP */      | 0x00040000L \
-+/* SET_WEP_OPTIONS */ | 0x00080000L \
-+/* SET_MSDU_LIFETIME */       | 0x00100000L \
-+/* SET_RATE_FALLBACK */       | 0x00200000L \
-+                      )
-+
-+
-+/***********************************************************************
-+** Firmware loading
-+*/
-+#include <linux/firmware.h>   /* request_firmware() */
-+#include <linux/pci.h>                /* struct pci_device */
-+
-+
-+/***********************************************************************
-+*/
-+typedef struct acx100_ie_memblocksize {
-+      u16     type;
-+      u16     len;
-+      u16     size;
-+} ACX_PACKED acx100_ie_memblocksize_t;
-+
-+typedef struct acx100_ie_queueconfig {
-+      u16     type;
-+      u16     len;
-+      u32     AreaSize;
-+      u32     RxQueueStart;
-+      u8      QueueOptions;
-+      u8      NumTxQueues;
-+      u8      NumRxDesc;       /* for USB only */
-+      u8      pad1;
-+      u32     QueueEnd;
-+      u32     HostQueueEnd; /* QueueEnd2 */
-+      u32     TxQueueStart;
-+      u8      TxQueuePri;
-+      u8      NumTxDesc;
-+      u16     pad2;
-+} ACX_PACKED acx100_ie_queueconfig_t;
-+
-+typedef struct acx111_ie_queueconfig {
-+      u16     type;
-+      u16     len;
-+      u32     tx_memory_block_address;
-+      u32     rx_memory_block_address;
-+      u32     rx1_queue_address;
-+      u32     reserved1;
-+      u32     tx1_queue_address;
-+      u8      tx1_attributes;
-+      u16     reserved2;
-+      u8      reserved3;
-+} ACX_PACKED acx111_ie_queueconfig_t;
-+
-+typedef struct acx100_ie_memconfigoption {
-+      u16     type;
-+      u16     len;
-+      u32     DMA_config;
-+      acx_ptr pRxHostDesc;
-+      u32     rx_mem;
-+      u32     tx_mem;
-+      u16     RxBlockNum;
-+      u16     TxBlockNum;
-+} ACX_PACKED acx100_ie_memconfigoption_t;
-+
-+typedef struct acx111_ie_memoryconfig {
-+      u16     type;
-+      u16     len;
-+      u16     no_of_stations;
-+      u16     memory_block_size;
-+      u8      tx_rx_memory_block_allocation;
-+      u8      count_rx_queues;
-+      u8      count_tx_queues;
-+      u8      options;
-+      u8      fragmentation;
-+      u16     reserved1;
-+      u8      reserved2;
-+
-+      /* start of rx1 block */
-+      u8      rx_queue1_count_descs;
-+      u8      rx_queue1_reserved1;
-+      u8      rx_queue1_type; /* must be set to 7 */
-+      u8      rx_queue1_prio; /* must be set to 0 */
-+      acx_ptr rx_queue1_host_rx_start;
-+      /* end of rx1 block */
-+
-+      /* start of tx1 block */
-+      u8      tx_queue1_count_descs;
-+      u8      tx_queue1_reserved1;
-+      u8      tx_queue1_reserved2;
-+      u8      tx_queue1_attributes;
-+      /* end of tx1 block */
-+} ACX_PACKED acx111_ie_memoryconfig_t;
-+
-+typedef struct acx_ie_memmap {
-+      u16     type;
-+      u16     len;
-+      u32     CodeStart;
-+      u32     CodeEnd;
-+      u32     WEPCacheStart;
-+      u32     WEPCacheEnd;
-+      u32     PacketTemplateStart;
-+      u32     PacketTemplateEnd;
-+      u32     QueueStart;
-+      u32     QueueEnd;
-+      u32     PoolStart;
-+      u32     PoolEnd;
-+} ACX_PACKED acx_ie_memmap_t;
-+
-+typedef struct acx111_ie_feature_config {
-+      u16     type;
-+      u16     len;
-+      u32     feature_options;
-+      u32     data_flow_options;
-+} ACX_PACKED acx111_ie_feature_config_t;
-+
-+typedef struct acx111_ie_tx_level {
-+      u16     type;
-+      u16     len;
-+      u8      level;
-+} ACX_PACKED acx111_ie_tx_level_t;
-+
-+#define PS_CFG_ENABLE         0x80
-+#define PS_CFG_PENDING                0x40 /* status flag when entering PS */
-+#define PS_CFG_WAKEUP_MODE_MASK       0x07
-+#define PS_CFG_WAKEUP_BY_HOST 0x03
-+#define PS_CFG_WAKEUP_EACH_ITVL       0x02
-+#define PS_CFG_WAKEUP_ON_DTIM 0x01
-+#define PS_CFG_WAKEUP_ALL_BEAC        0x00
-+
-+/* Enhanced PS mode: sleep until Rx Beacon w/ the STA's AID bit set
-+** in the TIM; newer firmwares only(?) */
-+#define PS_OPT_ENA_ENHANCED_PS        0x04
-+#define PS_OPT_TX_PSPOLL      0x02 /* send PSPoll frame to fetch waiting frames from AP (on frame with matching AID) */
-+#define PS_OPT_STILL_RCV_BCASTS       0x01
-+
-+typedef struct acx100_ie_powersave {
-+      u16     type;
-+      u16     len;
-+      u8      wakeup_cfg;
-+      u8      listen_interval; /* for EACH_ITVL: wake up every "beacon units" interval */
-+      u8      options;
-+      u8      hangover_period; /* remaining wake time after Tx MPDU w/ PS bit, in values of 1/1024 seconds */
-+      u16     enhanced_ps_transition_time; /* rem. wake time for Enh. PS */
-+} ACX_PACKED acx100_ie_powersave_t;
-+
-+typedef struct acx111_ie_powersave {
-+      u16     type;
-+      u16     len;
-+      u8      wakeup_cfg;
-+      u8      listen_interval; /* for EACH_ITVL: wake up every "beacon units" interval */
-+      u8      options;
-+      u8      hangover_period; /* remaining wake time after Tx MPDU w/ PS bit, in values of 1/1024 seconds */
-+      u32     beacon_rx_time;
-+      u32     enhanced_ps_transition_time; /* rem. wake time for Enh. PS */
-+} ACX_PACKED acx111_ie_powersave_t;
-+
-+
-+/***********************************************************************
-+** Commands and template structures
-+*/
-+
-+/*
-+** SCAN command structure
-+**
-+** even though acx100 scan rates match RATE100 constants,
-+** acx111 ones do not match! Therefore we do not use RATE100 #defines */
-+#define ACX_SCAN_RATE_1               10
-+#define ACX_SCAN_RATE_2               20
-+#define ACX_SCAN_RATE_5               55
-+#define ACX_SCAN_RATE_11      110
-+#define ACX_SCAN_RATE_22      220
-+#define ACX_SCAN_RATE_PBCC    0x80    /* OR with this if needed */
-+#define ACX_SCAN_OPT_ACTIVE   0x00    /* a bit mask */
-+#define ACX_SCAN_OPT_PASSIVE  0x01
-+/* Background scan: we go into Power Save mode (by transmitting
-+** NULL data frame to AP with the power mgmt bit set), do the scan,
-+** and then exit Power Save mode. A plus is that AP buffers frames
-+** for us while we do background scan. Thus we avoid frame losses.
-+** Background scan can be active or passive, just like normal one */
-+#define ACX_SCAN_OPT_BACKGROUND       0x02
-+typedef struct acx100_scan {
-+      u16     count;  /* number of scans to do, 0xffff == continuous */
-+      u16     start_chan;
-+      u16     flags;  /* channel list mask; 0x8000 == all channels? */
-+      u8      max_rate;       /* max. probe rate */
-+      u8      options;        /* bit mask, see defines above */
-+      u16     chan_duration;
-+      u16     max_probe_delay;
-+} ACX_PACKED acx100_scan_t;                   /* length 0xc */
-+
-+#define ACX111_SCAN_RATE_6    0x0B
-+#define ACX111_SCAN_RATE_9    0x0F
-+#define ACX111_SCAN_RATE_12   0x0A
-+#define ACX111_SCAN_RATE_18   0x0E
-+#define ACX111_SCAN_RATE_24   0x09
-+#define ACX111_SCAN_RATE_36   0x0D
-+#define ACX111_SCAN_RATE_48   0x08
-+#define ACX111_SCAN_RATE_54   0x0C
-+#define ACX111_SCAN_OPT_5GHZ    0x04  /* else 2.4GHZ */
-+#define ACX111_SCAN_MOD_SHORTPRE 0x01 /* you can combine SHORTPRE and PBCC */
-+#define ACX111_SCAN_MOD_PBCC  0x80
-+#define ACX111_SCAN_MOD_OFDM  0x40
-+typedef struct acx111_scan {
-+      u16     count;          /* number of scans to do */
-+      u8      channel_list_select; /* 0: scan all channels, 1: from chan_list only */
-+      u16     reserved1;
-+      u8      reserved2;
-+      u8      rate;           /* rate for probe requests (if active scan) */
-+      u8      options;                /* bit mask, see defines above */
-+      u16     chan_duration;  /* min time to wait for reply on one channel (in TU) */
-+                                              /* (active scan only) (802.11 section 11.1.3.2.2) */
-+      u16     max_probe_delay;        /* max time to wait for reply on one channel (active scan) */
-+                                              /* time to listen on a channel (passive scan) */
-+      u8      modulation;
-+      u8      channel_list[26];       /* bits 7:0 first byte: channels 8:1 */
-+                                              /* bits 7:0 second byte: channels 16:9 */
-+                                              /* 26 bytes is enough to cover 802.11a */
-+} ACX_PACKED acx111_scan_t;
-+
-+
-+/*
-+** Radio calibration command structure
-+*/
-+typedef struct acx111_cmd_radiocalib {
-+/* 0x80000000 == automatic calibration by firmware, according to interval;
-+ * bits 0..3: select calibration methods to go through:
-+ * calib based on DC, AfeDC, Tx mismatch, Tx equilization */
-+      u32     methods;
-+      u32     interval;
-+} ACX_PACKED acx111_cmd_radiocalib_t;
-+
-+
-+/*
-+** Packet template structures
-+**
-+** Packet templates store contents of Beacon, Probe response, Probe request,
-+** Null data frame, and TIM data frame. Firmware automatically transmits
-+** contents of template at appropriate time:
-+** - Beacon: when configured as AP or Ad-hoc
-+** - Probe response: when configured as AP or Ad-hoc, whenever
-+**   a Probe request frame is received
-+** - Probe request: when host issues SCAN command (active)
-+** - Null data frame: when entering 802.11 power save mode
-+** - TIM data: at the end of Beacon frames (if no TIM template
-+**   is configured, then transmits default TIM)
-+** NB:
-+** - size field must be set to size of actual template
-+**   (NOT sizeof(struct) - templates are variable in length),
-+**   size field is not itself counted.
-+** - members flagged with an asterisk must be initialized with host,
-+**   rest must be zero filled.
-+** - variable length fields shown only in comments */
-+typedef struct acx_template_tim {
-+      u16     size;
-+      u8      tim_eid;        /* 00 1 TIM IE ID * */
-+      u8      len;            /* 01 1 Length * */
-+      u8      dtim_cnt;       /* 02 1 DTIM Count */
-+      u8      dtim_period;    /* 03 1 DTIM Period */
-+      u8      bitmap_ctrl;    /* 04 1 Bitmap Control * (except bit0) */
-+                                      /* 05 n Partial Virtual Bitmap * */
-+      u8      variable[0x100 - 1-1-1-1-1];
-+} ACX_PACKED acx_template_tim_t;
-+
-+typedef struct acx_template_probereq {
-+      u16     size;
-+      u16     fc;             /* 00 2 fc * */
-+      u16     dur;            /* 02 2 Duration */
-+      u8      da[6];  /* 04 6 Destination Address * */
-+      u8      sa[6];  /* 0A 6 Source Address * */
-+      u8      bssid[6];       /* 10 6 BSSID * */
-+      u16     seq;            /* 16 2 Sequence Control */
-+                                      /* 18 n SSID * */
-+                                      /* nn n Supported Rates * */
-+      u8      variable[0x44 - 2-2-6-6-6-2];
-+} ACX_PACKED acx_template_probereq_t;
-+
-+typedef struct acx_template_proberesp {
-+      u16     size;
-+      u16     fc;             /* 00 2 fc * (bits [15:12] and [10:8] per 802.11 section 7.1.3.1) */
-+      u16     dur;            /* 02 2 Duration */
-+      u8      da[6];  /* 04 6 Destination Address */
-+      u8      sa[6];  /* 0A 6 Source Address */
-+      u8      bssid[6];       /* 10 6 BSSID */
-+      u16     seq;            /* 16 2 Sequence Control */
-+      u8      timestamp[8];/* 18 8 Timestamp */
-+      u16     beacon_interval; /* 20 2 Beacon Interval * */
-+      u16     cap;            /* 22 2 Capability Information * */
-+                                      /* 24 n SSID * */
-+                                      /* nn n Supported Rates * */
-+                                      /* nn 1 DS Parameter Set * */
-+      u8      variable[0x54 - 2-2-6-6-6-2-8-2-2];
-+} ACX_PACKED acx_template_proberesp_t;
-+#define acx_template_beacon_t acx_template_proberesp_t
-+#define acx_template_beacon acx_template_proberesp
-+
-+typedef struct acx_template_nullframe {
-+      u16     size;
-+      struct wlan_hdr_a3 hdr;
-+} ACX_PACKED acx_template_nullframe_t;
-+
-+
-+/*
-+** JOIN command structure
-+**
-+** as opposed to acx100, acx111 dtim interval is AFTER rates_basic111.
-+** NOTE: took me about an hour to get !@#$%^& packing right --> struct packing is eeeeevil... */
-+typedef struct acx_joinbss {
-+      u8      bssid[ETH_ALEN];
-+      u16     beacon_interval;
-+      union {
-+              struct {
-+                      u8      dtim_interval;
-+                      u8      rates_basic;
-+                      u8      rates_supported;
-+                /*
-+                 * ARM compiler doesn't pack correctly unless unions
-+                 * inside structures are multiples of 4 bytes.  Ugh.
-+                 */
-+                      u8      genfrm_txrate;  /* generated frame (bcn, proberesp, RTS, PSpoll) tx rate */
-+              } ACX_PACKED acx100;
-+              struct {
-+                      u16     rates_basic;
-+                      u8      dtim_interval;
-+                      u8      genfrm_txrate;  /* generated frame (bcn, proberesp, RTS, PSpoll) tx rate */
-+              } ACX_PACKED acx111;
-+              /*
-+               * ARM compiler doesn't pack correctly unles unions are aligned on
-+               * 4 byte boundaries and are multiples of 4 bytes.
-+               */
-+              struct {
-+                    u8 d1;
-+                    u8 d2;
-+                    u8 d3;
-+                    u8 genfrm_txrate;
-+              } ACX_PACKED txrate;
-+      } ACX_PACKED u;
-+      u8      genfrm_mod_pre; /* generated frame modulation/preamble:
-+                                              ** bit7: PBCC, bit6: OFDM (else CCK/DQPSK/DBPSK)
-+                                              ** bit5: short pre */
-+      u8      macmode;        /* BSS Type, must be one of ACX_MODE_xxx */
-+      u8      channel;
-+      u8      essid_len;
-+      char    essid[IW_ESSID_MAX_SIZE];
-+} ACX_PACKED acx_joinbss_t;
-+
-+#define JOINBSS_RATES_1               0x01
-+#define JOINBSS_RATES_2               0x02
-+#define JOINBSS_RATES_5               0x04
-+#define JOINBSS_RATES_11      0x08
-+#define JOINBSS_RATES_22      0x10
-+
-+/* Looks like missing bits are used to indicate 11g rates!
-+** (it follows from the fact that constants below match 1:1 to RATE111_nn)
-+** This was actually seen! Look at that Assoc Request sent by acx111,
-+** it _does_ contain 11g rates in basic set:
-+01:30:20.070772 Beacon (xxx) [1.0* 2.0* 5.5* 11.0* 6.0* 9.0* 12.0* 18.0* 24.0* 36.0* 48.0* 54.0* Mbit] ESS CH: 1
-+01:30:20.074425 Authentication (Open System)-1: Succesful
-+01:30:20.076539 Authentication (Open System)-2:
-+01:30:20.076620 Acknowledgment
-+01:30:20.088546 Assoc Request (xxx) [1.0* 2.0* 5.5* 6.0* 9.0* 11.0* 12.0* 18.0* 24.0* 36.0* 48.0* 54.0* Mbit]
-+01:30:20.122413 Assoc Response AID(1) :: Succesful
-+01:30:20.122679 Acknowledgment
-+01:30:20.173204 Beacon (xxx) [1.0* 2.0* 5.5* 11.0* 6.0* 9.0* 12.0* 18.0* 24.0* 36.0* 48.0* 54.0* Mbit] ESS CH: 1
-+*/
-+#define JOINBSS_RATES_BASIC111_1      0x0001
-+#define JOINBSS_RATES_BASIC111_2      0x0002
-+#define JOINBSS_RATES_BASIC111_5      0x0004
-+#define JOINBSS_RATES_BASIC111_11     0x0020
-+#define JOINBSS_RATES_BASIC111_22     0x0100
-+
-+
-+/***********************************************************************
-+*/
-+typedef struct mem_read_write {
-+      u16     addr;
-+      u16     type; /* 0x0 int. RAM / 0xffff MAC reg. / 0x81 PHY RAM / 0x82 PHY reg.; or maybe it's actually 0x30 for MAC? Better verify it by writing and reading back and checking whether the value holds! */
-+      u32     len;
-+      u32     data;
-+} ACX_PACKED mem_read_write_t;
-+
-+typedef struct firmware_image {
-+      u32     chksum;
-+      u32     size;
-+      u8      data[1]; /* the byte array of the actual firmware... */
-+} ACX_PACKED firmware_image_t;
-+
-+typedef struct acx_cmd_radioinit {
-+      u32     offset;
-+      u32     len;
-+} ACX_PACKED acx_cmd_radioinit_t;
-+
-+typedef struct acx100_ie_wep_options {
-+      u16     type;
-+      u16     len;
-+      u16     NumKeys;        /* max # of keys */
-+      u8      WEPOption;      /* 0 == decrypt default key only, 1 == override decrypt */
-+      u8      Pad;            /* used only for acx111 */
-+} ACX_PACKED acx100_ie_wep_options_t;
-+
-+typedef struct ie_dot11WEPDefaultKey {
-+      u16     type;
-+      u16     len;
-+      u8      action;
-+      u8      keySize;
-+      u8      defaultKeyNum;
-+      u8      key[29];        /* check this! was Key[19] */
-+} ACX_PACKED ie_dot11WEPDefaultKey_t;
-+
-+typedef struct acx111WEPDefaultKey {
-+      u8      MacAddr[ETH_ALEN];
-+      u16     action; /* NOTE: this is a u16, NOT a u8!! */
-+      u16     reserved;
-+      u8      keySize;
-+      u8      type;
-+      u8      index;
-+      u8      defaultKeyNum;
-+      u8      counter[6];
-+      u8      key[32];        /* up to 32 bytes (for TKIP!) */
-+} ACX_PACKED acx111WEPDefaultKey_t;
-+
-+typedef struct ie_dot11WEPDefaultKeyID {
-+      u16     type;
-+      u16     len;
-+      u8      KeyID;
-+} ACX_PACKED ie_dot11WEPDefaultKeyID_t;
-+
-+typedef struct acx100_cmd_wep_mgmt {
-+      u8      MacAddr[ETH_ALEN];
-+      u16     Action;
-+      u16     KeySize;
-+      u8      Key[29]; /* 29*8 == 232bits == WEP256 */
-+} ACX_PACKED acx100_cmd_wep_mgmt_t;
-+
-+typedef struct acx_ie_generic {
-+      u16     type;
-+      u16     len;
-+      union {
-+              /* Association ID IE: just a 16bit value: */
-+              u16     aid;
-+              /* generic member for quick implementation of commands */
-+              u8      bytes[32];
-+      } ACX_PACKED m;
-+} ACX_PACKED acx_ie_generic_t;
-+
-+/***********************************************************************
-+*/
-+#define CHECK_SIZEOF(type,size) { \
-+      extern void BUG_bad_size_for_##type(void); \
-+      if (sizeof(type)!=(size)) BUG_bad_size_for_##type(); \
-+}
-+
-+static inline void
-+acx_struct_size_check(void)
-+{
-+      CHECK_SIZEOF(txdesc_t, 0x30);
-+      CHECK_SIZEOF(acx100_ie_memconfigoption_t, 24);
-+      CHECK_SIZEOF(acx100_ie_queueconfig_t, 0x20);
-+      CHECK_SIZEOF(acx_joinbss_t, 0x30);
-+      /* IEs need 4 bytes for (type,len) tuple */
-+      CHECK_SIZEOF(acx111_ie_configoption_t, ACX111_IE_CONFIG_OPTIONS_LEN + 4);
-+}
-+
-+
-+/***********************************************************************
-+** Global data
-+*/
-+extern const u8 acx_bitpos2ratebyte[];
-+extern const u8 acx_bitpos2rate100[];
-+
-+extern const u8 acx_reg_domain_ids[];
-+extern const char * const acx_reg_domain_strings[];
-+enum {
-+      acx_reg_domain_ids_len = 8
-+};
-+
-+extern const struct iw_handler_def acx_ioctl_handler_def;
-Index: linux-2.6.22/drivers/net/wireless/acx/common.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/common.c     2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,7388 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
-+#include <linux/config.h>
-+#endif
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/types.h>
-+#include <linux/slab.h>
-+#include <linux/delay.h>
-+#include <linux/proc_fs.h>
-+#include <linux/if_arp.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/wireless.h>
-+#include <linux/pm.h>
-+#include <linux/vmalloc.h>
-+#include <net/iw_handler.h>
-+
-+#include "acx_hw.h"
-+#include "acx.h"
-+
-+
-+/***********************************************************************
-+*/
-+static client_t *acx_l_sta_list_alloc(acx_device_t *adev);
-+static client_t *acx_l_sta_list_get_from_hash(acx_device_t *adev, const u8 *address);
-+
-+static int acx_l_process_data_frame_master(acx_device_t *adev, rxbuffer_t *rxbuf);
-+static int acx_l_process_data_frame_client(acx_device_t *adev, rxbuffer_t *rxbuf);
-+/* static int acx_l_process_NULL_frame(acx_device_t *adev, rxbuffer_t *rxbuf, int vala); */
-+static int acx_l_process_mgmt_frame(acx_device_t *adev, rxbuffer_t *rxbuf);
-+static void acx_l_process_disassoc_from_sta(acx_device_t *adev, const wlan_fr_disassoc_t *req);
-+static void acx_l_process_disassoc_from_ap(acx_device_t *adev, const wlan_fr_disassoc_t *req);
-+static void acx_l_process_deauth_from_sta(acx_device_t *adev, const wlan_fr_deauthen_t *req);
-+static void acx_l_process_deauth_from_ap(acx_device_t *adev, const wlan_fr_deauthen_t *req);
-+static int acx_l_process_probe_response(acx_device_t *adev, wlan_fr_proberesp_t *req, const rxbuffer_t *rxbuf);
-+static int acx_l_process_assocresp(acx_device_t *adev, const wlan_fr_assocresp_t *req);
-+static int acx_l_process_reassocresp(acx_device_t *adev, const wlan_fr_reassocresp_t *req);
-+static int acx_l_process_authen(acx_device_t *adev, const wlan_fr_authen_t *req);
-+static int acx_l_transmit_assocresp(acx_device_t *adev, const wlan_fr_assocreq_t *req);
-+static int acx_l_transmit_reassocresp(acx_device_t *adev, const wlan_fr_reassocreq_t *req);
-+static int acx_l_transmit_deauthen(acx_device_t *adev, const u8 *addr, u16 reason);
-+static int acx_l_transmit_authen1(acx_device_t *adev);
-+static int acx_l_transmit_authen2(acx_device_t *adev, const wlan_fr_authen_t *req, client_t *clt);
-+static int acx_l_transmit_authen3(acx_device_t *adev, const wlan_fr_authen_t *req);
-+static int acx_l_transmit_authen4(acx_device_t *adev, const wlan_fr_authen_t *req);
-+static int acx_l_transmit_assoc_req(acx_device_t *adev);
-+
-+
-+/***********************************************************************
-+*/
-+#if ACX_DEBUG
-+unsigned int acx_debug /* will add __read_mostly later */ = ACX_DEFAULT_MSG;
-+/* parameter is 'debug', corresponding var is acx_debug */
-+module_param_named(debug, acx_debug, uint, 0);
-+MODULE_PARM_DESC(debug, "Debug level mask (see L_xxx constants)");
-+#endif
-+
-+#ifdef MODULE_LICENSE
-+MODULE_LICENSE("Dual MPL/GPL");
-+#endif
-+/* USB had this: MODULE_AUTHOR("Martin Wawro <martin.wawro AT uni-dortmund.de>"); */
-+MODULE_AUTHOR("ACX100 Open Source Driver development team");
-+MODULE_DESCRIPTION("Driver for TI ACX1xx based wireless cards (CardBus/PCI/USB)");
-+
-+
-+/***********************************************************************
-+*/
-+/* Probably a number of acx's intermediate buffers for USB transfers,
-+** not to be confused with number of descriptors in tx/rx rings
-+** (which are not directly accessible to host in USB devices) */
-+#define USB_RX_CNT 10
-+#define USB_TX_CNT 10
-+
-+
-+/***********************************************************************
-+*/
-+
-+/* minutes to wait until next radio recalibration: */
-+#define RECALIB_PAUSE 5
-+
-+/* Please keep acx_reg_domain_ids_len in sync... */
-+const u8 acx_reg_domain_ids[acx_reg_domain_ids_len] =
-+      { 0x10, 0x20, 0x30, 0x31, 0x32, 0x40, 0x41, 0x51 };
-+static const u16 reg_domain_channel_masks[acx_reg_domain_ids_len] =
-+#ifdef ACX_ALLOW_ALLCHANNELS
-+      { 0x3fff, 0x07ff, 0x1fff, 0x0600, 0x1e00, 0x2000, 0x3fff, 0x01fc };
-+#else
-+      { 0x07ff, 0x07ff, 0x1fff, 0x0600, 0x1e00, 0x2000, 0x3fff, 0x01fc };
-+#endif
-+const char * const
-+acx_reg_domain_strings[] = {
-+      /* 0 */ " 1-11 FCC (USA)",
-+      /* 1 */ " 1-11 DOC/IC (Canada)",
-+/* BTW: WLAN use in ETSI is regulated by ETSI standard EN 300 328-2 V1.1.2 */
-+      /* 2 */ " 1-13 ETSI (Europe)",
-+      /* 3 */ "10-11 Spain",
-+      /* 4 */ "10-13 France",
-+      /* 5 */ "   14 MKK (Japan)",
-+      /* 6 */ " 1-14 MKK1",
-+      /* 7 */ "  3-9 Israel (not all firmware versions)",
-+      NULL /* needs to remain as last entry */
-+};
-+
-+
-+
-+/***********************************************************************
-+** Debugging support
-+*/
-+#ifdef PARANOID_LOCKING
-+static unsigned max_lock_time;
-+static unsigned max_sem_time;
-+
-+void
-+acx_lock_unhold() { max_lock_time = 0; }
-+void
-+acx_sem_unhold() { max_sem_time = 0; }
-+
-+static inline const char*
-+sanitize_str(const char *s)
-+{
-+      const char* t = strrchr(s, '/');
-+      if (t) return t + 1;
-+      return s;
-+}
-+
-+void
-+acx_lock_debug(acx_device_t *adev, const char* where)
-+{
-+      unsigned int count = 100*1000*1000;
-+      where = sanitize_str(where);
-+      while (--count) {
-+              if (!spin_is_locked(&adev->lock)) break;
-+              cpu_relax();
-+      }
-+      if (!count) {
-+              printk(KERN_EMERG "LOCKUP: already taken at %s!\n", adev->last_lock);
-+              BUG();
-+      }
-+      adev->last_lock = where;
-+      rdtscl(adev->lock_time);
-+}
-+void
-+acx_unlock_debug(acx_device_t *adev, const char* where)
-+{
-+#ifdef SMP
-+      if (!spin_is_locked(&adev->lock)) {
-+              where = sanitize_str(where);
-+              printk(KERN_EMERG "STRAY UNLOCK at %s!\n", where);
-+              BUG();
-+      }
-+#endif
-+      if (acx_debug & L_LOCK) {
-+              unsigned long diff;
-+              rdtscl(diff);
-+              diff -= adev->lock_time;
-+              if (diff > max_lock_time) {
-+                      where = sanitize_str(where);
-+                      printk("max lock hold time %ld CPU ticks from %s "
-+                              "to %s\n", diff, adev->last_lock, where);
-+                      max_lock_time = diff;
-+              }
-+      }
-+}
-+void
-+acx_down_debug(acx_device_t *adev, const char* where)
-+{
-+      int sem_count;
-+      unsigned long timeout = jiffies + 5*HZ;
-+
-+      where = sanitize_str(where);
-+
-+      for (;;) {
-+              sem_count = atomic_read(&adev->sem.count);
-+              if (sem_count) break;
-+              if (time_after(jiffies, timeout))
-+                      break;
-+              msleep(5);
-+      }
-+      if (!sem_count) {
-+              printk(KERN_EMERG "D STATE at %s! last sem at %s\n",
-+                      where, adev->last_sem);
-+              dump_stack();
-+      }
-+      adev->last_sem = where;
-+      adev->sem_time = jiffies;
-+      down(&adev->sem);
-+      if (acx_debug & L_LOCK) {
-+              printk("%s: sem_down %d -> %d\n",
-+                      where, sem_count, atomic_read(&adev->sem.count));
-+      }
-+}
-+void
-+acx_up_debug(acx_device_t *adev, const char* where)
-+{
-+      int sem_count = atomic_read(&adev->sem.count);
-+      if (sem_count) {
-+              where = sanitize_str(where);
-+              printk(KERN_EMERG "STRAY UP at %s! sem.count=%d\n", where, sem_count);
-+              dump_stack();
-+      }
-+      if (acx_debug & L_LOCK) {
-+              unsigned long diff = jiffies - adev->sem_time;
-+              if (diff > max_sem_time) {
-+                      where = sanitize_str(where);
-+                      printk("max sem hold time %ld jiffies from %s "
-+                              "to %s\n", diff, adev->last_sem, where);
-+                      max_sem_time = diff;
-+              }
-+      }
-+      up(&adev->sem);
-+      if (acx_debug & L_LOCK) {
-+              where = sanitize_str(where);
-+              printk("%s: sem_up %d -> %d\n",
-+                      where, sem_count, atomic_read(&adev->sem.count));
-+      }
-+}
-+#endif /* PARANOID_LOCKING */
-+
-+
-+/***********************************************************************
-+*/
-+#if ACX_DEBUG > 1
-+
-+static int acx_debug_func_indent;
-+#define DEBUG_TSC 0
-+#define FUNC_INDENT_INCREMENT 2
-+
-+#if DEBUG_TSC
-+#define TIMESTAMP(d) unsigned long d; rdtscl(d)
-+#else
-+#define TIMESTAMP(d) unsigned long d = jiffies
-+#endif
-+
-+static const char
-+spaces[] = "          " "          "; /* Nx10 spaces */
-+
-+void
-+log_fn_enter(const char *funcname)
-+{
-+      int indent;
-+      TIMESTAMP(d);
-+
-+      indent = acx_debug_func_indent;
-+      if (indent >= sizeof(spaces))
-+              indent = sizeof(spaces)-1;
-+
-+      printk("%08ld %s==> %s\n",
-+              d % 100000000,
-+              spaces + (sizeof(spaces)-1) - indent,
-+              funcname
-+      );
-+
-+      acx_debug_func_indent += FUNC_INDENT_INCREMENT;
-+}
-+void
-+log_fn_exit(const char *funcname)
-+{
-+      int indent;
-+      TIMESTAMP(d);
-+
-+      acx_debug_func_indent -= FUNC_INDENT_INCREMENT;
-+
-+      indent = acx_debug_func_indent;
-+      if (indent >= sizeof(spaces))
-+              indent = sizeof(spaces)-1;
-+
-+      printk("%08ld %s<== %s\n",
-+              d % 100000000,
-+              spaces + (sizeof(spaces)-1) - indent,
-+              funcname
-+      );
-+}
-+void
-+log_fn_exit_v(const char *funcname, int v)
-+{
-+      int indent;
-+      TIMESTAMP(d);
-+
-+      acx_debug_func_indent -= FUNC_INDENT_INCREMENT;
-+
-+      indent = acx_debug_func_indent;
-+      if (indent >= sizeof(spaces))
-+              indent = sizeof(spaces)-1;
-+
-+      printk("%08ld %s<== %s: %08X\n",
-+              d % 100000000,
-+              spaces + (sizeof(spaces)-1) - indent,
-+              funcname,
-+              v
-+      );
-+}
-+#endif /* ACX_DEBUG > 1 */
-+
-+
-+/***********************************************************************
-+** Basically a msleep with logging
-+*/
-+void
-+acx_s_msleep(int ms)
-+{
-+      FN_ENTER;
-+      msleep(ms);
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** Not inlined: it's larger than it seems
-+*/
-+void
-+acx_print_mac(const char *head, const u8 *mac, const char *tail)
-+{
-+      printk("%s"MACSTR"%s", head, MAC(mac), tail);
-+}
-+
-+
-+/***********************************************************************
-+** acx_get_status_name
-+*/
-+static const char*
-+acx_get_status_name(u16 status)
-+{
-+      static const char * const str[] = {
-+              "STOPPED", "SCANNING", "WAIT_AUTH",
-+              "AUTHENTICATED", "ASSOCIATED", "INVALID??"
-+      };
-+      if (status > VEC_SIZE(str)-1)
-+              status = VEC_SIZE(str)-1;
-+
-+      return str[status];
-+}
-+
-+
-+/***********************************************************************
-+** acx_get_packet_type_string
-+*/
-+#if ACX_DEBUG
-+const char*
-+acx_get_packet_type_string(u16 fc)
-+{
-+      static const char * const mgmt_arr[] = {
-+              "MGMT/AssocReq", "MGMT/AssocResp", "MGMT/ReassocReq",
-+              "MGMT/ReassocResp", "MGMT/ProbeReq", "MGMT/ProbeResp",
-+              "MGMT/UNKNOWN", "MGMT/UNKNOWN", "MGMT/Beacon", "MGMT/ATIM",
-+              "MGMT/Disassoc", "MGMT/Authen", "MGMT/Deauthen"
-+      };
-+      static const char * const ctl_arr[] = {
-+              "CTL/PSPoll", "CTL/RTS", "CTL/CTS", "CTL/Ack", "CTL/CFEnd",
-+              "CTL/CFEndCFAck"
-+      };
-+      static const char * const data_arr[] = {
-+              "DATA/DataOnly", "DATA/Data CFAck", "DATA/Data CFPoll",
-+              "DATA/Data CFAck/CFPoll", "DATA/Null", "DATA/CFAck",
-+              "DATA/CFPoll", "DATA/CFAck/CFPoll"
-+      };
-+      const char *str;
-+      u8 fstype = (WF_FC_FSTYPE & fc) >> 4;
-+      u8 ctl;
-+
-+      switch (WF_FC_FTYPE & fc) {
-+      case WF_FTYPE_MGMT:
-+              if (fstype < VEC_SIZE(mgmt_arr))
-+                      str = mgmt_arr[fstype];
-+              else
-+                      str = "MGMT/UNKNOWN";
-+              break;
-+      case WF_FTYPE_CTL:
-+              ctl = fstype - 0x0a;
-+              if (ctl < VEC_SIZE(ctl_arr))
-+                      str = ctl_arr[ctl];
-+              else
-+                      str = "CTL/UNKNOWN";
-+              break;
-+      case WF_FTYPE_DATA:
-+              if (fstype < VEC_SIZE(data_arr))
-+                      str = data_arr[fstype];
-+              else
-+                      str = "DATA/UNKNOWN";
-+              break;
-+      default:
-+              str = "UNKNOWN";
-+              break;
-+      }
-+      return str;
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_wlan_reason_str
-+*/
-+static inline const char*
-+acx_wlan_reason_str(u16 reason)
-+{
-+      static const char* const reason_str[] = {
-+      /*  0 */        "?",
-+      /*  1 */        "unspecified",
-+      /*  2 */        "prev auth is not valid",
-+      /*  3 */        "leaving BBS",
-+      /*  4 */        "due to inactivity",
-+      /*  5 */        "AP is busy",
-+      /*  6 */        "got class 2 frame from non-auth'ed STA",
-+      /*  7 */        "got class 3 frame from non-assoc'ed STA",
-+      /*  8 */        "STA has left BSS",
-+      /*  9 */        "assoc without auth is not allowed",
-+      /* 10 */        "bad power setting (802.11h)",
-+      /* 11 */        "bad channel (802.11i)",
-+      /* 12 */        "?",
-+      /* 13 */        "invalid IE",
-+      /* 14 */        "MIC failure",
-+      /* 15 */        "four-way handshake timeout",
-+      /* 16 */        "group key handshake timeout",
-+      /* 17 */        "IE is different",
-+      /* 18 */        "invalid group cipher",
-+      /* 19 */        "invalid pairwise cipher",
-+      /* 20 */        "invalid AKMP",
-+      /* 21 */        "unsupported RSN version",
-+      /* 22 */        "invalid RSN IE cap",
-+      /* 23 */        "802.1x failed",
-+      /* 24 */        "cipher suite rejected"
-+      };
-+      return reason < VEC_SIZE(reason_str) ? reason_str[reason] : "?";
-+}
-+
-+
-+/***********************************************************************
-+** acx_cmd_status_str
-+*/
-+const char*
-+acx_cmd_status_str(unsigned int state)
-+{
-+      static const char * const cmd_error_strings[] = {
-+              "Idle",
-+              "Success",
-+              "Unknown Command",
-+              "Invalid Information Element",
-+              "Channel rejected",
-+              "Channel invalid in current regulatory domain",
-+              "MAC invalid",
-+              "Command rejected (read-only information element)",
-+              "Command rejected",
-+              "Already asleep",
-+              "TX in progress",
-+              "Already awake",
-+              "Write only",
-+              "RX in progress",
-+              "Invalid parameter",
-+              "Scan in progress",
-+              "Failed"
-+      };
-+      return state < VEC_SIZE(cmd_error_strings) ?
-+                      cmd_error_strings[state] : "?";
-+}
-+
-+
-+/***********************************************************************
-+** get_status_string
-+*/
-+static inline const char*
-+get_status_string(unsigned int status)
-+{
-+      /* A bit shortened, but hopefully still understandable */
-+      static const char * const status_str[] = {
-+      /* 0 */ "Successful",
-+      /* 1 */ "Unspecified failure",
-+      /* 2 */ "reserved",
-+      /* 3 */ "reserved",
-+      /* 4 */ "reserved",
-+      /* 5 */ "reserved",
-+      /* 6 */ "reserved",
-+      /* 7 */ "reserved",
-+      /* 8 */ "reserved",
-+      /* 9 */ "reserved",
-+      /*10 */ "Cannot support all requested capabilities in Capability Information field",
-+      /*11 */ "Reassoc denied (reason outside of 802.11b scope)",
-+      /*12 */ "Assoc denied (reason outside of 802.11b scope) -- maybe MAC filtering by peer?",
-+      /*13 */ "Responding station doesnt support specified auth algorithm -- maybe WEP auth Open vs. Restricted?",
-+      /*14 */ "Auth rejected: wrong transaction sequence number",
-+      /*15 */ "Auth rejected: challenge failure",
-+      /*16 */ "Auth rejected: timeout for next frame in sequence",
-+      /*17 */ "Assoc denied: too many STAs on this AP",
-+      /*18 */ "Assoc denied: requesting STA doesnt support all data rates in basic set",
-+      /*19 */ "Assoc denied: requesting STA doesnt support Short Preamble",
-+      /*20 */ "Assoc denied: requesting STA doesnt support PBCC Modulation",
-+      /*21 */ "Assoc denied: requesting STA doesnt support Channel Agility"
-+      /*22 */ "reserved",
-+      /*23 */ "reserved",
-+      /*24 */ "reserved",
-+      /*25 */ "Assoc denied: requesting STA doesnt support Short Slot Time",
-+      /*26 */ "Assoc denied: requesting STA doesnt support DSSS-OFDM"
-+      };
-+
-+      return status_str[status < VEC_SIZE(status_str) ? status : 2];
-+}
-+
-+
-+/***********************************************************************
-+*/
-+void
-+acx_log_bad_eid(wlan_hdr_t* hdr, int len, wlan_ie_t* ie_ptr)
-+{
-+      if (acx_debug & L_ASSOC) {
-+              int offset = (u8*)ie_ptr - (u8*)hdr;
-+              printk("acx: unknown EID %d in mgmt frame at offset %d. IE: ",
-+                              ie_ptr->eid, offset);
-+      /* IE len can be bogus, IE can extend past packet end. Oh well... */
-+              acx_dump_bytes(ie_ptr, ie_ptr->len + 2);
-+              if (acx_debug & L_DATA) {
-+                      printk("frame (%s): ",
-+                      acx_get_packet_type_string(le16_to_cpu(hdr->fc)));
-+                      acx_dump_bytes(hdr, len);
-+              }
-+      }
-+}
-+
-+
-+/***********************************************************************
-+*/
-+#if ACX_DEBUG
-+void
-+acx_dump_bytes(const void *data, int num)
-+{
-+      const u8* ptr = (const u8*)data;
-+
-+      if (num <= 0) {
-+              printk("\n");
-+              return;
-+      }
-+
-+      while (num >= 16) {
-+              printk( "%02X %02X %02X %02X %02X %02X %02X %02X "
-+                      "%02X %02X %02X %02X %02X %02X %02X %02X\n",
-+                      ptr[0], ptr[1], ptr[2], ptr[3],
-+                      ptr[4], ptr[5], ptr[6], ptr[7],
-+                      ptr[8], ptr[9], ptr[10], ptr[11],
-+                      ptr[12], ptr[13], ptr[14], ptr[15]);
-+              num -= 16;
-+              ptr += 16;
-+      }
-+      if (num > 0) {
-+              while (--num > 0)
-+                      printk("%02X ", *ptr++);
-+              printk("%02X\n", *ptr);
-+      }
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_s_get_firmware_version
-+*/
-+void
-+acx_s_get_firmware_version(acx_device_t *adev)
-+{
-+      fw_ver_t fw;
-+      u8 hexarr[4] = { 0, 0, 0, 0 };
-+      int hexidx = 0, val = 0;
-+      const char *num;
-+      char c;
-+
-+      FN_ENTER;
-+
-+      memset(fw.fw_id, 'E', FW_ID_SIZE);
-+      acx_s_interrogate(adev, &fw, ACX1xx_IE_FWREV);
-+      memcpy(adev->firmware_version, fw.fw_id, FW_ID_SIZE);
-+      adev->firmware_version[FW_ID_SIZE] = '\0';
-+
-+      log(L_DEBUG, "fw_ver: fw_id='%s' hw_id=%08X\n",
-+                              adev->firmware_version, fw.hw_id);
-+
-+      if (strncmp(fw.fw_id, "Rev ", 4) != 0) {
-+              printk("acx: strange firmware version string "
-+                      "'%s', please report\n", adev->firmware_version);
-+              adev->firmware_numver = 0x01090407; /* assume 1.9.4.7 */
-+      } else {
-+              num = &fw.fw_id[4];
-+              while (1) {
-+                      c = *num++;
-+                      if ((c == '.') || (c == '\0')) {
-+                              hexarr[hexidx++] = val;
-+                              if ((hexidx > 3) || (c == '\0')) /* end? */
-+                                      break;
-+                              val = 0;
-+                              continue;
-+                      }
-+                      if ((c >= '0') && (c <= '9'))
-+                              c -= '0';
-+                      else
-+                              c = c - 'a' + (char)10;
-+                      val = val*16 + c;
-+              }
-+
-+              adev->firmware_numver = (u32)(
-+                              (hexarr[0] << 24) | (hexarr[1] << 16)
-+                              | (hexarr[2] << 8) | hexarr[3]);
-+              log(L_DEBUG, "firmware_numver 0x%08X\n", adev->firmware_numver);
-+      }
-+      if (IS_ACX111(adev)) {
-+              if (adev->firmware_numver == 0x00010011) {
-+                      /* This one does not survive floodpinging */
-+                      printk("acx: firmware '%s' is known to be buggy, "
-+                              "please upgrade\n", adev->firmware_version);
-+              }
-+      }
-+
-+      adev->firmware_id = le32_to_cpu(fw.hw_id);
-+
-+      /* we're able to find out more detailed chip names now */
-+      switch (adev->firmware_id & 0xffff0000) {
-+              case 0x01010000:
-+              case 0x01020000:
-+                      adev->chip_name = "TNETW1100A";
-+                      break;
-+              case 0x01030000:
-+                      adev->chip_name = "TNETW1100B";
-+                      break;
-+              case 0x03000000:
-+              case 0x03010000:
-+                      adev->chip_name = "TNETW1130";
-+                      break;
-+              case 0x04030000: /* 0x04030101 is TNETW1450 */
-+                      adev->chip_name = "TNETW1450";
-+                      break;
-+              default:
-+                      printk("acx: unknown chip ID 0x%08X, "
-+                              "please report\n", adev->firmware_id);
-+                      break;
-+      }
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_display_hardware_details
-+**
-+** Displays hw/fw version, radio type etc...
-+*/
-+void
-+acx_display_hardware_details(acx_device_t *adev)
-+{
-+      const char *radio_str, *form_str;
-+
-+      FN_ENTER;
-+
-+      switch (adev->radio_type) {
-+      case RADIO_MAXIM_0D:
-+              radio_str = "Maxim";
-+              break;
-+      case RADIO_RFMD_11:
-+              radio_str = "RFMD";
-+              break;
-+      case RADIO_RALINK_15:
-+              radio_str = "Ralink";
-+              break;
-+      case RADIO_RADIA_16:
-+              radio_str = "Radia";
-+              break;
-+      case RADIO_UNKNOWN_17:
-+              /* TI seems to have a radio which is
-+               * additionally 802.11a capable, too */
-+              radio_str = "802.11a/b/g radio?! Please report";
-+              break;
-+      case RADIO_UNKNOWN_19:
-+              radio_str = "A radio used by Safecom cards?! Please report";
-+              break;
-+      case RADIO_UNKNOWN_1B:
-+              radio_str = "An unknown radio used by TNETW1450 USB adapters";
-+              break;
-+      default:
-+              radio_str = "UNKNOWN, please report radio type name!";
-+              break;
-+      }
-+
-+      switch (adev->form_factor) {
-+      case 0x00:
-+              form_str = "unspecified";
-+              break;
-+      case 0x01:
-+              form_str = "(mini-)PCI / CardBus";
-+              break;
-+      case 0x02:
-+              form_str = "USB";
-+              break;
-+      case 0x03:
-+              form_str = "Compact Flash";
-+              break;
-+      default:
-+              form_str = "UNKNOWN, please report";
-+              break;
-+      }
-+
-+      printk("acx: === chipset %s, radio type 0x%02X (%s), "
-+              "form factor 0x%02X (%s), EEPROM version 0x%02X: "
-+              "uploaded firmware '%s' ===\n",
-+              adev->chip_name, adev->radio_type, radio_str,
-+              adev->form_factor, form_str, adev->eeprom_version,
-+              adev->firmware_version);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acx_e_change_mtu(struct net_device *ndev, int mtu)
-+{
-+      enum {
-+              MIN_MTU = 256,
-+              MAX_MTU = WLAN_DATA_MAXLEN - (ETH_HLEN)
-+      };
-+
-+      if (mtu < MIN_MTU || mtu > MAX_MTU)
-+              return -EINVAL;
-+
-+      ndev->mtu = mtu;
-+      return 0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_e_get_stats, acx_e_get_wireless_stats
-+*/
-+struct net_device_stats*
-+acx_e_get_stats(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      return &adev->stats;
-+}
-+
-+struct iw_statistics*
-+acx_e_get_wireless_stats(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      return &adev->wstats;
-+}
-+
-+
-+/***********************************************************************
-+** maps acx111 tx descr rate field to acx100 one
-+*/
-+const u8
-+acx_bitpos2rate100[] = {
-+      RATE100_1       ,/* 0 */
-+      RATE100_2       ,/* 1 */
-+      RATE100_5       ,/* 2 */
-+      RATE100_2       ,/* 3, should not happen */
-+      RATE100_2       ,/* 4, should not happen */
-+      RATE100_11      ,/* 5 */
-+      RATE100_2       ,/* 6, should not happen */
-+      RATE100_2       ,/* 7, should not happen */
-+      RATE100_22      ,/* 8 */
-+      RATE100_2       ,/* 9, should not happen */
-+      RATE100_2       ,/* 10, should not happen */
-+      RATE100_2       ,/* 11, should not happen */
-+      RATE100_2       ,/* 12, should not happen */
-+      RATE100_2       ,/* 13, should not happen */
-+      RATE100_2       ,/* 14, should not happen */
-+      RATE100_2       ,/* 15, should not happen */
-+};
-+
-+u8
-+acx_rate111to100(u16 r) {
-+      return acx_bitpos2rate100[highest_bit(r)];
-+}
-+
-+
-+/***********************************************************************
-+** Calculate level like the feb 2003 windows driver seems to do
-+*/
-+static u8
-+acx_signal_to_winlevel(u8 rawlevel)
-+{
-+      /* u8 winlevel = (u8) (0.5 + 0.625 * rawlevel); */
-+      u8 winlevel = ((4 + (rawlevel * 5)) / 8);
-+
-+      if (winlevel > 100)
-+              winlevel = 100;
-+      return winlevel;
-+}
-+
-+u8
-+acx_signal_determine_quality(u8 signal, u8 noise)
-+{
-+      int qual;
-+
-+      qual = (((signal - 30) * 100 / 70) + (100 - noise * 4)) / 2;
-+
-+      if (qual > 100)
-+              return 100;
-+      if (qual < 0)
-+              return 0;
-+      return qual;
-+}
-+
-+
-+/***********************************************************************
-+** Interrogate/configure commands
-+*/
-+
-+/* FIXME: the lengths given here probably aren't always correct.
-+ * They should be gradually replaced by proper "sizeof(acx1XX_ie_XXXX)-4",
-+ * unless the firmware actually expects a different length than the struct length */
-+static const u16
-+acx100_ie_len[] = {
-+      0,
-+      ACX100_IE_ACX_TIMER_LEN,
-+      sizeof(acx100_ie_powersave_t)-4, /* is that 6 or 8??? */
-+      ACX1xx_IE_QUEUE_CONFIG_LEN,
-+      ACX100_IE_BLOCK_SIZE_LEN,
-+      ACX1xx_IE_MEMORY_CONFIG_OPTIONS_LEN,
-+      ACX1xx_IE_RATE_FALLBACK_LEN,
-+      ACX100_IE_WEP_OPTIONS_LEN,
-+      ACX1xx_IE_MEMORY_MAP_LEN, /*    ACX1xx_IE_SSID_LEN, */
-+      0,
-+      ACX1xx_IE_ASSOC_ID_LEN,
-+      0,
-+      ACX111_IE_CONFIG_OPTIONS_LEN,
-+      ACX1xx_IE_FWREV_LEN,
-+      ACX1xx_IE_FCS_ERROR_COUNT_LEN,
-+      ACX1xx_IE_MEDIUM_USAGE_LEN,
-+      ACX1xx_IE_RXCONFIG_LEN,
-+      0,
-+      0,
-+      sizeof(fw_stats_t)-4,
-+      0,
-+      ACX1xx_IE_FEATURE_CONFIG_LEN,
-+      ACX111_IE_KEY_CHOOSE_LEN,
-+      ACX1FF_IE_MISC_CONFIG_TABLE_LEN,
-+      ACX1FF_IE_WONE_CONFIG_LEN,
-+      0,
-+      ACX1FF_IE_TID_CONFIG_LEN,
-+      0,
-+      0,
-+      0,
-+      ACX1FF_IE_CALIB_ASSESSMENT_LEN,
-+      ACX1FF_IE_BEACON_FILTER_OPTIONS_LEN,
-+      ACX1FF_IE_LOW_RSSI_THRESH_OPT_LEN,
-+      ACX1FF_IE_NOISE_HISTOGRAM_RESULTS_LEN,
-+      0,
-+      ACX1FF_IE_PACKET_DETECT_THRESH_LEN,
-+      ACX1FF_IE_TX_CONFIG_OPTIONS_LEN,
-+      ACX1FF_IE_CCA_THRESHOLD_LEN,
-+      ACX1FF_IE_EVENT_MASK_LEN,
-+      ACX1FF_IE_DTIM_PERIOD_LEN,
-+      0,
-+      ACX1FF_IE_ACI_CONFIG_SET_LEN,
-+      0,
-+      0,
-+      0,
-+      0,
-+      0,
-+      0,
-+      ACX1FF_IE_EEPROM_VER_LEN,
-+};
-+
-+static const u16
-+acx100_ie_len_dot11[] = {
-+      0,
-+      ACX1xx_IE_DOT11_STATION_ID_LEN,
-+      0,
-+      ACX100_IE_DOT11_BEACON_PERIOD_LEN,
-+      ACX1xx_IE_DOT11_DTIM_PERIOD_LEN,
-+      ACX1xx_IE_DOT11_SHORT_RETRY_LIMIT_LEN,
-+      ACX1xx_IE_DOT11_LONG_RETRY_LIMIT_LEN,
-+      ACX100_IE_DOT11_WEP_DEFAULT_KEY_WRITE_LEN,
-+      ACX1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN,
-+      0,
-+      ACX1xx_IE_DOT11_CURRENT_REG_DOMAIN_LEN,
-+      ACX1xx_IE_DOT11_CURRENT_ANTENNA_LEN,
-+      0,
-+      ACX1xx_IE_DOT11_TX_POWER_LEVEL_LEN,
-+      ACX1xx_IE_DOT11_CURRENT_CCA_MODE_LEN,
-+      ACX100_IE_DOT11_ED_THRESHOLD_LEN,
-+      ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET_LEN,
-+      0,
-+      0,
-+      0,
-+};
-+
-+static const u16
-+acx111_ie_len[] = {
-+      0,
-+      ACX100_IE_ACX_TIMER_LEN,
-+      sizeof(acx111_ie_powersave_t)-4,
-+      ACX1xx_IE_QUEUE_CONFIG_LEN,
-+      ACX100_IE_BLOCK_SIZE_LEN,
-+      ACX1xx_IE_MEMORY_CONFIG_OPTIONS_LEN,
-+      ACX1xx_IE_RATE_FALLBACK_LEN,
-+      ACX100_IE_WEP_OPTIONS_LEN,
-+      ACX1xx_IE_MEMORY_MAP_LEN, /*    ACX1xx_IE_SSID_LEN, */
-+      0,
-+      ACX1xx_IE_ASSOC_ID_LEN,
-+      0,
-+      ACX111_IE_CONFIG_OPTIONS_LEN,
-+      ACX1xx_IE_FWREV_LEN,
-+      ACX1xx_IE_FCS_ERROR_COUNT_LEN,
-+      ACX1xx_IE_MEDIUM_USAGE_LEN,
-+      ACX1xx_IE_RXCONFIG_LEN,
-+      0,
-+      0,
-+      sizeof(fw_stats_t)-4,
-+      0,
-+      ACX1xx_IE_FEATURE_CONFIG_LEN,
-+      ACX111_IE_KEY_CHOOSE_LEN,
-+      ACX1FF_IE_MISC_CONFIG_TABLE_LEN,
-+      ACX1FF_IE_WONE_CONFIG_LEN,
-+      0,
-+      ACX1FF_IE_TID_CONFIG_LEN,
-+      0,
-+      0,
-+      0,
-+      ACX1FF_IE_CALIB_ASSESSMENT_LEN,
-+      ACX1FF_IE_BEACON_FILTER_OPTIONS_LEN,
-+      ACX1FF_IE_LOW_RSSI_THRESH_OPT_LEN,
-+      ACX1FF_IE_NOISE_HISTOGRAM_RESULTS_LEN,
-+      0,
-+      ACX1FF_IE_PACKET_DETECT_THRESH_LEN,
-+      ACX1FF_IE_TX_CONFIG_OPTIONS_LEN,
-+      ACX1FF_IE_CCA_THRESHOLD_LEN,
-+      ACX1FF_IE_EVENT_MASK_LEN,
-+      ACX1FF_IE_DTIM_PERIOD_LEN,
-+      0,
-+      ACX1FF_IE_ACI_CONFIG_SET_LEN,
-+      0,
-+      0,
-+      0,
-+      0,
-+      0,
-+      0,
-+      ACX1FF_IE_EEPROM_VER_LEN,
-+};
-+
-+static const u16
-+acx111_ie_len_dot11[] = {
-+      0,
-+      ACX1xx_IE_DOT11_STATION_ID_LEN,
-+      0,
-+      ACX100_IE_DOT11_BEACON_PERIOD_LEN,
-+      ACX1xx_IE_DOT11_DTIM_PERIOD_LEN,
-+      ACX1xx_IE_DOT11_SHORT_RETRY_LIMIT_LEN,
-+      ACX1xx_IE_DOT11_LONG_RETRY_LIMIT_LEN,
-+      ACX100_IE_DOT11_WEP_DEFAULT_KEY_WRITE_LEN,
-+      ACX1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN,
-+      0,
-+      ACX1xx_IE_DOT11_CURRENT_REG_DOMAIN_LEN,
-+      ACX1xx_IE_DOT11_CURRENT_ANTENNA_LEN,
-+      0,
-+      ACX1xx_IE_DOT11_TX_POWER_LEVEL_LEN,
-+      ACX1xx_IE_DOT11_CURRENT_CCA_MODE_LEN,
-+      ACX100_IE_DOT11_ED_THRESHOLD_LEN,
-+      ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET_LEN,
-+      0,
-+      0,
-+      0,
-+};
-+
-+
-+#undef FUNC
-+#define FUNC "configure"
-+#if !ACX_DEBUG
-+int
-+acx_s_configure(acx_device_t *adev, void *pdr, int type)
-+{
-+#else
-+int
-+acx_s_configure_debug(acx_device_t *adev, void *pdr, int type, const char* typestr)
-+{
-+#endif
-+      u16 len;
-+      int res;
-+
-+      if (type < 0x1000)
-+              len = adev->ie_len[type];
-+      else
-+              len = adev->ie_len_dot11[type - 0x1000];
-+
-+      log(L_CTL, FUNC"(type:%s,len:%u)\n", typestr, len);
-+      if (unlikely(!len)) {
-+              log(L_DEBUG, "zero-length type %s?!\n", typestr);
-+      }
-+
-+      ((acx_ie_generic_t *)pdr)->type = cpu_to_le16(type);
-+      ((acx_ie_generic_t *)pdr)->len = cpu_to_le16(len);
-+      res = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIGURE, pdr, len + 4);
-+      if (unlikely(OK != res)) {
-+#if ACX_DEBUG
-+              printk("%s: "FUNC"(type:%s) FAILED\n", adev->ndev->name, typestr);
-+#else
-+              printk("%s: "FUNC"(type:0x%X) FAILED\n", adev->ndev->name, type);
-+#endif
-+              /* dump_stack() is already done in issue_cmd() */
-+      }
-+      return res;
-+}
-+
-+#undef FUNC
-+#define FUNC "interrogate"
-+#if !ACX_DEBUG
-+int
-+acx_s_interrogate(acx_device_t *adev, void *pdr, int type)
-+{
-+#else
-+int
-+acx_s_interrogate_debug(acx_device_t *adev, void *pdr, int type,
-+              const char* typestr)
-+{
-+#endif
-+      u16 len;
-+      int res;
-+
-+      /* FIXME: no check whether this exceeds the array yet.
-+       * We should probably remember the number of entries... */
-+      if (type < 0x1000)
-+              len = adev->ie_len[type];
-+      else
-+              len = adev->ie_len_dot11[type-0x1000];
-+
-+      log(L_CTL, FUNC"(type:%s,len:%u)\n", typestr, len);
-+
-+      ((acx_ie_generic_t *)pdr)->type = cpu_to_le16(type);
-+      ((acx_ie_generic_t *)pdr)->len = cpu_to_le16(len);
-+      res = acx_s_issue_cmd(adev, ACX1xx_CMD_INTERROGATE, pdr, len + 4);
-+      if (unlikely(OK != res)) {
-+#if ACX_DEBUG
-+              printk("%s: "FUNC"(type:%s) FAILED\n", adev->ndev->name, typestr);
-+#else
-+              printk("%s: "FUNC"(type:0x%X) FAILED\n", adev->ndev->name, type);
-+#endif
-+              /* dump_stack() is already done in issue_cmd() */
-+      }
-+      return res;
-+}
-+
-+#if CMD_DISCOVERY
-+void
-+great_inquisitor(acx_device_t *adev)
-+{
-+      static struct {
-+              u16     type;
-+              u16     len;
-+              /* 0x200 was too large here: */
-+              u8      data[0x100 - 4];
-+      } ACX_PACKED ie;
-+      u16 type;
-+
-+      FN_ENTER;
-+
-+      /* 0..0x20, 0x1000..0x1020 */
-+      for (type = 0; type <= 0x1020; type++) {
-+              if (type == 0x21)
-+                      type = 0x1000;
-+              ie.type = cpu_to_le16(type);
-+              ie.len = cpu_to_le16(sizeof(ie) - 4);
-+              acx_s_issue_cmd(adev, ACX1xx_CMD_INTERROGATE, &ie, sizeof(ie));
-+      }
-+      FN_EXIT0;
-+}
-+#endif
-+
-+
-+#ifdef CONFIG_PROC_FS
-+/***********************************************************************
-+** /proc files
-+*/
-+/***********************************************************************
-+** acx_l_proc_output
-+** Generate content for our /proc entry
-+**
-+** Arguments:
-+**    buf is a pointer to write output to
-+**    adev is the usual pointer to our private struct acx_device
-+** Returns:
-+**    number of bytes actually written to buf
-+** Side effects:
-+**    none
-+*/
-+static int
-+acx_l_proc_output(char *buf, acx_device_t *adev)
-+{
-+      char *p = buf;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      p += sprintf(p,
-+              "acx driver version:\t\t" ACX_RELEASE "\n"
-+              "Wireless extension version:\t" STRING(WIRELESS_EXT) "\n"
-+              "chip name:\t\t\t%s (0x%08X)\n"
-+              "radio type:\t\t\t0x%02X\n"
-+              "form factor:\t\t\t0x%02X\n"
-+              "EEPROM version:\t\t\t0x%02X\n"
-+              "firmware version:\t\t%s (0x%08X)\n",
-+              adev->chip_name, adev->firmware_id,
-+              adev->radio_type,
-+              adev->form_factor,
-+              adev->eeprom_version,
-+              adev->firmware_version, adev->firmware_numver);
-+
-+      for (i = 0; i < VEC_SIZE(adev->sta_list); i++) {
-+              struct client *bss = &adev->sta_list[i];
-+              if (!bss->used) continue;
-+              p += sprintf(p, "BSS %u BSSID "MACSTR" ESSID %s channel %u "
-+                      "Cap 0x%X SIR %u SNR %u\n",
-+                      i, MAC(bss->bssid), (char*)bss->essid, bss->channel,
-+                      bss->cap_info, bss->sir, bss->snr);
-+      }
-+      p += sprintf(p, "status:\t\t\t%u (%s)\n",
-+                      adev->status, acx_get_status_name(adev->status));
-+
-+      FN_EXIT1(p - buf);
-+      return p - buf;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_s_proc_diag_output(char *buf, acx_device_t *adev)
-+{
-+      char *p = buf;
-+      unsigned long flags;
-+      unsigned int len = 0, partlen;
-+      u32 temp1, temp2;
-+      u8 *st, *st_end;
-+#ifdef __BIG_ENDIAN
-+      u8 *st2;
-+#endif
-+      fw_stats_t *fw_stats;
-+      char *part_str = NULL;
-+      fw_stats_tx_t *tx = NULL;
-+      fw_stats_rx_t *rx = NULL;
-+      fw_stats_dma_t *dma = NULL;
-+      fw_stats_irq_t *irq = NULL;
-+      fw_stats_wep_t *wep = NULL;
-+      fw_stats_pwr_t *pwr = NULL;
-+      fw_stats_mic_t *mic = NULL;
-+      fw_stats_aes_t *aes = NULL;
-+      fw_stats_event_t *evt = NULL;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+
-+#if defined (ACX_MEM)
-+      p = acxmem_s_proc_diag_output(p, adev);
-+#else
-+      if (IS_PCI(adev))
-+              p = acxpci_s_proc_diag_output(p, adev);
-+#endif
-+
-+      p += sprintf(p,
-+              "\n"
-+              "** network status **\n"
-+              "dev_state_mask 0x%04X\n"
-+              "status %u (%s), "
-+              "mode %u, channel %u, "
-+              "reg_dom_id 0x%02X, reg_dom_chanmask 0x%04X, ",
-+              adev->dev_state_mask,
-+              adev->status, acx_get_status_name(adev->status),
-+              adev->mode, adev->channel,
-+              adev->reg_dom_id, adev->reg_dom_chanmask
-+              );
-+      p += sprintf(p,
-+              "ESSID \"%s\", essid_active %d, essid_len %d, "
-+              "essid_for_assoc \"%s\", nick \"%s\"\n"
-+              "WEP ena %d, restricted %d, idx %d\n",
-+              adev->essid, adev->essid_active, (int)adev->essid_len,
-+              adev->essid_for_assoc, adev->nick,
-+              adev->wep_enabled, adev->wep_restricted,
-+              adev->wep_current_index);
-+      p += sprintf(p, "dev_addr  "MACSTR"\n", MAC(adev->dev_addr));
-+      p += sprintf(p, "bssid     "MACSTR"\n", MAC(adev->bssid));
-+      p += sprintf(p, "ap_filter "MACSTR"\n", MAC(adev->ap));
-+
-+      p += sprintf(p,
-+              "\n"
-+              "** PHY status **\n"
-+              "tx_disabled %d, tx_level_dbm %d\n" /* "tx_level_val %d, tx_level_auto %d\n" */
-+              "sensitivity %d, antenna 0x%02X, ed_threshold %d, cca %d, preamble_mode %d\n"
-+              "rate_basic 0x%04X, rate_oper 0x%04X\n"
-+              "rts_threshold %d, frag_threshold %d, short_retry %d, long_retry %d\n"
-+              "msdu_lifetime %d, listen_interval %d, beacon_interval %d\n",
-+              adev->tx_disabled, adev->tx_level_dbm, /* adev->tx_level_val, adev->tx_level_auto, */
-+              adev->sensitivity, adev->antenna, adev->ed_threshold, adev->cca, adev->preamble_mode,
-+              adev->rate_basic, adev->rate_oper,
-+              adev->rts_threshold, adev->frag_threshold, adev->short_retry, adev->long_retry,
-+              adev->msdu_lifetime, adev->listen_interval, adev->beacon_interval);
-+
-+      acx_unlock(adev, flags);
-+
-+      p += sprintf(p,
-+              "\n"
-+              "** Firmware **\n"
-+              "NOTE: version dependent statistics layout, "
-+              "please report if you suspect wrong parsing!\n"
-+              "\n"
-+              "version \"%s\"\n", adev->firmware_version);
-+
-+      /* TODO: may replace kmalloc/memset with kzalloc once
-+       * Linux 2.6.14 is widespread */
-+      fw_stats = kmalloc(sizeof(*fw_stats), GFP_KERNEL);
-+      if (!fw_stats) {
-+              FN_EXIT1(0);
-+              return 0;
-+      }
-+      memset(fw_stats, 0, sizeof(*fw_stats));
-+
-+      st = (u8 *)fw_stats;
-+
-+      part_str = "statistics query command";
-+
-+      if (OK != acx_s_interrogate(adev, st, ACX1xx_IE_FIRMWARE_STATISTICS))
-+              goto fw_stats_end;
-+
-+      st += sizeof(u16);
-+      len = *(u16 *)st;
-+
-+      if (len > sizeof(*fw_stats)) {
-+              p += sprintf(p,
-+                      "firmware version with bigger fw_stats struct detected\n"
-+                      "(%u vs. %u), please report\n", len, sizeof(fw_stats_t));
-+              if (len > sizeof(*fw_stats)) {
-+                      p += sprintf(p, "struct size exceeded allocation!\n");
-+                      len = sizeof(*fw_stats);
-+              }
-+      }
-+      st += sizeof(u16);
-+      st_end = st - 2*sizeof(u16) + len;
-+
-+#ifdef __BIG_ENDIAN
-+      /* let's make one bold assumption here:
-+       * (hopefully!) *all* statistics fields are u32 only,
-+       * thus if we need to make endianness corrections
-+       * we can simply do them in one go, in advance */
-+      st2 = (u8 *)fw_stats;
-+      for (temp1 = 0; temp1 < len; temp1 += 4, st2 += 4)
-+              *(u32 *)st2 = le32_to_cpu(*(u32 *)st2);
-+#endif
-+
-+      part_str = "Rx/Tx";
-+
-+      /* directly at end of a struct part? --> no error! */
-+      if (st == st_end)
-+              goto fw_stats_end;
-+
-+      tx = (fw_stats_tx_t *)st;
-+      st += sizeof(fw_stats_tx_t);
-+      rx = (fw_stats_rx_t *)st;
-+      st += sizeof(fw_stats_rx_t);
-+      partlen = sizeof(fw_stats_tx_t) + sizeof(fw_stats_rx_t);
-+
-+      if (IS_ACX100(adev)) {
-+              /* at least ACX100 PCI F/W 1.9.8.b
-+               * and ACX100 USB F/W 1.0.7-USB
-+               * don't have those two fields... */
-+              st -= 2*sizeof(u32);
-+
-+              /* our parsing doesn't quite match this firmware yet,
-+               * log failure */
-+              if (st > st_end)
-+                      goto fw_stats_fail;
-+              temp1 = temp2 = 999999999;
-+      } else {
-+              if (st > st_end)
-+                      goto fw_stats_fail;
-+              temp1 = rx->rx_aci_events;
-+              temp2 = rx->rx_aci_resets;
-+      }
-+
-+      p += sprintf(p,
-+              "%s:\n"
-+              "  tx_desc_overfl %u\n"
-+              "  rx_OutOfMem %u, rx_hdr_overfl %u, rx_hw_stuck %u\n"
-+              "  rx_dropped_frame %u, rx_frame_ptr_err %u, rx_xfr_hint_trig %u\n"
-+              "  rx_aci_events %u, rx_aci_resets %u\n",
-+              part_str,
-+              tx->tx_desc_of,
-+              rx->rx_oom,
-+              rx->rx_hdr_of,
-+              rx->rx_hw_stuck,
-+              rx->rx_dropped_frame,
-+              rx->rx_frame_ptr_err,
-+              rx->rx_xfr_hint_trig,
-+              temp1,
-+              temp2);
-+
-+      part_str = "DMA";
-+
-+      if (st == st_end)
-+              goto fw_stats_end;
-+
-+      dma = (fw_stats_dma_t *)st;
-+      partlen = sizeof(fw_stats_dma_t);
-+      st += partlen;
-+
-+      if (st > st_end)
-+              goto fw_stats_fail;
-+
-+      p += sprintf(p,
-+              "%s:\n"
-+              "  rx_dma_req %u, rx_dma_err %u, tx_dma_req %u, tx_dma_err %u\n",
-+              part_str,
-+              dma->rx_dma_req,
-+              dma->rx_dma_err,
-+              dma->tx_dma_req,
-+              dma->tx_dma_err);
-+
-+      part_str = "IRQ";
-+
-+      if (st == st_end)
-+              goto fw_stats_end;
-+
-+      irq = (fw_stats_irq_t *)st;
-+      partlen = sizeof(fw_stats_irq_t);
-+      st += partlen;
-+
-+      if (st > st_end)
-+              goto fw_stats_fail;
-+
-+      p += sprintf(p,
-+              "%s:\n"
-+              "  cmd_cplt %u, fiq %u\n"
-+              "  rx_hdrs %u, rx_cmplt %u, rx_mem_overfl %u, rx_rdys %u\n"
-+              "  irqs %u, tx_procs %u, decrypt_done %u\n"
-+              "  dma_0_done %u, dma_1_done %u, tx_exch_complet %u\n"
-+              "  commands %u, rx_procs %u, hw_pm_mode_changes %u\n"
-+              "  host_acks %u, pci_pm %u, acm_wakeups %u\n",
-+              part_str,
-+              irq->cmd_cplt,
-+              irq->fiq,
-+              irq->rx_hdrs,
-+              irq->rx_cmplt,
-+              irq->rx_mem_of,
-+              irq->rx_rdys,
-+              irq->irqs,
-+              irq->tx_procs,
-+              irq->decrypt_done,
-+              irq->dma_0_done,
-+              irq->dma_1_done,
-+              irq->tx_exch_complet,
-+              irq->commands,
-+              irq->rx_procs,
-+              irq->hw_pm_mode_changes,
-+              irq->host_acks,
-+              irq->pci_pm,
-+              irq->acm_wakeups);
-+
-+      part_str = "WEP";
-+
-+      if (st == st_end)
-+              goto fw_stats_end;
-+
-+      wep = (fw_stats_wep_t *)st;
-+      partlen = sizeof(fw_stats_wep_t);
-+      st += partlen;
-+
-+      if (
-+          (IS_PCI(adev) && IS_ACX100(adev))
-+      ||  (IS_USB(adev) && IS_ACX100(adev))
-+      ||  (IS_MEM(adev) && IS_ACX100(adev))
-+      ) {
-+              /* at least ACX100 PCI F/W 1.9.8.b,
-+               * ACX100 USB F/W 1.0.7-USB
-+               * and ACX100 Generic Slave F/W 1.10.7.K
-+               * don't have those two fields...
-+               */
-+              st -= 2*sizeof(u32);
-+              if (st > st_end)
-+                      goto fw_stats_fail;
-+              temp1 = temp2 = 999999999;
-+      } else {
-+              if (st > st_end)
-+                      goto fw_stats_fail;
-+              temp1 = wep->wep_pkt_decrypt;
-+              temp2 = wep->wep_decrypt_irqs;
-+      }
-+
-+      p += sprintf(p,
-+              "%s:\n"
-+              "  wep_key_count %u, wep_default_key_count %u, dot11_def_key_mib %u\n"
-+              "  wep_key_not_found %u, wep_decrypt_fail %u\n"
-+              "  wep_pkt_decrypt %u, wep_decrypt_irqs %u\n",
-+              part_str,
-+              wep->wep_key_count,
-+              wep->wep_default_key_count,
-+              wep->dot11_def_key_mib,
-+              wep->wep_key_not_found,
-+              wep->wep_decrypt_fail,
-+              temp1,
-+              temp2);
-+
-+      part_str = "power";
-+
-+      if (st == st_end)
-+              goto fw_stats_end;
-+
-+      pwr = (fw_stats_pwr_t *)st;
-+      partlen = sizeof(fw_stats_pwr_t);
-+      st += partlen;
-+
-+      if (st > st_end)
-+              goto fw_stats_fail;
-+
-+      p += sprintf(p,
-+              "%s:\n"
-+              "  tx_start_ctr %u, no_ps_tx_too_short %u\n"
-+              "  rx_start_ctr %u, no_ps_rx_too_short %u\n"
-+              "  lppd_started %u\n"
-+              "  no_lppd_too_noisy %u, no_lppd_too_short %u, no_lppd_matching_frame %u\n",
-+              part_str,
-+              pwr->tx_start_ctr,
-+              pwr->no_ps_tx_too_short,
-+              pwr->rx_start_ctr,
-+              pwr->no_ps_rx_too_short,
-+              pwr->lppd_started,
-+              pwr->no_lppd_too_noisy,
-+              pwr->no_lppd_too_short,
-+              pwr->no_lppd_matching_frame);
-+
-+      part_str = "MIC";
-+
-+      if (st == st_end)
-+              goto fw_stats_end;
-+
-+      mic = (fw_stats_mic_t *)st;
-+      partlen = sizeof(fw_stats_mic_t);
-+      st += partlen;
-+
-+      if (st > st_end)
-+              goto fw_stats_fail;
-+
-+      p += sprintf(p,
-+              "%s:\n"
-+              "  mic_rx_pkts %u, mic_calc_fail %u\n",
-+              part_str,
-+              mic->mic_rx_pkts,
-+              mic->mic_calc_fail);
-+
-+      part_str = "AES";
-+
-+      if (st == st_end)
-+              goto fw_stats_end;
-+
-+      aes = (fw_stats_aes_t *)st;
-+      partlen = sizeof(fw_stats_aes_t);
-+      st += partlen;
-+
-+      if (st > st_end)
-+              goto fw_stats_fail;
-+
-+      p += sprintf(p,
-+              "%s:\n"
-+              "  aes_enc_fail %u, aes_dec_fail %u\n"
-+              "  aes_enc_pkts %u, aes_dec_pkts %u\n"
-+              "  aes_enc_irq %u, aes_dec_irq %u\n",
-+              part_str,
-+              aes->aes_enc_fail,
-+              aes->aes_dec_fail,
-+              aes->aes_enc_pkts,
-+              aes->aes_dec_pkts,
-+              aes->aes_enc_irq,
-+              aes->aes_dec_irq);
-+
-+      part_str = "event";
-+
-+      if (st == st_end)
-+              goto fw_stats_end;
-+
-+      evt = (fw_stats_event_t *)st;
-+      partlen = sizeof(fw_stats_event_t);
-+      st += partlen;
-+
-+      if (st > st_end)
-+              goto fw_stats_fail;
-+
-+      p += sprintf(p,
-+              "%s:\n"
-+              "  heartbeat %u, calibration %u\n"
-+              "  rx_mismatch %u, rx_mem_empty %u, rx_pool %u\n"
-+              "  oom_late %u\n"
-+              "  phy_tx_err %u, tx_stuck %u\n",
-+              part_str,
-+              evt->heartbeat,
-+              evt->calibration,
-+              evt->rx_mismatch,
-+              evt->rx_mem_empty,
-+              evt->rx_pool,
-+              evt->oom_late,
-+              evt->phy_tx_err,
-+              evt->tx_stuck);
-+
-+      if (st < st_end)
-+              goto fw_stats_bigger;
-+
-+      goto fw_stats_end;
-+
-+fw_stats_fail:
-+      st -= partlen;
-+      p += sprintf(p,
-+              "failed at %s part (size %u), offset %u (struct size %u), "
-+              "please report\n", part_str, partlen,
-+              (int)st - (int)fw_stats, len);
-+
-+fw_stats_bigger:
-+      for (; st < st_end; st += 4)
-+              p += sprintf(p,
-+                      "UNKN%3d: %u\n", (int)st - (int)fw_stats, *(u32 *)st);
-+
-+fw_stats_end:
-+      kfree(fw_stats);
-+
-+      FN_EXIT1(p - buf);
-+      return p - buf;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_s_proc_phy_output(char *buf, acx_device_t *adev)
-+{
-+      char *p = buf;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /*
-+      if (RADIO_RFMD_11 != adev->radio_type) {
-+              printk("sorry, not yet adapted for radio types "
-+                      "other than RFMD, please verify "
-+                      "PHY size etc. first!\n");
-+              goto end;
-+      }
-+      */
-+
-+      /* The PHY area is only 0x80 bytes long; further pages after that
-+       * only have some page number registers with altered value,
-+       * all other registers remain the same. */
-+      for (i = 0; i < 0x80; i++) {
-+              acx_s_read_phy_reg(adev, i, p++);
-+      }
-+
-+      FN_EXIT1(p - buf);
-+      return p - buf;
-+}
-+
-+
-+/***********************************************************************
-+** acx_e_read_proc_XXXX
-+** Handle our /proc entry
-+**
-+** Arguments:
-+**    standard kernel read_proc interface
-+** Returns:
-+**    number of bytes written to buf
-+** Side effects:
-+**    none
-+*/
-+static int
-+acx_e_read_proc(char *buf, char **start, off_t offset, int count,
-+                   int *eof, void *data)
-+{
-+      acx_device_t *adev = (acx_device_t*)data;
-+      unsigned long flags;
-+      int length;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+      acx_lock(adev, flags);
-+      /* fill buf */
-+      length = acx_l_proc_output(buf, adev);
-+      acx_unlock(adev, flags);
-+      acx_sem_unlock(adev);
-+
-+      /* housekeeping */
-+      if (length <= offset + count)
-+              *eof = 1;
-+      *start = buf + offset;
-+      length -= offset;
-+      if (length > count)
-+              length = count;
-+      if (length < 0)
-+              length = 0;
-+      FN_EXIT1(length);
-+      return length;
-+}
-+
-+static char _buf[32768];
-+static int
-+acx_e_read_proc_diag(char *buf, char **start, off_t offset, int count,
-+                   int *eof, void *data)
-+{
-+      acx_device_t *adev = (acx_device_t*)data;
-+      int length;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+      /* fill buf */
-+      length = acx_s_proc_diag_output(_buf, adev);
-+      acx_sem_unlock(adev);
-+
-+      memcpy(buf, _buf + offset, count);
-+
-+      /* housekeeping */
-+      if (length <= offset + count)
-+              *eof = 1;
-+      *start = count;
-+      length -= offset;
-+      if (length > count)
-+              length = count;
-+      if (length < 0)
-+              length = 0;
-+      FN_EXIT1(length);
-+      return length;
-+}
-+
-+static int
-+acx_e_read_proc_eeprom(char *buf, char **start, off_t offset, int count,
-+                   int *eof, void *data)
-+{
-+      acx_device_t *adev = (acx_device_t*)data;
-+      int length;
-+
-+      FN_ENTER;
-+
-+      /* fill buf */
-+      length = 0;
-+#if defined (ACX_MEM)
-+              acx_sem_lock(adev);
-+              length = acxmem_proc_eeprom_output(buf, adev);
-+              acx_sem_unlock(adev);
-+#else
-+      if (IS_PCI(adev)) {
-+              acx_sem_lock(adev);
-+              length = acxpci_proc_eeprom_output(buf, adev);
-+              acx_sem_unlock(adev);
-+      }
-+#endif
-+
-+      /* housekeeping */
-+      if (length <= offset + count)
-+              *eof = 1;
-+      *start = buf + offset;
-+      length -= offset;
-+      if (length > count)
-+              length = count;
-+      if (length < 0)
-+              length = 0;
-+      FN_EXIT1(length);
-+      return length;
-+}
-+
-+static int
-+acx_e_read_proc_phy(char *buf, char **start, off_t offset, int count,
-+                   int *eof, void *data)
-+{
-+      acx_device_t *adev = (acx_device_t*)data;
-+      int length;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+      /* fill buf */
-+      length = acx_s_proc_phy_output(buf, adev);
-+      acx_sem_unlock(adev);
-+
-+      /* housekeeping */
-+      if (length <= offset + count)
-+              *eof = 1;
-+      *start = buf + offset;
-+      length -= offset;
-+      if (length > count)
-+              length = count;
-+      if (length < 0)
-+              length = 0;
-+      FN_EXIT1(length);
-+      return length;
-+}
-+
-+
-+/***********************************************************************
-+** /proc files registration
-+*/
-+static const char * const
-+proc_files[] = { "", "_diag", "_eeprom", "_phy" };
-+
-+static read_proc_t * const
-+proc_funcs[] = {
-+      acx_e_read_proc,
-+      acx_e_read_proc_diag,
-+      acx_e_read_proc_eeprom,
-+      acx_e_read_proc_phy
-+};
-+
-+static int
-+manage_proc_entries(const struct net_device *ndev, int remove)
-+{
-+      acx_device_t *adev = ndev2adev((struct net_device *)ndev);
-+      char procbuf[80];
-+      int i;
-+
-+      for (i = 0; i < VEC_SIZE(proc_files); i++)      {
-+              snprintf(procbuf, sizeof(procbuf),
-+                      "driver/acx_%s%s", ndev->name, proc_files[i]);
-+              log(L_INIT, "%sing /proc entry %s\n",
-+                      remove ? "remov" : "creat", procbuf);
-+              if (!remove) {
-+                      if (!create_proc_read_entry(procbuf, 0, 0, proc_funcs[i], adev)) {
-+                              printk("acx: cannot register /proc entry %s\n", procbuf);
-+                              return NOT_OK;
-+                      }
-+              } else {
-+                      remove_proc_entry(procbuf, NULL);
-+              }
-+      }
-+      return OK;
-+}
-+
-+int
-+acx_proc_register_entries(const struct net_device *ndev)
-+{
-+      return manage_proc_entries(ndev, 0);
-+}
-+
-+int
-+acx_proc_unregister_entries(const struct net_device *ndev)
-+{
-+      return manage_proc_entries(ndev, 1);
-+}
-+#endif /* CONFIG_PROC_FS */
-+
-+
-+/***********************************************************************
-+** acx_cmd_join_bssid
-+**
-+** Common code for both acx100 and acx111.
-+*/
-+/* NB: does NOT match RATE100_nn but matches ACX[111]_SCAN_RATE_n */
-+static const u8
-+bitpos2genframe_txrate[] = {
-+      10,     /*  0.  1 Mbit/s */
-+      20,     /*  1.  2 Mbit/s */
-+      55,     /*  2.  5.5 Mbit/s */
-+      0x0B,   /*  3.  6 Mbit/s */
-+      0x0F,   /*  4.  9 Mbit/s */
-+      110,    /*  5. 11 Mbit/s */
-+      0x0A,   /*  6. 12 Mbit/s */
-+      0x0E,   /*  7. 18 Mbit/s */
-+      220,    /*  8. 22 Mbit/s */
-+      0x09,   /*  9. 24 Mbit/s */
-+      0x0D,   /* 10. 36 Mbit/s */
-+      0x08,   /* 11. 48 Mbit/s */
-+      0x0C,   /* 12. 54 Mbit/s */
-+      10,     /* 13.  1 Mbit/s, should never happen */
-+      10,     /* 14.  1 Mbit/s, should never happen */
-+      10,     /* 15.  1 Mbit/s, should never happen */
-+};
-+
-+/* Looks scary, eh?
-+** Actually, each one compiled into one AND and one SHIFT,
-+** 31 bytes in x86 asm (more if uints are replaced by u16/u8) */
-+static inline unsigned int
-+rate111to5bits(unsigned int rate)
-+{
-+      return (rate & 0x7)
-+      | ( (rate & RATE111_11) / (RATE111_11/JOINBSS_RATES_11) )
-+      | ( (rate & RATE111_22) / (RATE111_22/JOINBSS_RATES_22) )
-+      ;
-+}
-+
-+static void
-+acx_s_cmd_join_bssid(acx_device_t *adev, const u8 *bssid)
-+{
-+      acx_joinbss_t tmp;
-+      int dtim_interval;
-+      int i;
-+
-+      if (mac_is_zero(bssid))
-+              return;
-+
-+      FN_ENTER;
-+
-+      dtim_interval = (ACX_MODE_0_ADHOC == adev->mode) ?
-+                      1 : adev->dtim_interval;
-+
-+      memset(&tmp, 0, sizeof(tmp));
-+
-+      for (i = 0; i < ETH_ALEN; i++) {
-+              tmp.bssid[i] = bssid[ETH_ALEN-1 - i];
-+      }
-+
-+      tmp.beacon_interval = cpu_to_le16(adev->beacon_interval);
-+
-+      /* Basic rate set. Control frame responses (such as ACK or CTS frames)
-+      ** are sent with one of these rates */
-+      if (IS_ACX111(adev)) {
-+              /* It was experimentally determined that rates_basic
-+              ** can take 11g rates as well, not only rates
-+              ** defined with JOINBSS_RATES_BASIC111_nnn.
-+              ** Just use RATE111_nnn constants... */
-+              tmp.u.acx111.dtim_interval = dtim_interval;
-+              tmp.u.acx111.rates_basic = cpu_to_le16(adev->rate_basic);
-+              log(L_ASSOC, "rates_basic:%04X, rates_supported:%04X\n",
-+                      adev->rate_basic, adev->rate_oper);
-+      } else {
-+              tmp.u.acx100.dtim_interval = dtim_interval;
-+              tmp.u.acx100.rates_basic = rate111to5bits(adev->rate_basic);
-+              tmp.u.acx100.rates_supported = rate111to5bits(adev->rate_oper);
-+              log(L_ASSOC, "rates_basic:%04X->%02X, "
-+                      "rates_supported:%04X->%02X\n",
-+                      adev->rate_basic, tmp.u.acx100.rates_basic,
-+                      adev->rate_oper, tmp.u.acx100.rates_supported);
-+      }
-+
-+      /* Setting up how Beacon, Probe Response, RTS, and PS-Poll frames
-+      ** will be sent (rate/modulation/preamble) */
-+      tmp.u.txrate.genfrm_txrate = bitpos2genframe_txrate[lowest_bit(adev->rate_basic)];
-+      tmp.genfrm_mod_pre = 0; /* FIXME: was = adev->capab_short (which was always 0); */
-+      /* we can use short pre *if* all peers can understand it */
-+      /* FIXME #2: we need to correctly set PBCC/OFDM bits here too */
-+
-+      /* we switch fw to STA mode in MONITOR mode, it seems to be
-+      ** the only mode where fw does not emit beacons by itself
-+      ** but allows us to send anything (we really want to retain
-+      ** ability to tx arbitrary frames in MONITOR mode)
-+      */
-+      tmp.macmode = (adev->mode != ACX_MODE_MONITOR ? adev->mode : ACX_MODE_2_STA);
-+      tmp.channel = adev->channel;
-+      tmp.essid_len = adev->essid_len;
-+      /* NOTE: the code memcpy'd essid_len + 1 before, which is WRONG! */
-+      memcpy(tmp.essid, adev->essid, tmp.essid_len);
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_JOIN, &tmp, tmp.essid_len + 0x11);
-+
-+      log(L_ASSOC|L_DEBUG, "BSS_Type = %u\n", tmp.macmode);
-+      acxlog_mac(L_ASSOC|L_DEBUG, "JoinBSSID MAC:", adev->bssid, "\n");
-+
-+      acx_update_capabilities(adev);
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_s_cmd_start_scan
-+**
-+** Issue scan command to the hardware
-+**
-+** unified function for both ACX111 and ACX100
-+*/
-+static void
-+acx_s_scan_chan(acx_device_t *adev)
-+{
-+      union {
-+              acx111_scan_t acx111;
-+              acx100_scan_t acx100;
-+      } s;
-+
-+      FN_ENTER;
-+
-+      memset(&s, 0, sizeof(s));
-+
-+      /* first common positions... */
-+
-+      s.acx111.count = cpu_to_le16(adev->scan_count);
-+      s.acx111.rate = adev->scan_rate;
-+      s.acx111.options = adev->scan_mode;
-+      s.acx111.chan_duration = cpu_to_le16(adev->scan_duration);
-+      s.acx111.max_probe_delay = cpu_to_le16(adev->scan_probe_delay);
-+
-+      /* ...then differences */
-+
-+      if (IS_ACX111(adev)) {
-+              s.acx111.channel_list_select = 0; /* scan every allowed channel */
-+              /*s.acx111.channel_list_select = 1;*/ /* scan given channels */
-+              /*s.acx111.modulation = 0x40;*/ /* long preamble? OFDM? -> only for active scan */
-+              s.acx111.modulation = 0;
-+              /*s.acx111.channel_list[0] = 6;
-+              s.acx111.channel_list[1] = 4;*/
-+      } else {
-+              s.acx100.start_chan = cpu_to_le16(1);
-+              s.acx100.flags = cpu_to_le16(0x8000);
-+      }
-+
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_SCAN, &s, sizeof(s));
-+      FN_EXIT0;
-+}
-+
-+
-+void
-+acx_s_cmd_start_scan(acx_device_t *adev)
-+{
-+      /* time_before check is 'just in case' thing */
-+      if (!(adev->irq_status & HOST_INT_SCAN_COMPLETE)
-+       && time_before(jiffies, adev->scan_start + 10*HZ)
-+      ) {
-+              log(L_INIT, "start_scan: seems like previous scan "
-+              "is still running. Not starting anew. Please report\n");
-+              return;
-+      }
-+
-+      log(L_INIT, "starting radio scan\n");
-+      /* remember that fw is commanded to do scan */
-+      adev->scan_start = jiffies;
-+      CLEAR_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE);
-+      /* issue it */
-+      acx_s_scan_chan(adev);
-+}
-+
-+
-+/***********************************************************************
-+** acx111 feature config
-+*/
-+static int
-+acx111_s_get_feature_config(acx_device_t *adev,
-+              u32 *feature_options, u32 *data_flow_options)
-+{
-+      struct acx111_ie_feature_config feat;
-+
-+      if (!IS_ACX111(adev)) {
-+              return NOT_OK;
-+      }
-+
-+      memset(&feat, 0, sizeof(feat));
-+
-+      if (OK != acx_s_interrogate(adev, &feat, ACX1xx_IE_FEATURE_CONFIG)) {
-+              return NOT_OK;
-+      }
-+      log(L_DEBUG,
-+              "got Feature option:0x%X, DataFlow option: 0x%X\n",
-+              feat.feature_options,
-+              feat.data_flow_options);
-+
-+      if (feature_options)
-+              *feature_options = le32_to_cpu(feat.feature_options);
-+      if (data_flow_options)
-+              *data_flow_options = le32_to_cpu(feat.data_flow_options);
-+
-+      return OK;
-+}
-+
-+static int
-+acx111_s_set_feature_config(acx_device_t *adev,
-+      u32 feature_options, u32 data_flow_options,
-+      unsigned int mode /* 0 == remove, 1 == add, 2 == set */)
-+{
-+      struct acx111_ie_feature_config feat;
-+
-+      if (!IS_ACX111(adev)) {
-+              return NOT_OK;
-+      }
-+
-+      if ((mode < 0) || (mode > 2))
-+              return NOT_OK;
-+
-+      if (mode != 2)
-+              /* need to modify old data */
-+              acx111_s_get_feature_config(adev, &feat.feature_options, &feat.data_flow_options);
-+      else {
-+              /* need to set a completely new value */
-+              feat.feature_options = 0;
-+              feat.data_flow_options = 0;
-+      }
-+
-+      if (mode == 0) { /* remove */
-+              CLEAR_BIT(feat.feature_options, cpu_to_le32(feature_options));
-+              CLEAR_BIT(feat.data_flow_options, cpu_to_le32(data_flow_options));
-+      } else { /* add or set */
-+              SET_BIT(feat.feature_options, cpu_to_le32(feature_options));
-+              SET_BIT(feat.data_flow_options, cpu_to_le32(data_flow_options));
-+      }
-+
-+      log(L_DEBUG,
-+              "old: feature 0x%08X dataflow 0x%08X. mode: %u\n"
-+              "new: feature 0x%08X dataflow 0x%08X\n",
-+              feature_options, data_flow_options, mode,
-+              le32_to_cpu(feat.feature_options),
-+              le32_to_cpu(feat.data_flow_options));
-+
-+      if (OK != acx_s_configure(adev, &feat, ACX1xx_IE_FEATURE_CONFIG)) {
-+              return NOT_OK;
-+      }
-+
-+      return OK;
-+}
-+
-+static inline int
-+acx111_s_feature_off(acx_device_t *adev, u32 f, u32 d)
-+{
-+      return acx111_s_set_feature_config(adev, f, d, 0);
-+}
-+static inline int
-+acx111_s_feature_on(acx_device_t *adev, u32 f, u32 d)
-+{
-+      return acx111_s_set_feature_config(adev, f, d, 1);
-+}
-+static inline int
-+acx111_s_feature_set(acx_device_t *adev, u32 f, u32 d)
-+{
-+      return acx111_s_set_feature_config(adev, f, d, 2);
-+}
-+
-+
-+/***********************************************************************
-+** acx100_s_init_memory_pools
-+*/
-+static int
-+acx100_s_init_memory_pools(acx_device_t *adev, const acx_ie_memmap_t *mmt)
-+{
-+      acx100_ie_memblocksize_t MemoryBlockSize;
-+      acx100_ie_memconfigoption_t MemoryConfigOption;
-+      int TotalMemoryBlocks;
-+      int RxBlockNum;
-+      int TotalRxBlockSize;
-+      int TxBlockNum;
-+      int TotalTxBlockSize;
-+
-+      FN_ENTER;
-+
-+      /* Let's see if we can follow this:
-+         first we select our memory block size (which I think is
-+         completely arbitrary) */
-+      MemoryBlockSize.size = cpu_to_le16(adev->memblocksize);
-+
-+      /* Then we alert the card to our decision of block size */
-+      if (OK != acx_s_configure(adev, &MemoryBlockSize, ACX100_IE_BLOCK_SIZE)) {
-+              goto bad;
-+      }
-+
-+      /* We figure out how many total blocks we can create, using
-+         the block size we chose, and the beginning and ending
-+         memory pointers, i.e.: end-start/size */
-+      TotalMemoryBlocks = (le32_to_cpu(mmt->PoolEnd) - le32_to_cpu(mmt->PoolStart)) / adev->memblocksize;
-+
-+      log(L_DEBUG, "TotalMemoryBlocks=%u (%u bytes)\n",
-+              TotalMemoryBlocks, TotalMemoryBlocks*adev->memblocksize);
-+
-+      /* MemoryConfigOption.DMA_config bitmask:
-+                      access to ACX memory is to be done:
-+      0x00080000      using PCI conf space?!
-+      0x00040000      using IO instructions?
-+      0x00000000      using memory access instructions
-+      0x00020000      using local memory block linked list (else what?)
-+      0x00010000      using host indirect descriptors (else host must access ACX memory?)
-+      */
-+#if defined (ACX_MEM)
-+              /*
-+               * ACX ignores DMA_config for generic slave mode.
-+               */
-+              MemoryConfigOption.DMA_config = 0;
-+              /* Declare start of the Rx host pool */
-+              MemoryConfigOption.pRxHostDesc = cpu2acx(0);
-+              log(L_DEBUG, "pRxHostDesc 0x%08X, rxhostdesc_startphy 0x%lX\n",
-+                              acx2cpu(MemoryConfigOption.pRxHostDesc),
-+                              (long)adev->rxhostdesc_startphy);
-+#else
-+      if (IS_PCI(adev)) {
-+              MemoryConfigOption.DMA_config = cpu_to_le32(0x30000);
-+              /* Declare start of the Rx host pool */
-+              MemoryConfigOption.pRxHostDesc = cpu2acx(adev->rxhostdesc_startphy);
-+              log(L_DEBUG, "pRxHostDesc 0x%08X, rxhostdesc_startphy 0x%lX\n",
-+                              acx2cpu(MemoryConfigOption.pRxHostDesc),
-+                              (long)adev->rxhostdesc_startphy);
-+      } else {
-+              MemoryConfigOption.DMA_config = cpu_to_le32(0x20000);
-+      }
-+#endif
-+
-+      /* 50% of the allotment of memory blocks go to tx descriptors */
-+      TxBlockNum = TotalMemoryBlocks / 2;
-+      MemoryConfigOption.TxBlockNum = cpu_to_le16(TxBlockNum);
-+
-+      /* and 50% go to the rx descriptors */
-+      RxBlockNum = TotalMemoryBlocks - TxBlockNum;
-+      MemoryConfigOption.RxBlockNum = cpu_to_le16(RxBlockNum);
-+
-+      /* size of the tx and rx descriptor queues */
-+      TotalTxBlockSize = TxBlockNum * adev->memblocksize;
-+      TotalRxBlockSize = RxBlockNum * adev->memblocksize;
-+      log(L_DEBUG, "TxBlockNum %u RxBlockNum %u TotalTxBlockSize %u "
-+              "TotalTxBlockSize %u\n", TxBlockNum, RxBlockNum,
-+              TotalTxBlockSize, TotalRxBlockSize);
-+
-+
-+      /* align the tx descriptor queue to an alignment of 0x20 (32 bytes) */
-+      MemoryConfigOption.rx_mem =
-+              cpu_to_le32((le32_to_cpu(mmt->PoolStart) + 0x1f) & ~0x1f);
-+
-+      /* align the rx descriptor queue to units of 0x20
-+       * and offset it by the tx descriptor queue */
-+      MemoryConfigOption.tx_mem =
-+              cpu_to_le32((le32_to_cpu(mmt->PoolStart) + TotalRxBlockSize + 0x1f) & ~0x1f);
-+      log(L_DEBUG, "rx_mem %08X rx_mem %08X\n",
-+              MemoryConfigOption.tx_mem, MemoryConfigOption.rx_mem);
-+
-+      /* alert the device to our decision */
-+      if (OK != acx_s_configure(adev, &MemoryConfigOption, ACX1xx_IE_MEMORY_CONFIG_OPTIONS)) {
-+              goto bad;
-+      }
-+
-+      /* and tell the device to kick it into gear */
-+      if (OK != acx_s_issue_cmd(adev, ACX100_CMD_INIT_MEMORY, NULL, 0)) {
-+              goto bad;
-+      }
-+#ifdef ACX_MEM
-+      /*
-+       * slave memory interface has to manage the transmit pools for the ACX,
-+       * so it needs to know what we chose here.
-+       */
-+      adev->acx_txbuf_start = MemoryConfigOption.tx_mem;
-+      adev->acx_txbuf_numblocks = MemoryConfigOption.TxBlockNum;
-+#endif
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+bad:
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx100_s_create_dma_regions
-+**
-+** Note that this fn messes up heavily with hardware, but we cannot
-+** lock it (we need to sleep). Not a problem since IRQs can't happen
-+*/
-+static int
-+acx100_s_create_dma_regions(acx_device_t *adev)
-+{
-+      acx100_ie_queueconfig_t queueconf;
-+      acx_ie_memmap_t memmap;
-+      int res = NOT_OK;
-+      u32 tx_queue_start, rx_queue_start;
-+
-+      FN_ENTER;
-+
-+      /* read out the acx100 physical start address for the queues */
-+      if (OK != acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP)) {
-+              goto fail;
-+      }
-+
-+      tx_queue_start = le32_to_cpu(memmap.QueueStart);
-+      rx_queue_start = tx_queue_start + TX_CNT * sizeof(txdesc_t);
-+
-+      log(L_DEBUG, "initializing Queue Indicator\n");
-+
-+      memset(&queueconf, 0, sizeof(queueconf));
-+
-+      /* Not needed for PCI or slave memory, so we can avoid setting them altogether */
-+      if (IS_USB(adev)) {
-+              queueconf.NumTxDesc = USB_TX_CNT;
-+              queueconf.NumRxDesc = USB_RX_CNT;
-+      }
-+
-+      /* calculate size of queues */
-+      queueconf.AreaSize = cpu_to_le32(
-+                      TX_CNT * sizeof(txdesc_t) +
-+                      RX_CNT * sizeof(rxdesc_t) + 8
-+                      );
-+      queueconf.NumTxQueues = 1;  /* number of tx queues */
-+      /* sets the beginning of the tx descriptor queue */
-+      queueconf.TxQueueStart = memmap.QueueStart;
-+      /* done by memset: queueconf.TxQueuePri = 0; */
-+      queueconf.RxQueueStart = cpu_to_le32(rx_queue_start);
-+      queueconf.QueueOptions = 1;             /* auto reset descriptor */
-+      /* sets the end of the rx descriptor queue */
-+      queueconf.QueueEnd = cpu_to_le32(
-+                      rx_queue_start + RX_CNT * sizeof(rxdesc_t)
-+                      );
-+      /* sets the beginning of the next queue */
-+      queueconf.HostQueueEnd = cpu_to_le32(le32_to_cpu(queueconf.QueueEnd) + 8);
-+      if (OK != acx_s_configure(adev, &queueconf, ACX1xx_IE_QUEUE_CONFIG)) {
-+              goto fail;
-+      }
-+
-+#if defined (ACX_MEM)
-+      /* sets the beginning of the rx descriptor queue, after the tx descrs */
-+              adev->acx_queue_indicator =
-+                (queueindicator_t *) le32_to_cpu (queueconf.QueueEnd);
-+              if (OK != acxmem_s_create_hostdesc_queues(adev))
-+                      goto fail;
-+
-+              acxmem_create_desc_queues(adev, tx_queue_start, rx_queue_start);
-+#else
-+      if (IS_PCI(adev)) {
-+      /* sets the beginning of the rx descriptor queue, after the tx descrs */
-+              if (OK != acxpci_s_create_hostdesc_queues(adev))
-+                      goto fail;
-+              acxpci_create_desc_queues(adev, tx_queue_start, rx_queue_start);
-+      }
-+#endif
-+
-+      if (OK != acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP)) {
-+              goto fail;
-+      }
-+
-+      /*
-+       * Have to make sure we skip past the Queue Indicator (QueueEnd) and Host Queue Indicator
-+       * maps, each of which are 8 bytes and follow immediately after the transmit and
-+       * receive queues.
-+       */
-+      memmap.PoolStart = cpu_to_le32(
-+                      (le32_to_cpu(memmap.QueueEnd) + 4 + 0x1f) & ~0x1f
-+                      );
-+
-+      if (OK != acx_s_configure(adev, &memmap, ACX1xx_IE_MEMORY_MAP)) {
-+              goto fail;
-+      }
-+
-+      if (OK != acx100_s_init_memory_pools(adev, &memmap)) {
-+              goto fail;
-+      }
-+
-+      res = OK;
-+      goto end;
-+
-+fail:
-+      acx_s_msleep(1000); /* ? */
-+#if defined (ACX_MEM)
-+              acxmem_free_desc_queues(adev);
-+#else
-+      if (IS_PCI(adev))
-+              acxpci_free_desc_queues(adev);
-+#endif
-+end:
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acx111_s_create_dma_regions
-+**
-+** Note that this fn messes heavily with hardware, but we cannot
-+** lock it (we need to sleep). Not a problem since IRQs can't happen
-+*/
-+#define ACX111_PERCENT(percent) ((percent)/5)
-+
-+static int
-+acx111_s_create_dma_regions(acx_device_t *adev)
-+{
-+      struct acx111_ie_memoryconfig memconf;
-+      struct acx111_ie_queueconfig queueconf;
-+      u32 tx_queue_start, rx_queue_start;
-+
-+      FN_ENTER;
-+
-+      /* Calculate memory positions and queue sizes */
-+
-+      /* Set up our host descriptor pool + data pool */
-+#if defined (ACX_MEM)
-+              if (OK != acxmem_s_create_hostdesc_queues(adev))
-+                      goto fail;
-+#else
-+      if (IS_PCI(adev)) {
-+              if (OK != acxpci_s_create_hostdesc_queues(adev))
-+                      goto fail;
-+      }
-+#endif
-+
-+      memset(&memconf, 0, sizeof(memconf));
-+      /* the number of STAs (STA contexts) to support
-+      ** NB: was set to 1 and everything seemed to work nevertheless... */
-+      memconf.no_of_stations = cpu_to_le16(VEC_SIZE(adev->sta_list));
-+      /* specify the memory block size. Default is 256 */
-+      memconf.memory_block_size = cpu_to_le16(adev->memblocksize);
-+      /* let's use 50%/50% for tx/rx (specify percentage, units of 5%) */
-+      memconf.tx_rx_memory_block_allocation = ACX111_PERCENT(50);
-+      /* set the count of our queues
-+      ** NB: struct acx111_ie_memoryconfig shall be modified
-+      ** if we ever will switch to more than one rx and/or tx queue */
-+      memconf.count_rx_queues = 1;
-+      memconf.count_tx_queues = 1;
-+      /* 0 == Busmaster Indirect Memory Organization, which is what we want
-+       * (using linked host descs with their allocated mem).
-+       * 2 == Generic Bus Slave */
-+      /* done by memset: memconf.options = 0; */
-+      /* let's use 25% for fragmentations and 75% for frame transfers
-+       * (specified in units of 5%) */
-+      memconf.fragmentation = ACX111_PERCENT(75);
-+      /* Rx descriptor queue config */
-+      memconf.rx_queue1_count_descs = RX_CNT;
-+      memconf.rx_queue1_type = 7; /* must be set to 7 */
-+      /* done by memset: memconf.rx_queue1_prio = 0; low prio */
-+#if defined (ACX_MEM)
-+              memconf.rx_queue1_host_rx_start = cpu2acx(adev->rxhostdesc_startphy);
-+#else
-+      if (IS_PCI(adev)) {
-+              memconf.rx_queue1_host_rx_start = cpu2acx(adev->rxhostdesc_startphy);
-+      }
-+#endif
-+      /* Tx descriptor queue config */
-+      memconf.tx_queue1_count_descs = TX_CNT;
-+      /* done by memset: memconf.tx_queue1_attributes = 0; lowest priority */
-+
-+      /* NB1: this looks wrong: (memconf,ACX1xx_IE_QUEUE_CONFIG),
-+      ** (queueconf,ACX1xx_IE_MEMORY_CONFIG_OPTIONS) look swapped, eh?
-+      ** But it is actually correct wrt IE numbers.
-+      ** NB2: sizeof(memconf) == 28 == 0x1c but configure(ACX1xx_IE_QUEUE_CONFIG)
-+      ** writes 0x20 bytes (because same IE for acx100 uses struct acx100_ie_queueconfig
-+      ** which is 4 bytes larger. what a mess. TODO: clean it up) */
-+      if (OK != acx_s_configure(adev, &memconf, ACX1xx_IE_QUEUE_CONFIG)) {
-+              goto fail;
-+      }
-+
-+      acx_s_interrogate(adev, &queueconf, ACX1xx_IE_MEMORY_CONFIG_OPTIONS);
-+
-+      tx_queue_start = le32_to_cpu(queueconf.tx1_queue_address);
-+      rx_queue_start = le32_to_cpu(queueconf.rx1_queue_address);
-+
-+      log(L_INIT, "dump queue head (from card):\n"
-+                     "len: %u\n"
-+                     "tx_memory_block_address: %X\n"
-+                     "rx_memory_block_address: %X\n"
-+                     "tx1_queue address: %X\n"
-+                     "rx1_queue address: %X\n",
-+                              le16_to_cpu(queueconf.len),
-+                              le32_to_cpu(queueconf.tx_memory_block_address),
-+                              le32_to_cpu(queueconf.rx_memory_block_address),
-+                              tx_queue_start,
-+                              rx_queue_start);
-+
-+#if defined (ACX_MEM)
-+              acxmem_create_desc_queues(adev, tx_queue_start, rx_queue_start);
-+#else
-+      if (IS_PCI(adev))
-+              acxpci_create_desc_queues(adev, tx_queue_start, rx_queue_start);
-+#endif
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+fail:
-+#if defined (ACX_MEM)
-+              acxmem_free_desc_queues(adev);
-+#else
-+      if (IS_PCI(adev))
-+              acxpci_free_desc_queues(adev);
-+#endif
-+
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static void
-+acx_s_initialize_rx_config(acx_device_t *adev)
-+{
-+      struct {
-+              u16     id;
-+              u16     len;
-+              u16     rx_cfg1;
-+              u16     rx_cfg2;
-+      } ACX_PACKED cfg;
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_OFF:
-+              adev->rx_config_1 = (u16) (0
-+                      /* | RX_CFG1_INCLUDE_RXBUF_HDR  */
-+                      /* | RX_CFG1_FILTER_SSID        */
-+                      /* | RX_CFG1_FILTER_BCAST       */
-+                      /* | RX_CFG1_RCV_MC_ADDR1       */
-+                      /* | RX_CFG1_RCV_MC_ADDR0       */
-+                      /* | RX_CFG1_FILTER_ALL_MULTI   */
-+                      /* | RX_CFG1_FILTER_BSSID       */
-+                      /* | RX_CFG1_FILTER_MAC         */
-+                      /* | RX_CFG1_RCV_PROMISCUOUS    */
-+                      /* | RX_CFG1_INCLUDE_FCS        */
-+                      /* | RX_CFG1_INCLUDE_PHY_HDR    */
-+                      );
-+              adev->rx_config_2 = (u16) (0
-+                      /*| RX_CFG2_RCV_ASSOC_REQ       */
-+                      /*| RX_CFG2_RCV_AUTH_FRAMES     */
-+                      /*| RX_CFG2_RCV_BEACON_FRAMES   */
-+                      /*| RX_CFG2_RCV_CONTENTION_FREE */
-+                      /*| RX_CFG2_RCV_CTRL_FRAMES     */
-+                      /*| RX_CFG2_RCV_DATA_FRAMES     */
-+                      /*| RX_CFG2_RCV_BROKEN_FRAMES   */
-+                      /*| RX_CFG2_RCV_MGMT_FRAMES     */
-+                      /*| RX_CFG2_RCV_PROBE_REQ       */
-+                      /*| RX_CFG2_RCV_PROBE_RESP      */
-+                      /*| RX_CFG2_RCV_ACK_FRAMES      */
-+                      /*| RX_CFG2_RCV_OTHER           */
-+                      );
-+              break;
-+      case ACX_MODE_MONITOR:
-+              adev->rx_config_1 = (u16) (0
-+                      /* | RX_CFG1_INCLUDE_RXBUF_HDR  */
-+                      /* | RX_CFG1_FILTER_SSID        */
-+                      /* | RX_CFG1_FILTER_BCAST       */
-+                      /* | RX_CFG1_RCV_MC_ADDR1       */
-+                      /* | RX_CFG1_RCV_MC_ADDR0       */
-+                      /* | RX_CFG1_FILTER_ALL_MULTI   */
-+                      /* | RX_CFG1_FILTER_BSSID       */
-+                      /* | RX_CFG1_FILTER_MAC         */
-+                      | RX_CFG1_RCV_PROMISCUOUS
-+                      /* | RX_CFG1_INCLUDE_FCS        */
-+                      /* | RX_CFG1_INCLUDE_PHY_HDR    */
-+                      );
-+              adev->rx_config_2 = (u16) (0
-+                      | RX_CFG2_RCV_ASSOC_REQ
-+                      | RX_CFG2_RCV_AUTH_FRAMES
-+                      | RX_CFG2_RCV_BEACON_FRAMES
-+                      | RX_CFG2_RCV_CONTENTION_FREE
-+                      | RX_CFG2_RCV_CTRL_FRAMES
-+                      | RX_CFG2_RCV_DATA_FRAMES
-+                      | RX_CFG2_RCV_BROKEN_FRAMES
-+                      | RX_CFG2_RCV_MGMT_FRAMES
-+                      | RX_CFG2_RCV_PROBE_REQ
-+                      | RX_CFG2_RCV_PROBE_RESP
-+                      | RX_CFG2_RCV_ACK_FRAMES
-+                      | RX_CFG2_RCV_OTHER
-+                      );
-+              break;
-+      default:
-+              adev->rx_config_1 = (u16) (0
-+                      /* | RX_CFG1_INCLUDE_RXBUF_HDR  */
-+                      /* | RX_CFG1_FILTER_SSID        */
-+                      /* | RX_CFG1_FILTER_BCAST       */
-+                      /* | RX_CFG1_RCV_MC_ADDR1       */
-+                      /* | RX_CFG1_RCV_MC_ADDR0       */
-+                      /* | RX_CFG1_FILTER_ALL_MULTI   */
-+                      /* | RX_CFG1_FILTER_BSSID       */
-+                      | RX_CFG1_FILTER_MAC
-+                      /* | RX_CFG1_RCV_PROMISCUOUS    */
-+                      /* | RX_CFG1_INCLUDE_FCS        */
-+                      /* | RX_CFG1_INCLUDE_PHY_HDR    */
-+                      );
-+              adev->rx_config_2 = (u16) (0
-+                      | RX_CFG2_RCV_ASSOC_REQ
-+                      | RX_CFG2_RCV_AUTH_FRAMES
-+                      | RX_CFG2_RCV_BEACON_FRAMES
-+                      | RX_CFG2_RCV_CONTENTION_FREE
-+                      | RX_CFG2_RCV_CTRL_FRAMES
-+                      | RX_CFG2_RCV_DATA_FRAMES
-+                      /*| RX_CFG2_RCV_BROKEN_FRAMES   */
-+                      | RX_CFG2_RCV_MGMT_FRAMES
-+                      | RX_CFG2_RCV_PROBE_REQ
-+                      | RX_CFG2_RCV_PROBE_RESP
-+                      /*| RX_CFG2_RCV_ACK_FRAMES      */
-+                      | RX_CFG2_RCV_OTHER
-+                      );
-+              break;
-+      }
-+      adev->rx_config_1 |= RX_CFG1_INCLUDE_RXBUF_HDR;
-+
-+      if ((adev->rx_config_1 & RX_CFG1_INCLUDE_PHY_HDR)
-+       || (adev->firmware_numver >= 0x02000000))
-+              adev->phy_header_len = IS_ACX111(adev) ? 8 : 4;
-+      else
-+              adev->phy_header_len = 0;
-+
-+      log(L_INIT, "setting RXconfig to %04X:%04X\n",
-+                      adev->rx_config_1, adev->rx_config_2);
-+      cfg.rx_cfg1 = cpu_to_le16(adev->rx_config_1);
-+      cfg.rx_cfg2 = cpu_to_le16(adev->rx_config_2);
-+      acx_s_configure(adev, &cfg, ACX1xx_IE_RXCONFIG);
-+}
-+
-+
-+/***********************************************************************
-+** acx_s_set_defaults
-+*/
-+void
-+acx_s_set_defaults(acx_device_t *adev)
-+{
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      /* do it before getting settings, prevent bogus channel 0 warning */
-+      adev->channel = 1;
-+
-+      /* query some settings from the card.
-+       * NOTE: for some settings, e.g. CCA and ED (ACX100!), an initial
-+       * query is REQUIRED, otherwise the card won't work correctly! */
-+      adev->get_mask = GETSET_ANTENNA|GETSET_SENSITIVITY|GETSET_STATION_ID|GETSET_REG_DOMAIN;
-+      /* Only ACX100 supports ED and CCA */
-+      if (IS_ACX100(adev))
-+              adev->get_mask |= GETSET_CCA|GETSET_ED_THRESH;
-+
-+      acx_s_update_card_settings(adev);
-+
-+      acx_lock(adev, flags);
-+
-+      /* set our global interrupt mask */
-+#if defined (ACX_MEM)
-+              acxmem_set_interrupt_mask(adev);
-+#else
-+      if (IS_PCI(adev))
-+              acxpci_set_interrupt_mask(adev);
-+#endif
-+
-+      adev->led_power = 1; /* LED is active on startup */
-+      adev->brange_max_quality = 60; /* LED blink max quality is 60 */
-+      adev->brange_time_last_state_change = jiffies;
-+
-+      /* copy the MAC address we just got from the card
-+       * into our MAC address used during current 802.11 session */
-+      MAC_COPY(adev->dev_addr, adev->ndev->dev_addr);
-+      MAC_BCAST(adev->ap);
-+
-+      adev->essid_len =
-+              snprintf(adev->essid, sizeof(adev->essid), "STA%02X%02X%02X",
-+                      adev->dev_addr[3], adev->dev_addr[4], adev->dev_addr[5]);
-+      adev->essid_active = 1;
-+
-+      /* we have a nick field to waste, so why not abuse it
-+       * to announce the driver version? ;-) */
-+      strncpy(adev->nick, "acx " ACX_RELEASE, IW_ESSID_MAX_SIZE);
-+
-+#if defined (ACX_MEM)
-+              adev->reg_dom_id = adev->cfgopt_domains.list[0];
-+#else
-+      if (IS_PCI(adev)) { /* FIXME: this should be made to apply to USB, too! */
-+              /* first regulatory domain entry in EEPROM == default reg. domain */
-+              adev->reg_dom_id = adev->cfgopt_domains.list[0];
-+      }
-+#endif
-+
-+      /* 0xffff would be better, but then we won't get a "scan complete"
-+       * interrupt, so our current infrastructure will fail: */
-+      adev->scan_count = 1;
-+      adev->scan_mode = ACX_SCAN_OPT_ACTIVE;
-+      adev->scan_duration = 100;
-+      adev->scan_probe_delay = 200;
-+      /* reported to break scanning: adev->scan_probe_delay = adev->cfgopt_probe_delay; */
-+      adev->scan_rate = ACX_SCAN_RATE_1;
-+
-+      adev->mode = ACX_MODE_2_STA;
-+      adev->auth_alg = WLAN_AUTH_ALG_OPENSYSTEM;
-+      adev->listen_interval = 100;
-+      adev->beacon_interval = DEFAULT_BEACON_INTERVAL;
-+      adev->dtim_interval = DEFAULT_DTIM_INTERVAL;
-+
-+      adev->msdu_lifetime = DEFAULT_MSDU_LIFETIME;
-+
-+      adev->rts_threshold = DEFAULT_RTS_THRESHOLD;
-+      adev->frag_threshold = 2346;
-+
-+      /* use standard default values for retry limits */
-+      adev->short_retry = 7; /* max. retries for (short) non-RTS packets */
-+      adev->long_retry = 4; /* max. retries for long (RTS) packets */
-+
-+      adev->preamble_mode = 2; /* auto */
-+      adev->fallback_threshold = 3;
-+      adev->stepup_threshold = 10;
-+      adev->rate_bcast = RATE111_1;
-+      adev->rate_bcast100 = RATE100_1;
-+      adev->rate_basic = RATE111_1 | RATE111_2;
-+      adev->rate_auto = 1;
-+      if (IS_ACX111(adev)) {
-+              adev->rate_oper = RATE111_ALL;
-+      } else {
-+              adev->rate_oper = RATE111_ACX100_COMPAT;
-+      }
-+
-+      /* Supported Rates element - the rates here are given in units of
-+       * 500 kbit/s, plus 0x80 added. See 802.11-1999.pdf item 7.3.2.2 */
-+      acx_l_update_ratevector(adev);
-+
-+      /* set some more defaults */
-+      if (IS_ACX111(adev)) {
-+              /* 30mW (15dBm) is default, at least in my acx111 card: */
-+              adev->tx_level_dbm = 15;
-+      } else {
-+              /* don't use max. level, since it might be dangerous
-+               * (e.g. WRT54G people experience
-+               * excessive Tx power damage!) */
-+              adev->tx_level_dbm = 18;
-+              /*
-+               * Lower power for the iPaq hx4700
-+               */
-+              if (IS_MEM(adev)) {
-+                      adev->tx_level_dbm = 14;
-+              }
-+      }
-+      /* adev->tx_level_auto = 1; */
-+      if (IS_ACX111(adev)) {
-+              /* start with sensitivity level 1 out of 3: */
-+              adev->sensitivity = 1;
-+      }
-+
-+/* #define ENABLE_POWER_SAVE */
-+#ifdef ENABLE_POWER_SAVE
-+      adev->ps_wakeup_cfg = PS_CFG_ENABLE | PS_CFG_WAKEUP_ALL_BEAC;
-+      adev->ps_listen_interval = 1;
-+      adev->ps_options = PS_OPT_ENA_ENHANCED_PS | PS_OPT_TX_PSPOLL | PS_OPT_STILL_RCV_BCASTS;
-+      adev->ps_hangover_period = 30;
-+      adev->ps_enhanced_transition_time = 0;
-+#else
-+      adev->ps_wakeup_cfg = 0;
-+      adev->ps_listen_interval = 0;
-+      adev->ps_options = 0;
-+      adev->ps_hangover_period = 0;
-+      adev->ps_enhanced_transition_time = 0;
-+#endif
-+
-+      /* These settings will be set in fw on ifup */
-+      adev->set_mask = 0
-+              | GETSET_RETRY
-+              | SET_MSDU_LIFETIME
-+      /* configure card to do rate fallback when in auto rate mode */
-+              | SET_RATE_FALLBACK
-+              | SET_RXCONFIG
-+              | GETSET_TXPOWER
-+      /* better re-init the antenna value we got above */
-+              | GETSET_ANTENNA
-+#if POWER_SAVE_80211
-+              | GETSET_POWER_80211
-+#endif
-+              ;
-+
-+      acx_unlock(adev, flags);
-+      acx_lock_unhold(); /* hold time 844814 CPU ticks @2GHz */
-+
-+      acx_s_initialize_rx_config(adev);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** FIXME: this should be solved in a general way for all radio types
-+** by decoding the radio firmware module,
-+** since it probably has some standard structure describing how to
-+** set the power level of the radio module which it controls.
-+** Or maybe not, since the radio module probably has a function interface
-+** instead which then manages Tx level programming :-\
-+*/
-+static int
-+acx111_s_set_tx_level(acx_device_t *adev, u8 level_dbm)
-+{
-+      struct acx111_ie_tx_level tx_level;
-+
-+      /* my acx111 card has two power levels in its configoptions (== EEPROM):
-+       * 1 (30mW) [15dBm]
-+       * 2 (10mW) [10dBm]
-+       * For now, just assume all other acx111 cards have the same.
-+       * FIXME: Ideally we would query it here, but we first need a
-+       * standard way to query individual configoptions easily.
-+       * Well, now we have proper cfgopt txpower variables, but this still
-+       * hasn't been done yet, since it also requires dBm <-> mW conversion here... */
-+      if (level_dbm <= 12) {
-+              tx_level.level = 2; /* 10 dBm */
-+              adev->tx_level_dbm = 10;
-+      } else {
-+              tx_level.level = 1; /* 15 dBm */
-+              adev->tx_level_dbm = 15;
-+      }
-+      if (level_dbm != adev->tx_level_dbm)
-+              log(L_INIT, "acx111 firmware has specific "
-+                      "power levels only: adjusted %d dBm to %d dBm!\n",
-+                      level_dbm, adev->tx_level_dbm);
-+
-+      return acx_s_configure(adev, &tx_level, ACX1xx_IE_DOT11_TX_POWER_LEVEL);
-+}
-+
-+static int
-+acx_s_set_tx_level(acx_device_t *adev, u8 level_dbm)
-+{
-+      if (IS_ACX111(adev)) {
-+              return acx111_s_set_tx_level(adev, level_dbm);
-+      }
-+#if defined (ACX_MEM)
-+              return acx100mem_s_set_tx_level(adev, level_dbm);
-+#else
-+      if (IS_PCI(adev)) {
-+              return acx100pci_s_set_tx_level(adev, level_dbm);
-+      }
-+#endif
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+#ifdef UNUSED
-+/* Returns the current tx level (ACX111) */
-+static u8
-+acx111_s_get_tx_level(acx_device_t *adev)
-+{
-+      struct acx111_ie_tx_level tx_level;
-+
-+      tx_level.level = 0;
-+      acx_s_interrogate(adev, &tx_level, ACX1xx_IE_DOT11_TX_POWER_LEVEL);
-+      return tx_level.level;
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_l_rxmonitor
-+** Called from IRQ context only
-+*/
-+static void
-+acx_l_rxmonitor(acx_device_t *adev, const rxbuffer_t *rxbuf)
-+{
-+      wlansniffrm_t *msg;
-+      struct sk_buff *skb;
-+      void *datap;
-+      unsigned int skb_len;
-+      int payload_offset;
-+
-+      FN_ENTER;
-+
-+      /* we are in big luck: the acx100 doesn't modify any of the fields */
-+      /* in the 802.11 frame. just pass this packet into the PF_PACKET */
-+      /* subsystem. yeah. */
-+      payload_offset = ((u8*)acx_get_wlan_hdr(adev, rxbuf) - (u8*)rxbuf);
-+      skb_len = RXBUF_BYTES_USED(rxbuf) - payload_offset;
-+
-+      /* sanity check */
-+      if (unlikely(skb_len > WLAN_A4FR_MAXLEN_WEP)) {
-+              printk("%s: monitor mode panic: oversized frame!\n",
-+                              adev->ndev->name);
-+              goto end;
-+      }
-+
-+      if (adev->ndev->type == ARPHRD_IEEE80211_PRISM)
-+              skb_len += sizeof(*msg);
-+
-+      /* allocate skb */
-+      skb = dev_alloc_skb(skb_len);
-+      if (unlikely(!skb)) {
-+              printk("%s: no memory for skb (%u bytes)\n",
-+                              adev->ndev->name, skb_len);
-+              goto end;
-+      }
-+
-+      skb_put(skb, skb_len);
-+
-+      if (adev->ndev->type == ARPHRD_IEEE80211) {
-+              /* when in raw 802.11 mode, just copy frame as-is */
-+              datap = skb->data;
-+      } else if (adev->ndev->type == ARPHRD_IEEE80211_PRISM) {
-+              /* emulate prism header */
-+              msg = (wlansniffrm_t*)skb->data;
-+              datap = msg + 1;
-+
-+              msg->msgcode = WLANSNIFFFRM;
-+              msg->msglen = sizeof(*msg);
-+              strncpy(msg->devname, adev->ndev->name, sizeof(msg->devname)-1);
-+              msg->devname[sizeof(msg->devname)-1] = '\0';
-+
-+              msg->hosttime.did = WLANSNIFFFRM_hosttime;
-+              msg->hosttime.status = WLANITEM_STATUS_data_ok;
-+              msg->hosttime.len = 4;
-+              msg->hosttime.data = jiffies;
-+
-+              msg->mactime.did = WLANSNIFFFRM_mactime;
-+              msg->mactime.status = WLANITEM_STATUS_data_ok;
-+              msg->mactime.len = 4;
-+              msg->mactime.data = rxbuf->time;
-+
-+              msg->channel.did = WLANSNIFFFRM_channel;
-+              msg->channel.status = WLANITEM_STATUS_data_ok;
-+              msg->channel.len = 4;
-+              msg->channel.data = adev->channel;
-+
-+              msg->rssi.did = WLANSNIFFFRM_rssi;
-+              msg->rssi.status = WLANITEM_STATUS_no_value;
-+              msg->rssi.len = 4;
-+              msg->rssi.data = 0;
-+
-+              msg->sq.did = WLANSNIFFFRM_sq;
-+              msg->sq.status = WLANITEM_STATUS_no_value;
-+              msg->sq.len = 4;
-+              msg->sq.data = 0;
-+
-+              msg->signal.did = WLANSNIFFFRM_signal;
-+              msg->signal.status = WLANITEM_STATUS_data_ok;
-+              msg->signal.len = 4;
-+              msg->signal.data = rxbuf->phy_snr;
-+
-+              msg->noise.did = WLANSNIFFFRM_noise;
-+              msg->noise.status = WLANITEM_STATUS_data_ok;
-+              msg->noise.len = 4;
-+              msg->noise.data = rxbuf->phy_level;
-+
-+              msg->rate.did = WLANSNIFFFRM_rate;
-+              msg->rate.status = WLANITEM_STATUS_data_ok;
-+              msg->rate.len = 4;
-+              msg->rate.data = rxbuf->phy_plcp_signal / 5;
-+
-+              msg->istx.did = WLANSNIFFFRM_istx;
-+              msg->istx.status = WLANITEM_STATUS_data_ok;
-+              msg->istx.len = 4;
-+              msg->istx.data = 0;     /* tx=0: it's not a tx packet */
-+
-+              skb_len -= sizeof(*msg);
-+
-+              msg->frmlen.did = WLANSNIFFFRM_signal;
-+              msg->frmlen.status = WLANITEM_STATUS_data_ok;
-+              msg->frmlen.len = 4;
-+              msg->frmlen.data = skb_len;
-+      } else {
-+              printk("acx: unsupported netdev type %d!\n", adev->ndev->type);
-+              dev_kfree_skb(skb);
-+              return;
-+      }
-+
-+      /* sanity check (keep it here) */
-+      if (unlikely((int)skb_len < 0)) {
-+              printk("acx: skb_len=%d. Driver bug, please report\n", (int)skb_len);
-+              dev_kfree_skb(skb);
-+              return;
-+      }
-+      memcpy(datap, ((unsigned char*)rxbuf)+payload_offset, skb_len);
-+
-+      skb->dev = adev->ndev;
-+      skb->dev->last_rx = jiffies;
-+
-+      skb_reset_mac_header(skb);
-+      skb->ip_summed = CHECKSUM_NONE;
-+      skb->pkt_type = PACKET_OTHERHOST;
-+      skb->protocol = htons(ETH_P_80211_RAW);
-+      netif_rx(skb);
-+
-+      adev->stats.rx_packets++;
-+      adev->stats.rx_bytes += skb->len;
-+
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_rx_ieee802_11_frame
-+**
-+** Called from IRQ context only
-+*/
-+
-+/* All these contortions are for saner dup logging
-+**
-+** We want: (a) to know about excessive dups
-+** (b) to not spam kernel log about occasional dups
-+**
-+** 1/64 threshold was chosen by running "ping -A"
-+** It gave "rx: 59 DUPs in 2878 packets" only with 4 parallel
-+** "ping -A" streams running. */
-+/* 2005-10-11: bumped up to 1/8
-+** subtract a $smallint from dup_count in order to
-+** avoid "2 DUPs in 19 packets" messages */
-+static inline int
-+acx_l_handle_dup(acx_device_t *adev, u16 seq)
-+{
-+      if (adev->dup_count) {
-+              adev->nondup_count++;
-+              if (time_after(jiffies, adev->dup_msg_expiry)) {
-+                      /* Log only if more than 1 dup in 64 packets */
-+                      if (adev->nondup_count/8 < adev->dup_count-5) {
-+                              printk(KERN_INFO "%s: rx: %d DUPs in "
-+                                      "%d packets received in 10 secs\n",
-+                                      adev->ndev->name,
-+                                      adev->dup_count,
-+                                      adev->nondup_count);
-+                      }
-+                      adev->dup_count = 0;
-+                      adev->nondup_count = 0;
-+              }
-+      }
-+      if (unlikely(seq == adev->last_seq_ctrl)) {
-+              if (!adev->dup_count++)
-+                      adev->dup_msg_expiry = jiffies + 10*HZ;
-+              adev->stats.rx_errors++;
-+              return 1; /* a dup */
-+      }
-+      adev->last_seq_ctrl = seq;
-+      return 0;
-+}
-+
-+static int
-+acx_l_rx_ieee802_11_frame(acx_device_t *adev, rxbuffer_t *rxbuf)
-+{
-+      unsigned int ftype, fstype;
-+      const wlan_hdr_t *hdr;
-+      int result = NOT_OK;
-+
-+      FN_ENTER;
-+
-+      hdr = acx_get_wlan_hdr(adev, rxbuf);
-+
-+      /* see IEEE 802.11-1999.pdf chapter 7 "MAC frame formats" */
-+      if (unlikely((hdr->fc & WF_FC_PVERi) != 0)) {
-+              printk_ratelimited(KERN_INFO "rx: unsupported 802.11 protocol\n");
-+              goto end;
-+      }
-+
-+      ftype = hdr->fc & WF_FC_FTYPEi;
-+      fstype = hdr->fc & WF_FC_FSTYPEi;
-+
-+      switch (ftype) {
-+      /* check data frames first, for speed */
-+      case WF_FTYPE_DATAi:
-+              switch (fstype) {
-+              case WF_FSTYPE_DATAONLYi:
-+                      if (acx_l_handle_dup(adev, hdr->seq))
-+                              break; /* a dup, simply discard it */
-+
-+                      /* TODO:
-+                      if (WF_FC_FROMTODSi == (hdr->fc & WF_FC_FROMTODSi)) {
-+                              result = acx_l_process_data_frame_wds(adev, rxbuf);
-+                              break;
-+                      }
-+                      */
-+
-+                      switch (adev->mode) {
-+                      case ACX_MODE_3_AP:
-+                              result = acx_l_process_data_frame_master(adev, rxbuf);
-+                              break;
-+                      case ACX_MODE_0_ADHOC:
-+                      case ACX_MODE_2_STA:
-+                              result = acx_l_process_data_frame_client(adev, rxbuf);
-+                              break;
-+                      }
-+              case WF_FSTYPE_DATA_CFACKi:
-+              case WF_FSTYPE_DATA_CFPOLLi:
-+              case WF_FSTYPE_DATA_CFACK_CFPOLLi:
-+              case WF_FSTYPE_CFPOLLi:
-+              case WF_FSTYPE_CFACK_CFPOLLi:
-+              /*   see above.
-+                      acx_process_class_frame(adev, rxbuf, 3); */
-+                      break;
-+              case WF_FSTYPE_NULLi:
-+                      /* acx_l_process_NULL_frame(adev, rxbuf, 3); */
-+                      break;
-+              /* FIXME: same here, see above */
-+              case WF_FSTYPE_CFACKi:
-+              default:
-+                      break;
-+              }
-+              break;
-+      case WF_FTYPE_MGMTi:
-+              result = acx_l_process_mgmt_frame(adev, rxbuf);
-+              break;
-+      case WF_FTYPE_CTLi:
-+              if (fstype == WF_FSTYPE_PSPOLLi)
-+                      result = OK;
-+              /*   this call is irrelevant, since
-+               *   acx_process_class_frame is a stub, so return
-+               *   immediately instead.
-+               * return acx_process_class_frame(adev, rxbuf, 3); */
-+              break;
-+      default:
-+              break;
-+      }
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_rxbuf
-+**
-+** NB: used by USB code also
-+*/
-+void
-+acx_l_process_rxbuf(acx_device_t *adev, rxbuffer_t *rxbuf)
-+{
-+      struct wlan_hdr *hdr;
-+      unsigned int qual;
-+      int buf_len;
-+      u16 fc;
-+
-+      hdr = acx_get_wlan_hdr(adev, rxbuf);
-+      fc = le16_to_cpu(hdr->fc);
-+      /* length of frame from control field to first byte of FCS */
-+      buf_len = RXBUF_BYTES_RCVD(adev, rxbuf);
-+
-+      if ( ((WF_FC_FSTYPE & fc) != WF_FSTYPE_BEACON)
-+        || (acx_debug & L_XFER_BEACON)
-+      ) {
-+              log(L_XFER|L_DATA, "rx: %s "
-+                      "time:%u len:%u signal:%u SNR:%u macstat:%02X "
-+                      "phystat:%02X phyrate:%u status:%u\n",
-+                      acx_get_packet_type_string(fc),
-+                      le32_to_cpu(rxbuf->time),
-+                      buf_len,
-+                      acx_signal_to_winlevel(rxbuf->phy_level),
-+                      acx_signal_to_winlevel(rxbuf->phy_snr),
-+                      rxbuf->mac_status,
-+                      rxbuf->phy_stat_baseband,
-+                      rxbuf->phy_plcp_signal,
-+                      adev->status);
-+      }
-+
-+      if (unlikely(acx_debug & L_DATA)) {
-+              printk("rx: 802.11 buf[%u]: ", buf_len);
-+              acx_dump_bytes(hdr, buf_len);
-+      }
-+
-+      /* FIXME: should check for Rx errors (rxbuf->mac_status?
-+       * discard broken packets - but NOT for monitor!)
-+       * and update Rx packet statistics here */
-+
-+      if (unlikely(adev->mode == ACX_MODE_MONITOR)) {
-+              acx_l_rxmonitor(adev, rxbuf);
-+      } else if (likely(buf_len >= WLAN_HDR_A3_LEN)) {
-+              acx_l_rx_ieee802_11_frame(adev, rxbuf);
-+      } else {
-+              log(L_DEBUG|L_XFER|L_DATA,
-+                     "rx: NOT receiving packet (%s): "
-+                     "size too small (%u)\n",
-+                     acx_get_packet_type_string(fc),
-+                     buf_len);
-+      }
-+
-+      /* Now check Rx quality level, AFTER processing packet.
-+       * I tried to figure out how to map these levels to dBm
-+       * values, but for the life of me I really didn't
-+       * manage to get it. Either these values are not meant to
-+       * be expressed in dBm, or it's some pretty complicated
-+       * calculation. */
-+
-+#ifdef FROM_SCAN_SOURCE_ONLY
-+      /* only consider packets originating from the MAC
-+       * address of the device that's managing our BSSID.
-+       * Disable it for now, since it removes information (levels
-+       * from different peers) and slows the Rx path. */
-+      if (adev->ap_client
-+       && mac_is_equal(hdr->a2, adev->ap_client->address)) {
-+#endif
-+              adev->wstats.qual.level = acx_signal_to_winlevel(rxbuf->phy_level);
-+              adev->wstats.qual.noise = acx_signal_to_winlevel(rxbuf->phy_snr);
-+#ifndef OLD_QUALITY
-+              qual = acx_signal_determine_quality(adev->wstats.qual.level,
-+                              adev->wstats.qual.noise);
-+#else
-+              qual = (adev->wstats.qual.noise <= 100) ?
-+                              100 - adev->wstats.qual.noise : 0;
-+#endif
-+              adev->wstats.qual.qual = qual;
-+              adev->wstats.qual.updated = 7; /* all 3 indicators updated */
-+#ifdef FROM_SCAN_SOURCE_ONLY
-+      }
-+#endif
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_handle_txrate_auto
-+**
-+** Theory of operation:
-+** client->rate_cap is a bitmask of rates client is capable of.
-+** client->rate_cfg is a bitmask of allowed (configured) rates.
-+** It is set as a result of iwconfig rate N [auto]
-+** or iwpriv set_rates "N,N,N N,N,N" commands.
-+** It can be fixed (e.g. 0x0080 == 18Mbit only),
-+** auto (0x00ff == 18Mbit or any lower value),
-+** and code handles any bitmask (0x1081 == try 54Mbit,18Mbit,1Mbit _only_).
-+**
-+** client->rate_cur is a value for rate111 field in tx descriptor.
-+** It is always set to txrate_cfg sans zero or more most significant
-+** bits. This routine handles selection of new rate_cur value depending on
-+** outcome of last tx event.
-+**
-+** client->rate_100 is a precalculated rate value for acx100
-+** (we can do without it, but will need to calculate it on each tx).
-+**
-+** You cannot configure mixed usage of 5.5 and/or 11Mbit rate
-+** with PBCC and CCK modulation. Either both at CCK or both at PBCC.
-+** In theory you can implement it, but so far it is considered not worth doing.
-+**
-+** 22Mbit, of course, is PBCC always. */
-+
-+/* maps acx100 tx descr rate field to acx111 one */
-+static u16
-+rate100to111(u8 r)
-+{
-+      switch (r) {
-+      case RATE100_1: return RATE111_1;
-+      case RATE100_2: return RATE111_2;
-+      case RATE100_5:
-+      case (RATE100_5 | RATE100_PBCC511):     return RATE111_5;
-+      case RATE100_11:
-+      case (RATE100_11 | RATE100_PBCC511):    return RATE111_11;
-+      case RATE100_22:        return RATE111_22;
-+      default:
-+              printk("acx: unexpected acx100 txrate: %u! "
-+                      "Please report\n", r);
-+              return RATE111_1;
-+      }
-+}
-+
-+
-+void
-+acx_l_handle_txrate_auto(acx_device_t *adev, struct client *txc,
-+                      u16 cur, u8 rate100, u16 rate111,
-+                      u8 error, int pkts_to_ignore)
-+{
-+      u16 sent_rate;
-+      int slower_rate_was_used;
-+
-+      /* vda: hmm. current code will do this:
-+      ** 1. send packets at 11 Mbit, stepup++
-+      ** 2. will try to send at 22Mbit. hardware will see no ACK,
-+      **    retries at 11Mbit, success. code notes that used rate
-+      **    is lower. stepup = 0, fallback++
-+      ** 3. repeat step 2 fallback_count times. Fall back to
-+      **    11Mbit. go to step 1.
-+      ** If stepup_count is large (say, 16) and fallback_count
-+      ** is small (3), this wouldn't be too bad wrt throughput */
-+
-+      if (unlikely(!cur)) {
-+              printk("acx: BUG! ratemask is empty\n");
-+              return; /* or else we may lock up the box */
-+      }
-+
-+      /* do some preparations, i.e. calculate the one rate that was
-+       * used to send this packet */
-+      if (IS_ACX111(adev)) {
-+              sent_rate = 1 << highest_bit(rate111 & RATE111_ALL);
-+      } else {
-+              sent_rate = rate100to111(rate100);
-+      }
-+      /* sent_rate has only one bit set now, corresponding to tx rate
-+       * which was used by hardware to tx this particular packet */
-+
-+      /* now do the actual auto rate management */
-+      log(L_XFER, "tx: %sclient=%p/"MACSTR" used=%04X cur=%04X cfg=%04X "
-+              "__=%u/%u ^^=%u/%u\n",
-+              (txc->ignore_count > 0) ? "[IGN] " : "",
-+              txc, MAC(txc->address), sent_rate, cur, txc->rate_cfg,
-+              txc->fallback_count, adev->fallback_threshold,
-+              txc->stepup_count, adev->stepup_threshold
-+      );
-+
-+      /* we need to ignore old packets already in the tx queue since
-+       * they use older rate bytes configured before our last rate change,
-+       * otherwise our mechanism will get confused by interpreting old data.
-+       * Do it after logging above */
-+      if (txc->ignore_count) {
-+              txc->ignore_count--;
-+              return;
-+      }
-+
-+      /* true only if the only nonzero bit in sent_rate is
-+      ** less significant than highest nonzero bit in cur */
-+      slower_rate_was_used = ( cur > ((sent_rate<<1)-1) );
-+
-+      if (slower_rate_was_used || error) {
-+              txc->stepup_count = 0;
-+              if (++txc->fallback_count <= adev->fallback_threshold)
-+                      return;
-+              txc->fallback_count = 0;
-+
-+              /* clear highest 1 bit in cur */
-+              sent_rate = RATE111_54;
-+              while (!(cur & sent_rate)) sent_rate >>= 1;
-+              CLEAR_BIT(cur, sent_rate);
-+              if (!cur) /* we can't disable all rates! */
-+                      cur = sent_rate;
-+              log(L_XFER, "tx: falling back to ratemask %04X\n", cur);
-+
-+      } else { /* there was neither lower rate nor error */
-+              txc->fallback_count = 0;
-+              if (++txc->stepup_count <= adev->stepup_threshold)
-+                      return;
-+              txc->stepup_count = 0;
-+
-+              /* Sanitize. Sort of not needed, but I dont trust hw that much...
-+              ** what if it can report bogus tx rates sometimes? */
-+              while (!(cur & sent_rate)) sent_rate >>= 1;
-+
-+              /* try to find a higher sent_rate that isn't yet in our
-+               * current set, but is an allowed cfg */
-+              while (1) {
-+                      sent_rate <<= 1;
-+                      if (sent_rate > txc->rate_cfg)
-+                              /* no higher rates allowed by config */
-+                              return;
-+                      if (!(cur & sent_rate) && (txc->rate_cfg & sent_rate))
-+                              /* found */
-+                              break;
-+                      /* not found, try higher one */
-+              }
-+              SET_BIT(cur, sent_rate);
-+              log(L_XFER, "tx: stepping up to ratemask %04X\n", cur);
-+      }
-+
-+      txc->rate_cur = cur;
-+      txc->ignore_count = pkts_to_ignore;
-+      /* calculate acx100 style rate byte if needed */
-+      if (IS_ACX100(adev)) {
-+              txc->rate_100 = acx_bitpos2rate100[highest_bit(cur)];
-+      }
-+}
-+
-+
-+/***********************************************************************
-+** acx_i_start_xmit
-+**
-+** Called by network core. Can be called outside of process context.
-+*/
-+int
-+acx_i_start_xmit(struct sk_buff *skb, struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      tx_t *tx;
-+      void *txbuf;
-+      unsigned long flags;
-+      int txresult = NOT_OK;
-+      int len;
-+
-+      FN_ENTER;
-+
-+      if (unlikely(!skb)) {
-+              /* indicate success */
-+              txresult = OK;
-+              goto end_no_unlock;
-+      }
-+      if (unlikely(!adev)) {
-+              goto end_no_unlock;
-+      }
-+
-+      acx_lock(adev, flags);
-+
-+      if (unlikely(!(adev->dev_state_mask & ACX_STATE_IFACE_UP))) {
-+              goto end;
-+      }
-+      if (unlikely(adev->mode == ACX_MODE_OFF)) {
-+              goto end;
-+      }
-+      if (unlikely(acx_queue_stopped(ndev))) {
-+              log(L_DEBUG, "%s: called when queue stopped\n", __func__);
-+              goto end;
-+      }
-+      if (unlikely(ACX_STATUS_4_ASSOCIATED != adev->status)) {
-+              log(L_XFER, "trying to xmit, but not associated yet: "
-+                      "aborting...\n");
-+              /* silently drop the packet, since we're not connected yet */
-+              txresult = OK;
-+              /* ...but indicate an error nevertheless */
-+              adev->stats.tx_errors++;
-+              goto end;
-+      }
-+
-+      tx = acx_l_alloc_tx(adev);
-+      if (unlikely(!tx)) {
-+#ifndef ACX_MEM
-+        /*
-+         * generic slave interface has to make do with the tiny amount, around
-+         * 7k, of transmit buffer space on the ACX itself.  It is likely this will
-+         * frequently be full.
-+         */
-+              printk_ratelimited("%s: start_xmit: txdesc ring is full, "
-+                      "dropping tx\n", ndev->name);
-+#endif
-+              txresult = NOT_OK;
-+              goto end;
-+      }
-+
-+      txbuf = acx_l_get_txbuf(adev, tx);
-+      if (unlikely(!txbuf)) {
-+              /* Card was removed */
-+              txresult = NOT_OK;
-+              acx_l_dealloc_tx(adev, tx);
-+              goto end;
-+      }
-+      len = acx_ether_to_txbuf(adev, txbuf, skb);
-+      if (unlikely(len < 0)) {
-+              /* Error in packet conversion */
-+              txresult = NOT_OK;
-+              acx_l_dealloc_tx(adev, tx);
-+              goto end;
-+      }
-+      acx_l_tx_data(adev, tx, len);
-+      ndev->trans_start = jiffies;
-+
-+      txresult = OK;
-+      adev->stats.tx_packets++;
-+      adev->stats.tx_bytes += skb->len;
-+
-+end:
-+      acx_unlock(adev, flags);
-+
-+end_no_unlock:
-+      if ((txresult == OK) && skb)
-+              dev_kfree_skb_any(skb);
-+
-+      FN_EXIT1(txresult);
-+      return txresult;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_update_ratevector
-+**
-+** Updates adev->rate_supported[_len] according to rate_{basic,oper}
-+*/
-+const u8
-+acx_bitpos2ratebyte[] = {
-+      DOT11RATEBYTE_1,
-+      DOT11RATEBYTE_2,
-+      DOT11RATEBYTE_5_5,
-+      DOT11RATEBYTE_6_G,
-+      DOT11RATEBYTE_9_G,
-+      DOT11RATEBYTE_11,
-+      DOT11RATEBYTE_12_G,
-+      DOT11RATEBYTE_18_G,
-+      DOT11RATEBYTE_22,
-+      DOT11RATEBYTE_24_G,
-+      DOT11RATEBYTE_36_G,
-+      DOT11RATEBYTE_48_G,
-+      DOT11RATEBYTE_54_G,
-+};
-+
-+void
-+acx_l_update_ratevector(acx_device_t *adev)
-+{
-+      u16 bcfg = adev->rate_basic;
-+      u16 ocfg = adev->rate_oper;
-+      u8 *supp = adev->rate_supported;
-+      const u8 *dot11 = acx_bitpos2ratebyte;
-+
-+      FN_ENTER;
-+
-+      while (ocfg) {
-+              if (ocfg & 1) {
-+                      *supp = *dot11;
-+                      if (bcfg & 1) {
-+                              *supp |= 0x80;
-+                      }
-+                      supp++;
-+              }
-+              dot11++;
-+              ocfg >>= 1;
-+              bcfg >>= 1;
-+      }
-+      adev->rate_supported_len = supp - adev->rate_supported;
-+      if (acx_debug & L_ASSOC) {
-+              printk("new ratevector: ");
-+              acx_dump_bytes(adev->rate_supported, adev->rate_supported_len);
-+      }
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_sta_list_init
-+*/
-+static void
-+acx_l_sta_list_init(acx_device_t *adev)
-+{
-+      FN_ENTER;
-+      memset(adev->sta_hash_tab, 0, sizeof(adev->sta_hash_tab));
-+      memset(adev->sta_list, 0, sizeof(adev->sta_list));
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_sta_list_get_from_hash
-+*/
-+static inline client_t*
-+acx_l_sta_list_get_from_hash(acx_device_t *adev, const u8 *address)
-+{
-+      return adev->sta_hash_tab[address[5] % VEC_SIZE(adev->sta_hash_tab)];
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_sta_list_get
-+*/
-+client_t*
-+acx_l_sta_list_get(acx_device_t *adev, const u8 *address)
-+{
-+      client_t *client;
-+      FN_ENTER;
-+      client = acx_l_sta_list_get_from_hash(adev, address);
-+      while (client) {
-+              if (mac_is_equal(address, client->address)) {
-+                      client->mtime = jiffies;
-+                      break;
-+              }
-+              client = client->next;
-+      }
-+      FN_EXIT0;
-+      return client;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_sta_list_del
-+*/
-+void
-+acx_l_sta_list_del(acx_device_t *adev, client_t *victim)
-+{
-+      client_t *client, *next;
-+
-+      client = acx_l_sta_list_get_from_hash(adev, victim->address);
-+      next = client;
-+      /* tricky. next = client on first iteration only,
-+      ** on all other iters next = client->next */
-+      while (next) {
-+              if (next == victim) {
-+                      client->next = victim->next;
-+                      /* Overkill */
-+                      memset(victim, 0, sizeof(*victim));
-+                      break;
-+              }
-+              client = next;
-+              next = client->next;
-+      }
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_sta_list_alloc
-+**
-+** Never fails - will evict oldest client if needed
-+*/
-+static client_t*
-+acx_l_sta_list_alloc(acx_device_t *adev)
-+{
-+      int i;
-+      unsigned long age, oldest_age;
-+      client_t *client, *oldest;
-+
-+      FN_ENTER;
-+
-+      oldest = &adev->sta_list[0];
-+      oldest_age = 0;
-+      for (i = 0; i < VEC_SIZE(adev->sta_list); i++) {
-+              client = &adev->sta_list[i];
-+
-+              if (!client->used) {
-+                      goto found;
-+              } else {
-+                      age = jiffies - client->mtime;
-+                      if (oldest_age < age) {
-+                              oldest_age = age;
-+                              oldest = client;
-+                      }
-+              }
-+      }
-+      acx_l_sta_list_del(adev, oldest);
-+      client = oldest;
-+found:
-+      memset(client, 0, sizeof(*client));
-+      FN_EXIT0;
-+      return client;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_sta_list_add
-+**
-+** Never fails - will evict oldest client if needed
-+*/
-+/* In case we will reimplement it differently... */
-+#define STA_LIST_ADD_CAN_FAIL 0
-+
-+static client_t*
-+acx_l_sta_list_add(acx_device_t *adev, const u8 *address)
-+{
-+      client_t *client;
-+      int index;
-+
-+      FN_ENTER;
-+
-+      client = acx_l_sta_list_alloc(adev);
-+
-+      client->mtime = jiffies;
-+      MAC_COPY(client->address, address);
-+      client->used = CLIENT_EXIST_1;
-+      client->auth_alg = WLAN_AUTH_ALG_SHAREDKEY;
-+      client->auth_step = 1;
-+      /* give some tentative peer rate values
-+      ** (needed because peer may do auth without probing us first,
-+      ** thus we'll have no idea of peer's ratevector yet).
-+      ** Will be overwritten by scanning or assoc code */
-+      client->rate_cap = adev->rate_basic;
-+      client->rate_cfg = adev->rate_basic;
-+      client->rate_cur = 1 << lowest_bit(adev->rate_basic);
-+
-+      index = address[5] % VEC_SIZE(adev->sta_hash_tab);
-+      client->next = adev->sta_hash_tab[index];
-+      adev->sta_hash_tab[index] = client;
-+
-+      acxlog_mac(L_ASSOC, "sta_list_add: sta=", address, "\n");
-+
-+      FN_EXIT0;
-+      return client;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_sta_list_get_or_add
-+**
-+** Never fails - will evict oldest client if needed
-+*/
-+static client_t*
-+acx_l_sta_list_get_or_add(acx_device_t *adev, const u8 *address)
-+{
-+      client_t *client = acx_l_sta_list_get(adev, address);
-+      if (!client)
-+              client = acx_l_sta_list_add(adev, address);
-+      return client;
-+}
-+
-+
-+/***********************************************************************
-+** acx_set_status
-+**
-+** This function is called in many atomic regions, must not sleep
-+**
-+** This function does not need locking UNLESS you call it
-+** as acx_set_status(ACX_STATUS_4_ASSOCIATED), bacause this can
-+** wake queue. This can race with stop_queue elsewhere.
-+** See acx_stop_queue comment. */
-+void
-+acx_set_status(acx_device_t *adev, u16 new_status)
-+{
-+#define QUEUE_OPEN_AFTER_ASSOC 1 /* this really seems to be needed now */
-+      u16 old_status = adev->status;
-+
-+      FN_ENTER;
-+
-+      log(L_ASSOC, "%s(%d):%s\n",
-+             __func__, new_status, acx_get_status_name(new_status));
-+
-+      /* wireless_send_event never sleeps */
-+      if (ACX_STATUS_4_ASSOCIATED == new_status) {
-+              union iwreq_data wrqu;
-+
-+              wrqu.data.length = 0;
-+              wrqu.data.flags = 0;
-+              wireless_send_event(adev->ndev, SIOCGIWSCAN, &wrqu, NULL);
-+
-+              wrqu.data.length = 0;
-+              wrqu.data.flags = 0;
-+              MAC_COPY(wrqu.ap_addr.sa_data, adev->bssid);
-+              wrqu.ap_addr.sa_family = ARPHRD_ETHER;
-+              wireless_send_event(adev->ndev, SIOCGIWAP, &wrqu, NULL);
-+      } else {
-+              union iwreq_data wrqu;
-+
-+              /* send event with empty BSSID to indicate we're not associated */
-+              MAC_ZERO(wrqu.ap_addr.sa_data);
-+              wrqu.ap_addr.sa_family = ARPHRD_ETHER;
-+              wireless_send_event(adev->ndev, SIOCGIWAP, &wrqu, NULL);
-+      }
-+
-+      adev->status = new_status;
-+
-+      switch (new_status) {
-+      case ACX_STATUS_1_SCANNING:
-+              adev->scan_retries = 0;
-+              /* 1.0 s initial scan time */
-+              acx_set_timer(adev, 1000000);
-+              break;
-+      case ACX_STATUS_2_WAIT_AUTH:
-+      case ACX_STATUS_3_AUTHENTICATED:
-+              adev->auth_or_assoc_retries = 0;
-+              acx_set_timer(adev, 1500000); /* 1.5 s */
-+              break;
-+      }
-+
-+#if QUEUE_OPEN_AFTER_ASSOC
-+      if (new_status == ACX_STATUS_4_ASSOCIATED)      {
-+              if (old_status < ACX_STATUS_4_ASSOCIATED) {
-+                      /* ah, we're newly associated now,
-+                       * so let's indicate carrier */
-+                      acx_carrier_on(adev->ndev, "after association");
-+                      acx_wake_queue(adev->ndev, "after association");
-+              }
-+      } else {
-+              /* not associated any more, so let's kill carrier */
-+              if (old_status >= ACX_STATUS_4_ASSOCIATED) {
-+                      acx_carrier_off(adev->ndev, "after losing association");
-+                      acx_stop_queue(adev->ndev, "after losing association");
-+              }
-+      }
-+#endif
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_i_timer
-+**
-+** Fires up periodically. Used to kick scan/auth/assoc if something goes wrong
-+*/
-+void
-+acx_i_timer(unsigned long address)
-+{
-+      unsigned long flags;
-+      acx_device_t *adev = (acx_device_t*)address;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+
-+      log(L_DEBUG|L_ASSOC, "%s: adev->status=%d (%s)\n",
-+              __func__, adev->status, acx_get_status_name(adev->status));
-+
-+      switch (adev->status) {
-+      case ACX_STATUS_1_SCANNING:
-+              /* was set to 0 by set_status() */
-+              if (++adev->scan_retries < 7) {
-+                      acx_set_timer(adev, 1000000);
-+                      /* used to interrogate for scan status.
-+                      ** We rely on SCAN_COMPLETE IRQ instead */
-+                      log(L_ASSOC, "continuing scan (%d sec)\n",
-+                                      adev->scan_retries);
-+              } else {
-+                      log(L_ASSOC, "stopping scan\n");
-+                      /* send stop_scan cmd when we leave the interrupt context,
-+                       * and make a decision what to do next (COMPLETE_SCAN) */
-+                      acx_schedule_task(adev,
-+                              ACX_AFTER_IRQ_CMD_STOP_SCAN + ACX_AFTER_IRQ_COMPLETE_SCAN);
-+              }
-+              break;
-+      case ACX_STATUS_2_WAIT_AUTH:
-+              /* was set to 0 by set_status() */
-+              if (++adev->auth_or_assoc_retries < 10) {
-+                      log(L_ASSOC, "resend authen1 request (attempt %d)\n",
-+                                      adev->auth_or_assoc_retries + 1);
-+                      acx_l_transmit_authen1(adev);
-+              } else {
-+                      /* time exceeded: fall back to scanning mode */
-+                      log(L_ASSOC,
-+                             "authen1 request reply timeout, giving up\n");
-+                      /* we are a STA, need to find AP anyhow */
-+                      acx_set_status(adev, ACX_STATUS_1_SCANNING);
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_RESTART_SCAN);
-+              }
-+              /* used to be 1500000, but some other driver uses 2.5s */
-+              acx_set_timer(adev, 2500000);
-+              break;
-+      case ACX_STATUS_3_AUTHENTICATED:
-+              /* was set to 0 by set_status() */
-+              if (++adev->auth_or_assoc_retries < 10) {
-+                      log(L_ASSOC, "resend assoc request (attempt %d)\n",
-+                                      adev->auth_or_assoc_retries + 1);
-+                      acx_l_transmit_assoc_req(adev);
-+              } else {
-+                      /* time exceeded: give up */
-+                      log(L_ASSOC,
-+                              "association request reply timeout, giving up\n");
-+                      /* we are a STA, need to find AP anyhow */
-+                      acx_set_status(adev, ACX_STATUS_1_SCANNING);
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_RESTART_SCAN);
-+              }
-+              acx_set_timer(adev, 2500000); /* see above */
-+              break;
-+      case ACX_STATUS_4_ASSOCIATED:
-+      default:
-+              break;
-+      }
-+
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_set_timer
-+**
-+** Sets the 802.11 state management timer's timeout.
-+*/
-+void
-+acx_set_timer(acx_device_t *adev, int timeout_us)
-+{
-+      FN_ENTER;
-+
-+      log(L_DEBUG|L_IRQ, "%s(%u ms)\n", __func__, timeout_us/1000);
-+      if (!(adev->dev_state_mask & ACX_STATE_IFACE_UP)) {
-+              printk("attempt to set the timer "
-+                      "when the card interface is not up!\n");
-+              goto end;
-+      }
-+
-+      /* first check if the timer was already initialized, THEN modify it */
-+      if (adev->mgmt_timer.function) {
-+              mod_timer(&adev->mgmt_timer,
-+                              jiffies + (timeout_us * HZ / 1000000));
-+      }
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_transmit_assocresp
-+**
-+** We are an AP here
-+*/
-+static const u8
-+dot11ratebyte[] = {
-+      DOT11RATEBYTE_1,
-+      DOT11RATEBYTE_2,
-+      DOT11RATEBYTE_5_5,
-+      DOT11RATEBYTE_6_G,
-+      DOT11RATEBYTE_9_G,
-+      DOT11RATEBYTE_11,
-+      DOT11RATEBYTE_12_G,
-+      DOT11RATEBYTE_18_G,
-+      DOT11RATEBYTE_22,
-+      DOT11RATEBYTE_24_G,
-+      DOT11RATEBYTE_36_G,
-+      DOT11RATEBYTE_48_G,
-+      DOT11RATEBYTE_54_G,
-+};
-+
-+static inline int
-+find_pos(const u8 *p, int size, u8 v)
-+{
-+      int i;
-+      for (i = 0; i < size; i++)
-+              if (p[i] == v)
-+                      return i;
-+      /* printk a message about strange byte? */
-+      return 0;
-+}
-+
-+static void
-+add_bits_to_ratemasks(u8* ratevec, int len, u16* brate, u16* orate)
-+{
-+      while (len--) {
-+              int n = 1 << find_pos(dot11ratebyte,
-+                              sizeof(dot11ratebyte), *ratevec & 0x7f);
-+              if (*ratevec & 0x80)
-+                      *brate |= n;
-+              *orate |= n;
-+              ratevec++;
-+      }
-+}
-+
-+static int
-+acx_l_transmit_assocresp(acx_device_t *adev, const wlan_fr_assocreq_t *req)
-+{
-+      struct tx *tx;
-+      struct wlan_hdr_mgmt *head;
-+      struct assocresp_frame_body *body;
-+      u8 *p;
-+      const u8 *da;
-+      /* const u8 *sa; */
-+      const u8 *bssid;
-+      client_t *clt;
-+
-+      FN_ENTER;
-+
-+      /* sa = req->hdr->a1; */
-+      da = req->hdr->a2;
-+      bssid = req->hdr->a3;
-+
-+      clt = acx_l_sta_list_get(adev, da);
-+      if (!clt)
-+              goto ok;
-+
-+      /* Assoc without auth is a big no-no */
-+      /* Let's be liberal: if already assoc'ed STA sends assoc req again,
-+      ** we won't be rude */
-+      if (clt->used != CLIENT_AUTHENTICATED_2
-+       && clt->used != CLIENT_ASSOCIATED_3) {
-+              acx_l_transmit_deauthen(adev, da, WLAN_MGMT_REASON_CLASS2_NONAUTH);
-+              goto bad;
-+      }
-+
-+      clt->used = CLIENT_ASSOCIATED_3;
-+
-+      if (clt->aid == 0)
-+              clt->aid = ++adev->aid;
-+      clt->cap_info = ieee2host16(*(req->cap_info));
-+
-+      /* We cheat here a bit. We don't really care which rates are flagged
-+      ** as basic by the client, so we stuff them in single ratemask */
-+      clt->rate_cap = 0;
-+      if (req->supp_rates)
-+              add_bits_to_ratemasks(req->supp_rates->rates,
-+                      req->supp_rates->len, &clt->rate_cap, &clt->rate_cap);
-+      if (req->ext_rates)
-+              add_bits_to_ratemasks(req->ext_rates->rates,
-+                      req->ext_rates->len, &clt->rate_cap, &clt->rate_cap);
-+      /* We can check that client supports all basic rates,
-+      ** and deny assoc if not. But let's be liberal, right? ;) */
-+      clt->rate_cfg = clt->rate_cap & adev->rate_oper;
-+      if (!clt->rate_cfg) clt->rate_cfg = 1 << lowest_bit(adev->rate_oper);
-+      clt->rate_cur = 1 << lowest_bit(clt->rate_cfg);
-+      if (IS_ACX100(adev))
-+              clt->rate_100 = acx_bitpos2rate100[lowest_bit(clt->rate_cfg)];
-+      clt->fallback_count = clt->stepup_count = 0;
-+      clt->ignore_count = 16;
-+
-+      tx = acx_l_alloc_tx(adev);
-+      if (!tx)
-+              goto bad;
-+      head = acx_l_get_txbuf(adev, tx);
-+      if (!head) {
-+              acx_l_dealloc_tx(adev, tx);
-+              goto bad;
-+      }
-+      body = (void*)(head + 1);
-+
-+      head->fc = WF_FSTYPE_ASSOCRESPi;
-+      head->dur = req->hdr->dur;
-+      MAC_COPY(head->da, da);
-+      MAC_COPY(head->sa, adev->dev_addr);
-+      MAC_COPY(head->bssid, bssid);
-+      head->seq = req->hdr->seq;
-+
-+      body->cap_info = host2ieee16(adev->capabilities);
-+      body->status = host2ieee16(0);
-+      body->aid = host2ieee16(clt->aid);
-+      p = wlan_fill_ie_rates((u8*)&body->rates, adev->rate_supported_len,
-+                                                      adev->rate_supported);
-+      p = wlan_fill_ie_rates_ext(p, adev->rate_supported_len,
-+                                                      adev->rate_supported);
-+
-+      acx_l_tx_data(adev, tx, p - (u8*)head);
-+ok:
-+      FN_EXIT1(OK);
-+      return OK;
-+bad:
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+* acx_l_transmit_reassocresp
-+
-+You may be wondering, just like me, what the hell ReAuth is.
-+In practice it was seen sent by STA when STA feels like losing connection.
-+
-+[802.11]
-+
-+5.4.2.3 Reassociation
-+
-+Association is sufficient for no-transition message delivery between
-+IEEE 802.11 stations. Additional functionality is needed to support
-+BSS-transition mobility. The additional required functionality
-+is provided by the reassociation service. Reassociation is a DSS.
-+The reassociation service is invoked to 'move' a current association
-+from one AP to another. This keeps the DS informed of the current
-+mapping between AP and STA as the station moves from BSS to BSS within
-+an ESS. Reassociation also enables changing association attributes
-+of an established association while the STA remains associated with
-+the same AP. Reassociation is always initiated by the mobile STA.
-+
-+5.4.3.1 Authentication
-+...
-+A STA may be authenticated with many other STAs at any given instant.
-+
-+5.4.3.1.1 Preauthentication
-+
-+Because the authentication process could be time-consuming (depending
-+on the authentication protocol in use), the authentication service can
-+be invoked independently of the association service. Preauthentication
-+is typically done by a STA while it is already associated with an AP
-+(with which it previously authenticated). IEEE 802.11 does not require
-+that STAs preauthenticate with APs. However, authentication is required
-+before an association can be established. If the authentication is left
-+until reassociation time, this may impact the speed with which a STA can
-+reassociate between APs, limiting BSS-transition mobility performance.
-+The use of preauthentication takes the authentication service overhead
-+out of the time-critical reassociation process.
-+
-+5.7.3 Reassociation
-+
-+For a STA to reassociate, the reassociation service causes the following
-+message to occur:
-+
-+  Reassociation request
-+
-+* Message type: Management
-+* Message subtype: Reassociation request
-+* Information items:
-+  - IEEE address of the STA
-+  - IEEE address of the AP with which the STA will reassociate
-+  - IEEE address of the AP with which the STA is currently associated
-+  - ESSID
-+* Direction of message: From STA to 'new' AP
-+
-+The address of the current AP is included for efficiency. The inclusion
-+of the current AP address facilitates MAC reassociation to be independent
-+of the DS implementation.
-+
-+  Reassociation response
-+* Message type: Management
-+* Message subtype: Reassociation response
-+* Information items:
-+  - Result of the requested reassociation. (success/failure)
-+  - If the reassociation is successful, the response shall include the AID.
-+* Direction of message: From AP to STA
-+
-+7.2.3.6 Reassociation Request frame format
-+
-+The frame body of a management frame of subtype Reassociation Request
-+contains the information shown in Table 9.
-+
-+Table 9 Reassociation Request frame body
-+Order Information
-+1 Capability information
-+2 Listen interval
-+3 Current AP address
-+4 SSID
-+5 Supported rates
-+
-+7.2.3.7 Reassociation Response frame format
-+
-+The frame body of a management frame of subtype Reassociation Response
-+contains the information shown in Table 10.
-+
-+Table 10 Reassociation Response frame body
-+Order Information
-+1 Capability information
-+2 Status code
-+3 Association ID (AID)
-+4 Supported rates
-+
-+*/
-+static int
-+acx_l_transmit_reassocresp(acx_device_t *adev, const wlan_fr_reassocreq_t *req)
-+{
-+      struct tx *tx;
-+      struct wlan_hdr_mgmt *head;
-+      struct reassocresp_frame_body *body;
-+      u8 *p;
-+      const u8 *da;
-+      /* const u8 *sa; */
-+      const u8 *bssid;
-+      client_t *clt;
-+
-+      FN_ENTER;
-+
-+      /* sa = req->hdr->a1; */
-+      da = req->hdr->a2;
-+      bssid = req->hdr->a3;
-+
-+      /* Must be already authenticated, so it must be in the list */
-+      clt = acx_l_sta_list_get(adev, da);
-+      if (!clt)
-+              goto ok;
-+
-+      /* Assoc without auth is a big no-no */
-+      /* Already assoc'ed STAs sending ReAssoc req are ok per 802.11 */
-+      if (clt->used != CLIENT_AUTHENTICATED_2
-+       && clt->used != CLIENT_ASSOCIATED_3) {
-+              acx_l_transmit_deauthen(adev, da, WLAN_MGMT_REASON_CLASS2_NONAUTH);
-+              goto bad;
-+      }
-+
-+      clt->used = CLIENT_ASSOCIATED_3;
-+      if (clt->aid == 0) {
-+              clt->aid = ++adev->aid;
-+      }
-+      if (req->cap_info)
-+              clt->cap_info = ieee2host16(*(req->cap_info));
-+
-+      /* We cheat here a bit. We don't really care which rates are flagged
-+      ** as basic by the client, so we stuff them in single ratemask */
-+      clt->rate_cap = 0;
-+      if (req->supp_rates)
-+              add_bits_to_ratemasks(req->supp_rates->rates,
-+                      req->supp_rates->len, &clt->rate_cap, &clt->rate_cap);
-+      if (req->ext_rates)
-+              add_bits_to_ratemasks(req->ext_rates->rates,
-+                      req->ext_rates->len, &clt->rate_cap, &clt->rate_cap);
-+      /* We can check that client supports all basic rates,
-+      ** and deny assoc if not. But let's be liberal, right? ;) */
-+      clt->rate_cfg = clt->rate_cap & adev->rate_oper;
-+      if (!clt->rate_cfg) clt->rate_cfg = 1 << lowest_bit(adev->rate_oper);
-+      clt->rate_cur = 1 << lowest_bit(clt->rate_cfg);
-+      if (IS_ACX100(adev))
-+              clt->rate_100 = acx_bitpos2rate100[lowest_bit(clt->rate_cfg)];
-+
-+      clt->fallback_count = clt->stepup_count = 0;
-+      clt->ignore_count = 16;
-+
-+      tx = acx_l_alloc_tx(adev);
-+      if (!tx)
-+              goto ok;
-+      head = acx_l_get_txbuf(adev, tx);
-+      if (!head) {
-+              acx_l_dealloc_tx(adev, tx);
-+              goto ok;
-+      }
-+      body = (void*)(head + 1);
-+
-+      head->fc = WF_FSTYPE_REASSOCRESPi;
-+      head->dur = req->hdr->dur;
-+      MAC_COPY(head->da, da);
-+      MAC_COPY(head->sa, adev->dev_addr);
-+      MAC_COPY(head->bssid, bssid);
-+      head->seq = req->hdr->seq;
-+
-+      /* IEs: 1. caps */
-+      body->cap_info = host2ieee16(adev->capabilities);
-+      /* 2. status code */
-+      body->status = host2ieee16(0);
-+      /* 3. AID */
-+      body->aid = host2ieee16(clt->aid);
-+      /* 4. supp rates */
-+      p = wlan_fill_ie_rates((u8*)&body->rates, adev->rate_supported_len,
-+                                                      adev->rate_supported);
-+      /* 5. ext supp rates */
-+      p = wlan_fill_ie_rates_ext(p, adev->rate_supported_len,
-+                                                      adev->rate_supported);
-+
-+      acx_l_tx_data(adev, tx, p - (u8*)head);
-+ok:
-+      FN_EXIT1(OK);
-+      return OK;
-+bad:
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_disassoc_from_sta
-+*/
-+static void
-+acx_l_process_disassoc_from_sta(acx_device_t *adev, const wlan_fr_disassoc_t *req)
-+{
-+      const u8 *ta;
-+      client_t *clt;
-+
-+      FN_ENTER;
-+
-+      ta = req->hdr->a2;
-+      clt = acx_l_sta_list_get(adev, ta);
-+      if (!clt)
-+              goto end;
-+
-+      if (clt->used != CLIENT_ASSOCIATED_3
-+       && clt->used != CLIENT_AUTHENTICATED_2) {
-+              /* it's disassociating, but it's
-+              ** not even authenticated! Let it know that */
-+              acxlog_mac(L_ASSOC|L_XFER, "peer ", ta, "has sent disassoc "
-+                      "req but it is not even auth'ed! sending deauth\n");
-+              acx_l_transmit_deauthen(adev, ta,
-+                      WLAN_MGMT_REASON_CLASS2_NONAUTH);
-+              clt->used = CLIENT_EXIST_1;
-+      } else {
-+              /* mark it as auth'ed only */
-+              clt->used = CLIENT_AUTHENTICATED_2;
-+      }
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_deauthen_from_sta
-+*/
-+static void
-+acx_l_process_deauth_from_sta(acx_device_t *adev, const wlan_fr_deauthen_t *req)
-+{
-+      const wlan_hdr_t *hdr;
-+      client_t *client;
-+
-+      FN_ENTER;
-+
-+      hdr = req->hdr;
-+
-+      if (acx_debug & L_ASSOC) {
-+              acx_print_mac("got deauth from sta:", hdr->a2, " ");
-+              acx_print_mac("a1:", hdr->a1, " ");
-+              acx_print_mac("a3:", hdr->a3, " ");
-+              acx_print_mac("adev->addr:", adev->dev_addr, " ");
-+              acx_print_mac("adev->bssid:", adev->bssid, "\n");
-+      }
-+
-+      if (!mac_is_equal(adev->dev_addr, hdr->a1)) {
-+              goto end;
-+      }
-+
-+      client = acx_l_sta_list_get(adev, hdr->a2);
-+      if (!client) {
-+              goto end;
-+      }
-+      client->used = CLIENT_EXIST_1;
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_disassoc_from_ap
-+*/
-+static void
-+acx_l_process_disassoc_from_ap(acx_device_t *adev, const wlan_fr_disassoc_t *req)
-+{
-+      FN_ENTER;
-+
-+      if (!adev->ap_client) {
-+              /* Hrm, we aren't assoc'ed yet anyhow... */
-+              goto end;
-+      }
-+
-+      printk("%s: got disassoc frame with reason %d (%s)\n",
-+              adev->ndev->name, *req->reason,
-+              acx_wlan_reason_str(*req->reason));
-+
-+      if (mac_is_equal(adev->dev_addr, req->hdr->a1)) {
-+              acx_l_transmit_deauthen(adev, adev->bssid,
-+                              WLAN_MGMT_REASON_DEAUTH_LEAVING);
-+              SET_BIT(adev->set_mask, GETSET_RESCAN);
-+              acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG);
-+      }
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_deauth_from_ap
-+*/
-+static void
-+acx_l_process_deauth_from_ap(acx_device_t *adev, const wlan_fr_deauthen_t *req)
-+{
-+      FN_ENTER;
-+
-+      if (!adev->ap_client) {
-+              /* Hrm, we aren't assoc'ed yet anyhow... */
-+              goto end;
-+      }
-+
-+      printk("%s: got deauth frame with reason %d (%s)\n",
-+              adev->ndev->name, *req->reason,
-+              acx_wlan_reason_str(*req->reason));
-+
-+      /* Chk: is ta verified to be from our AP? */
-+      if (mac_is_equal(adev->dev_addr, req->hdr->a1)) {
-+              log(L_DEBUG, "AP sent us deauth packet\n");
-+              SET_BIT(adev->set_mask, GETSET_RESCAN);
-+              acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG);
-+      }
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_rx
-+**
-+** The end of the Rx path. Pulls data from a rxhostdesc into a socket
-+** buffer and feeds it to the network stack via netif_rx().
-+*/
-+static void
-+acx_l_rx(acx_device_t *adev, rxbuffer_t *rxbuf)
-+{
-+      FN_ENTER;
-+      if (likely(adev->dev_state_mask & ACX_STATE_IFACE_UP)) {
-+              struct sk_buff *skb;
-+              skb = acx_rxbuf_to_ether(adev, rxbuf);
-+              if (likely(skb)) {
-+                      netif_rx(skb);
-+                      adev->ndev->last_rx = jiffies;
-+                      adev->stats.rx_packets++;
-+                      adev->stats.rx_bytes += skb->len;
-+              }
-+      }
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_data_frame_master
-+*/
-+static int
-+acx_l_process_data_frame_master(acx_device_t *adev, rxbuffer_t *rxbuf)
-+{
-+      struct wlan_hdr *hdr;
-+      struct tx *tx;
-+      void *txbuf;
-+      int len;
-+      int result = NOT_OK;
-+
-+      FN_ENTER;
-+
-+      hdr = acx_get_wlan_hdr(adev, rxbuf);
-+
-+      switch (WF_FC_FROMTODSi & hdr->fc) {
-+      case 0:
-+      case WF_FC_FROMDSi:
-+              log(L_DEBUG, "ap->sta or adhoc->adhoc data frame ignored\n");
-+              goto done;
-+      case WF_FC_TODSi:
-+              break;
-+      default: /* WF_FC_FROMTODSi */
-+              log(L_DEBUG, "wds data frame ignored (TODO)\n");
-+              goto done;
-+      }
-+
-+      /* check if it is our BSSID, if not, leave */
-+      if (!mac_is_equal(adev->bssid, hdr->a1)) {
-+              goto done;
-+      }
-+
-+      if (mac_is_equal(adev->dev_addr, hdr->a3)) {
-+              /* this one is for us */
-+              acx_l_rx(adev, rxbuf);
-+      } else {
-+              if (mac_is_bcast(hdr->a3)) {
-+                      /* this one is bcast, rx it too */
-+                      acx_l_rx(adev, rxbuf);
-+              }
-+              tx = acx_l_alloc_tx(adev);
-+              if (!tx) {
-+                      goto fail;
-+              }
-+              /* repackage, tx, and hope it someday reaches its destination */
-+              /* order is important, we do it in-place */
-+              MAC_COPY(hdr->a1, hdr->a3);
-+              MAC_COPY(hdr->a3, hdr->a2);
-+              MAC_COPY(hdr->a2, adev->bssid);
-+              /* To_DS = 0, From_DS = 1 */
-+              hdr->fc = WF_FC_FROMDSi + WF_FTYPE_DATAi;
-+
-+              txbuf = acx_l_get_txbuf(adev, tx);
-+              if (txbuf) {
-+                      len = RXBUF_BYTES_RCVD(adev, rxbuf);
-+                      memcpy(txbuf, hdr, len);
-+                      acx_l_tx_data(adev, tx, len);
-+              } else {
-+                      acx_l_dealloc_tx(adev, tx);
-+              }
-+      }
-+done:
-+      result = OK;
-+fail:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_data_frame_client
-+*/
-+static int
-+acx_l_process_data_frame_client(acx_device_t *adev, rxbuffer_t *rxbuf)
-+{
-+      const u8 *da, *bssid;
-+      const wlan_hdr_t *hdr;
-+      struct net_device *ndev = adev->ndev;
-+      int result = NOT_OK;
-+
-+      FN_ENTER;
-+
-+      if (ACX_STATUS_4_ASSOCIATED != adev->status)
-+              goto drop;
-+
-+      hdr = acx_get_wlan_hdr(adev, rxbuf);
-+
-+      switch (WF_FC_FROMTODSi & hdr->fc) {
-+      case 0:
-+              if (adev->mode != ACX_MODE_0_ADHOC) {
-+                      log(L_DEBUG, "adhoc->adhoc data frame ignored\n");
-+                      goto drop;
-+              }
-+              bssid = hdr->a3;
-+              break;
-+      case WF_FC_FROMDSi:
-+              if (adev->mode != ACX_MODE_2_STA) {
-+                      log(L_DEBUG, "ap->sta data frame ignored\n");
-+                      goto drop;
-+              }
-+              bssid = hdr->a2;
-+              break;
-+      case WF_FC_TODSi:
-+              log(L_DEBUG, "sta->ap data frame ignored\n");
-+              goto drop;
-+      default: /* WF_FC_FROMTODSi: wds->wds */
-+              log(L_DEBUG, "wds data frame ignored (todo)\n");
-+              goto drop;
-+      }
-+
-+      da = hdr->a1;
-+
-+      if (unlikely(acx_debug & L_DEBUG)) {
-+              acx_print_mac("rx: da=", da, "");
-+              acx_print_mac(" bssid=", bssid, "");
-+              acx_print_mac(" adev->bssid=", adev->bssid, "");
-+              acx_print_mac(" adev->addr=", adev->dev_addr, "\n");
-+      }
-+
-+      /* promiscuous mode --> receive all packets */
-+      if (unlikely(ndev->flags & IFF_PROMISC))
-+              goto process;
-+
-+      /* FIRST, check if it is our BSSID */
-+      if (!mac_is_equal(adev->bssid, bssid)) {
-+              /* is not our BSSID, so bail out */
-+              goto drop;
-+      }
-+
-+      /* then, check if it is our address */
-+      if (mac_is_equal(adev->dev_addr, da)) {
-+              goto process;
-+      }
-+
-+      /* then, check if it is broadcast */
-+      if (mac_is_bcast(da)) {
-+              goto process;
-+      }
-+
-+      if (mac_is_mcast(da)) {
-+              /* unconditionally receive all multicasts */
-+              if (ndev->flags & IFF_ALLMULTI)
-+                      goto process;
-+
-+              /* FIXME: need to check against the list of
-+               * multicast addresses that are configured
-+               * for the interface (ifconfig) */
-+              log(L_XFER, "FIXME: multicast packet, need to check "
-+                      "against a list of multicast addresses "
-+                      "(to be created!); accepting packet for now\n");
-+              /* for now, just accept it here */
-+              goto process;
-+      }
-+
-+      log(L_DEBUG, "rx: foreign packet, dropping\n");
-+      goto drop;
-+process:
-+      /* receive packet */
-+      acx_l_rx(adev, rxbuf);
-+
-+      result = OK;
-+drop:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_mgmt_frame
-+**
-+** Theory of operation: mgmt packet gets parsed (to make it easy
-+** to access variable-sized IEs), results stored in 'parsed'.
-+** Then we react to the packet.
-+*/
-+typedef union parsed_mgmt_req {
-+      wlan_fr_mgmt_t mgmt;
-+      wlan_fr_assocreq_t assocreq;
-+      wlan_fr_reassocreq_t reassocreq;
-+      wlan_fr_assocresp_t assocresp;
-+      wlan_fr_reassocresp_t reassocresp;
-+      wlan_fr_beacon_t beacon;
-+      wlan_fr_disassoc_t disassoc;
-+      wlan_fr_authen_t authen;
-+      wlan_fr_deauthen_t deauthen;
-+      wlan_fr_proberesp_t proberesp;
-+} parsed_mgmt_req_t;
-+
-+void BUG_excessive_stack_usage(void);
-+
-+static int
-+acx_l_process_mgmt_frame(acx_device_t *adev, rxbuffer_t *rxbuf)
-+{
-+      parsed_mgmt_req_t parsed;       /* takes ~100 bytes of stack */
-+      wlan_hdr_t *hdr;
-+      int adhoc, sta_scan, sta, ap;
-+      int len;
-+
-+      if (sizeof(parsed) > 256)
-+              BUG_excessive_stack_usage();
-+
-+      FN_ENTER;
-+
-+      hdr = acx_get_wlan_hdr(adev, rxbuf);
-+
-+      /* Management frames never have these set */
-+      if (WF_FC_FROMTODSi & hdr->fc) {
-+              FN_EXIT1(NOT_OK);
-+              return NOT_OK;
-+      }
-+
-+      len = RXBUF_BYTES_RCVD(adev, rxbuf);
-+      if (WF_FC_ISWEPi & hdr->fc)
-+              len -= 0x10;
-+
-+      adhoc = (adev->mode == ACX_MODE_0_ADHOC);
-+      sta_scan = ((adev->mode == ACX_MODE_2_STA)
-+               && (adev->status != ACX_STATUS_4_ASSOCIATED));
-+      sta = ((adev->mode == ACX_MODE_2_STA)
-+          && (adev->status == ACX_STATUS_4_ASSOCIATED));
-+      ap = (adev->mode == ACX_MODE_3_AP);
-+
-+      switch (WF_FC_FSTYPEi & hdr->fc) {
-+      /* beacons first, for speed */
-+      case WF_FSTYPE_BEACONi:
-+              memset(&parsed.beacon, 0, sizeof(parsed.beacon));
-+              parsed.beacon.hdr = hdr;
-+              parsed.beacon.len = len;
-+              if (acx_debug & L_DATA) {
-+                      printk("beacon len:%d fc:%04X dur:%04X seq:%04X",
-+                             len, hdr->fc, hdr->dur, hdr->seq);
-+                      acx_print_mac(" a1:", hdr->a1, "");
-+                      acx_print_mac(" a2:", hdr->a2, "");
-+                      acx_print_mac(" a3:", hdr->a3, "\n");
-+              }
-+              wlan_mgmt_decode_beacon(&parsed.beacon);
-+              /* beacon and probe response are very similar, so... */
-+              acx_l_process_probe_response(adev, &parsed.beacon, rxbuf);
-+              break;
-+      case WF_FSTYPE_ASSOCREQi:
-+              if (!ap)
-+                      break;
-+              memset(&parsed.assocreq, 0, sizeof(parsed.assocreq));
-+              parsed.assocreq.hdr = hdr;
-+              parsed.assocreq.len = len;
-+              wlan_mgmt_decode_assocreq(&parsed.assocreq);
-+              if (mac_is_equal(hdr->a1, adev->bssid)
-+               && mac_is_equal(hdr->a3, adev->bssid)) {
-+                      acx_l_transmit_assocresp(adev, &parsed.assocreq);
-+              }
-+              break;
-+      case WF_FSTYPE_REASSOCREQi:
-+              if (!ap)
-+                      break;
-+              memset(&parsed.assocreq, 0, sizeof(parsed.assocreq));
-+              parsed.assocreq.hdr = hdr;
-+              parsed.assocreq.len = len;
-+              wlan_mgmt_decode_assocreq(&parsed.assocreq);
-+              /* reassocreq and assocreq are equivalent */
-+              acx_l_transmit_reassocresp(adev, &parsed.reassocreq);
-+              break;
-+      case WF_FSTYPE_ASSOCRESPi:
-+              if (!sta_scan)
-+                      break;
-+              memset(&parsed.assocresp, 0, sizeof(parsed.assocresp));
-+              parsed.assocresp.hdr = hdr;
-+              parsed.assocresp.len = len;
-+              wlan_mgmt_decode_assocresp(&parsed.assocresp);
-+              acx_l_process_assocresp(adev, &parsed.assocresp);
-+              break;
-+      case WF_FSTYPE_REASSOCRESPi:
-+              if (!sta_scan)
-+                      break;
-+              memset(&parsed.assocresp, 0, sizeof(parsed.assocresp));
-+              parsed.assocresp.hdr = hdr;
-+              parsed.assocresp.len = len;
-+              wlan_mgmt_decode_assocresp(&parsed.assocresp);
-+              acx_l_process_reassocresp(adev, &parsed.reassocresp);
-+              break;
-+      case WF_FSTYPE_PROBEREQi:
-+              if (ap || adhoc) {
-+                      /* FIXME: since we're supposed to be an AP,
-+                      ** we need to return a Probe Response packet.
-+                      ** Currently firmware is doing it for us,
-+                      ** but firmware is buggy! See comment elsewhere --vda */
-+              }
-+              break;
-+      case WF_FSTYPE_PROBERESPi:
-+              memset(&parsed.proberesp, 0, sizeof(parsed.proberesp));
-+              parsed.proberesp.hdr = hdr;
-+              parsed.proberesp.len = len;
-+              wlan_mgmt_decode_proberesp(&parsed.proberesp);
-+              acx_l_process_probe_response(adev, &parsed.proberesp, rxbuf);
-+              break;
-+      case 6:
-+      case 7:
-+              /* exit */
-+              break;
-+      case WF_FSTYPE_ATIMi:
-+              /* exit */
-+              break;
-+      case WF_FSTYPE_DISASSOCi:
-+              if (!sta && !ap)
-+                      break;
-+              memset(&parsed.disassoc, 0, sizeof(parsed.disassoc));
-+              parsed.disassoc.hdr = hdr;
-+              parsed.disassoc.len = len;
-+              wlan_mgmt_decode_disassoc(&parsed.disassoc);
-+              if (sta)
-+                      acx_l_process_disassoc_from_ap(adev, &parsed.disassoc);
-+              else
-+                      acx_l_process_disassoc_from_sta(adev, &parsed.disassoc);
-+              break;
-+      case WF_FSTYPE_AUTHENi:
-+              if (!sta_scan && !ap)
-+                      break;
-+              memset(&parsed.authen, 0, sizeof(parsed.authen));
-+              parsed.authen.hdr = hdr;
-+              parsed.authen.len = len;
-+              wlan_mgmt_decode_authen(&parsed.authen);
-+              acx_l_process_authen(adev, &parsed.authen);
-+              break;
-+      case WF_FSTYPE_DEAUTHENi:
-+              if (!sta && !ap)
-+                      break;
-+              memset(&parsed.deauthen, 0, sizeof(parsed.deauthen));
-+              parsed.deauthen.hdr = hdr;
-+              parsed.deauthen.len = len;
-+              wlan_mgmt_decode_deauthen(&parsed.deauthen);
-+              if (sta)
-+                      acx_l_process_deauth_from_ap(adev, &parsed.deauthen);
-+              else
-+                      acx_l_process_deauth_from_sta(adev, &parsed.deauthen);
-+              break;
-+      }
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+#ifdef UNUSED
-+/***********************************************************************
-+** acx_process_class_frame
-+**
-+** Called from IRQ context only
-+*/
-+static int
-+acx_process_class_frame(acx_device_t *adev, rxbuffer_t *rxbuf, int vala)
-+{
-+      return OK;
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_l_process_NULL_frame
-+*/
-+#ifdef BOGUS_ITS_NOT_A_NULL_FRAME_HANDLER_AT_ALL
-+static int
-+acx_l_process_NULL_frame(acx_device_t *adev, rxbuffer_t *rxbuf, int vala)
-+{
-+      const signed char *esi;
-+      const u8 *ebx;
-+      const wlan_hdr_t *hdr;
-+      const client_t *client;
-+      int result = NOT_OK;
-+
-+      hdr = acx_get_wlan_hdr(adev, rxbuf);
-+
-+      switch (WF_FC_FROMTODSi & hdr->fc) {
-+      case 0:
-+              esi = hdr->a1;
-+              ebx = hdr->a2;
-+              break;
-+      case WF_FC_FROMDSi:
-+              esi = hdr->a1;
-+              ebx = hdr->a3;
-+              break;
-+      case WF_FC_TODSi:
-+              esi = hdr->a1;
-+              ebx = hdr->a2;
-+              break;
-+      default: /* WF_FC_FROMTODSi */
-+              esi = hdr->a1; /* added by me! --vda */
-+              ebx = hdr->a2;
-+      }
-+
-+      if (esi[0x0] < 0) {
-+              result = OK;
-+              goto done;
-+      }
-+
-+      client = acx_l_sta_list_get(adev, ebx);
-+      if (client)
-+              result = NOT_OK;
-+      else {
-+#ifdef IS_IT_BROKEN
-+              log(L_DEBUG|L_XFER, "<transmit_deauth 7>\n");
-+              acx_l_transmit_deauthen(adev, ebx,
-+                      WLAN_MGMT_REASON_CLASS2_NONAUTH);
-+#else
-+              log(L_DEBUG, "received NULL frame from unknown client! "
-+                      "We really shouldn't send deauthen here, right?\n");
-+#endif
-+              result = OK;
-+      }
-+done:
-+      return result;
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_l_process_probe_response
-+*/
-+static int
-+acx_l_process_probe_response(acx_device_t *adev, wlan_fr_proberesp_t *req,
-+                      const rxbuffer_t *rxbuf)
-+{
-+      struct client *bss;
-+      wlan_hdr_t *hdr;
-+
-+      FN_ENTER;
-+
-+      hdr = req->hdr;
-+
-+      if (mac_is_equal(hdr->a3, adev->dev_addr)) {
-+              log(L_ASSOC, "huh, scan found our own MAC!?\n");
-+              goto ok; /* just skip this one silently */
-+      }
-+
-+      bss = acx_l_sta_list_get_or_add(adev, hdr->a2);
-+
-+      /* NB: be careful modifying bss data! It may be one
-+      ** of the already known clients (like our AP if we are a STA)
-+      ** Thus do not blindly modify e.g. current ratemask! */
-+
-+      if (STA_LIST_ADD_CAN_FAIL && !bss) {
-+              /* uh oh, we found more sites/stations than we can handle with
-+               * our current setup: pull the emergency brake and stop scanning! */
-+              acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_STOP_SCAN);
-+              /* TODO: a nice comment what below call achieves --vda */
-+              acx_set_status(adev, ACX_STATUS_2_WAIT_AUTH);
-+              goto ok;
-+      }
-+      /* NB: get_or_add already filled bss->address = hdr->a2 */
-+      MAC_COPY(bss->bssid, hdr->a3);
-+
-+      /* copy the ESSID element */
-+      if (req->ssid && req->ssid->len <= IW_ESSID_MAX_SIZE) {
-+              bss->essid_len = req->ssid->len;
-+              memcpy(bss->essid, req->ssid->ssid, req->ssid->len);
-+              bss->essid[req->ssid->len] = '\0';
-+      } else {
-+              /* Either no ESSID IE or oversized one */
-+              printk("%s: received packet has bogus ESSID\n",
-+                                                  adev->ndev->name);
-+      }
-+
-+      if (req->ds_parms)
-+              bss->channel = req->ds_parms->curr_ch;
-+      if (req->cap_info)
-+              bss->cap_info = ieee2host16(*req->cap_info);
-+
-+      bss->sir = acx_signal_to_winlevel(rxbuf->phy_level);
-+      bss->snr = acx_signal_to_winlevel(rxbuf->phy_snr);
-+
-+      bss->rate_cap = 0;      /* operational mask */
-+      bss->rate_bas = 0;      /* basic mask */
-+      if (req->supp_rates)
-+              add_bits_to_ratemasks(req->supp_rates->rates,
-+                      req->supp_rates->len, &bss->rate_bas, &bss->rate_cap);
-+      if (req->ext_rates)
-+              add_bits_to_ratemasks(req->ext_rates->rates,
-+                      req->ext_rates->len, &bss->rate_bas, &bss->rate_cap);
-+      /* Fix up any possible bogosity - code elsewhere
-+       * is not expecting empty masks */
-+      if (!bss->rate_cap)
-+              bss->rate_cap = adev->rate_basic;
-+      if (!bss->rate_bas)
-+              bss->rate_bas = 1 << lowest_bit(bss->rate_cap);
-+      if (!bss->rate_cur)
-+              bss->rate_cur = 1 << lowest_bit(bss->rate_bas);
-+
-+      /* People moan about this being too noisy at L_ASSOC */
-+      log(L_DEBUG,
-+              "found %s: ESSID=\"%s\" ch=%d "
-+              "BSSID="MACSTR" caps=0x%04X SIR=%d SNR=%d\n",
-+              (bss->cap_info & WF_MGMT_CAP_IBSS) ? "Ad-Hoc peer" : "AP",
-+              bss->essid, bss->channel, MAC(bss->bssid), bss->cap_info,
-+              bss->sir, bss->snr);
-+ok:
-+      FN_EXIT0;
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_assocresp
-+*/
-+static int
-+acx_l_process_assocresp(acx_device_t *adev, const wlan_fr_assocresp_t *req)
-+{
-+      const wlan_hdr_t *hdr;
-+      int res = OK;
-+
-+      FN_ENTER;
-+
-+      hdr = req->hdr;
-+
-+      if ((ACX_MODE_2_STA == adev->mode)
-+       && mac_is_equal(adev->dev_addr, hdr->a1)) {
-+              u16 st = ieee2host16(*(req->status));
-+              if (WLAN_MGMT_STATUS_SUCCESS == st) {
-+                      adev->aid = ieee2host16(*(req->aid));
-+                      /* tell the card we are associated when
-+                      ** we are out of interrupt context */
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_ASSOCIATE);
-+              } else {
-+
-+                      /* TODO: we shall delete peer from sta_list, and try
-+                      ** other candidates... */
-+
-+                      printk("%s: association FAILED: peer sent "
-+                              "Status Code %d (%s)\n",
-+                              adev->ndev->name, st, get_status_string(st));
-+                      res = NOT_OK;
-+              }
-+      }
-+
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_reassocresp
-+*/
-+static int
-+acx_l_process_reassocresp(acx_device_t *adev, const wlan_fr_reassocresp_t *req)
-+{
-+      const wlan_hdr_t *hdr;
-+      int result = NOT_OK;
-+      u16 st;
-+
-+      FN_ENTER;
-+
-+      hdr = req->hdr;
-+
-+      if (!mac_is_equal(adev->dev_addr, hdr->a1)) {
-+              goto end;
-+      }
-+      st = ieee2host16(*(req->status));
-+      if (st == WLAN_MGMT_STATUS_SUCCESS) {
-+              acx_set_status(adev, ACX_STATUS_4_ASSOCIATED);
-+              result = OK;
-+      } else {
-+              printk("%s: reassociation FAILED: peer sent "
-+                      "response code %d (%s)\n",
-+                      adev->ndev->name, st, get_status_string(st));
-+      }
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_process_authen
-+**
-+** Called only in STA_SCAN or AP mode
-+*/
-+static int
-+acx_l_process_authen(acx_device_t *adev, const wlan_fr_authen_t *req)
-+{
-+      const wlan_hdr_t *hdr;
-+      client_t *clt;
-+      wlan_ie_challenge_t *chal;
-+      u16 alg, seq, status;
-+      int ap, result;
-+
-+      FN_ENTER;
-+
-+      hdr = req->hdr;
-+
-+      if (acx_debug & L_ASSOC) {
-+              acx_print_mac("AUTHEN adev->addr=", adev->dev_addr, " ");
-+              acx_print_mac("a1=", hdr->a1, " ");
-+              acx_print_mac("a2=", hdr->a2, " ");
-+              acx_print_mac("a3=", hdr->a3, " ");
-+              acx_print_mac("adev->bssid=", adev->bssid, "\n");
-+      }
-+
-+      if (!mac_is_equal(adev->dev_addr, hdr->a1)
-+       || !mac_is_equal(adev->bssid, hdr->a3)) {
-+              result = OK;
-+              goto end;
-+      }
-+
-+      alg = ieee2host16(*(req->auth_alg));
-+      seq = ieee2host16(*(req->auth_seq));
-+      status = ieee2host16(*(req->status));
-+
-+      log(L_ASSOC, "auth algorithm %d, auth sequence %d, status %d\n", alg, seq, status);
-+
-+      ap = (adev->mode == ACX_MODE_3_AP);
-+
-+      if (adev->auth_alg <= 1) {
-+              if (adev->auth_alg != alg) {
-+                      log(L_ASSOC, "auth algorithm mismatch: "
-+                              "our:%d peer:%d\n", adev->auth_alg, alg);
-+                      result = NOT_OK;
-+                      goto end;
-+              }
-+      }
-+      if (ap) {
-+              clt = acx_l_sta_list_get_or_add(adev, hdr->a2);
-+              if (STA_LIST_ADD_CAN_FAIL && !clt) {
-+                      log(L_ASSOC, "could not allocate room for client\n");
-+                      result = NOT_OK;
-+                      goto end;
-+              }
-+      } else {
-+              clt = adev->ap_client;
-+              if (!mac_is_equal(clt->address, hdr->a2)) {
-+                      printk("%s: malformed auth frame from AP?!\n",
-+                                      adev->ndev->name);
-+                      result = NOT_OK;
-+                      goto end;
-+              }
-+      }
-+
-+      /* now check which step in the authentication sequence we are
-+       * currently in, and act accordingly */
-+      switch (seq) {
-+      case 1:
-+              if (!ap)
-+                      break;
-+              acx_l_transmit_authen2(adev, req, clt);
-+              break;
-+      case 2:
-+              if (ap)
-+                      break;
-+              if (status == WLAN_MGMT_STATUS_SUCCESS) {
-+                      if (alg == WLAN_AUTH_ALG_OPENSYSTEM) {
-+                              acx_set_status(adev, ACX_STATUS_3_AUTHENTICATED);
-+                              acx_l_transmit_assoc_req(adev);
-+                      } else
-+                      if (alg == WLAN_AUTH_ALG_SHAREDKEY) {
-+                              acx_l_transmit_authen3(adev, req);
-+                      }
-+              } else {
-+                      printk("%s: auth FAILED: peer sent "
-+                              "response code %d (%s), "
-+                              "still waiting for authentication\n",
-+                              adev->ndev->name,
-+                              status, get_status_string(status));
-+                      acx_set_status(adev, ACX_STATUS_2_WAIT_AUTH);
-+              }
-+              break;
-+      case 3:
-+              if (!ap)
-+                      break;
-+              if ((clt->auth_alg != WLAN_AUTH_ALG_SHAREDKEY)
-+               || (alg != WLAN_AUTH_ALG_SHAREDKEY)
-+               || (clt->auth_step != 2))
-+                      break;
-+              chal = req->challenge;
-+              if (!chal
-+               || memcmp(chal->challenge, clt->challenge_text, WLAN_CHALLENGE_LEN)
-+               || (chal->eid != WLAN_EID_CHALLENGE)
-+               || (chal->len != WLAN_CHALLENGE_LEN)
-+              )
-+                      break;
-+              acx_l_transmit_authen4(adev, req);
-+              MAC_COPY(clt->address, hdr->a2);
-+              clt->used = CLIENT_AUTHENTICATED_2;
-+              clt->auth_step = 4;
-+              clt->seq = ieee2host16(hdr->seq);
-+              break;
-+      case 4:
-+              if (ap)
-+                      break;
-+              /* ok, we're through: we're authenticated. Woohoo!! */
-+              acx_set_status(adev, ACX_STATUS_3_AUTHENTICATED);
-+              log(L_ASSOC, "Authenticated!\n");
-+              /* now that we're authenticated, request association */
-+              acx_l_transmit_assoc_req(adev);
-+              break;
-+      }
-+      result = OK;
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_gen_challenge
-+*/
-+static inline void
-+acx_gen_challenge(wlan_ie_challenge_t* d)
-+{
-+      FN_ENTER;
-+      d->eid = WLAN_EID_CHALLENGE;
-+      d->len = WLAN_CHALLENGE_LEN;
-+      get_random_bytes(d->challenge, WLAN_CHALLENGE_LEN);
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_transmit_deauthen
-+*/
-+static int
-+acx_l_transmit_deauthen(acx_device_t *adev, const u8 *addr, u16 reason)
-+{
-+      struct tx *tx;
-+      struct wlan_hdr_mgmt *head;
-+      struct deauthen_frame_body *body;
-+
-+      FN_ENTER;
-+
-+      tx = acx_l_alloc_tx(adev);
-+      if (!tx)
-+              goto bad;
-+      head = acx_l_get_txbuf(adev, tx);
-+      if (!head) {
-+              acx_l_dealloc_tx(adev, tx);
-+              goto bad;
-+      }
-+      body = (void*)(head + 1);
-+
-+      head->fc = (WF_FTYPE_MGMTi | WF_FSTYPE_DEAUTHENi);
-+      head->dur = 0;
-+      MAC_COPY(head->da, addr);
-+      MAC_COPY(head->sa, adev->dev_addr);
-+      MAC_COPY(head->bssid, adev->bssid);
-+      head->seq = 0;
-+
-+      log(L_DEBUG|L_ASSOC|L_XFER,
-+              "sending deauthen to "MACSTR" for %d\n",
-+              MAC(addr), reason);
-+
-+      body->reason = host2ieee16(reason);
-+
-+      /* body is fixed size here, but beware of cutting-and-pasting this -
-+      ** do not use sizeof(*body) for variable sized mgmt packets! */
-+      acx_l_tx_data(adev, tx, WLAN_HDR_A3_LEN + sizeof(*body));
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+bad:
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_transmit_authen1
-+*/
-+static int
-+acx_l_transmit_authen1(acx_device_t *adev)
-+{
-+      struct tx *tx;
-+      struct wlan_hdr_mgmt *head;
-+      struct auth_frame_body *body;
-+
-+      FN_ENTER;
-+
-+      log(L_ASSOC, "sending authentication1 request (auth algo %d), "
-+              "awaiting response\n", adev->auth_alg);
-+
-+      tx = acx_l_alloc_tx(adev);
-+      if (!tx)
-+              goto bad;
-+      head = acx_l_get_txbuf(adev, tx);
-+      if (!head) {
-+              acx_l_dealloc_tx(adev, tx);
-+              goto bad;
-+      }
-+      body = (void*)(head + 1);
-+
-+      head->fc = WF_FSTYPE_AUTHENi;
-+      /* duration should be 0 instead of 0x8000 to have
-+       * the firmware calculate the value, right? */
-+      head->dur = 0;
-+      MAC_COPY(head->da, adev->bssid);
-+      MAC_COPY(head->sa, adev->dev_addr);
-+      MAC_COPY(head->bssid, adev->bssid);
-+      head->seq = 0;
-+
-+      body->auth_alg = host2ieee16(adev->auth_alg);
-+      body->auth_seq = host2ieee16(1);
-+      body->status = host2ieee16(0);
-+
-+      acx_l_tx_data(adev, tx, WLAN_HDR_A3_LEN + 2 + 2 + 2);
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+bad:
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_transmit_authen2
-+*/
-+static int
-+acx_l_transmit_authen2(acx_device_t *adev, const wlan_fr_authen_t *req,
-+                    client_t *clt)
-+{
-+      struct tx *tx;
-+      struct wlan_hdr_mgmt *head;
-+      struct auth_frame_body *body;
-+      unsigned int packet_len;
-+
-+      FN_ENTER;
-+
-+      if (!clt)
-+              goto ok;
-+
-+      MAC_COPY(clt->address, req->hdr->a2);
-+#ifdef UNUSED
-+      clt->ps = ((WF_FC_PWRMGTi & req->hdr->fc) != 0);
-+#endif
-+      clt->auth_alg = ieee2host16(*(req->auth_alg));
-+      clt->auth_step = 2;
-+      clt->seq = ieee2host16(req->hdr->seq);
-+
-+      tx = acx_l_alloc_tx(adev);
-+      if (!tx)
-+              goto bad;
-+      head = acx_l_get_txbuf(adev, tx);
-+      if (!head) {
-+              acx_l_dealloc_tx(adev, tx);
-+              goto bad;
-+      }
-+      body = (void*)(head + 1);
-+
-+      head->fc = WF_FSTYPE_AUTHENi;
-+      head->dur = 0 /* req->hdr->dur */;
-+      MAC_COPY(head->da, req->hdr->a2);
-+      MAC_COPY(head->sa, adev->dev_addr);
-+      MAC_COPY(head->bssid, req->hdr->a3);
-+      head->seq = 0 /* req->hdr->seq */;
-+
-+      /* already in IEEE format, no endianness conversion */
-+      body->auth_alg = *(req->auth_alg);
-+      body->auth_seq = host2ieee16(2);
-+      body->status = host2ieee16(0);
-+
-+      packet_len = WLAN_HDR_A3_LEN + 2 + 2 + 2;
-+      if (ieee2host16(*(req->auth_alg)) == WLAN_AUTH_ALG_OPENSYSTEM) {
-+              clt->used = CLIENT_AUTHENTICATED_2;
-+      } else {        /* shared key */
-+              acx_gen_challenge(&body->challenge);
-+              memcpy(&clt->challenge_text, body->challenge.challenge, WLAN_CHALLENGE_LEN);
-+              packet_len += 2 + 2 + 2 + 1+1+WLAN_CHALLENGE_LEN;
-+      }
-+
-+      acxlog_mac(L_ASSOC|L_XFER,
-+              "transmit_auth2: BSSID=", head->bssid, "\n");
-+
-+      acx_l_tx_data(adev, tx, packet_len);
-+ok:
-+      FN_EXIT1(OK);
-+      return OK;
-+bad:
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_transmit_authen3
-+*/
-+static int
-+acx_l_transmit_authen3(acx_device_t *adev, const wlan_fr_authen_t *req)
-+{
-+      struct tx *tx;
-+      struct wlan_hdr_mgmt *head;
-+      struct auth_frame_body *body;
-+      unsigned int packet_len;
-+
-+      FN_ENTER;
-+
-+      tx = acx_l_alloc_tx(adev);
-+      if (!tx)
-+              goto ok;
-+      head = acx_l_get_txbuf(adev, tx);
-+      if (!head) {
-+              acx_l_dealloc_tx(adev, tx);
-+              goto ok;
-+      }
-+      body = (void*)(head + 1);
-+
-+      /* add WF_FC_ISWEPi: auth step 3 needs to be encrypted */
-+      head->fc = WF_FC_ISWEPi + WF_FSTYPE_AUTHENi;
-+      /* FIXME: is this needed?? authen4 does it...
-+       * I think it's even wrong since we shouldn't re-use old
-+       * values but instead let the firmware calculate proper ones
-+      head->dur = req->hdr->dur;
-+      head->seq = req->hdr->seq;
-+      */
-+      MAC_COPY(head->da, adev->bssid);
-+      MAC_COPY(head->sa, adev->dev_addr);
-+      MAC_COPY(head->bssid, adev->bssid);
-+
-+      /* already in IEEE format, no endianness conversion */
-+      body->auth_alg = *(req->auth_alg);
-+      body->auth_seq = host2ieee16(3);
-+      body->status = host2ieee16(0);
-+      memcpy(&body->challenge, req->challenge, req->challenge->len + 2);
-+      packet_len = WLAN_HDR_A3_LEN + 8 + req->challenge->len;
-+
-+      log(L_ASSOC|L_XFER, "transmit_authen3!\n");
-+
-+      acx_l_tx_data(adev, tx, packet_len);
-+ok:
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_transmit_authen4
-+*/
-+static int
-+acx_l_transmit_authen4(acx_device_t *adev, const wlan_fr_authen_t *req)
-+{
-+      struct tx *tx;
-+      struct wlan_hdr_mgmt *head;
-+      struct auth_frame_body *body;
-+
-+      FN_ENTER;
-+
-+      tx = acx_l_alloc_tx(adev);
-+      if (!tx)
-+              goto ok;
-+      head = acx_l_get_txbuf(adev, tx);
-+      if (!head) {
-+              acx_l_dealloc_tx(adev, tx);
-+              goto ok;
-+      }
-+      body = (void*)(head + 1);
-+
-+      head->fc = WF_FSTYPE_AUTHENi; /* 0xb0 */
-+      head->dur = 0 /* req->hdr->dur */;
-+      MAC_COPY(head->da, req->hdr->a2);
-+      MAC_COPY(head->sa, adev->dev_addr);
-+      MAC_COPY(head->bssid, req->hdr->a3);
-+      head->seq = 0 /* req->hdr->seq  */;
-+
-+      /* already in IEEE format, no endianness conversion */
-+      body->auth_alg = *(req->auth_alg);
-+      body->auth_seq = host2ieee16(4);
-+      body->status = host2ieee16(0);
-+
-+      acx_l_tx_data(adev, tx, WLAN_HDR_A3_LEN + 2 + 2 + 2);
-+ok:
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_transmit_assoc_req
-+**
-+** adev->ap_client is a current candidate AP here
-+*/
-+static int
-+acx_l_transmit_assoc_req(acx_device_t *adev)
-+{
-+      struct tx *tx;
-+      struct wlan_hdr_mgmt *head;
-+      u8 *body, *p, *prate;
-+      unsigned int packet_len;
-+      u16 cap;
-+
-+      FN_ENTER;
-+
-+      log(L_ASSOC, "sending association request, "
-+                      "awaiting response. NOT ASSOCIATED YET\n");
-+      tx = acx_l_alloc_tx(adev);
-+      if (!tx)
-+              goto bad;
-+      head = acx_l_get_txbuf(adev, tx);
-+      if (!head) {
-+              acx_l_dealloc_tx(adev, tx);
-+              goto bad;
-+      }
-+      body = (void*)(head + 1);
-+
-+      head->fc = WF_FSTYPE_ASSOCREQi;
-+      head->dur = host2ieee16(0x8000);
-+      MAC_COPY(head->da, adev->bssid);
-+      MAC_COPY(head->sa, adev->dev_addr);
-+      MAC_COPY(head->bssid, adev->bssid);
-+      head->seq = 0;
-+
-+      p = body;
-+      /* now start filling the AssocReq frame body */
-+
-+      /* since this assoc request will most likely only get
-+       * sent in the STA to AP case (and not when Ad-Hoc IBSS),
-+       * the cap combination indicated here will thus be
-+       * WF_MGMT_CAP_ESSi *always* (no IBSS ever)
-+       * The specs are more than non-obvious on all that:
-+       *
-+       * 802.11 7.3.1.4 Capability Information field
-+      ** APs set the ESS subfield to 1 and the IBSS subfield to 0 within
-+      ** Beacon or Probe Response management frames. STAs within an IBSS
-+      ** set the ESS subfield to 0 and the IBSS subfield to 1 in transmitted
-+      ** Beacon or Probe Response management frames
-+      **
-+      ** APs set the Privacy subfield to 1 within transmitted Beacon,
-+      ** Probe Response, Association Response, and Reassociation Response
-+      ** if WEP is required for all data type frames within the BSS.
-+      ** STAs within an IBSS set the Privacy subfield to 1 in Beacon
-+      ** or Probe Response management frames if WEP is required
-+      ** for all data type frames within the IBSS */
-+
-+      /* note that returning 0 will be refused by several APs...
-+       * (so this indicates that you're probably supposed to
-+       * "confirm" the ESS mode) */
-+      cap = WF_MGMT_CAP_ESSi;
-+
-+      /* this one used to be a check on wep_restricted,
-+       * but more likely it's wep_enabled instead */
-+      if (adev->wep_enabled)
-+              SET_BIT(cap, WF_MGMT_CAP_PRIVACYi);
-+
-+      /* Probably we can just set these always, because our hw is
-+      ** capable of shortpre and PBCC --vda */
-+      /* only ask for short preamble if the peer station supports it */
-+      if (adev->ap_client->cap_info & WF_MGMT_CAP_SHORT)
-+              SET_BIT(cap, WF_MGMT_CAP_SHORTi);
-+      /* only ask for PBCC support if the peer station supports it */
-+      if (adev->ap_client->cap_info & WF_MGMT_CAP_PBCC)
-+              SET_BIT(cap, WF_MGMT_CAP_PBCCi);
-+
-+      /* IEs: 1. caps */
-+      *(u16*)p = cap; p += 2;
-+      /* 2. listen interval */
-+      *(u16*)p = host2ieee16(adev->listen_interval); p += 2;
-+      /* 3. ESSID */
-+      p = wlan_fill_ie_ssid(p,
-+                      strlen(adev->essid_for_assoc), adev->essid_for_assoc);
-+      /* 4. supp rates */
-+      prate = p;
-+      p = wlan_fill_ie_rates(p,
-+                      adev->rate_supported_len, adev->rate_supported);
-+      /* 5. ext supp rates */
-+      p = wlan_fill_ie_rates_ext(p,
-+                      adev->rate_supported_len, adev->rate_supported);
-+
-+      if (acx_debug & L_DEBUG) {
-+              printk("association: rates element\n");
-+              acx_dump_bytes(prate, p - prate);
-+      }
-+
-+      /* calculate lengths */
-+      packet_len = WLAN_HDR_A3_LEN + (p - body);
-+
-+      log(L_ASSOC, "association: requesting caps 0x%04X, ESSID \"%s\"\n",
-+              cap, adev->essid_for_assoc);
-+
-+      acx_l_tx_data(adev, tx, packet_len);
-+      FN_EXIT1(OK);
-+      return OK;
-+bad:
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_transmit_disassoc
-+**
-+** FIXME: looks like incomplete implementation of a helper:
-+** acx_l_transmit_disassoc(adev, clt) - kick this client (we're an AP)
-+** acx_l_transmit_disassoc(adev, NULL) - leave BSSID (we're a STA)
-+*/
-+#ifdef BROKEN
-+int
-+acx_l_transmit_disassoc(acx_device_t *adev, client_t *clt)
-+{
-+      struct tx *tx;
-+      struct wlan_hdr_mgmt *head;
-+      struct disassoc_frame_body *body;
-+
-+      FN_ENTER;
-+/*    if (clt != NULL) { */
-+              tx = acx_l_alloc_tx(adev);
-+              if (!tx)
-+                      goto bad;
-+              head = acx_l_get_txbuf(adev, tx);
-+              if (!head) {
-+                      acx_l_dealloc_tx(adev, tx);
-+                      goto bad;
-+              }
-+              body = (void*)(head + 1);
-+
-+/*            clt->used = CLIENT_AUTHENTICATED_2; - not (yet?) associated */
-+
-+              head->fc = WF_FSTYPE_DISASSOCi;
-+              head->dur = 0;
-+              /* huh? It muchly depends on whether we're STA or AP...
-+              ** sta->ap: da=bssid, sa=own, bssid=bssid
-+              ** ap->sta: da=sta, sa=bssid, bssid=bssid. FIXME! */
-+              MAC_COPY(head->da, adev->bssid);
-+              MAC_COPY(head->sa, adev->dev_addr);
-+              MAC_COPY(head->bssid, adev->dev_addr);
-+              head->seq = 0;
-+
-+              /* "Class 3 frame received from nonassociated station." */
-+              body->reason = host2ieee16(7);
-+
-+              /* fixed size struct, ok to sizeof */
-+              acx_l_tx_data(adev, tx, WLAN_HDR_A3_LEN + sizeof(*body));
-+/*    } */
-+      FN_EXIT1(OK);
-+      return OK;
-+bad:
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_s_complete_scan
-+**
-+** Called either from after_interrupt_task() if:
-+** 1) there was Scan_Complete IRQ, or
-+** 2) scanning expired in timer()
-+** We need to decide which ESS or IBSS to join.
-+** Iterates thru adev->sta_list:
-+**    if adev->ap is not bcast, will join only specified
-+**    ESS or IBSS with this bssid
-+**    checks peers' caps for ESS/IBSS bit
-+**    checks peers' SSID, allows exact match or hidden SSID
-+** If station to join is chosen:
-+**    points adev->ap_client to the chosen struct client
-+**    sets adev->essid_for_assoc for future assoc attempt
-+** Auth/assoc is not yet performed
-+** Returns OK if there is no need to restart scan
-+*/
-+int
-+acx_s_complete_scan(acx_device_t *adev)
-+{
-+      struct client *bss;
-+      unsigned long flags;
-+      u16 needed_cap;
-+      int i;
-+      int idx_found = -1;
-+      int result = OK;
-+
-+      FN_ENTER;
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+              needed_cap = WF_MGMT_CAP_IBSS; /* 2, we require Ad-Hoc */
-+              break;
-+      case ACX_MODE_2_STA:
-+              needed_cap = WF_MGMT_CAP_ESS; /* 1, we require Managed */
-+              break;
-+      default:
-+              printk("acx: driver bug: mode=%d in complete_scan()\n", adev->mode);
-+              dump_stack();
-+              goto end;
-+      }
-+
-+      acx_lock(adev, flags);
-+
-+      /* TODO: sta_iterator hiding implementation would be nice here... */
-+
-+      for (i = 0; i < VEC_SIZE(adev->sta_list); i++) {
-+              bss = &adev->sta_list[i];
-+              if (!bss->used) continue;
-+
-+
-+              log(L_ASSOC, "scan table: SSID=\"%s\" CH=%d SIR=%d SNR=%d\n",
-+                      bss->essid, bss->channel, bss->sir, bss->snr);
-+
-+              if (!mac_is_bcast(adev->ap))
-+                      if (!mac_is_equal(bss->bssid, adev->ap))
-+                              continue; /* keep looking */
-+
-+              /* broken peer with no mode flags set? */
-+              if (unlikely(!(bss->cap_info & (WF_MGMT_CAP_ESS | WF_MGMT_CAP_IBSS)))) {
-+                      printk("%s: strange peer "MACSTR" found with "
-+                              "neither ESS (AP) nor IBSS (Ad-Hoc) "
-+                              "capability - skipped\n",
-+                              adev->ndev->name, MAC(bss->address));
-+                      continue;
-+              }
-+              log(L_ASSOC, "peer_cap 0x%04X, needed_cap 0x%04X\n",
-+                     bss->cap_info, needed_cap);
-+
-+              /* does peer station support what we need? */
-+              if ((bss->cap_info & needed_cap) != needed_cap)
-+                      continue; /* keep looking */
-+
-+              /* strange peer with NO basic rates?! */
-+              if (unlikely(!bss->rate_bas)) {
-+                      printk("%s: strange peer "MACSTR" with empty rate set "
-+                              "- skipped\n",
-+                              adev->ndev->name, MAC(bss->address));
-+                      continue;
-+              }
-+
-+              /* do we support all basic rates of this peer? */
-+              if ((bss->rate_bas & adev->rate_oper) != bss->rate_bas) {
-+/* we probably need to have all rates as operational rates,
-+   even in case of an 11M-only configuration */
-+#ifdef THIS_IS_TROUBLESOME
-+                      printk("%s: peer "MACSTR": incompatible basic rates "
-+                              "(AP requests 0x%04X, we have 0x%04X) "
-+                              "- skipped\n",
-+                              adev->ndev->name, MAC(bss->address),
-+                              bss->rate_bas, adev->rate_oper);
-+                      continue;
-+#else
-+                      printk("%s: peer "MACSTR": incompatible basic rates "
-+                              "(AP requests 0x%04X, we have 0x%04X). "
-+                              "Considering anyway...\n",
-+                              adev->ndev->name, MAC(bss->address),
-+                              bss->rate_bas, adev->rate_oper);
-+#endif
-+              }
-+
-+              if ( !(adev->reg_dom_chanmask & (1<<(bss->channel-1))) ) {
-+                      printk("%s: warning: peer "MACSTR" is on channel %d "
-+                              "outside of channel range of current "
-+                              "regulatory domain - couldn't join "
-+                              "even if other settings match. "
-+                              "You might want to adapt your config\n",
-+                              adev->ndev->name, MAC(bss->address),
-+                              bss->channel);
-+                      continue; /* keep looking */
-+              }
-+
-+              if (!adev->essid_active || !strcmp(bss->essid, adev->essid)) {
-+                      log(L_ASSOC,
-+                             "found station with matching ESSID! ('%s' "
-+                             "station, '%s' config)\n",
-+                             bss->essid,
-+                             (adev->essid_active) ? adev->essid : "[any]");
-+                      /* TODO: continue looking for peer with better SNR */
-+                      bss->used = CLIENT_JOIN_CANDIDATE;
-+                      idx_found = i;
-+
-+                      /* stop searching if this station is
-+                       * on the current channel, otherwise
-+                       * keep looking for an even better match */
-+                      if (bss->channel == adev->channel)
-+                              break;
-+              } else
-+              if (is_hidden_essid(bss->essid)) {
-+                      /* hmm, station with empty or single-space SSID:
-+                       * using hidden SSID broadcast?
-+                       */
-+                      /* This behaviour is broken: which AP from zillion
-+                      ** of APs with hidden SSID you'd try?
-+                      ** We should use Probe requests to get Probe responses
-+                      ** and check for real SSID (are those never hidden?) */
-+                      bss->used = CLIENT_JOIN_CANDIDATE;
-+                      if (idx_found == -1)
-+                              idx_found = i;
-+                      log(L_ASSOC, "found station with empty or "
-+                              "single-space (hidden) SSID, considering "
-+                              "for assoc attempt\n");
-+                      /* ...and keep looking for better matches */
-+              } else {
-+                      log(L_ASSOC, "ESSID doesn't match! ('%s' "
-+                              "station, '%s' config)\n",
-+                              bss->essid,
-+                              (adev->essid_active) ? adev->essid : "[any]");
-+              }
-+      }
-+
-+      /* TODO: iterate thru join candidates instead */
-+      /* TODO: rescan if not associated within some timeout */
-+      if (idx_found != -1) {
-+              char *essid_src;
-+              size_t essid_len;
-+
-+              bss = &adev->sta_list[idx_found];
-+              adev->ap_client = bss;
-+
-+              if (is_hidden_essid(bss->essid)) {
-+                      /* if the ESSID of the station we found is empty
-+                       * (no broadcast), then use user-configured ESSID
-+                       * instead */
-+                      essid_src = adev->essid;
-+                      essid_len = adev->essid_len;
-+              } else {
-+                      essid_src = bss->essid;
-+                      essid_len = strlen(bss->essid);
-+              }
-+
-+              acx_update_capabilities(adev);
-+
-+              memcpy(adev->essid_for_assoc, essid_src, essid_len);
-+              adev->essid_for_assoc[essid_len] = '\0';
-+              adev->channel = bss->channel;
-+              MAC_COPY(adev->bssid, bss->bssid);
-+
-+              bss->rate_cfg = (bss->rate_cap & adev->rate_oper);
-+              bss->rate_cur = 1 << lowest_bit(bss->rate_cfg);
-+              bss->rate_100 = acx_rate111to100(bss->rate_cur);
-+
-+              acxlog_mac(L_ASSOC,
-+                      "matching station found: ", adev->bssid, ", joining\n");
-+
-+              /* TODO: do we need to switch to the peer's channel first? */
-+
-+              if (ACX_MODE_0_ADHOC == adev->mode) {
-+                      acx_set_status(adev, ACX_STATUS_4_ASSOCIATED);
-+              } else {
-+                      acx_l_transmit_authen1(adev);
-+                      acx_set_status(adev, ACX_STATUS_2_WAIT_AUTH);
-+              }
-+      } else { /* idx_found == -1 */
-+              /* uh oh, no station found in range */
-+              if (ACX_MODE_0_ADHOC == adev->mode) {
-+                      printk("%s: no matching station found in range, "
-+                              "generating our own IBSS instead\n",
-+                              adev->ndev->name);
-+                      /* we do it the HostAP way: */
-+                      MAC_COPY(adev->bssid, adev->dev_addr);
-+                      adev->bssid[0] |= 0x02; /* 'local assigned addr' bit */
-+                      /* add IBSS bit to our caps... */
-+                      acx_update_capabilities(adev);
-+                      acx_set_status(adev, ACX_STATUS_4_ASSOCIATED);
-+                      /* In order to cmd_join be called below */
-+                      idx_found = 0;
-+              } else {
-+                      /* we shall scan again, AP can be
-+                      ** just temporarily powered off */
-+                      log(L_ASSOC,
-+                              "no matching station found in range yet\n");
-+                      acx_set_status(adev, ACX_STATUS_1_SCANNING);
-+                      result = NOT_OK;
-+              }
-+      }
-+
-+      acx_unlock(adev, flags);
-+
-+      if (idx_found != -1) {
-+              if (ACX_MODE_0_ADHOC == adev->mode) {
-+                      /* need to update channel in beacon template */
-+                      SET_BIT(adev->set_mask, SET_TEMPLATES);
-+                      if (ACX_STATE_IFACE_UP & adev->dev_state_mask)
-+                              acx_s_update_card_settings(adev);
-+              }
-+              /* Inform firmware on our decision to start or join BSS */
-+              acx_s_cmd_join_bssid(adev, adev->bssid);
-+      }
-+
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_s_read_fw
-+**
-+** Loads a firmware image
-+**
-+** Returns:
-+**  0                         unable to load file
-+**  pointer to firmware               success
-+*/
-+firmware_image_t*
-+acx_s_read_fw(struct device *dev, const char *file, u32 *size)
-+{
-+      firmware_image_t *res;
-+      const struct firmware *fw_entry;
-+
-+      res = NULL;
-+      log(L_INIT, "requesting firmware image '%s'\n", file);
-+      if (!request_firmware(&fw_entry, file, dev)) {
-+              *size = 8;
-+              if (fw_entry->size >= 8)
-+                      *size = 8 + le32_to_cpu(*(u32 *)(fw_entry->data + 4));
-+              if (fw_entry->size != *size) {
-+                      printk("acx: firmware size does not match "
-+                              "firmware header: %d != %d, "
-+                              "aborting fw upload\n",
-+                              (int) fw_entry->size, (int) *size);
-+                      goto release_ret;
-+              }
-+              res = vmalloc(*size);
-+              if (!res) {
-+                      printk("acx: no memory for firmware "
-+                              "(%u bytes)\n", *size);
-+                      goto release_ret;
-+              }
-+              memcpy(res, fw_entry->data, fw_entry->size);
-+release_ret:
-+              release_firmware(fw_entry);
-+              return res;
-+      }
-+      printk("acx: firmware image '%s' was not provided. "
-+              "Check your hotplug scripts\n", file);
-+
-+      /* checksum will be verified in write_fw, so don't bother here */
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acx_s_set_wepkey
-+*/
-+static void
-+acx100_s_set_wepkey(acx_device_t *adev)
-+{
-+      ie_dot11WEPDefaultKey_t dk;
-+      int i;
-+
-+      for (i = 0; i < DOT11_MAX_DEFAULT_WEP_KEYS; i++) {
-+              if (adev->wep_keys[i].size != 0) {
-+                      log(L_INIT, "setting WEP key: %d with "
-+                              "total size: %d\n", i, (int) adev->wep_keys[i].size);
-+                      dk.action = 1;
-+                      dk.keySize = adev->wep_keys[i].size;
-+                      dk.defaultKeyNum = i;
-+                      memcpy(dk.key, adev->wep_keys[i].key, dk.keySize);
-+                      acx_s_configure(adev, &dk, ACX100_IE_DOT11_WEP_DEFAULT_KEY_WRITE);
-+              }
-+      }
-+}
-+
-+static void
-+acx111_s_set_wepkey(acx_device_t *adev)
-+{
-+      acx111WEPDefaultKey_t dk;
-+      int i;
-+
-+      for (i = 0; i < DOT11_MAX_DEFAULT_WEP_KEYS; i++) {
-+              if (adev->wep_keys[i].size != 0) {
-+                      log(L_INIT, "setting WEP key: %d with "
-+                              "total size: %d\n", i, (int) adev->wep_keys[i].size);
-+                      memset(&dk, 0, sizeof(dk));
-+                      dk.action = cpu_to_le16(1); /* "add key"; yes, that's a 16bit value */
-+                      dk.keySize = adev->wep_keys[i].size;
-+
-+                      /* are these two lines necessary? */
-+                      dk.type = 0;              /* default WEP key */
-+                      dk.index = 0;             /* ignored when setting default key */
-+
-+                      dk.defaultKeyNum = i;
-+                      memcpy(dk.key, adev->wep_keys[i].key, dk.keySize);
-+                      acx_s_issue_cmd(adev, ACX1xx_CMD_WEP_MGMT, &dk, sizeof(dk));
-+              }
-+      }
-+}
-+
-+static void
-+acx_s_set_wepkey(acx_device_t *adev)
-+{
-+      if (IS_ACX111(adev))
-+              acx111_s_set_wepkey(adev);
-+      else
-+              acx100_s_set_wepkey(adev);
-+}
-+
-+
-+/***********************************************************************
-+** acx100_s_init_wep
-+**
-+** FIXME: this should probably be moved into the new card settings
-+** management, but since we're also modifying the memory map layout here
-+** due to the WEP key space we want, we should take care...
-+*/
-+static int
-+acx100_s_init_wep(acx_device_t *adev)
-+{
-+      acx100_ie_wep_options_t options;
-+      ie_dot11WEPDefaultKeyID_t dk;
-+      acx_ie_memmap_t pt;
-+      int res = NOT_OK;
-+
-+      FN_ENTER;
-+
-+      if (OK != acx_s_interrogate(adev, &pt, ACX1xx_IE_MEMORY_MAP)) {
-+              goto fail;
-+      }
-+
-+      log(L_DEBUG, "CodeEnd:%X\n", pt.CodeEnd);
-+
-+      pt.WEPCacheStart = cpu_to_le32(le32_to_cpu(pt.CodeEnd) + 0x4);
-+      pt.WEPCacheEnd   = cpu_to_le32(le32_to_cpu(pt.CodeEnd) + 0x4);
-+
-+      if (OK != acx_s_configure(adev, &pt, ACX1xx_IE_MEMORY_MAP)) {
-+              goto fail;
-+      }
-+
-+      /* let's choose maximum setting: 4 default keys, plus 10 other keys: */
-+      options.NumKeys = cpu_to_le16(DOT11_MAX_DEFAULT_WEP_KEYS + 10);
-+      options.WEPOption = 0x00;
-+
-+      log(L_ASSOC, "%s: writing WEP options\n", __func__);
-+      acx_s_configure(adev, &options, ACX100_IE_WEP_OPTIONS);
-+
-+      acx100_s_set_wepkey(adev);
-+
-+      if (adev->wep_keys[adev->wep_current_index].size != 0) {
-+              log(L_ASSOC, "setting active default WEP key number: %d\n",
-+                              adev->wep_current_index);
-+              dk.KeyID = adev->wep_current_index;
-+              acx_s_configure(adev, &dk, ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET); /* 0x1010 */
-+      }
-+      /* FIXME!!! wep_key_struct is filled nowhere! But adev
-+       * is initialized to 0, and we don't REALLY need those keys either */
-+/*            for (i = 0; i < 10; i++) {
-+              if (adev->wep_key_struct[i].len != 0) {
-+                      MAC_COPY(wep_mgmt.MacAddr, adev->wep_key_struct[i].addr);
-+                      wep_mgmt.KeySize = cpu_to_le16(adev->wep_key_struct[i].len);
-+                      memcpy(&wep_mgmt.Key, adev->wep_key_struct[i].key, le16_to_cpu(wep_mgmt.KeySize));
-+                      wep_mgmt.Action = cpu_to_le16(1);
-+                      log(L_ASSOC, "writing WEP key %d (len %d)\n", i, le16_to_cpu(wep_mgmt.KeySize));
-+                      if (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_WEP_MGMT, &wep_mgmt, sizeof(wep_mgmt))) {
-+                              adev->wep_key_struct[i].index = i;
-+                      }
-+              }
-+      }
-+*/
-+
-+      /* now retrieve the updated WEPCacheEnd pointer... */
-+      if (OK != acx_s_interrogate(adev, &pt, ACX1xx_IE_MEMORY_MAP)) {
-+              printk("%s: ACX1xx_IE_MEMORY_MAP read #2 FAILED\n",
-+                              adev->ndev->name);
-+              goto fail;
-+      }
-+      /* ...and tell it to start allocating templates at that location */
-+      /* (no endianness conversion needed) */
-+      pt.PacketTemplateStart = pt.WEPCacheEnd;
-+
-+      if (OK != acx_s_configure(adev, &pt, ACX1xx_IE_MEMORY_MAP)) {
-+              printk("%s: ACX1xx_IE_MEMORY_MAP write #2 FAILED\n",
-+                              adev->ndev->name);
-+              goto fail;
-+      }
-+      res = OK;
-+
-+fail:
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+
-+static int
-+acx_s_init_max_template_generic(acx_device_t *adev, unsigned int len, unsigned int cmd)
-+{
-+      int res;
-+      union {
-+              acx_template_nullframe_t null;
-+              acx_template_beacon_t b;
-+              acx_template_tim_t tim;
-+              acx_template_probereq_t preq;
-+              acx_template_proberesp_t presp;
-+      } templ;
-+
-+      memset(&templ, 0, len);
-+      templ.null.size = cpu_to_le16(len - 2);
-+      res = acx_s_issue_cmd(adev, cmd, &templ, len);
-+      return res;
-+}
-+
-+static inline int
-+acx_s_init_max_null_data_template(acx_device_t *adev)
-+{
-+      return acx_s_init_max_template_generic(
-+              adev, sizeof(acx_template_nullframe_t), ACX1xx_CMD_CONFIG_NULL_DATA
-+      );
-+}
-+
-+static inline int
-+acx_s_init_max_beacon_template(acx_device_t *adev)
-+{
-+      return acx_s_init_max_template_generic(
-+              adev, sizeof(acx_template_beacon_t), ACX1xx_CMD_CONFIG_BEACON
-+      );
-+}
-+
-+static inline int
-+acx_s_init_max_tim_template(acx_device_t *adev)
-+{
-+      return acx_s_init_max_template_generic(
-+              adev, sizeof(acx_template_tim_t), ACX1xx_CMD_CONFIG_TIM
-+      );
-+}
-+
-+static inline int
-+acx_s_init_max_probe_response_template(acx_device_t *adev)
-+{
-+      return acx_s_init_max_template_generic(
-+              adev, sizeof(acx_template_proberesp_t), ACX1xx_CMD_CONFIG_PROBE_RESPONSE
-+      );
-+}
-+
-+static inline int
-+acx_s_init_max_probe_request_template(acx_device_t *adev)
-+{
-+      return acx_s_init_max_template_generic(
-+              adev, sizeof(acx_template_probereq_t), ACX1xx_CMD_CONFIG_PROBE_REQUEST
-+      );
-+}
-+
-+/***********************************************************************
-+** acx_s_set_tim_template
-+**
-+** FIXME: In full blown driver we will regularly update partial virtual bitmap
-+** by calling this function
-+** (it can be done by irq handler on each DTIM irq or by timer...)
-+
-+[802.11 7.3.2.6] TIM information element:
-+- 1 EID
-+- 1 Length
-+1 1 DTIM Count
-+    indicates how many beacons (including this) appear before next DTIM
-+    (0=this one is a DTIM)
-+2 1 DTIM Period
-+    number of beacons between successive DTIMs
-+    (0=reserved, 1=all TIMs are DTIMs, 2=every other, etc)
-+3 1 Bitmap Control
-+    bit0: Traffic Indicator bit associated with Assoc ID 0 (Bcast AID?)
-+    set to 1 in TIM elements with a value of 0 in the DTIM Count field
-+    when one or more broadcast or multicast frames are buffered at the AP.
-+    bit1-7: Bitmap Offset (logically Bitmap_Offset = Bitmap_Control & 0xFE).
-+4 n Partial Virtual Bitmap
-+    Visible part of traffic-indication bitmap.
-+    Full bitmap consists of 2008 bits (251 octets) such that bit number N
-+    (0<=N<=2007) in the bitmap corresponds to bit number (N mod 8)
-+    in octet number N/8 where the low-order bit of each octet is bit0,
-+    and the high order bit is bit7.
-+    Each set bit in virtual bitmap corresponds to traffic buffered by AP
-+    for a specific station (with corresponding AID?).
-+    Partial Virtual Bitmap shows a part of bitmap which has non-zero.
-+    Bitmap Offset is a number of skipped zero octets (see above).
-+    'Missing' octets at the tail are also assumed to be zero.
-+    Example: Length=6, Bitmap_Offset=2, Partial_Virtual_Bitmap=55 55 55
-+    This means that traffic-indication bitmap is:
-+    00000000 00000000 01010101 01010101 01010101 00000000 00000000...
-+    (is bit0 in the map is always 0 and real value is in Bitmap Control bit0?)
-+*/
-+static int
-+acx_s_set_tim_template(acx_device_t *adev)
-+{
-+/* For now, configure smallish test bitmap, all zero ("no pending data") */
-+      enum { bitmap_size = 5 };
-+
-+      acx_template_tim_t t;
-+      int result;
-+
-+      FN_ENTER;
-+
-+      memset(&t, 0, sizeof(t));
-+      t.size = 5 + bitmap_size; /* eid+len+count+period+bmap_ctrl + bmap */
-+      t.tim_eid = WLAN_EID_TIM;
-+      t.len = 3 + bitmap_size; /* count+period+bmap_ctrl + bmap */
-+      result = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_TIM, &t, sizeof(t));
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_fill_beacon_or_proberesp_template
-+**
-+** For frame format info, please see 802.11-1999.pdf item 7.2.3.9 and below!!
-+**
-+** NB: we use the fact that
-+** struct acx_template_proberesp and struct acx_template_beacon are the same
-+** (well, almost...)
-+**
-+** [802.11] Beacon's body consist of these IEs:
-+** 1 Timestamp
-+** 2 Beacon interval
-+** 3 Capability information
-+** 4 SSID
-+** 5 Supported rates (up to 8 rates)
-+** 6 FH Parameter Set (frequency-hopping PHYs only)
-+** 7 DS Parameter Set (direct sequence PHYs only)
-+** 8 CF Parameter Set (only if PCF is supported)
-+** 9 IBSS Parameter Set (ad-hoc only)
-+**
-+** Beacon only:
-+** 10 TIM (AP only) (see 802.11 7.3.2.6)
-+** 11 Country Information (802.11d)
-+** 12 FH Parameters (802.11d)
-+** 13 FH Pattern Table (802.11d)
-+** ... (?!! did not yet find relevant PDF file... --vda)
-+** 19 ERP Information (extended rate PHYs)
-+** 20 Extended Supported Rates (if more than 8 rates)
-+**
-+** Proberesp only:
-+** 10 Country information (802.11d)
-+** 11 FH Parameters (802.11d)
-+** 12 FH Pattern Table (802.11d)
-+** 13-n Requested information elements (802.11d)
-+** ????
-+** 18 ERP Information (extended rate PHYs)
-+** 19 Extended Supported Rates (if more than 8 rates)
-+*/
-+static int
-+acx_fill_beacon_or_proberesp_template(acx_device_t *adev,
-+                                      struct acx_template_beacon *templ,
-+                                      u16 fc /* in host order! */)
-+{
-+      int len;
-+      u8 *p;
-+
-+      FN_ENTER;
-+
-+      memset(templ, 0, sizeof(*templ));
-+      MAC_BCAST(templ->da);
-+      MAC_COPY(templ->sa, adev->dev_addr);
-+      MAC_COPY(templ->bssid, adev->bssid);
-+
-+      templ->beacon_interval = cpu_to_le16(adev->beacon_interval);
-+      acx_update_capabilities(adev);
-+      templ->cap = cpu_to_le16(adev->capabilities);
-+
-+      p = templ->variable;
-+      p = wlan_fill_ie_ssid(p, adev->essid_len, adev->essid);
-+      p = wlan_fill_ie_rates(p, adev->rate_supported_len, adev->rate_supported);
-+      p = wlan_fill_ie_ds_parms(p, adev->channel);
-+      /* NB: should go AFTER tim, but acx seem to keep tim last always */
-+      p = wlan_fill_ie_rates_ext(p, adev->rate_supported_len, adev->rate_supported);
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+              /* ATIM window */
-+              p = wlan_fill_ie_ibss_parms(p, 0); break;
-+      case ACX_MODE_3_AP:
-+              /* TIM IE is set up as separate template */
-+              break;
-+      }
-+
-+      len = p - (u8*)templ;
-+      templ->fc = cpu_to_le16(WF_FTYPE_MGMT | fc);
-+      /* - 2: do not count 'u16 size' field */
-+      templ->size = cpu_to_le16(len - 2);
-+
-+      FN_EXIT1(len);
-+      return len;
-+}
-+
-+
-+#if POWER_SAVE_80211
-+/***********************************************************************
-+** acx_s_set_null_data_template
-+*/
-+static int
-+acx_s_set_null_data_template(acx_device_t *adev)
-+{
-+      struct acx_template_nullframe b;
-+      int result;
-+
-+      FN_ENTER;
-+
-+      /* memset(&b, 0, sizeof(b)); not needed, setting all members */
-+
-+      b.size = cpu_to_le16(sizeof(b) - 2);
-+      b.hdr.fc = WF_FTYPE_MGMTi | WF_FSTYPE_NULLi;
-+      b.hdr.dur = 0;
-+      MAC_BCAST(b.hdr.a1);
-+      MAC_COPY(b.hdr.a2, adev->dev_addr);
-+      MAC_COPY(b.hdr.a3, adev->bssid);
-+      b.hdr.seq = 0;
-+
-+      result = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_NULL_DATA, &b, sizeof(b));
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_s_set_beacon_template
-+*/
-+static int
-+acx_s_set_beacon_template(acx_device_t *adev)
-+{
-+      struct acx_template_beacon bcn;
-+      int len, result;
-+
-+      FN_ENTER;
-+
-+      len = acx_fill_beacon_or_proberesp_template(adev, &bcn, WF_FSTYPE_BEACON);
-+      result = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_BEACON, &bcn, len);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_s_set_probe_response_template
-+*/
-+static int
-+acx_s_set_probe_response_template(acx_device_t *adev)
-+{
-+      struct acx_template_proberesp pr;
-+      int len, result;
-+
-+      FN_ENTER;
-+
-+      len = acx_fill_beacon_or_proberesp_template(adev, &pr, WF_FSTYPE_PROBERESP);
-+      result = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_PROBE_RESPONSE, &pr, len);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_s_init_packet_templates()
-+**
-+** NOTE: order is very important here, to have a correct memory layout!
-+** init templates: max Probe Request (station mode), max NULL data,
-+** max Beacon, max TIM, max Probe Response.
-+*/
-+static int
-+acx_s_init_packet_templates(acx_device_t *adev)
-+{
-+      acx_ie_memmap_t mm; /* ACX100 only */
-+      int result = NOT_OK;
-+
-+      FN_ENTER;
-+
-+      log(L_DEBUG|L_INIT, "initializing max packet templates\n");
-+
-+      if (OK != acx_s_init_max_probe_request_template(adev))
-+              goto failed;
-+
-+      if (OK != acx_s_init_max_null_data_template(adev))
-+              goto failed;
-+
-+      if (OK != acx_s_init_max_beacon_template(adev))
-+              goto failed;
-+
-+      if (OK != acx_s_init_max_tim_template(adev))
-+              goto failed;
-+
-+      if (OK != acx_s_init_max_probe_response_template(adev))
-+              goto failed;
-+
-+      if (IS_ACX111(adev)) {
-+              /* ACX111 doesn't need the memory map magic below,
-+               * and the other templates will be set later (acx_start) */
-+              result = OK;
-+              goto success;
-+      }
-+
-+      /* ACX100 will have its TIM template set,
-+       * and we also need to update the memory map */
-+
-+      if (OK != acx_s_set_tim_template(adev))
-+              goto failed_acx100;
-+
-+      log(L_DEBUG, "sizeof(memmap)=%d bytes\n", (int)sizeof(mm));
-+
-+      if (OK != acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP))
-+              goto failed_acx100;
-+
-+      mm.QueueStart = cpu_to_le32(le32_to_cpu(mm.PacketTemplateEnd) + 4);
-+      if (OK != acx_s_configure(adev, &mm, ACX1xx_IE_MEMORY_MAP))
-+              goto failed_acx100;
-+
-+      result = OK;
-+      goto success;
-+
-+failed_acx100:
-+      log(L_DEBUG|L_INIT,
-+              /* "cb=0x%X\n" */
-+              "ACXMemoryMap:\n"
-+              ".CodeStart=0x%X\n"
-+              ".CodeEnd=0x%X\n"
-+              ".WEPCacheStart=0x%X\n"
-+              ".WEPCacheEnd=0x%X\n"
-+              ".PacketTemplateStart=0x%X\n"
-+              ".PacketTemplateEnd=0x%X\n",
-+              /* len, */
-+              le32_to_cpu(mm.CodeStart),
-+              le32_to_cpu(mm.CodeEnd),
-+              le32_to_cpu(mm.WEPCacheStart),
-+              le32_to_cpu(mm.WEPCacheEnd),
-+              le32_to_cpu(mm.PacketTemplateStart),
-+              le32_to_cpu(mm.PacketTemplateEnd));
-+
-+failed:
-+      printk("%s: %s() FAILED\n", adev->ndev->name, __func__);
-+
-+success:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_s_set_probe_request_template(acx_device_t *adev)
-+{
-+      struct acx_template_probereq probereq;
-+      char *p;
-+      int res;
-+      int frame_len;
-+
-+      FN_ENTER;
-+
-+      memset(&probereq, 0, sizeof(probereq));
-+
-+      probereq.fc = WF_FTYPE_MGMTi | WF_FSTYPE_PROBEREQi;
-+      MAC_BCAST(probereq.da);
-+      MAC_COPY(probereq.sa, adev->dev_addr);
-+      MAC_BCAST(probereq.bssid);
-+
-+      p = probereq.variable;
-+      p = wlan_fill_ie_ssid(p, adev->essid_len, adev->essid);
-+      p = wlan_fill_ie_rates(p, adev->rate_supported_len, adev->rate_supported);
-+      p = wlan_fill_ie_rates_ext(p, adev->rate_supported_len, adev->rate_supported);
-+      frame_len = p - (char*)&probereq;
-+      probereq.size = cpu_to_le16(frame_len - 2);
-+
-+      res = acx_s_issue_cmd(adev, ACX1xx_CMD_CONFIG_PROBE_REQUEST, &probereq, frame_len);
-+      FN_EXIT0;
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acx_s_init_mac
-+*/
-+int
-+acx_s_init_mac(acx_device_t *adev)
-+{
-+      int result = NOT_OK;
-+
-+      FN_ENTER;
-+
-+      if (IS_ACX111(adev)) {
-+              adev->ie_len = acx111_ie_len;
-+              adev->ie_len_dot11 = acx111_ie_len_dot11;
-+      } else {
-+              adev->ie_len = acx100_ie_len;
-+              adev->ie_len_dot11 = acx100_ie_len_dot11;
-+      }
-+
-+#if defined (ACX_MEM)
-+              adev->memblocksize = 256; /* 256 is default */
-+              /* try to load radio for both ACX100 and ACX111, since both
-+               * chips have at least some firmware versions making use of an
-+               * external radio module */
-+              acxmem_s_upload_radio(adev);
-+#else
-+      if (IS_PCI(adev)) {
-+              adev->memblocksize = 256; /* 256 is default */
-+              /* try to load radio for both ACX100 and ACX111, since both
-+               * chips have at least some firmware versions making use of an
-+               * external radio module */
-+              acxpci_s_upload_radio(adev);
-+      } else {
-+              adev->memblocksize = 128;
-+      }
-+#endif
-+
-+      if (IS_ACX111(adev)) {
-+              /* for ACX111, the order is different from ACX100
-+                 1. init packet templates
-+                 2. create station context and create dma regions
-+                 3. init wep default keys
-+              */
-+              if (OK != acx_s_init_packet_templates(adev))
-+                      goto fail;
-+              if (OK != acx111_s_create_dma_regions(adev)) {
-+                      printk("%s: acx111_create_dma_regions FAILED\n",
-+                                              adev->ndev->name);
-+                      goto fail;
-+              }
-+      } else {
-+              if (OK != acx100_s_init_wep(adev))
-+                      goto fail;
-+              if (OK != acx_s_init_packet_templates(adev))
-+                      goto fail;
-+              if (OK != acx100_s_create_dma_regions(adev)) {
-+                      printk("%s: acx100_create_dma_regions FAILED\n",
-+                                              adev->ndev->name);
-+                      goto fail;
-+              }
-+      }
-+
-+      MAC_COPY(adev->ndev->dev_addr, adev->dev_addr);
-+      result = OK;
-+
-+fail:
-+      if (result)
-+              printk("acx: init_mac() FAILED\n");
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+void
-+acx_s_set_sane_reg_domain(acx_device_t *adev, int do_set)
-+{
-+      unsigned mask;
-+
-+      unsigned int i;
-+
-+      for (i = 0; i < sizeof(acx_reg_domain_ids); i++)
-+              if (acx_reg_domain_ids[i] == adev->reg_dom_id)
-+                      break;
-+
-+      if (sizeof(acx_reg_domain_ids) == i) {
-+              log(L_INIT, "Invalid or unsupported regulatory domain"
-+                             " 0x%02X specified, falling back to FCC (USA)!"
-+                             " Please report if this sounds fishy!\n",
-+                              adev->reg_dom_id);
-+              i = 0;
-+              adev->reg_dom_id = acx_reg_domain_ids[i];
-+
-+              /* since there was a mismatch, we need to force updating */
-+              do_set = 1;
-+      }
-+
-+      if (do_set) {
-+              acx_ie_generic_t dom;
-+              dom.m.bytes[0] = adev->reg_dom_id;
-+              acx_s_configure(adev, &dom, ACX1xx_IE_DOT11_CURRENT_REG_DOMAIN);
-+      }
-+
-+      adev->reg_dom_chanmask = reg_domain_channel_masks[i];
-+
-+      mask = (1 << (adev->channel - 1));
-+      if (!(adev->reg_dom_chanmask & mask)) {
-+      /* hmm, need to adjust our channel to reside within domain */
-+              mask = 1;
-+              for (i = 1; i <= 14; i++) {
-+                      if (adev->reg_dom_chanmask & mask) {
-+                              printk("%s: adjusting selected channel from %d "
-+                                      "to %d due to new regulatory domain\n",
-+                                      adev->ndev->name, adev->channel, i);
-+                              adev->channel = i;
-+                              break;
-+                      }
-+                      mask <<= 1;
-+              }
-+      }
-+}
-+
-+
-+#if POWER_SAVE_80211
-+static void
-+acx_s_update_80211_powersave_mode(acx_device_t *adev)
-+{
-+      /* merge both structs in a union to be able to have common code */
-+      union {
-+              acx111_ie_powersave_t acx111;
-+              acx100_ie_powersave_t acx100;
-+      } pm;
-+
-+      /* change 802.11 power save mode settings */
-+      log(L_INIT, "updating 802.11 power save mode settings: "
-+              "wakeup_cfg 0x%02X, listen interval %u, "
-+              "options 0x%02X, hangover period %u, "
-+              "enhanced_ps_transition_time %u\n",
-+              adev->ps_wakeup_cfg, adev->ps_listen_interval,
-+              adev->ps_options, adev->ps_hangover_period,
-+              adev->ps_enhanced_transition_time);
-+      acx_s_interrogate(adev, &pm, ACX1xx_IE_POWER_MGMT);
-+      log(L_INIT, "Previous PS mode settings: wakeup_cfg 0x%02X, "
-+              "listen interval %u, options 0x%02X, "
-+              "hangover period %u, "
-+              "enhanced_ps_transition_time %u, beacon_rx_time %u\n",
-+              pm.acx111.wakeup_cfg,
-+              pm.acx111.listen_interval,
-+              pm.acx111.options,
-+              pm.acx111.hangover_period,
-+              IS_ACX111(adev) ?
-+                      pm.acx111.enhanced_ps_transition_time
-+                    : pm.acx100.enhanced_ps_transition_time,
-+              IS_ACX111(adev) ?
-+                      pm.acx111.beacon_rx_time
-+                    : (u32)-1
-+              );
-+      pm.acx111.wakeup_cfg = adev->ps_wakeup_cfg;
-+      pm.acx111.listen_interval = adev->ps_listen_interval;
-+      pm.acx111.options = adev->ps_options;
-+      pm.acx111.hangover_period = adev->ps_hangover_period;
-+      if (IS_ACX111(adev)) {
-+              pm.acx111.beacon_rx_time = cpu_to_le32(adev->ps_beacon_rx_time);
-+              pm.acx111.enhanced_ps_transition_time = cpu_to_le32(adev->ps_enhanced_transition_time);
-+      } else {
-+              pm.acx100.enhanced_ps_transition_time = cpu_to_le16(adev->ps_enhanced_transition_time);
-+      }
-+      acx_s_configure(adev, &pm, ACX1xx_IE_POWER_MGMT);
-+      acx_s_interrogate(adev, &pm, ACX1xx_IE_POWER_MGMT);
-+      log(L_INIT, "wakeup_cfg: 0x%02X\n", pm.acx111.wakeup_cfg);
-+      acx_s_msleep(40);
-+      acx_s_interrogate(adev, &pm, ACX1xx_IE_POWER_MGMT);
-+      log(L_INIT, "wakeup_cfg: 0x%02X\n", pm.acx111.wakeup_cfg);
-+      log(L_INIT, "power save mode change %s\n",
-+              (pm.acx111.wakeup_cfg & PS_CFG_PENDING) ? "FAILED" : "was successful");
-+      /* FIXME: maybe verify via PS_CFG_PENDING bit here
-+       * that power save mode change was successful. */
-+      /* FIXME: we shouldn't trigger a scan immediately after
-+       * fiddling with power save mode (since the firmware is sending
-+       * a NULL frame then). */
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_s_update_card_settings
-+**
-+** Applies accumulated changes in various adev->xxxx members
-+** Called by ioctl commit handler, acx_start, acx_set_defaults,
-+** acx_s_after_interrupt_task (if IRQ_CMD_UPDATE_CARD_CFG),
-+*/
-+static void
-+acx111_s_sens_radio_16_17(acx_device_t *adev)
-+{
-+      u32 feature1, feature2;
-+
-+      if ((adev->sensitivity < 1) || (adev->sensitivity > 3)) {
-+              printk("%s: invalid sensitivity setting (1..3), "
-+                      "setting to 1\n", adev->ndev->name);
-+              adev->sensitivity = 1;
-+      }
-+      acx111_s_get_feature_config(adev, &feature1, &feature2);
-+      CLEAR_BIT(feature1, FEATURE1_LOW_RX|FEATURE1_EXTRA_LOW_RX);
-+      if (adev->sensitivity > 1)
-+              SET_BIT(feature1, FEATURE1_LOW_RX);
-+      if (adev->sensitivity > 2)
-+              SET_BIT(feature1, FEATURE1_EXTRA_LOW_RX);
-+      acx111_s_feature_set(adev, feature1, feature2);
-+}
-+
-+
-+void
-+acx_s_update_card_settings(acx_device_t *adev)
-+{
-+      unsigned long flags;
-+      unsigned int start_scan = 0;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      log(L_INIT, "get_mask 0x%08X, set_mask 0x%08X\n",
-+                      adev->get_mask, adev->set_mask);
-+
-+      /* Track dependencies betweed various settings */
-+
-+      if (adev->set_mask & (GETSET_MODE|GETSET_RESCAN|GETSET_WEP)) {
-+              log(L_INIT, "important setting has been changed. "
-+                      "Need to update packet templates, too\n");
-+              SET_BIT(adev->set_mask, SET_TEMPLATES);
-+      }
-+      if (adev->set_mask & GETSET_CHANNEL) {
-+              /* This will actually tune RX/TX to the channel */
-+              SET_BIT(adev->set_mask, GETSET_RX|GETSET_TX);
-+              switch (adev->mode) {
-+              case ACX_MODE_0_ADHOC:
-+              case ACX_MODE_3_AP:
-+                      /* Beacons contain channel# - update them */
-+                      SET_BIT(adev->set_mask, SET_TEMPLATES);
-+              }
-+              switch (adev->mode) {
-+              case ACX_MODE_0_ADHOC:
-+              case ACX_MODE_2_STA:
-+                      start_scan = 1;
-+              }
-+      }
-+
-+      /* Apply settings */
-+
-+#ifdef WHY_SHOULD_WE_BOTHER /* imagine we were just powered off */
-+      /* send a disassoc request in case it's required */
-+      if (adev->set_mask & (GETSET_MODE|GETSET_RESCAN|GETSET_CHANNEL|GETSET_WEP)) {
-+              if (ACX_MODE_2_STA == adev->mode) {
-+                      if (ACX_STATUS_4_ASSOCIATED == adev->status) {
-+                              log(L_ASSOC, "we were ASSOCIATED - "
-+                                      "sending disassoc request\n");
-+                              acx_lock(adev, flags);
-+                              acx_l_transmit_disassoc(adev, NULL);
-+                              /* FIXME: deauth? */
-+                              acx_unlock(adev, flags);
-+                      }
-+                      /* need to reset some other stuff as well */
-+                      log(L_DEBUG, "resetting bssid\n");
-+                      MAC_ZERO(adev->bssid);
-+                      SET_BIT(adev->set_mask, SET_TEMPLATES|SET_STA_LIST);
-+                      start_scan = 1;
-+              }
-+      }
-+#endif
-+
-+      if (adev->get_mask & GETSET_STATION_ID) {
-+              u8 stationID[4 + ACX1xx_IE_DOT11_STATION_ID_LEN];
-+              const u8 *paddr;
-+
-+              acx_s_interrogate(adev, &stationID, ACX1xx_IE_DOT11_STATION_ID);
-+              paddr = &stationID[4];
-+              for (i = 0; i < ETH_ALEN; i++) {
-+                      /* we copy the MAC address (reversed in
-+                       * the card) to the netdevice's MAC
-+                       * address, and on ifup it will be
-+                       * copied into iwadev->dev_addr */
-+                      adev->ndev->dev_addr[ETH_ALEN - 1 - i] = paddr[i];
-+              }
-+              CLEAR_BIT(adev->get_mask, GETSET_STATION_ID);
-+      }
-+
-+      if (adev->get_mask & GETSET_SENSITIVITY) {
-+              if ((RADIO_RFMD_11 == adev->radio_type)
-+              || (RADIO_MAXIM_0D == adev->radio_type)
-+              || (RADIO_RALINK_15 == adev->radio_type)) {
-+                      acx_s_read_phy_reg(adev, 0x30, &adev->sensitivity);
-+              } else {
-+                      log(L_INIT, "don't know how to get sensitivity "
-+                              "for radio type 0x%02X\n", adev->radio_type);
-+                      adev->sensitivity = 0;
-+              }
-+              log(L_INIT, "got sensitivity value %u\n", adev->sensitivity);
-+
-+              CLEAR_BIT(adev->get_mask, GETSET_SENSITIVITY);
-+      }
-+
-+      if (adev->get_mask & GETSET_ANTENNA) {
-+              u8 antenna[4 + ACX1xx_IE_DOT11_CURRENT_ANTENNA_LEN];
-+
-+              memset(antenna, 0, sizeof(antenna));
-+              acx_s_interrogate(adev, antenna, ACX1xx_IE_DOT11_CURRENT_ANTENNA);
-+              adev->antenna = antenna[4];
-+              log(L_INIT, "got antenna value 0x%02X\n", adev->antenna);
-+              CLEAR_BIT(adev->get_mask, GETSET_ANTENNA);
-+      }
-+
-+      if (adev->get_mask & GETSET_ED_THRESH) {
-+              if (IS_ACX100(adev))    {
-+                      u8 ed_threshold[4 + ACX100_IE_DOT11_ED_THRESHOLD_LEN];
-+
-+                      memset(ed_threshold, 0, sizeof(ed_threshold));
-+                      acx_s_interrogate(adev, ed_threshold, ACX100_IE_DOT11_ED_THRESHOLD);
-+                      adev->ed_threshold = ed_threshold[4];
-+              } else {
-+                      log(L_INIT, "acx111 doesn't support ED\n");
-+                      adev->ed_threshold = 0;
-+              }
-+              log(L_INIT, "got Energy Detect (ED) threshold %u\n", adev->ed_threshold);
-+              CLEAR_BIT(adev->get_mask, GETSET_ED_THRESH);
-+      }
-+
-+      if (adev->get_mask & GETSET_CCA) {
-+              if (IS_ACX100(adev))    {
-+                      u8 cca[4 + ACX1xx_IE_DOT11_CURRENT_CCA_MODE_LEN];
-+
-+                      memset(cca, 0, sizeof(adev->cca));
-+                      acx_s_interrogate(adev, cca, ACX1xx_IE_DOT11_CURRENT_CCA_MODE);
-+                      adev->cca = cca[4];
-+              } else {
-+                      log(L_INIT, "acx111 doesn't support CCA\n");
-+                      adev->cca = 0;
-+              }
-+              log(L_INIT, "got Channel Clear Assessment (CCA) value %u\n", adev->cca);
-+              CLEAR_BIT(adev->get_mask, GETSET_CCA);
-+      }
-+
-+      if (adev->get_mask & GETSET_REG_DOMAIN) {
-+              acx_ie_generic_t dom;
-+
-+              acx_s_interrogate(adev, &dom, ACX1xx_IE_DOT11_CURRENT_REG_DOMAIN);
-+              adev->reg_dom_id = dom.m.bytes[0];
-+              acx_s_set_sane_reg_domain(adev, 0);
-+              log(L_INIT, "got regulatory domain 0x%02X\n", adev->reg_dom_id);
-+              CLEAR_BIT(adev->get_mask, GETSET_REG_DOMAIN);
-+      }
-+
-+      if (adev->set_mask & GETSET_STATION_ID) {
-+              u8 stationID[4 + ACX1xx_IE_DOT11_STATION_ID_LEN];
-+              u8 *paddr;
-+
-+              paddr = &stationID[4];
-+              memcpy(adev->dev_addr, adev->ndev->dev_addr, ETH_ALEN);
-+              for (i = 0; i < ETH_ALEN; i++) {
-+                      /* copy the MAC address we obtained when we noticed
-+                       * that the ethernet iface's MAC changed
-+                       * to the card (reversed in
-+                       * the card!) */
-+                      paddr[i] = adev->dev_addr[ETH_ALEN - 1 - i];
-+              }
-+              acx_s_configure(adev, &stationID, ACX1xx_IE_DOT11_STATION_ID);
-+              CLEAR_BIT(adev->set_mask, GETSET_STATION_ID);
-+      }
-+
-+      if (adev->set_mask & SET_TEMPLATES) {
-+              log(L_INIT, "updating packet templates\n");
-+              switch (adev->mode) {
-+              case ACX_MODE_2_STA:
-+                      acx_s_set_probe_request_template(adev);
-+#if POWER_SAVE_80211
-+                      acx_s_set_null_data_template(adev);
-+#endif
-+                      break;
-+              case ACX_MODE_0_ADHOC:
-+                      acx_s_set_probe_request_template(adev);
-+#if POWER_SAVE_80211
-+                      /* maybe power save functionality is somehow possible
-+                       * for Ad-Hoc mode, too... FIXME: verify it somehow? firmware debug fields? */
-+                      acx_s_set_null_data_template(adev);
-+#endif
-+                      /* fall through */
-+              case ACX_MODE_3_AP:
-+                      acx_s_set_beacon_template(adev);
-+                      acx_s_set_tim_template(adev);
-+                      /* BTW acx111 firmware would not send probe responses
-+                      ** if probe request does not have all basic rates flagged
-+                      ** by 0x80! Thus firmware does not conform to 802.11,
-+                      ** it should ignore 0x80 bit in ratevector from STA.
-+                      ** We can 'fix' it by not using this template and
-+                      ** sending probe responses by hand. TODO --vda */
-+                      acx_s_set_probe_response_template(adev);
-+              }
-+              /* Needed if generated frames are to be emitted at different tx rate now */
-+              log(L_IRQ, "redoing cmd_join_bssid() after template cfg\n");
-+              acx_s_cmd_join_bssid(adev, adev->bssid);
-+              CLEAR_BIT(adev->set_mask, SET_TEMPLATES);
-+      }
-+      if (adev->set_mask & SET_STA_LIST) {
-+              acx_lock(adev, flags);
-+              acx_l_sta_list_init(adev);
-+              CLEAR_BIT(adev->set_mask, SET_STA_LIST);
-+              acx_unlock(adev, flags);
-+      }
-+      if (adev->set_mask & SET_RATE_FALLBACK) {
-+              u8 rate[4 + ACX1xx_IE_RATE_FALLBACK_LEN];
-+
-+              /* configure to not do fallbacks when not in auto rate mode */
-+              rate[4] = (adev->rate_auto) ? /* adev->txrate_fallback_retries */ 1 : 0;
-+              log(L_INIT, "updating Tx fallback to %u retries\n", rate[4]);
-+              acx_s_configure(adev, &rate, ACX1xx_IE_RATE_FALLBACK);
-+              CLEAR_BIT(adev->set_mask, SET_RATE_FALLBACK);
-+      }
-+      if (adev->set_mask & GETSET_TXPOWER) {
-+              log(L_INIT, "updating transmit power: %u dBm\n",
-+                                      adev->tx_level_dbm);
-+              acx_s_set_tx_level(adev, adev->tx_level_dbm);
-+              CLEAR_BIT(adev->set_mask, GETSET_TXPOWER);
-+      }
-+
-+      if (adev->set_mask & GETSET_SENSITIVITY) {
-+              log(L_INIT, "updating sensitivity value: %u\n",
-+                                      adev->sensitivity);
-+              switch (adev->radio_type) {
-+              case RADIO_RFMD_11:
-+              case RADIO_MAXIM_0D:
-+              case RADIO_RALINK_15:
-+                      acx_s_write_phy_reg(adev, 0x30, adev->sensitivity);
-+                      break;
-+              case RADIO_RADIA_16:
-+              case RADIO_UNKNOWN_17:
-+                      acx111_s_sens_radio_16_17(adev);
-+                      break;
-+              default:
-+                      log(L_INIT, "don't know how to modify sensitivity "
-+                              "for radio type 0x%02X\n", adev->radio_type);
-+              }
-+              CLEAR_BIT(adev->set_mask, GETSET_SENSITIVITY);
-+      }
-+
-+      if (adev->set_mask & GETSET_ANTENNA) {
-+              /* antenna */
-+              u8 antenna[4 + ACX1xx_IE_DOT11_CURRENT_ANTENNA_LEN];
-+
-+              memset(antenna, 0, sizeof(antenna));
-+              antenna[4] = adev->antenna;
-+              log(L_INIT, "updating antenna value: 0x%02X\n",
-+                                      adev->antenna);
-+              acx_s_configure(adev, &antenna, ACX1xx_IE_DOT11_CURRENT_ANTENNA);
-+              CLEAR_BIT(adev->set_mask, GETSET_ANTENNA);
-+      }
-+
-+      if (adev->set_mask & GETSET_ED_THRESH) {
-+              /* ed_threshold */
-+              log(L_INIT, "updating Energy Detect (ED) threshold: %u\n",
-+                                      adev->ed_threshold);
-+              if (IS_ACX100(adev)) {
-+                      u8 ed_threshold[4 + ACX100_IE_DOT11_ED_THRESHOLD_LEN];
-+
-+                      memset(ed_threshold, 0, sizeof(ed_threshold));
-+                      ed_threshold[4] = adev->ed_threshold;
-+                      acx_s_configure(adev, &ed_threshold, ACX100_IE_DOT11_ED_THRESHOLD);
-+              }
-+              else
-+                      log(L_INIT, "acx111 doesn't support ED!\n");
-+              CLEAR_BIT(adev->set_mask, GETSET_ED_THRESH);
-+      }
-+
-+      if (adev->set_mask & GETSET_CCA) {
-+              /* CCA value */
-+              log(L_INIT, "updating Channel Clear Assessment "
-+                              "(CCA) value: 0x%02X\n", adev->cca);
-+              if (IS_ACX100(adev))    {
-+                      u8 cca[4 + ACX1xx_IE_DOT11_CURRENT_CCA_MODE_LEN];
-+
-+                      memset(cca, 0, sizeof(cca));
-+                      cca[4] = adev->cca;
-+                      acx_s_configure(adev, &cca, ACX1xx_IE_DOT11_CURRENT_CCA_MODE);
-+              }
-+              else
-+                      log(L_INIT, "acx111 doesn't support CCA!\n");
-+              CLEAR_BIT(adev->set_mask, GETSET_CCA);
-+      }
-+
-+      if (adev->set_mask & GETSET_LED_POWER) {
-+              /* Enable Tx */
-+              log(L_INIT, "updating power LED status: %u\n", adev->led_power);
-+
-+              acx_lock(adev, flags);
-+#if defined (ACX_MEM)
-+              acxmem_l_power_led(adev, adev->led_power);
-+#else
-+              if (IS_PCI(adev))
-+                      acxpci_l_power_led(adev, adev->led_power);
-+#endif
-+              CLEAR_BIT(adev->set_mask, GETSET_LED_POWER);
-+              acx_unlock(adev, flags);
-+      }
-+
-+      if (adev->set_mask & GETSET_POWER_80211) {
-+#if POWER_SAVE_80211
-+              acx_s_update_80211_powersave_mode(adev);
-+#endif
-+              CLEAR_BIT(adev->set_mask, GETSET_POWER_80211);
-+      }
-+
-+      if (adev->set_mask & GETSET_CHANNEL) {
-+              /* channel */
-+              log(L_INIT, "updating channel to: %u\n", adev->channel);
-+              CLEAR_BIT(adev->set_mask, GETSET_CHANNEL);
-+      }
-+
-+      if (adev->set_mask & GETSET_TX) {
-+              /* set Tx */
-+              log(L_INIT, "updating: %s Tx\n",
-+                              adev->tx_disabled ? "disable" : "enable");
-+              if (adev->tx_disabled)
-+                      acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0);
-+              else
-+                      acx_s_issue_cmd(adev, ACX1xx_CMD_ENABLE_TX, &adev->channel, 1);
-+              CLEAR_BIT(adev->set_mask, GETSET_TX);
-+      }
-+
-+      if (adev->set_mask & GETSET_RX) {
-+              /* Enable Rx */
-+              log(L_INIT, "updating: enable Rx on channel: %u\n",
-+                              adev->channel);
-+              acx_s_issue_cmd(adev, ACX1xx_CMD_ENABLE_RX, &adev->channel, 1);
-+              CLEAR_BIT(adev->set_mask, GETSET_RX);
-+      }
-+
-+      if (adev->set_mask & GETSET_RETRY) {
-+              u8 short_retry[4 + ACX1xx_IE_DOT11_SHORT_RETRY_LIMIT_LEN];
-+              u8 long_retry[4 + ACX1xx_IE_DOT11_LONG_RETRY_LIMIT_LEN];
-+
-+              log(L_INIT, "updating short retry limit: %u, long retry limit: %u\n",
-+                                      adev->short_retry, adev->long_retry);
-+              short_retry[0x4] = adev->short_retry;
-+              long_retry[0x4] = adev->long_retry;
-+              acx_s_configure(adev, &short_retry, ACX1xx_IE_DOT11_SHORT_RETRY_LIMIT);
-+              acx_s_configure(adev, &long_retry, ACX1xx_IE_DOT11_LONG_RETRY_LIMIT);
-+              CLEAR_BIT(adev->set_mask, GETSET_RETRY);
-+      }
-+
-+      if (adev->set_mask & SET_MSDU_LIFETIME) {
-+              u8 xmt_msdu_lifetime[4 + ACX1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN];
-+
-+              log(L_INIT, "updating tx MSDU lifetime: %u\n",
-+                                      adev->msdu_lifetime);
-+              *(u32 *)&xmt_msdu_lifetime[4] = cpu_to_le32((u32)adev->msdu_lifetime);
-+              acx_s_configure(adev, &xmt_msdu_lifetime, ACX1xx_IE_DOT11_MAX_XMIT_MSDU_LIFETIME);
-+              CLEAR_BIT(adev->set_mask, SET_MSDU_LIFETIME);
-+      }
-+
-+      if (adev->set_mask & GETSET_REG_DOMAIN) {
-+              log(L_INIT, "updating regulatory domain: 0x%02X\n",
-+                                      adev->reg_dom_id);
-+              acx_s_set_sane_reg_domain(adev, 1);
-+              CLEAR_BIT(adev->set_mask, GETSET_REG_DOMAIN);
-+      }
-+
-+      if (adev->set_mask & GETSET_MODE) {
-+              adev->ndev->type = (adev->mode == ACX_MODE_MONITOR) ?
-+                      adev->monitor_type : ARPHRD_ETHER;
-+
-+              switch (adev->mode) {
-+              case ACX_MODE_3_AP:
-+
-+                      acx_lock(adev, flags);
-+                      acx_l_sta_list_init(adev);
-+                      adev->aid = 0;
-+                      adev->ap_client = NULL;
-+                      MAC_COPY(adev->bssid, adev->dev_addr);
-+                      /* this basically says "we're connected" */
-+                      acx_set_status(adev, ACX_STATUS_4_ASSOCIATED);
-+                      acx_unlock(adev, flags);
-+
-+                      acx111_s_feature_off(adev, 0, FEATURE2_NO_TXCRYPT|FEATURE2_SNIFFER);
-+                      /* start sending beacons */
-+                      acx_s_cmd_join_bssid(adev, adev->bssid);
-+                      break;
-+              case ACX_MODE_MONITOR:
-+                      acx111_s_feature_on(adev, 0, FEATURE2_NO_TXCRYPT|FEATURE2_SNIFFER);
-+                      /* this stops beacons */
-+                      acx_s_cmd_join_bssid(adev, adev->bssid);
-+                      /* this basically says "we're connected" */
-+                      acx_set_status(adev, ACX_STATUS_4_ASSOCIATED);
-+                      SET_BIT(adev->set_mask, SET_RXCONFIG|SET_WEP_OPTIONS);
-+                      break;
-+              case ACX_MODE_0_ADHOC:
-+              case ACX_MODE_2_STA:
-+                      acx111_s_feature_off(adev, 0, FEATURE2_NO_TXCRYPT|FEATURE2_SNIFFER);
-+
-+                      acx_lock(adev, flags);
-+                      adev->aid = 0;
-+                      adev->ap_client = NULL;
-+                      acx_unlock(adev, flags);
-+
-+                      /* we want to start looking for peer or AP */
-+                      start_scan = 1;
-+                      break;
-+              case ACX_MODE_OFF:
-+                      /* TODO: disable RX/TX, stop any scanning activity etc: */
-+                      /* adev->tx_disabled = 1; */
-+                      /* SET_BIT(adev->set_mask, GETSET_RX|GETSET_TX); */
-+
-+                      /* This stops beacons (invalid macmode...) */
-+                      acx_s_cmd_join_bssid(adev, adev->bssid);
-+                      acx_set_status(adev, ACX_STATUS_0_STOPPED);
-+                      break;
-+              }
-+              CLEAR_BIT(adev->set_mask, GETSET_MODE);
-+      }
-+
-+      if (adev->set_mask & SET_RXCONFIG) {
-+              acx_s_initialize_rx_config(adev);
-+              CLEAR_BIT(adev->set_mask, SET_RXCONFIG);
-+      }
-+
-+      if (adev->set_mask & GETSET_RESCAN) {
-+              switch (adev->mode) {
-+              case ACX_MODE_0_ADHOC:
-+              case ACX_MODE_2_STA:
-+                      start_scan = 1;
-+                      break;
-+              }
-+              CLEAR_BIT(adev->set_mask, GETSET_RESCAN);
-+      }
-+
-+      if (adev->set_mask & GETSET_WEP) {
-+              /* encode */
-+
-+              ie_dot11WEPDefaultKeyID_t dkey;
-+#ifdef DEBUG_WEP
-+              struct {
-+                      u16 type;
-+                      u16 len;
-+                      u8  val;
-+              } ACX_PACKED keyindic;
-+#endif
-+              log(L_INIT, "updating WEP key settings\n");
-+
-+              acx_s_set_wepkey(adev);
-+
-+              dkey.KeyID = adev->wep_current_index;
-+              log(L_INIT, "setting WEP key %u as default\n", dkey.KeyID);
-+              acx_s_configure(adev, &dkey, ACX1xx_IE_DOT11_WEP_DEFAULT_KEY_SET);
-+#ifdef DEBUG_WEP
-+              keyindic.val = 3;
-+              acx_s_configure(adev, &keyindic, ACX111_IE_KEY_CHOOSE);
-+#endif
-+              start_scan = 1;
-+              CLEAR_BIT(adev->set_mask, GETSET_WEP);
-+      }
-+
-+      if (adev->set_mask & SET_WEP_OPTIONS) {
-+              acx100_ie_wep_options_t options;
-+              if (IS_ACX111(adev)) {
-+                      log(L_DEBUG, "setting WEP Options for acx111 is not supported\n");
-+              } else {
-+                      log(L_INIT, "setting WEP Options\n");
-+                      acx100_s_init_wep(adev);
-+#if 0
-+                      /* let's choose maximum setting: 4 default keys,
-+                       * plus 10 other keys: */
-+                      options.NumKeys = cpu_to_le16(DOT11_MAX_DEFAULT_WEP_KEYS + 10);
-+                      /* don't decrypt default key only,
-+                       * don't override decryption: */
-+                      options.WEPOption = 0;
-+                      if (adev->mode == ACX_MODE_MONITOR) {
-+                              /* don't decrypt default key only,
-+                               * override decryption mechanism: */
-+                              options.WEPOption = 2;
-+                      }
-+
-+                      acx_s_configure(adev, &options, ACX100_IE_WEP_OPTIONS);
-+#endif
-+              }
-+              CLEAR_BIT(adev->set_mask, SET_WEP_OPTIONS);
-+      }
-+
-+      /* Rescan was requested */
-+      if (start_scan) {
-+              switch (adev->mode) {
-+              case ACX_MODE_0_ADHOC:
-+              case ACX_MODE_2_STA:
-+                      /* We can avoid clearing list if join code
-+                      ** will be a bit more clever about not picking
-+                      ** 'bad' AP over and over again */
-+                      acx_lock(adev, flags);
-+                      adev->ap_client = NULL;
-+                      acx_l_sta_list_init(adev);
-+                      acx_set_status(adev, ACX_STATUS_1_SCANNING);
-+                      acx_unlock(adev, flags);
-+
-+                      acx_s_cmd_start_scan(adev);
-+              }
-+      }
-+
-+      /* debug, rate, and nick don't need any handling */
-+      /* what about sniffing mode?? */
-+
-+      log(L_INIT, "get_mask 0x%08X, set_mask 0x%08X - after update\n",
-+                      adev->get_mask, adev->set_mask);
-+
-+/* end: */
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_e_after_interrupt_task
-+*/
-+static int
-+acx_s_recalib_radio(acx_device_t *adev)
-+{
-+      if (IS_ACX111(adev)) {
-+              acx111_cmd_radiocalib_t cal;
-+
-+              printk("%s: recalibrating radio\n", adev->ndev->name);
-+              /* automatic recalibration, choose all methods: */
-+              cal.methods = cpu_to_le32(0x8000000f);
-+              /* automatic recalibration every 60 seconds (value in TUs)
-+               * I wonder what the firmware default here is? */
-+              cal.interval = cpu_to_le32(58594);
-+              return acx_s_issue_cmd_timeo(adev, ACX111_CMD_RADIOCALIB,
-+                      &cal, sizeof(cal), CMD_TIMEOUT_MS(100));
-+      } else {
-+              /* On ACX100, we need to recalibrate the radio
-+               * by issuing a GETSET_TX|GETSET_RX */
-+              if (/* (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0)) &&
-+                  (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0)) && */
-+                  (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_ENABLE_TX, &adev->channel, 1)) &&
-+                  (OK == acx_s_issue_cmd(adev, ACX1xx_CMD_ENABLE_RX, &adev->channel, 1)) )
-+                      return OK;
-+              return NOT_OK;
-+      }
-+}
-+
-+static void
-+acx_s_after_interrupt_recalib(acx_device_t *adev)
-+{
-+      int res;
-+
-+      /* this helps with ACX100 at least;
-+       * hopefully ACX111 also does a
-+       * recalibration here */
-+
-+      /* clear flag beforehand, since we want to make sure
-+       * it's cleared; then only set it again on specific circumstances */
-+      CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_CMD_RADIO_RECALIB);
-+
-+      /* better wait a bit between recalibrations to
-+       * prevent overheating due to torturing the card
-+       * into working too long despite high temperature
-+       * (just a safety measure) */
-+      if (adev->recalib_time_last_success
-+       && time_before(jiffies, adev->recalib_time_last_success
-+                                      + RECALIB_PAUSE * 60 * HZ)) {
-+              if (adev->recalib_msg_ratelimit <= 4) {
-+                      printk("%s: less than " STRING(RECALIB_PAUSE)
-+                              " minutes since last radio recalibration, "
-+                              "not recalibrating (maybe card is too hot?)\n",
-+                              adev->ndev->name);
-+                      adev->recalib_msg_ratelimit++;
-+                      if (adev->recalib_msg_ratelimit == 5)
-+                              printk("disabling above message until next recalib\n");
-+              }
-+              return;
-+      }
-+
-+      adev->recalib_msg_ratelimit = 0;
-+
-+      /* note that commands sometimes fail (card busy),
-+       * so only clear flag if we were fully successful */
-+      res = acx_s_recalib_radio(adev);
-+      if (res == OK) {
-+              printk("%s: successfully recalibrated radio\n",
-+                                              adev->ndev->name);
-+              adev->recalib_time_last_success = jiffies;
-+              adev->recalib_failure_count = 0;
-+      } else {
-+              /* failed: resubmit, but only limited
-+               * amount of times within some time range
-+               * to prevent endless loop */
-+
-+              adev->recalib_time_last_success = 0; /* we failed */
-+
-+              /* if some time passed between last
-+               * attempts, then reset failure retry counter
-+               * to be able to do next recalib attempt */
-+              if (time_after(jiffies, adev->recalib_time_last_attempt + 5*HZ))
-+                      adev->recalib_failure_count = 0;
-+
-+              if (adev->recalib_failure_count < 5) {
-+                      /* increment inside only, for speedup of outside path */
-+                      adev->recalib_failure_count++;
-+                      adev->recalib_time_last_attempt = jiffies;
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB);
-+              }
-+      }
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
-+static void
-+acx_e_after_interrupt_task(struct work_struct *work)
-+{
-+      acx_device_t *adev = container_of(work, acx_device_t, after_interrupt_task);
-+#else
-+  static void
-+  acx_e_after_interrupt_task(void *data)
-+  {
-+      struct net_device *ndev = (struct net_device*)data;
-+      acx_device_t *adev = ndev2adev(ndev);
-+#endif
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      if (!adev->after_interrupt_jobs)
-+              goto end; /* no jobs to do */
-+
-+#if TX_CLEANUP_IN_SOFTIRQ
-+      /* can happen only on PCI */
-+      if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_TX_CLEANUP) {
-+              acx_lock(adev, flags);
-+              acxpci_l_clean_txdesc(adev);
-+              CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_TX_CLEANUP);
-+              acx_unlock(adev, flags);
-+      }
-+#endif
-+      /* we see lotsa tx errors */
-+      if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_CMD_RADIO_RECALIB) {
-+              acx_s_after_interrupt_recalib(adev);
-+      }
-+
-+      /* a poor interrupt code wanted to do update_card_settings() */
-+      if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_UPDATE_CARD_CFG) {
-+              if (ACX_STATE_IFACE_UP & adev->dev_state_mask)
-+                      acx_s_update_card_settings(adev);
-+              CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_UPDATE_CARD_CFG);
-+      }
-+
-+      /* 1) we detected that no Scan_Complete IRQ came from fw, or
-+      ** 2) we found too many STAs */
-+      if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_CMD_STOP_SCAN) {
-+              log(L_IRQ, "sending a stop scan cmd...\n");
-+              acx_s_issue_cmd(adev, ACX1xx_CMD_STOP_SCAN, NULL, 0);
-+              /* HACK: set the IRQ bit, since we won't get a
-+               * scan complete IRQ any more on ACX111 (works on ACX100!),
-+               * since _we_, not a fw, have stopped the scan */
-+              SET_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE);
-+              CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_CMD_STOP_SCAN);
-+      }
-+
-+      /* either fw sent Scan_Complete or we detected that
-+      ** no Scan_Complete IRQ came from fw. Finish scanning,
-+      ** pick join partner if any */
-+      if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_COMPLETE_SCAN) {
-+              if (adev->status == ACX_STATUS_1_SCANNING) {
-+                      if (OK != acx_s_complete_scan(adev)) {
-+                              SET_BIT(adev->after_interrupt_jobs,
-+                                      ACX_AFTER_IRQ_RESTART_SCAN);
-+                      }
-+              } else {
-+                      /* + scan kills current join status - restore it
-+                      **   (do we need it for STA?) */
-+                      /* + does it happen only with active scans?
-+                      **   active and passive scans? ALL scans including
-+                      **   background one? */
-+                      /* + was not verified that everything is restored
-+                      **   (but at least we start to emit beacons again) */
-+                      switch (adev->mode) {
-+                      case ACX_MODE_0_ADHOC:
-+                      case ACX_MODE_3_AP:
-+                              log(L_IRQ, "redoing cmd_join_bssid() after scan\n");
-+                              acx_s_cmd_join_bssid(adev, adev->bssid);
-+                      }
-+              }
-+              CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_COMPLETE_SCAN);
-+      }
-+
-+      /* STA auth or assoc timed out, start over again */
-+      if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_RESTART_SCAN) {
-+              log(L_IRQ, "sending a start_scan cmd...\n");
-+              acx_s_cmd_start_scan(adev);
-+              CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_RESTART_SCAN);
-+      }
-+
-+      /* whee, we got positive assoc response! 8) */
-+      if (adev->after_interrupt_jobs & ACX_AFTER_IRQ_CMD_ASSOCIATE) {
-+              acx_ie_generic_t pdr;
-+              /* tiny race window exists, checking that we still a STA */
-+              switch (adev->mode) {
-+              case ACX_MODE_2_STA:
-+                      pdr.m.aid = cpu_to_le16(adev->aid);
-+                      acx_s_configure(adev, &pdr, ACX1xx_IE_ASSOC_ID);
-+                      acx_set_status(adev, ACX_STATUS_4_ASSOCIATED);
-+                      log(L_ASSOC|L_DEBUG, "ASSOCIATED!\n");
-+                      CLEAR_BIT(adev->after_interrupt_jobs, ACX_AFTER_IRQ_CMD_ASSOCIATE);
-+              }
-+      }
-+end:
-+      acx_sem_unlock(adev);
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_schedule_task
-+**
-+** Schedule the call of the after_interrupt method after leaving
-+** the interrupt context.
-+*/
-+void
-+acx_schedule_task(acx_device_t *adev, unsigned int set_flag)
-+{
-+      SET_BIT(adev->after_interrupt_jobs, set_flag);
-+      SCHEDULE_WORK(&adev->after_interrupt_task);
-+}
-+
-+
-+/***********************************************************************
-+*/
-+void
-+acx_init_task_scheduler(acx_device_t *adev)
-+{
-+      /* configure task scheduler */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
-+      INIT_WORK(&adev->after_interrupt_task, acx_e_after_interrupt_task);
-+#else
-+      INIT_WORK(&adev->after_interrupt_task, acx_e_after_interrupt_task,
-+                      adev->ndev);
-+#endif
-+}
-+
-+
-+/***********************************************************************
-+** acx_s_start
-+*/
-+void
-+acx_s_start(acx_device_t *adev)
-+{
-+      FN_ENTER;
-+
-+      /*
-+       * Ok, now we do everything that can possibly be done with ioctl
-+       * calls to make sure that when it was called before the card
-+       * was up we get the changes asked for
-+       */
-+
-+      SET_BIT(adev->set_mask, SET_TEMPLATES|SET_STA_LIST|GETSET_WEP
-+              |GETSET_TXPOWER|GETSET_ANTENNA|GETSET_ED_THRESH|GETSET_CCA
-+              |GETSET_REG_DOMAIN|GETSET_MODE|GETSET_CHANNEL
-+              |GETSET_TX|GETSET_RX|GETSET_STATION_ID);
-+
-+      log(L_INIT, "updating initial settings on iface activation\n");
-+      acx_s_update_card_settings(adev);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_update_capabilities
-+*/
-+void
-+acx_update_capabilities(acx_device_t *adev)
-+{
-+      u16 cap = 0;
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_3_AP:
-+              SET_BIT(cap, WF_MGMT_CAP_ESS); break;
-+      case ACX_MODE_0_ADHOC:
-+              SET_BIT(cap, WF_MGMT_CAP_IBSS); break;
-+      /* other types of stations do not emit beacons */
-+      }
-+
-+      if (adev->wep_restricted) {
-+              SET_BIT(cap, WF_MGMT_CAP_PRIVACY);
-+      }
-+      if (adev->cfgopt_dot11ShortPreambleOption) {
-+              SET_BIT(cap, WF_MGMT_CAP_SHORT);
-+      }
-+      if (adev->cfgopt_dot11PBCCOption) {
-+              SET_BIT(cap, WF_MGMT_CAP_PBCC);
-+      }
-+      if (adev->cfgopt_dot11ChannelAgility) {
-+              SET_BIT(cap, WF_MGMT_CAP_AGILITY);
-+      }
-+      log(L_DEBUG, "caps updated from 0x%04X to 0x%04X\n",
-+                              adev->capabilities, cap);
-+      adev->capabilities = cap;
-+}
-+
-+/***********************************************************************
-+** Common function to parse ALL configoption struct formats
-+** (ACX100 and ACX111; FIXME: how to make it work with ACX100 USB!?!?).
-+** FIXME: logging should be removed here and added to a /proc file instead
-+*/
-+void
-+acx_s_parse_configoption(acx_device_t *adev, const acx111_ie_configoption_t *pcfg)
-+{
-+      const u8 *pEle;
-+      int i;
-+      int is_acx111 = IS_ACX111(adev);
-+
-+      if (acx_debug & L_DEBUG) {
-+              printk("configoption struct content:\n");
-+              acx_dump_bytes(pcfg, sizeof(*pcfg));
-+      }
-+
-+      if (( is_acx111 && (adev->eeprom_version == 5))
-+      ||  (!is_acx111 && (adev->eeprom_version == 4))
-+      ||  (!is_acx111 && (adev->eeprom_version == 5))) {
-+              /* these versions are known to be supported */
-+      } else {
-+              printk("unknown chip and EEPROM version combination (%s, v%d), "
-+                      "don't know how to parse config options yet. "
-+                      "Please report\n", is_acx111 ? "ACX111" : "ACX100",
-+                      adev->eeprom_version);
-+              return;
-+      }
-+
-+      /* first custom-parse the first part which has chip-specific layout */
-+
-+      pEle = (const u8 *) pcfg;
-+
-+      pEle += 4; /* skip (type,len) header */
-+
-+      memcpy(adev->cfgopt_NVSv, pEle, sizeof(adev->cfgopt_NVSv));
-+      pEle += sizeof(adev->cfgopt_NVSv);
-+
-+      if (is_acx111) {
-+              adev->cfgopt_NVS_vendor_offs = le16_to_cpu(*(u16 *)pEle);
-+              pEle += sizeof(adev->cfgopt_NVS_vendor_offs);
-+
-+              adev->cfgopt_probe_delay = 200; /* good default value? */
-+              pEle += 2; /* FIXME: unknown, value 0x0001 */
-+      } else {
-+              memcpy(adev->cfgopt_MAC, pEle, sizeof(adev->cfgopt_MAC));
-+              pEle += sizeof(adev->cfgopt_MAC);
-+
-+              adev->cfgopt_probe_delay = le16_to_cpu(*(u16 *)pEle);
-+              pEle += sizeof(adev->cfgopt_probe_delay);
-+              if ((adev->cfgopt_probe_delay < 100) || (adev->cfgopt_probe_delay > 500)) {
-+                      printk("strange probe_delay value %d, "
-+                              "tweaking to 200\n", adev->cfgopt_probe_delay);
-+                      adev->cfgopt_probe_delay = 200;
-+              }
-+      }
-+
-+      adev->cfgopt_eof_memory = le32_to_cpu(*(u32 *)pEle);
-+      pEle += sizeof(adev->cfgopt_eof_memory);
-+
-+      printk("NVS_vendor_offs:%04X probe_delay:%d eof_memory:%d\n",
-+              adev->cfgopt_NVS_vendor_offs,
-+              adev->cfgopt_probe_delay,
-+              adev->cfgopt_eof_memory);
-+
-+      adev->cfgopt_dot11CCAModes = *pEle++;
-+      adev->cfgopt_dot11Diversity = *pEle++;
-+      adev->cfgopt_dot11ShortPreambleOption = *pEle++;
-+      adev->cfgopt_dot11PBCCOption = *pEle++;
-+      adev->cfgopt_dot11ChannelAgility = *pEle++;
-+      adev->cfgopt_dot11PhyType = *pEle++;
-+      adev->cfgopt_dot11TempType = *pEle++;
-+      printk("CCAModes:%02X Diversity:%02X ShortPreOpt:%02X "
-+              "PBCC:%02X ChanAgil:%02X PHY:%02X Temp:%02X\n",
-+              adev->cfgopt_dot11CCAModes,
-+              adev->cfgopt_dot11Diversity,
-+              adev->cfgopt_dot11ShortPreambleOption,
-+              adev->cfgopt_dot11PBCCOption,
-+              adev->cfgopt_dot11ChannelAgility,
-+              adev->cfgopt_dot11PhyType,
-+              adev->cfgopt_dot11TempType);
-+
-+      /* then use common parsing for next part which has common layout */
-+
-+      pEle++; /* skip table_count (6) */
-+
-+      if (IS_MEM(adev) && IS_ACX100(adev))
-+      {
-+      /*
-+         * For iPaq hx4700 Generic Slave F/W 1.10.7.K.  I'm not sure if these
-+         * 4 extra bytes are before the dot11 things above or after, so I'm just
-+         * going to guess after.  If someone sees these aren't reasonable numbers,
-+         * please fix this.
-+       * The area from which the dot11 values above are read contains:
-+       * 04 01 01 01 00 05 01 06 00 02 01 02
-+       * the 8 dot11 reads above take care of 8 of them, but which 8...
-+       */
-+      pEle += 4;
-+      }
-+
-+      adev->cfgopt_antennas.type = pEle[0];
-+      adev->cfgopt_antennas.len = pEle[1];
-+      printk("AntennaID:%02X Len:%02X Data:",
-+                      adev->cfgopt_antennas.type, adev->cfgopt_antennas.len);
-+      for (i = 0; i < pEle[1]; i++) {
-+              adev->cfgopt_antennas.list[i] = pEle[i+2];
-+              printk("%02X ", pEle[i+2]);
-+      }
-+      printk("\n");
-+
-+      pEle += pEle[1] + 2;
-+      adev->cfgopt_power_levels.type = pEle[0];
-+      adev->cfgopt_power_levels.len = pEle[1];
-+      printk("PowerLevelID:%02X Len:%02X Data:",
-+              adev->cfgopt_power_levels.type, adev->cfgopt_power_levels.len);
-+      for (i = 0; i < pEle[1]; i++) {
-+              adev->cfgopt_power_levels.list[i] = le16_to_cpu(*(u16 *)&pEle[i*2+2]);
-+              printk("%04X ", adev->cfgopt_power_levels.list[i]);
-+      }
-+      printk("\n");
-+
-+      pEle += pEle[1]*2 + 2;
-+      adev->cfgopt_data_rates.type = pEle[0];
-+      adev->cfgopt_data_rates.len = pEle[1];
-+      printk("DataRatesID:%02X Len:%02X Data:",
-+              adev->cfgopt_data_rates.type, adev->cfgopt_data_rates.len);
-+      for (i = 0; i < pEle[1]; i++) {
-+              adev->cfgopt_data_rates.list[i] = pEle[i+2];
-+              printk("%02X ", pEle[i+2]);
-+      }
-+      printk("\n");
-+
-+      pEle += pEle[1] + 2;
-+      adev->cfgopt_domains.type = pEle[0];
-+      adev->cfgopt_domains.len = pEle[1];
-+      if (IS_MEM(adev) && IS_ACX100(adev))
-+      {
-+      /*
-+         * For iPaq hx4700 Generic Slave F/W 1.10.7.K.
-+       * There's an extra byte between this structure and the next
-+       * that is not accounted for with this structure's length.  It's
-+       * most likely a bug in the firmware, but we can fix it here
-+       * by bumping the length of this field by 1.
-+       */
-+      adev->cfgopt_domains.len++;
-+      }
-+      printk("DomainID:%02X Len:%02X Data:",
-+                      adev->cfgopt_domains.type, adev->cfgopt_domains.len);
-+      for (i = 0; i < adev->cfgopt_domains.len; i++) {
-+              adev->cfgopt_domains.list[i] = pEle[i+2];
-+              printk("%02X ", pEle[i+2]);
-+      }
-+      printk("\n");
-+
-+      pEle += adev->cfgopt_domains.len + 2;
-+
-+      adev->cfgopt_product_id.type = pEle[0];
-+      adev->cfgopt_product_id.len = pEle[1];
-+      for (i = 0; i < pEle[1]; i++) {
-+              adev->cfgopt_product_id.list[i] = pEle[i+2];
-+      }
-+      printk("ProductID:%02X Len:%02X Data:%.*s\n",
-+              adev->cfgopt_product_id.type, adev->cfgopt_product_id.len,
-+              adev->cfgopt_product_id.len, (char *)adev->cfgopt_product_id.list);
-+
-+      pEle += pEle[1] + 2;
-+      adev->cfgopt_manufacturer.type = pEle[0];
-+      adev->cfgopt_manufacturer.len = pEle[1];
-+      for (i = 0; i < pEle[1]; i++) {
-+              adev->cfgopt_manufacturer.list[i] = pEle[i+2];
-+      }
-+      printk("ManufacturerID:%02X Len:%02X Data:%.*s\n",
-+              adev->cfgopt_manufacturer.type, adev->cfgopt_manufacturer.len,
-+              adev->cfgopt_manufacturer.len, (char *)adev->cfgopt_manufacturer.list);
-+/*
-+      printk("EEPROM part:\n");
-+      for (i=0; i<58; i++) {
-+              printk("%02X =======>  0x%02X\n",
-+                      i, (u8 *)adev->cfgopt_NVSv[i-2]);
-+      }
-+*/
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int __init
-+acx_e_init_module(void)
-+{
-+      int r1,r2,r3,r4;
-+
-+      acx_struct_size_check();
-+
-+      printk("acx: this driver is still EXPERIMENTAL\n"
-+              "acx: reading README file and/or Craig's HOWTO is "
-+              "recommended, visit http://acx100.sf.net in case "
-+              "of further questions/discussion\n");
-+
-+#if defined(CONFIG_ACX_PCI)
-+      r1 = acxpci_e_init_module();
-+#else
-+      r1 = -EINVAL;
-+#endif
-+#if defined(CONFIG_ACX_MEM)
-+      r2 = acxmem_e_init_module();
-+#else
-+      r2 = -EINVAL;
-+#endif
-+#if defined(CONFIG_ACX_USB)
-+      r3 = acxusb_e_init_module();
-+#else
-+      r3 = -EINVAL;
-+#endif
-+#if defined(CONFIG_ACX_CS)
-+      r4 = acx_cs_init();
-+#else
-+      r4 = -EINVAL;
-+#endif
-+      if (r2 && r1  && r3 && r4) { /* all failed! */
-+        if (r3 || r1)
-+              return r3 ? r3 : r1;
-+        else
-+          return r2;
-+      }
-+      /* return success if at least one succeeded */
-+      return 0;
-+
-+}
-+
-+static void __exit
-+acx_e_cleanup_module(void)
-+{
-+#if defined(CONFIG_ACX_PCI)
-+      acxpci_e_cleanup_module();
-+#endif
-+#if defined(CONFIG_ACX_MEM)
-+      acxmem_e_cleanup_module();
-+#endif
-+#if defined(CONFIG_ACX_USB)
-+      acxusb_e_cleanup_module();
-+#endif
-+#if defined(CONFIG_ACX_CS)
-+      acx_cs_cleanup();
-+#endif
-+}
-+
-+module_init(acx_e_init_module)
-+module_exit(acx_e_cleanup_module)
-Index: linux-2.6.22/drivers/net/wireless/acx/conv.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/conv.c       2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,504 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
-+#include <linux/config.h>
-+#endif
-+#include <linux/skbuff.h>
-+#include <linux/if_arp.h>
-+#include <linux/etherdevice.h>
-+#include <linux/wireless.h>
-+#include <net/iw_handler.h>
-+
-+#include "acx.h"
-+
-+
-+/***********************************************************************
-+** proto_is_stt
-+**
-+** Searches the 802.1h Selective Translation Table for a given
-+** protocol.
-+**
-+** prottype - protocol number (in host order) to search for.
-+**
-+** Returns:
-+**    1 - if the table is empty or a match is found.
-+**    0 - if the table is non-empty and a match is not found.
-+**
-+** Based largely on p80211conv.c of the linux-wlan-ng project
-+*/
-+static inline int
-+proto_is_stt(unsigned int proto)
-+{
-+      /* Always return found for now.  This is the behavior used by the */
-+      /* Zoom Win95 driver when 802.1h mode is selected */
-+      /* TODO: If necessary, add an actual search we'll probably
-+               need this to match the CMAC's way of doing things.
-+               Need to do some testing to confirm.
-+      */
-+
-+      if (proto == 0x80f3)  /* APPLETALK */
-+              return 1;
-+
-+      return 0;
-+/*    return ((prottype == ETH_P_AARP) || (prottype == ETH_P_IPX)); */
-+}
-+
-+/* Helpers */
-+
-+static inline void
-+store_llc_snap(struct wlan_llc *llc)
-+{
-+      llc->dsap = 0xaa;       /* SNAP, see IEEE 802 */
-+      llc->ssap = 0xaa;
-+      llc->ctl = 0x03;
-+}
-+static inline int
-+llc_is_snap(const struct wlan_llc *llc)
-+{
-+      return (llc->dsap == 0xaa)
-+      && (llc->ssap == 0xaa)
-+      && (llc->ctl == 0x03);
-+}
-+static inline void
-+store_oui_rfc1042(struct wlan_snap *snap)
-+{
-+      snap->oui[0] = 0;
-+      snap->oui[1] = 0;
-+      snap->oui[2] = 0;
-+}
-+static inline int
-+oui_is_rfc1042(const struct wlan_snap *snap)
-+{
-+      return (snap->oui[0] == 0)
-+      && (snap->oui[1] == 0)
-+      && (snap->oui[2] == 0);
-+}
-+static inline void
-+store_oui_8021h(struct wlan_snap *snap)
-+{
-+      snap->oui[0] = 0;
-+      snap->oui[1] = 0;
-+      snap->oui[2] = 0xf8;
-+}
-+static inline int
-+oui_is_8021h(const struct wlan_snap *snap)
-+{
-+      return (snap->oui[0] == 0)
-+      && (snap->oui[1] == 0)
-+      && (snap->oui[2] == 0xf8);
-+}
-+
-+
-+/***********************************************************************
-+** acx_ether_to_txbuf
-+**
-+** Uses the contents of the ether frame to build the elements of
-+** the 802.11 frame.
-+**
-+** We don't actually set up the frame header here.  That's the
-+** MAC's job.  We're only handling conversion of DIXII or 802.3+LLC
-+** frames to something that works with 802.11.
-+**
-+** Based largely on p80211conv.c of the linux-wlan-ng project
-+*/
-+int
-+acx_ether_to_txbuf(acx_device_t *adev, void *txbuf, const struct sk_buff *skb)
-+{
-+      struct wlan_hdr_a3 *w_hdr;
-+      struct wlan_ethhdr *e_hdr;
-+      struct wlan_llc *e_llc;
-+      struct wlan_snap *e_snap;
-+      const u8 *a1, *a3;
-+      int header_len, payload_len = -1;
-+      /* protocol type or data length, depending on whether
-+       * DIX or 802.3 ethernet format */
-+      u16 proto;
-+      u16 fc;
-+
-+      FN_ENTER;
-+
-+      if (unlikely(!skb->len)) {
-+              log(L_DEBUG, "zero-length skb!\n");
-+              goto end;
-+      }
-+
-+      w_hdr = (struct wlan_hdr_a3*)txbuf;
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_MONITOR:
-+              /* NB: one day we might want to play with DESC_CTL2_FCS
-+              ** Will need to stop doing "- WLAN_FCS_LEN" here then */
-+              if (unlikely(skb->len >= WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_FCS_LEN)) {
-+                      printk("%s: can't tx oversized frame (%d bytes)\n",
-+                              adev->ndev->name, skb->len);
-+                      goto end;
-+              }
-+              memcpy(w_hdr, skb->data, skb->len);
-+              payload_len = skb->len;
-+              goto end;
-+      }
-+
-+      /* step 1: classify ether frame, DIX or 802.3? */
-+      e_hdr = (wlan_ethhdr_t *)skb->data;
-+      proto = ntohs(e_hdr->type);
-+      if (proto <= 1500) {
-+              log(L_DEBUG, "tx: 802.3 len: %d\n", skb->len);
-+              /* codes <= 1500 reserved for 802.3 lengths */
-+              /* it's 802.3, pass ether payload unchanged, */
-+              /* trim off ethernet header and copy payload to txdesc */
-+              header_len = WLAN_HDR_A3_LEN;
-+      } else {
-+              /* it's DIXII, time for some conversion */
-+              /* Create 802.11 packet. Header also contains llc and snap. */
-+
-+              log(L_DEBUG, "tx: DIXII len: %d\n", skb->len);
-+
-+              /* size of header is 802.11 header + llc + snap */
-+              header_len = WLAN_HDR_A3_LEN + sizeof(wlan_llc_t) + sizeof(wlan_snap_t);
-+              /* llc is located behind the 802.11 header */
-+              e_llc = (wlan_llc_t*)(w_hdr + 1);
-+              /* snap is located behind the llc */
-+              e_snap = (wlan_snap_t*)(e_llc + 1);
-+
-+              /* setup the LLC header */
-+              store_llc_snap(e_llc);
-+
-+              /* setup the SNAP header */
-+              e_snap->type = htons(proto);
-+              if (proto_is_stt(proto)) {
-+                      store_oui_8021h(e_snap);
-+              } else {
-+                      store_oui_rfc1042(e_snap);
-+              }
-+      }
-+      /* trim off ethernet header and copy payload to txbuf */
-+      payload_len = skb->len - sizeof(wlan_ethhdr_t);
-+      /* TODO: can we just let acx DMA payload from skb instead? */
-+      memcpy((u8*)txbuf + header_len, skb->data + sizeof(wlan_ethhdr_t), payload_len);
-+      payload_len += header_len;
-+
-+      /* Set up the 802.11 header */
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+              fc = (WF_FTYPE_DATAi | WF_FSTYPE_DATAONLYi);
-+              a1 = e_hdr->daddr;
-+              a3 = adev->bssid;
-+              break;
-+      case ACX_MODE_2_STA:
-+              fc = (WF_FTYPE_DATAi | WF_FSTYPE_DATAONLYi | WF_FC_TODSi);
-+              a1 = adev->bssid;
-+              a3 = e_hdr->daddr;
-+              break;
-+      case ACX_MODE_3_AP:
-+              fc = (WF_FTYPE_DATAi | WF_FSTYPE_DATAONLYi | WF_FC_FROMDSi);
-+              a1 = e_hdr->daddr;
-+              a3 = e_hdr->saddr;
-+              break;
-+      default:
-+              printk("%s: error - converting eth to wlan in unknown mode\n",
-+                              adev->ndev->name);
-+              payload_len = -1;
-+              goto end;
-+      }
-+      if (adev->wep_enabled)
-+              SET_BIT(fc, WF_FC_ISWEPi);
-+
-+      w_hdr->fc = fc;
-+      w_hdr->dur = 0;
-+      MAC_COPY(w_hdr->a1, a1);
-+      MAC_COPY(w_hdr->a2, adev->dev_addr);
-+      MAC_COPY(w_hdr->a3, a3);
-+      w_hdr->seq = 0;
-+
-+#ifdef DEBUG_CONVERT
-+      if (acx_debug & L_DATA) {
-+              printk("original eth frame [%d]: ", skb->len);
-+              acx_dump_bytes(skb->data, skb->len);
-+              printk("802.11 frame [%d]: ", payload_len);
-+              acx_dump_bytes(w_hdr, payload_len);
-+      }
-+#endif
-+
-+end:
-+      FN_EXIT1(payload_len);
-+      return payload_len;
-+}
-+
-+
-+/***********************************************************************
-+** acx_rxbuf_to_ether
-+**
-+** Uses the contents of a received 802.11 frame to build an ether
-+** frame.
-+**
-+** This function extracts the src and dest address from the 802.11
-+** frame to use in the construction of the eth frame.
-+**
-+** Based largely on p80211conv.c of the linux-wlan-ng project
-+*/
-+struct sk_buff*
-+acx_rxbuf_to_ether(acx_device_t *adev, rxbuffer_t *rxbuf)
-+{
-+      struct wlan_hdr *w_hdr;
-+      struct wlan_ethhdr *e_hdr;
-+      struct wlan_llc *e_llc;
-+      struct wlan_snap *e_snap;
-+      struct sk_buff *skb;
-+      const u8 *daddr;
-+      const u8 *saddr;
-+      const u8 *e_payload;
-+      int buflen, payload_length;
-+      unsigned int payload_offset, mtu;
-+      u16 fc;
-+
-+      FN_ENTER;
-+
-+      /* This looks complex because it must handle possible
-+      ** phy header in rxbuff */
-+      w_hdr = acx_get_wlan_hdr(adev, rxbuf);
-+      payload_offset = WLAN_HDR_A3_LEN; /* it is relative to w_hdr */
-+      payload_length = RXBUF_BYTES_USED(rxbuf) /* entire rxbuff... */
-+              - ((u8*)w_hdr - (u8*)rxbuf) /* minus space before 802.11 frame */
-+              - WLAN_HDR_A3_LEN; /* minus 802.11 header */
-+
-+      /* setup some vars for convenience */
-+      fc = w_hdr->fc;
-+      switch (WF_FC_FROMTODSi & fc) {
-+      case 0:
-+              daddr = w_hdr->a1;
-+              saddr = w_hdr->a2;
-+              break;
-+      case WF_FC_FROMDSi:
-+              daddr = w_hdr->a1;
-+              saddr = w_hdr->a3;
-+              break;
-+      case WF_FC_TODSi:
-+              daddr = w_hdr->a3;
-+              saddr = w_hdr->a2;
-+              break;
-+      default: /* WF_FC_FROMTODSi */
-+              payload_offset += (WLAN_HDR_A4_LEN - WLAN_HDR_A3_LEN);
-+              payload_length -= (WLAN_HDR_A4_LEN - WLAN_HDR_A3_LEN);
-+              daddr = w_hdr->a3;
-+              saddr = w_hdr->a4;
-+      }
-+
-+      if ((WF_FC_ISWEPi & fc) && IS_ACX100(adev)) {
-+              /* chop off the IV+ICV WEP header and footer */
-+              log(L_DATA|L_DEBUG, "rx: WEP packet, "
-+                      "chopping off IV and ICV\n");
-+              payload_offset += WLAN_WEP_IV_LEN;
-+              payload_length -= WLAN_WEP_IV_LEN + WLAN_WEP_ICV_LEN;
-+      }
-+
-+      if (unlikely(payload_length < 0)) {
-+              printk("%s: rx frame too short, ignored\n", adev->ndev->name);
-+              goto ret_null;
-+      }
-+
-+      e_hdr = (wlan_ethhdr_t*) ((u8*) w_hdr + payload_offset);
-+      e_llc = (wlan_llc_t*) e_hdr;
-+      e_snap = (wlan_snap_t*) (e_llc + 1);
-+      mtu = adev->ndev->mtu;
-+      e_payload = (u8*) (e_snap + 1);
-+
-+      log(L_DATA, "rx: payload_offset %d, payload_length %d\n",
-+              payload_offset, payload_length);
-+      log(L_XFER|L_DATA,
-+              "rx: frame info: llc=%02X%02X%02X "
-+              "snap.oui=%02X%02X%02X snap.type=%04X\n",
-+              e_llc->dsap, e_llc->ssap, e_llc->ctl,
-+              e_snap->oui[0], e_snap->oui[1], e_snap->oui[2],
-+              ntohs(e_snap->type));
-+
-+      /* Test for the various encodings */
-+      if ((payload_length >= sizeof(wlan_ethhdr_t))
-+       && ((e_llc->dsap != 0xaa) || (e_llc->ssap != 0xaa))
-+       && (   (mac_is_equal(daddr, e_hdr->daddr))
-+           || (mac_is_equal(saddr, e_hdr->saddr))
-+          )
-+      ) {
-+      /* 802.3 Encapsulated: */
-+      /* wlan frame body contains complete eth frame (header+body) */
-+              log(L_DEBUG|L_DATA, "rx: 802.3 ENCAP len=%d\n", payload_length);
-+
-+              if (unlikely(payload_length > (mtu + ETH_HLEN))) {
-+                      printk("%s: rx: ENCAP frame too large (%d > %d)\n",
-+                              adev->ndev->name,
-+                              payload_length, mtu + ETH_HLEN);
-+                      goto ret_null;
-+              }
-+
-+              /* allocate space and setup host buffer */
-+              buflen = payload_length;
-+              /* Attempt to align IP header (14 bytes eth header + 2 = 16) */
-+              skb = dev_alloc_skb(buflen + 2);
-+              if (unlikely(!skb))
-+                      goto no_skb;
-+              skb_reserve(skb, 2);
-+              skb_put(skb, buflen);           /* make room */
-+
-+              /* now copy the data from the 80211 frame */
-+              memcpy(skb->data, e_hdr, payload_length);
-+
-+      } else if ( (payload_length >= sizeof(wlan_llc_t)+sizeof(wlan_snap_t))
-+               && llc_is_snap(e_llc) ) {
-+      /* wlan frame body contains: AA AA 03 ... (it's a SNAP) */
-+
-+              if ( !oui_is_rfc1042(e_snap)
-+               || (proto_is_stt(ieee2host16(e_snap->type)) /* && (ethconv == WLAN_ETHCONV_8021h) */)) {
-+                      log(L_DEBUG|L_DATA, "rx: SNAP+RFC1042 len=%d\n", payload_length);
-+      /* wlan frame body contains: AA AA 03 !(00 00 00) ... -or- */
-+      /* wlan frame body contains: AA AA 03 00 00 00 0x80f3 ... */
-+      /* build eth hdr, type = len, copy AA AA 03... as eth body */
-+                      /* it's a SNAP + RFC1042 frame && protocol is in STT */
-+
-+                      if (unlikely(payload_length > mtu)) {
-+                              printk("%s: rx: SNAP frame too large (%d > %d)\n",
-+                                      adev->ndev->name,
-+                                      payload_length, mtu);
-+                              goto ret_null;
-+                      }
-+
-+                      /* allocate space and setup host buffer */
-+                      buflen = payload_length + ETH_HLEN;
-+                      skb = dev_alloc_skb(buflen + 2);
-+                      if (unlikely(!skb))
-+                              goto no_skb;
-+                      skb_reserve(skb, 2);
-+                      skb_put(skb, buflen);           /* make room */
-+
-+                      /* create 802.3 header */
-+                      e_hdr = (wlan_ethhdr_t*) skb->data;
-+                      MAC_COPY(e_hdr->daddr, daddr);
-+                      MAC_COPY(e_hdr->saddr, saddr);
-+                      e_hdr->type = htons(payload_length);
-+
-+                      /* Now copy the data from the 80211 frame.
-+                         Make room in front for the eth header, and keep the
-+                         llc and snap from the 802.11 payload */
-+                      memcpy(skb->data + ETH_HLEN,
-+                                      e_llc, payload_length);
-+
-+              } else {
-+      /* wlan frame body contains: AA AA 03 00 00 00 [type] [tail] */
-+      /* build eth hdr, type=[type], copy [tail] as eth body */
-+                      log(L_DEBUG|L_DATA, "rx: 802.1h/RFC1042 len=%d\n",
-+                              payload_length);
-+                      /* it's an 802.1h frame (an RFC1042 && protocol is not in STT) */
-+                      /* build a DIXII + RFC894 */
-+
-+                      payload_length -= sizeof(wlan_llc_t) + sizeof(wlan_snap_t);
-+                      if (unlikely(payload_length > mtu)) {
-+                              printk("%s: rx: DIXII frame too large (%d > %d)\n",
-+                                      adev->ndev->name,
-+                                      payload_length, mtu);
-+                              goto ret_null;
-+                      }
-+
-+                      /* allocate space and setup host buffer */
-+                      buflen = payload_length + ETH_HLEN;
-+                      skb = dev_alloc_skb(buflen + 2);
-+                      if (unlikely(!skb))
-+                              goto no_skb;
-+                      skb_reserve(skb, 2);
-+                      skb_put(skb, buflen);           /* make room */
-+
-+                      /* create 802.3 header */
-+                      e_hdr = (wlan_ethhdr_t *) skb->data;
-+                      MAC_COPY(e_hdr->daddr, daddr);
-+                      MAC_COPY(e_hdr->saddr, saddr);
-+                      e_hdr->type = e_snap->type;
-+
-+                      /* Now copy the data from the 80211 frame.
-+                         Make room in front for the eth header, and cut off the
-+                         llc and snap from the 802.11 payload */
-+                      memcpy(skb->data + ETH_HLEN,
-+                                      e_payload, payload_length);
-+              }
-+
-+      } else {
-+              log(L_DEBUG|L_DATA, "rx: NON-ENCAP len=%d\n", payload_length);
-+      /* build eth hdr, type=len, copy wlan body as eth body */
-+              /* any NON-ENCAP */
-+              /* it's a generic 80211+LLC or IPX 'Raw 802.3' */
-+              /* build an 802.3 frame */
-+
-+              if (unlikely(payload_length > mtu)) {
-+                      printk("%s: rx: OTHER frame too large (%d > %d)\n",
-+                              adev->ndev->name, payload_length, mtu);
-+                      goto ret_null;
-+              }
-+
-+              /* allocate space and setup host buffer */
-+              buflen = payload_length + ETH_HLEN;
-+              skb = dev_alloc_skb(buflen + 2);
-+              if (unlikely(!skb))
-+                      goto no_skb;
-+              skb_reserve(skb, 2);
-+              skb_put(skb, buflen);           /* make room */
-+
-+              /* set up the 802.3 header */
-+              e_hdr = (wlan_ethhdr_t *) skb->data;
-+              MAC_COPY(e_hdr->daddr, daddr);
-+              MAC_COPY(e_hdr->saddr, saddr);
-+              e_hdr->type = htons(payload_length);
-+
-+              /* now copy the data from the 80211 frame */
-+              memcpy(skb->data + ETH_HLEN, e_llc, payload_length);
-+      }
-+
-+      skb->dev = adev->ndev;
-+      skb->protocol = eth_type_trans(skb, adev->ndev);
-+
-+#ifdef DEBUG_CONVERT
-+      if (acx_debug & L_DATA) {
-+              int len = RXBUF_BYTES_RCVD(adev, rxbuf);
-+              printk("p802.11 frame [%d]: ", len);
-+              acx_dump_bytes(w_hdr, len);
-+              printk("eth frame [%d]: ", skb->len);
-+              acx_dump_bytes(skb->data, skb->len);
-+      }
-+#endif
-+
-+      FN_EXIT0;
-+      return skb;
-+
-+no_skb:
-+      printk("%s: rx: no memory for skb (%d bytes)\n",
-+                      adev->ndev->name, buflen + 2);
-+ret_null:
-+      FN_EXIT1((int)NULL);
-+      return NULL;
-+}
-Index: linux-2.6.22/drivers/net/wireless/acx/cs.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/cs.c 2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,5703 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+**
-+** Slave memory interface support:
-+**
-+** Todd Blumer - SDG Systems
-+** Bill Reese - HP
-+** Eric McCorkle - Shadowsun
-+**
-+** CF support, (c) Fabrice Crohas, Paul Sokolovsky
-+*/
-+#define ACX_MEM 1
-+
-+/*
-+ * non-zero makes it dump the ACX memory to the console then
-+ * panic when you cat /proc/driver/acx_wlan0_diag
-+ */
-+#define DUMP_MEM_DEFINED 1
-+
-+#define DUMP_MEM_DURING_DIAG 0
-+#define DUMP_IF_SLOW 0
-+
-+#define PATCH_AROUND_BAD_SPOTS 1
-+#define HX4700_FIRMWARE_CHECKSUM 0x0036862e
-+#define HX4700_ALTERNATE_FIRMWARE_CHECKSUM 0x00368a75
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
-+#include <linux/config.h>
-+#endif
-+
-+/* Linux 2.6.18+ uses <linux/utsrelease.h> */
-+#ifndef UTS_RELEASE
-+#include <linux/utsrelease.h>
-+#endif
-+
-+#include <linux/compiler.h> /* required for Lx 2.6.8 ?? */
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/sched.h>
-+#include <linux/types.h>
-+#include <linux/skbuff.h>
-+#include <linux/slab.h>
-+#include <linux/if_arp.h>
-+#include <linux/irq.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/wireless.h>
-+#include <net/iw_handler.h>
-+#include <linux/netdevice.h>
-+#include <linux/ioport.h>
-+#include <linux/pci.h>
-+#include <linux/platform_device.h>
-+#include <linux/pm.h>
-+#include <linux/vmalloc.h>
-+#include <linux/delay.h>
-+#include <linux/workqueue.h>
-+#include <linux/inetdevice.h>
-+
-+#define PCMCIA_DEBUG 1
-+
-+/*
-+   All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
-+   you do not define PCMCIA_DEBUG at all, all the debug code will be
-+   left out.  If you compile with PCMCIA_DEBUG=0, the debug code will
-+   be present but disabled -- but it can then be enabled for specific
-+   modules at load time with a 'pc_debug=#' option to insmod.
-+      
-+*/
-+#include <pcmcia/cs_types.h>
-+#include <pcmcia/cs.h>
-+#include <pcmcia/cistpl.h>
-+#include <pcmcia/cisreg.h>
-+#include <pcmcia/ds.h>
-+#include "acx.h"
-+#include "acx_hw.h"
-+
-+#ifdef PCMCIA_DEBUG
-+static int pc_debug = PCMCIA_DEBUG;
-+module_param(pc_debug, int, 0);
-+static char *version = "$Revision: 1.10 $";
-+#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args);
-+#else
-+#define DEBUG(n, args...)
-+#endif
-+
-+
-+static win_req_t memwin;
-+
-+typedef struct local_info_t {
-+        dev_node_t      node;
-+        struct net_device *ndev;
-+} local_info_t;
-+
-+static struct net_device *resume_ndev;
-+
-+
-+/***********************************************************************
-+*/
-+
-+#define CARD_EEPROM_ID_SIZE 6
-+
-+#include <asm/io.h>
-+
-+#define REG_ACX_VENDOR_ID 0x900
-+/*
-+ * This is the vendor id on the HX4700, anyway
-+ */
-+#define ACX_VENDOR_ID 0x8400104c
-+
-+typedef enum {
-+      ACX_SOFT_RESET = 0,
-+
-+      ACX_SLV_REG_ADDR,
-+      ACX_SLV_REG_DATA,
-+      ACX_SLV_REG_ADATA,
-+
-+      ACX_SLV_MEM_CP,
-+      ACX_SLV_MEM_ADDR,
-+      ACX_SLV_MEM_DATA,
-+      ACX_SLV_MEM_CTL,
-+} acxreg_t;
-+
-+/***********************************************************************
-+*/
-+static void acxmem_i_tx_timeout(struct net_device *ndev);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
-+static irqreturn_t acxmem_i_interrupt(int irq, void *dev_id);
-+#else
-+static irqreturn_t acxmem_i_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-+#endif
-+static void acxmem_i_set_multicast_list(struct net_device *ndev);
-+
-+static int acxmem_e_open(struct net_device *ndev);
-+static int acxmem_e_close(struct net_device *ndev);
-+static void acxmem_s_up(struct net_device *ndev);
-+static void acxmem_s_down(struct net_device *ndev);
-+
-+static void dump_acxmem (acx_device_t *adev, u32 start, int length);
-+static int acxmem_complete_hw_reset (acx_device_t *adev);
-+static void acxmem_s_delete_dma_regions(acx_device_t *adev);
-+
-+static int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+acxmem_e_suspend( struct net_device *ndev, pm_message_t state);
-+#else
-+acxmem_e_suspend( struct net_device *ndev, u32 state);
-+#endif
-+static void
-+fw_resumer(struct work_struct *notused);
-+//fw_resumer( void *data );
-+
-+static int acx_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
-+{
-+  struct net_device *ndev = ptr;
-+  acx_device_t *adev = ndev2adev(ndev);
-+
-+  /*
-+   * Upper level ioctl() handlers send a NETDEV_CHANGEADDR if the MAC address changes.
-+   */
-+
-+  if (NETDEV_CHANGEADDR == event) {
-+    /*
-+     * the upper layers put the new MAC address in ndev->dev_addr; we just copy
-+     * it over and update the ACX with it.
-+     */
-+    MAC_COPY(adev->dev_addr, adev->ndev->dev_addr);
-+    adev->set_mask |= GETSET_STATION_ID;
-+    acx_s_update_card_settings (adev);
-+  }
-+
-+  return 0;
-+}
-+
-+static struct notifier_block acx_netdev_notifier = {
-+        .notifier_call = acx_netdev_event,
-+};
-+
-+/***********************************************************************
-+** Register access
-+*/
-+
-+/* Pick one */
-+/* #define INLINE_IO static */
-+#define INLINE_IO static inline
-+
-+INLINE_IO u32
-+read_id_register (acx_device_t *adev)
-+{
-+  writel (0x24, &adev->iobase[ACX_SLV_REG_ADDR]);
-+  return readl (&adev->iobase[ACX_SLV_REG_DATA]);
-+}
-+
-+INLINE_IO u32
-+read_reg32(acx_device_t *adev, unsigned int offset)
-+{
-+        u32 val;
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+        return readl(((u8*)adev->iobase) + addr);
-+      }
-+
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      val = readl( &adev->iobase[ACX_SLV_REG_DATA] );
-+
-+      return val;
-+}
-+
-+INLINE_IO u16
-+read_reg16(acx_device_t *adev, unsigned int offset)
-+{
-+      u16 lo;
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+          return readw(((u8 *) adev->iobase) + addr);
-+      }
-+
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      lo = readw( (u16 *)&adev->iobase[ACX_SLV_REG_DATA] );
-+
-+      return lo;
-+}
-+
-+INLINE_IO u8
-+read_reg8(acx_device_t *adev, unsigned int offset)
-+{
-+      u8 lo;
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20)
-+          return readb(((u8 *)adev->iobase) + addr);
-+
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      lo = readw( (u8 *)&adev->iobase[ACX_SLV_REG_DATA] );
-+
-+      return (u8)lo;
-+}
-+
-+INLINE_IO void
-+write_reg32(acx_device_t *adev, unsigned int offset, u32 val)
-+{
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+          writel(val, ((u8*)adev->iobase) + addr);
-+          return;
-+      }
-+
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      writel( val, &adev->iobase[ACX_SLV_REG_DATA] );
-+}
-+
-+INLINE_IO void
-+write_reg16(acx_device_t *adev, unsigned int offset, u16 val)
-+{
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+          writew(val, ((u8 *)adev->iobase) + addr);
-+          return;
-+      }
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      writew( val, (u16 *) &adev->iobase[ACX_SLV_REG_DATA] );
-+}
-+
-+INLINE_IO void
-+write_reg8(acx_device_t *adev, unsigned int offset, u8 val)
-+{
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+          writeb(val, ((u8 *) adev->iobase) + addr);
-+          return;
-+      }
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      writeb( val, (u8 *)&adev->iobase[ACX_SLV_REG_DATA] );
-+}
-+
-+/* Handle PCI posting properly:
-+ * Make sure that writes reach the adapter in case they require to be executed
-+ * *before* the next write, by reading a random (and safely accessible) register.
-+ * This call has to be made if there is no read following (which would flush the data
-+ * to the adapter), yet the written data has to reach the adapter immediately. */
-+INLINE_IO void
-+write_flush(acx_device_t *adev)
-+{
-+      /* readb(adev->iobase + adev->io[IO_ACX_INFO_MAILBOX_OFFS]); */
-+      /* faster version (accesses the first register, IO_ACX_SOFT_RESET,
-+       * which should also be safe): */
-+      (void) readl(adev->iobase);
-+}
-+
-+INLINE_IO void
-+set_regbits (acx_device_t *adev, unsigned int offset, u32 bits) {
-+  u32 tmp;
-+
-+  tmp = read_reg32 (adev, offset);
-+  tmp = tmp | bits;
-+  write_reg32 (adev, offset, tmp);
-+  write_flush (adev);
-+}
-+
-+INLINE_IO void
-+clear_regbits (acx_device_t *adev, unsigned int offset, u32 bits) {
-+  u32 tmp;
-+
-+  tmp = read_reg32 (adev, offset);
-+  tmp = tmp & ~bits;
-+  write_reg32 (adev, offset, tmp);
-+  write_flush (adev);
-+}
-+
-+/*
-+ * Copy from PXA memory to the ACX memory.  This assumes both the PXA and ACX
-+ * addresses are 32 bit aligned.  Count is in bytes.
-+ */
-+INLINE_IO void
-+write_slavemem32 (acx_device_t *adev, u32 slave_address, u32 val)
-+{
-+  write_reg32 (adev, IO_ACX_SLV_MEM_CTL, 0x0);
-+  write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, slave_address);
-+  udelay (10);
-+  write_reg32 (adev, IO_ACX_SLV_MEM_DATA, val);
-+}
-+
-+INLINE_IO u32
-+read_slavemem32 (acx_device_t *adev, u32 slave_address)
-+{
-+  u32 val;
-+
-+  write_reg32 (adev, IO_ACX_SLV_MEM_CTL, 0x0);
-+  write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, slave_address);
-+  udelay (10);
-+  val = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
-+
-+  return val;
-+}
-+
-+INLINE_IO void
-+write_slavemem8 (acx_device_t *adev, u32 slave_address, u8 val)
-+{
-+  u32 data;
-+  u32 base;
-+  int offset;
-+
-+  /*
-+   * Get the word containing the target address and the byte offset in that word.
-+   */
-+  base = slave_address & ~3;
-+  offset = (slave_address & 3) * 8;
-+
-+  data = read_slavemem32 (adev, base);
-+  data &= ~(0xff << offset);
-+  data |= val << offset;
-+  write_slavemem32 (adev, base, data);
-+}
-+
-+INLINE_IO u8
-+read_slavemem8 (acx_device_t *adev, u32 slave_address)
-+{
-+  u8 val;
-+  u32 base;
-+  u32 data;
-+  int offset;
-+
-+  base = slave_address & ~3;
-+  offset = (slave_address & 3) * 8;
-+
-+  data = read_slavemem32 (adev, base);
-+ 
-+  val = (data >> offset) & 0xff;
-+
-+  return val;
-+}
-+
-+/*
-+ * doesn't split across word boundaries
-+ */
-+INLINE_IO void
-+write_slavemem16 (acx_device_t *adev, u32 slave_address, u16 val)
-+{
-+  u32 data;
-+  u32 base;
-+  int offset;
-+
-+  /*
-+   * Get the word containing the target address and the byte offset in that word.
-+   */
-+  base = slave_address & ~3;
-+  offset = (slave_address & 3) * 8;
-+
-+  data = read_slavemem32 (adev, base);
-+  data &= ~(0xffff << offset);
-+  data |= val << offset;
-+  write_slavemem32 (adev, base, data);
-+}
-+
-+/*
-+ * doesn't split across word boundaries
-+ */
-+INLINE_IO u16
-+read_slavemem16 (acx_device_t *adev, u32 slave_address)
-+{
-+  u16 val;
-+  u32 base;
-+  u32 data;
-+  int offset;
-+
-+  base = slave_address & ~3;
-+  offset = (slave_address & 3) * 8;
-+
-+  data = read_slavemem32 (adev, base);
-+ 
-+  val = (data >> offset) & 0xffff;
-+
-+  return val;
-+}
-+
-+/*
-+ * Copy from slave memory
-+ *
-+ * TODO - rewrite using address autoincrement, handle partial words
-+ */
-+void
-+copy_from_slavemem (acx_device_t *adev, u8 *destination, u32 source, int count) {
-+  u32 tmp = 0;
-+  u8 *ptmp = (u8 *) &tmp;
-+
-+  /*
-+   * Right now I'm making the assumption that the destination is aligned, but
-+   * I'd better check.
-+   */
-+  if ((u32) destination & 3) {
-+    printk ("acx copy_from_slavemem: warning!  destination not word-aligned!\n");
-+  }
-+
-+  while (count >= 4) {
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source);
-+    udelay (10);
-+    *((u32 *) destination) = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
-+    count -= 4;
-+    source += 4;
-+    destination += 4;
-+  }
-+
-+  /*
-+   * If the word reads above didn't satisfy the count, read one more word
-+   * and transfer a byte at a time until the request is satisfied.
-+   */
-+  if (count) {
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source);
-+    udelay (10);
-+    tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
-+    while (count--) {
-+      *destination++ = *ptmp++;
-+    }
-+  }
-+}
-+
-+/*
-+ * Copy to slave memory
-+ *
-+ * TODO - rewrite using autoincrement, handle partial words
-+ */
-+void
-+copy_to_slavemem (acx_device_t *adev, u32 destination, u8 *source, int count)
-+{
-+  u32 tmp = 0;
-+  u8* ptmp = (u8 *) &tmp;
-+  static u8 src[512]; /* make static to avoid huge stack objects */
-+
-+  /*
-+   * For now, make sure the source is word-aligned by copying it to a word-aligned
-+   * buffer.  Someday rewrite to avoid the extra copy.
-+   */
-+  if (count > sizeof (src)) {
-+    printk ("acx copy_to_slavemem: Warning! buffer overflow!\n");
-+    count = sizeof (src);
-+  }
-+  memcpy (src, source, count);
-+  source = src;
-+
-+  while (count >= 4) {
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination);
-+    udelay (10);
-+    write_reg32 (adev, IO_ACX_SLV_MEM_DATA, *((u32 *) source));
-+    count -= 4;
-+    source += 4;
-+    destination += 4;
-+  }
-+
-+  /*
-+   * If there are leftovers read the next word from the acx and merge in
-+   * what they want to write.
-+   */
-+  if (count) {
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination);
-+    udelay (10);
-+    tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
-+    while (count--) {
-+      *ptmp++ = *source++;
-+    }
-+    /*
-+     * reset address in case we're currently in auto-increment mode
-+     */
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination);
-+    udelay (10);
-+    write_reg32 (adev, IO_ACX_SLV_MEM_DATA, tmp);
-+    udelay (10);
-+  }
-+  
-+}
-+
-+/*
-+ * Block copy to slave buffers using memory block chain mode.  Copies to the ACX
-+ * transmit buffer structure with minimal intervention on our part.
-+ * Interrupts should be disabled when calling this.
-+ */
-+void
-+chaincopy_to_slavemem (acx_device_t *adev, u32 destination, u8 *source, int count)
-+{
-+  u32 val;
-+  u32 *data = (u32 *) source;
-+  static u8 aligned_source[WLAN_A4FR_MAXLEN_WEP_FCS];
-+
-+  /*
-+   * Warn if the pointers don't look right.  Destination must fit in [23:5] with
-+   * zero elsewhere and source should be 32 bit aligned.
-+   * This should never happen since we're in control of both, but I want to know about
-+   * it if it does.
-+   */
-+  if ((destination & 0x00ffffe0) != destination) {
-+    printk ("acx chaincopy: destination block 0x%04x not aligned!\n", destination);
-+  }
-+  if (count > sizeof aligned_source) {
-+      printk( KERN_ERR "chaincopy_to_slavemem overflow!\n" );
-+      count = sizeof aligned_source;
-+  }
-+  if ((u32) source & 3) {
-+    memcpy (aligned_source, source, count);
-+    data = (u32 *) aligned_source;
-+  }
-+
-+  /*
-+   * SLV_MEM_CTL[17:16] = memory block chain mode with auto-increment
-+   * SLV_MEM_CTL[5:2] = offset to data portion = 1 word
-+   */
-+  val = 2 << 16 | 1 << 2;
-+  writel (val, &adev->iobase[ACX_SLV_MEM_CTL]);
-+
-+  /*
-+   * SLV_MEM_CP[23:5] = start of 1st block
-+   * SLV_MEM_CP[3:2] = offset to memblkptr = 0
-+   */
-+  val = destination & 0x00ffffe0;
-+  writel (val, &adev->iobase[ACX_SLV_MEM_CP]);
-+
-+  /*
-+   * SLV_MEM_ADDR[23:2] = SLV_MEM_CTL[5:2] + SLV_MEM_CP[23:5]
-+   */
-+  val = (destination & 0x00ffffe0) + (1<<2);
-+  writel (val, &adev->iobase[ACX_SLV_MEM_ADDR]);
-+
-+  /*
-+   * Write the data to the slave data register, rounding up to the end
-+   * of the word containing the last byte (hence the > 0)
-+   */
-+  while (count > 0) {
-+    writel (*data++, &adev->iobase[ACX_SLV_MEM_DATA]);
-+    count -= 4;
-+  }
-+}
-+
-+
-+/*
-+ * Block copy from slave buffers using memory block chain mode.  Copies from the ACX
-+ * receive buffer structures with minimal intervention on our part.
-+ * Interrupts should be disabled when calling this.
-+ */
-+void
-+chaincopy_from_slavemem (acx_device_t *adev, u8 *destination, u32 source, int count)
-+{
-+  u32 val;
-+  u32 *data = (u32 *) destination;
-+  static u8 aligned_destination[WLAN_A4FR_MAXLEN_WEP_FCS];
-+  int saved_count = count;
-+
-+  /*
-+   * Warn if the pointers don't look right.  Destination must fit in [23:5] with
-+   * zero elsewhere and source should be 32 bit aligned.
-+   * Turns out the network stack sends unaligned things, so fix them before
-+   * copying to the ACX.
-+   */
-+  if ((source & 0x00ffffe0) != source) {
-+    printk ("acx chaincopy: source block 0x%04x not aligned!\n", source);
-+    dump_acxmem (adev, 0, 0x10000);
-+  }
-+  if ((u32) destination & 3) {
-+    //printk ("acx chaincopy: data destination not word aligned!\n");
-+    data = (u32 *) aligned_destination;
-+    if (count > sizeof aligned_destination) {
-+      printk( KERN_ERR "chaincopy_from_slavemem overflow!\n" );
-+      count = sizeof aligned_destination;
-+    }
-+  }
-+
-+  /*
-+   * SLV_MEM_CTL[17:16] = memory block chain mode with auto-increment
-+   * SLV_MEM_CTL[5:2] = offset to data portion = 1 word
-+   */
-+  val = (2 << 16) | (1 << 2);
-+  writel (val, &adev->iobase[ACX_SLV_MEM_CTL]);
-+
-+  /*
-+   * SLV_MEM_CP[23:5] = start of 1st block
-+   * SLV_MEM_CP[3:2] = offset to memblkptr = 0
-+   */
-+  val = source & 0x00ffffe0;
-+  writel (val, &adev->iobase[ACX_SLV_MEM_CP]);
-+
-+  /*
-+   * SLV_MEM_ADDR[23:2] = SLV_MEM_CTL[5:2] + SLV_MEM_CP[23:5]
-+   */
-+  val = (source & 0x00ffffe0) + (1<<2);
-+  writel (val, &adev->iobase[ACX_SLV_MEM_ADDR]);
-+
-+  /*
-+   * Read the data from the slave data register, rounding up to the end
-+   * of the word containing the last byte (hence the > 0)
-+   */
-+  while (count > 0) {
-+    *data++ = readl (&adev->iobase[ACX_SLV_MEM_DATA]);
-+    count -= 4;
-+  }
-+
-+  /*
-+   * If the destination wasn't aligned, we would have saved it in
-+   * the aligned buffer, so copy it where it should go.
-+   */
-+  if ((u32) destination & 3) {
-+    memcpy (destination, aligned_destination, saved_count);
-+  }
-+}
-+
-+char
-+printable (char c) 
-+{
-+  return ((c >= 20) && (c < 127)) ? c : '.';
-+}
-+
-+#if DUMP_MEM_DEFINED > 0
-+static void
-+dump_acxmem (acx_device_t *adev, u32 start, int length)
-+{
-+  int i;
-+  u8 buf[16];
-+
-+  while (length > 0) {
-+    printk ("%04x ", start);
-+    copy_from_slavemem (adev, buf, start, 16);
-+    for (i = 0; (i < 16) && (i < length); i++) {
-+      printk ("%02x ", buf[i]);
-+    }
-+    for (i = 0; (i < 16) && (i < length); i++) {
-+      printk ("%c", printable (buf[i]));
-+    }
-+    printk ("\n");
-+    start += 16;
-+    length -= 16;
-+  }
-+}
-+#endif
-+
-+static void
-+enable_acx_irq(acx_device_t *adev);
-+static void
-+disable_acx_irq(acx_device_t *adev);
-+
-+/*
-+ * Return an acx pointer to the next transmit data block.
-+ */
-+u32
-+allocate_acx_txbuf_space (acx_device_t *adev, int count) {
-+  u32 block, next, last_block;
-+  int blocks_needed;
-+  unsigned long flags;
-+
-+  spin_lock_irqsave(&adev->txbuf_lock, flags);
-+  /*
-+   * Take 4 off the memory block size to account for the reserved word at the start of
-+   * the block.
-+   */
-+  blocks_needed = count / (adev->memblocksize - 4);
-+  if (count % (adev->memblocksize - 4))
-+    blocks_needed++;
-+
-+  if (blocks_needed <= adev->acx_txbuf_blocks_free) {
-+    /*
-+     * Take blocks at the head of the free list.
-+     */
-+    last_block = block = adev->acx_txbuf_free;
-+
-+    /*
-+     * Follow block pointers through the requested number of blocks both to
-+     * find the new head of the free list and to set the flags for the blocks
-+     * appropriately.
-+     */
-+    while (blocks_needed--) {
-+      /*
-+       * Keep track of the last block of the allocation
-+       */
-+      last_block = adev->acx_txbuf_free;
-+
-+      /*
-+       * Make sure the end control flag is not set.
-+       */
-+      next = read_slavemem32 (adev, adev->acx_txbuf_free) & 0x7ffff;
-+      write_slavemem32 (adev, adev->acx_txbuf_free, next);
-+
-+      /*
-+       * Update the new head of the free list
-+       */
-+      adev->acx_txbuf_free = next << 5;
-+      adev->acx_txbuf_blocks_free--;
-+
-+    }
-+
-+    /*
-+     * Flag the last block both by clearing out the next pointer
-+     * and marking the control field.
-+     */
-+    write_slavemem32 (adev, last_block, 0x02000000);
-+
-+    /*
-+     * If we're out of buffers make sure the free list pointer is NULL
-+     */
-+    if (!adev->acx_txbuf_blocks_free) {
-+      adev->acx_txbuf_free = 0;
-+    }
-+  }
-+  else {
-+    block = 0;
-+  }
-+  spin_unlock_irqrestore (&adev->txbuf_lock, flags);
-+  return block;
-+}
-+
-+/*
-+ * Return buffer space back to the pool by following the next pointers until we find
-+ * the block marked as the end.  Point the last block to the head of the free list,
-+ * then update the head of the free list to point to the newly freed memory.
-+ * This routine gets called in interrupt context, so it shouldn't block to protect
-+ * the integrity of the linked list.  The ISR already holds the lock.
-+ */
-+void
-+reclaim_acx_txbuf_space (acx_device_t *adev, u32 blockptr) {
-+  u32 cur, last, next;
-+  unsigned long flags;
-+
-+  spin_lock_irqsave (&adev->txbuf_lock, flags);
-+  if ((blockptr >= adev->acx_txbuf_start) &&
-+      (blockptr <= adev->acx_txbuf_start +
-+       (adev->acx_txbuf_numblocks - 1) * adev->memblocksize)) {
-+    cur = blockptr;
-+    do {
-+      last = cur;
-+      next = read_slavemem32 (adev, cur);
-+      
-+      /*
-+       * Advance to the next block in this allocation
-+       */
-+      cur = (next & 0x7ffff) << 5;
-+      
-+      /*
-+       * This block now counts as free.
-+       */
-+      adev->acx_txbuf_blocks_free++;
-+    } while (!(next & 0x02000000));
-+    
-+    /*
-+     * last now points to the last block of that allocation.  Update the pointer
-+     * in that block to point to the free list and reset the free list to the
-+     * first block of the free call.  If there were no free blocks, make sure
-+     * the new end of the list marks itself as truly the end.
-+     */
-+    if (adev->acx_txbuf_free) {
-+      write_slavemem32 (adev, last, adev->acx_txbuf_free >> 5);
-+    }
-+    else {
-+      write_slavemem32 (adev, last, 0x02000000);
-+    }
-+    adev->acx_txbuf_free = blockptr;
-+  } 
-+  spin_unlock_irqrestore(&adev->txbuf_lock, flags);
-+}
-+
-+/*
-+ * Initialize the pieces managing the transmit buffer pool on the ACX.  The transmit
-+ * buffer is a circular queue with one 32 bit word reserved at the beginning of each
-+ * block.  The upper 13 bits are a control field, of which only 0x02000000 has any
-+ * meaning.  The lower 19 bits are the address of the next block divided by 32.
-+ */
-+void
-+init_acx_txbuf (acx_device_t *adev) {
-+  
-+  /*
-+   * acx100_s_init_memory_pools set up txbuf_start and txbuf_numblocks for us.
-+   * All we need to do is reset the rest of the bookeeping.
-+   */
-+  
-+  adev->acx_txbuf_free = adev->acx_txbuf_start;
-+  adev->acx_txbuf_blocks_free = adev->acx_txbuf_numblocks;
-+  
-+  /*
-+   * Initialization leaves the last transmit pool block without a pointer back to
-+   * the head of the list, but marked as the end of the list.  That's how we want
-+   * to see it, too, so leave it alone.  This is only ever called after a firmware
-+   * reset, so the ACX memory is in the state we want.
-+   */
-+      
-+}
-+
-+INLINE_IO int
-+adev_present(acx_device_t *adev)
-+{
-+      /* fast version (accesses the first register, IO_ACX_SOFT_RESET,
-+       * which should be safe): */
-+      return readl(adev->iobase) != 0xffffffff;
-+}
-+
-+/***********************************************************************
-+*/
-+static inline txdesc_t*
-+get_txdesc(acx_device_t *adev, int index)
-+{
-+      return (txdesc_t*) (((u8*)adev->txdesc_start) + index * adev->txdesc_size);
-+}
-+
-+static inline txdesc_t*
-+advance_txdesc(acx_device_t *adev, txdesc_t* txdesc, int inc)
-+{
-+      return (txdesc_t*) (((u8*)txdesc) + inc * adev->txdesc_size);
-+}
-+
-+static txhostdesc_t*
-+get_txhostdesc(acx_device_t *adev, txdesc_t* txdesc)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      index /= adev->txdesc_size;
-+      if (unlikely(ACX_DEBUG && (index >= TX_CNT))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      return &adev->txhostdesc_start[index*2];
-+}
-+
-+static inline client_t*
-+get_txc(acx_device_t *adev, txdesc_t* txdesc)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      index /= adev->txdesc_size;
-+      if (unlikely(ACX_DEBUG && (index >= TX_CNT))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      return adev->txc[index];
-+}
-+
-+static inline u16
-+get_txr(acx_device_t *adev, txdesc_t* txdesc)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      index /= adev->txdesc_size;
-+      return adev->txr[index];
-+}
-+
-+static inline void
-+put_txcr(acx_device_t *adev, txdesc_t* txdesc, client_t* c, u16 r111)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return;
-+      }
-+      index /= adev->txdesc_size;
-+      if (unlikely(ACX_DEBUG && (index >= TX_CNT))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return;
-+      }
-+      adev->txc[index] = c;
-+      adev->txr[index] = r111;
-+}
-+
-+
-+/***********************************************************************
-+** EEPROM and PHY read/write helpers
-+*/
-+/***********************************************************************
-+** acxmem_read_eeprom_byte
-+**
-+** Function called to read an octet in the EEPROM.
-+**
-+** This function is used by acxmem_e_probe to check if the
-+** connected card is a legal one or not.
-+**
-+** Arguments:
-+**    adev            ptr to acx_device structure
-+**    addr            address to read in the EEPROM
-+**    charbuf         ptr to a char. This is where the read octet
-+**                    will be stored
-+*/
-+int
-+acxmem_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf)
-+{
-+      int result;
-+      int count;
-+
-+      write_reg32(adev, IO_ACX_EEPROM_CFG, 0);
-+      write_reg32(adev, IO_ACX_EEPROM_ADDR, addr);
-+      write_flush(adev);
-+      write_reg32(adev, IO_ACX_EEPROM_CTL, 2);
-+
-+      count = 0xffff;
-+      while (read_reg16(adev, IO_ACX_EEPROM_CTL)) {
-+              /* scheduling away instead of CPU burning loop
-+               * doesn't seem to work here at all:
-+               * awful delay, sometimes also failure.
-+               * Doesn't matter anyway (only small delay). */
-+              if (unlikely(!--count)) {
-+                      printk("%s: timeout waiting for EEPROM read\n",
-+                                                      adev->ndev->name);
-+                      result = NOT_OK;
-+                      goto fail;
-+              }
-+              cpu_relax();
-+      }
-+
-+      *charbuf = read_reg8(adev, IO_ACX_EEPROM_DATA);
-+      log(L_DEBUG, "EEPROM at 0x%04X = 0x%02X\n", addr, *charbuf);
-+      result = OK;
-+
-+fail:
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** We don't lock hw accesses here since we never r/w eeprom in IRQ
-+** Note: this function sleeps only because of GFP_KERNEL alloc
-+*/
-+#ifdef UNUSED
-+int
-+acxmem_s_write_eeprom(acx_device_t *adev, u32 addr, u32 len, const u8 *charbuf)
-+{
-+      u8 *data_verify = NULL;
-+      unsigned long flags;
-+      int count, i;
-+      int result = NOT_OK;
-+      u16 gpio_orig;
-+
-+      printk("acx: WARNING! I would write to EEPROM now. "
-+              "Since I really DON'T want to unless you know "
-+              "what you're doing (THIS CODE WILL PROBABLY "
-+              "NOT WORK YET!), I will abort that now. And "
-+              "definitely make sure to make a "
-+              "/proc/driver/acx_wlan0_eeprom backup copy first!!! "
-+              "(the EEPROM content includes the PCI config header!! "
-+              "If you kill important stuff, then you WILL "
-+              "get in trouble and people DID get in trouble already)\n");
-+      return OK;
-+
-+      FN_ENTER;
-+
-+      data_verify = kmalloc(len, GFP_KERNEL);
-+      if (!data_verify) {
-+              goto end;
-+      }
-+
-+      /* first we need to enable the OE (EEPROM Output Enable) GPIO line
-+       * to be able to write to the EEPROM.
-+       * NOTE: an EEPROM writing success has been reported,
-+       * but you probably have to modify GPIO_OUT, too,
-+       * and you probably need to activate a different GPIO
-+       * line instead! */
-+      gpio_orig = read_reg16(adev, IO_ACX_GPIO_OE);
-+      write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig & ~1);
-+      write_flush(adev);
-+
-+      /* ok, now start writing the data out */
-+      for (i = 0; i < len; i++) {
-+              write_reg32(adev, IO_ACX_EEPROM_CFG, 0);
-+              write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i);
-+              write_reg32(adev, IO_ACX_EEPROM_DATA, *(charbuf + i));
-+              write_flush(adev);
-+              write_reg32(adev, IO_ACX_EEPROM_CTL, 1);
-+
-+              count = 0xffff;
-+              while (read_reg16(adev, IO_ACX_EEPROM_CTL)) {
-+                      if (unlikely(!--count)) {
-+                              printk("WARNING, DANGER!!! "
-+                                      "Timeout waiting for EEPROM write\n");
-+                              goto end;
-+                      }
-+                      cpu_relax();
-+              }
-+      }
-+
-+      /* disable EEPROM writing */
-+      write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig);
-+      write_flush(adev);
-+
-+      /* now start a verification run */
-+      for (i = 0; i < len; i++) {
-+              write_reg32(adev, IO_ACX_EEPROM_CFG, 0);
-+              write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i);
-+              write_flush(adev);
-+              write_reg32(adev, IO_ACX_EEPROM_CTL, 2);
-+
-+              count = 0xffff;
-+              while (read_reg16(adev, IO_ACX_EEPROM_CTL)) {
-+                      if (unlikely(!--count)) {
-+                              printk("timeout waiting for EEPROM read\n");
-+                              goto end;
-+                      }
-+                      cpu_relax();
-+              }
-+
-+              data_verify[i] = read_reg16(adev, IO_ACX_EEPROM_DATA);
-+      }
-+
-+      if (0 == memcmp(charbuf, data_verify, len))
-+              result = OK; /* read data matches, success */
-+
-+end:
-+      kfree(data_verify);
-+      FN_EXIT1(result);
-+      return result;
-+}
-+#endif /* UNUSED */
-+
-+
-+/***********************************************************************
-+** acxmem_s_read_phy_reg
-+**
-+** Messing with rx/tx disabling and enabling here
-+** (write_reg32(adev, IO_ACX_ENABLE, 0b000000xx)) kills traffic
-+*/
-+int
-+acxmem_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf)
-+{
-+      int result = NOT_OK;
-+      int count;
-+
-+      FN_ENTER;
-+
-+      write_reg32(adev, IO_ACX_PHY_ADDR, reg);
-+      write_flush(adev);
-+      write_reg32(adev, IO_ACX_PHY_CTL, 2);
-+
-+      count = 0xffff;
-+      while (read_reg32(adev, IO_ACX_PHY_CTL)) {
-+              /* scheduling away instead of CPU burning loop
-+               * doesn't seem to work here at all:
-+               * awful delay, sometimes also failure.
-+               * Doesn't matter anyway (only small delay). */
-+              if (unlikely(!--count)) {
-+                      printk("%s: timeout waiting for phy read\n",
-+                                                      adev->ndev->name);
-+                      *charbuf = 0;
-+                      goto fail;
-+              }
-+              cpu_relax();
-+      }
-+
-+      log(L_DEBUG, "count was %u\n", count);
-+      *charbuf = read_reg8(adev, IO_ACX_PHY_DATA);
-+
-+      log(L_DEBUG, "radio PHY at 0x%04X = 0x%02X\n", *charbuf, reg);
-+      result = OK;
-+      goto fail; /* silence compiler warning */
-+fail:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acxmem_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value)
-+{
-+        int count;
-+      FN_ENTER;
-+
-+      /* mprusko said that 32bit accesses result in distorted sensitivity
-+       * on his card. Unconfirmed, looks like it's not true (most likely since we
-+       * now properly flush writes). */
-+      write_reg32(adev, IO_ACX_PHY_DATA, value);
-+      write_reg32(adev, IO_ACX_PHY_ADDR, reg);
-+      write_flush(adev);
-+      write_reg32(adev, IO_ACX_PHY_CTL, 1);
-+      write_flush(adev);
-+
-+      count = 0xffff;
-+      while (read_reg32(adev, IO_ACX_PHY_CTL)) {
-+              /* scheduling away instead of CPU burning loop
-+               * doesn't seem to work here at all:
-+               * awful delay, sometimes also failure.
-+               * Doesn't matter anyway (only small delay). */
-+              if (unlikely(!--count)) {
-+                      printk("%s: timeout waiting for phy read\n",
-+                                                      adev->ndev->name);
-+                      goto fail;
-+              }
-+              cpu_relax();
-+      }
-+
-+      log(L_DEBUG, "radio PHY write 0x%02X at 0x%04X\n", value, reg);
-+ fail:
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+#define NO_AUTO_INCREMENT     1
-+
-+/***********************************************************************
-+** acxmem_s_write_fw
-+**
-+** Write the firmware image into the card.
-+**
-+** Arguments:
-+**    adev            wlan device structure
-+**    fw_image        firmware image.
-+**
-+** Returns:
-+**    1       firmware image corrupted
-+**    0       success
-+*/
-+static int
-+acxmem_s_write_fw(acx_device_t *adev, const firmware_image_t *fw_image, u32 offset)
-+{
-+      int len, size, checkMismatch = -1;
-+      u32 sum, v32, tmp, id;
-+      /* we skip the first four bytes which contain the control sum */
-+      const u8 *p = (u8*)fw_image + 4;
-+
-+      /* start the image checksum by adding the image size value */
-+      sum = p[0]+p[1]+p[2]+p[3];
-+      p += 4;
-+
-+#ifdef NOPE
-+#if NO_AUTO_INCREMENT
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */
-+#else
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */
-+      write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */
-+      write_flush(adev);
-+#endif
-+#endif
-+      len = 0;
-+      size = le32_to_cpu(fw_image->size) & (~3);
-+
-+      while (likely(len < size)) {
-+              v32 = be32_to_cpu(*(u32*)p);
-+              sum += p[0]+p[1]+p[2]+p[3];
-+              p += 4;
-+              len += 4;
-+
-+#ifdef NOPE
-+#if NO_AUTO_INCREMENT 
-+              write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4);
-+              write_flush(adev);
-+#endif
-+              write_reg32(adev, IO_ACX_SLV_MEM_DATA, v32);
-+              write_flush(adev);
-+#endif
-+              write_slavemem32 (adev, offset + len - 4, v32);
-+
-+              id = read_id_register (adev);
-+              
-+              /*
-+               * check the data written
-+               */
-+              tmp = read_slavemem32 (adev, offset + len - 4);
-+              if (checkMismatch && (tmp != v32)) {
-+                printk ("first data mismatch at 0x%08x good 0x%08x bad 0x%08x id 0x%08x\n",
-+                        offset + len - 4, v32, tmp, id);
-+                checkMismatch = 0;
-+              }
-+      }
-+      log(L_DEBUG, "firmware written, size:%d sum1:%x sum2:%x\n",
-+                      size, sum, le32_to_cpu(fw_image->chksum));
-+
-+      /* compare our checksum with the stored image checksum */
-+      return (sum != le32_to_cpu(fw_image->chksum));
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_validate_fw
-+**
-+** Compare the firmware image given with
-+** the firmware image written into the card.
-+**
-+** Arguments:
-+**    adev            wlan device structure
-+**    fw_image        firmware image.
-+**
-+** Returns:
-+**    NOT_OK  firmware image corrupted or not correctly written
-+**    OK      success
-+*/
-+static int
-+acxmem_s_validate_fw(acx_device_t *adev, const firmware_image_t *fw_image,
-+                              u32 offset)
-+{
-+      u32 sum, v32, w32;
-+      int len, size;
-+      int result = OK;
-+      /* we skip the first four bytes which contain the control sum */
-+      const u8 *p = (u8*)fw_image + 4;
-+
-+      /* start the image checksum by adding the image size value */
-+      sum = p[0]+p[1]+p[2]+p[3];
-+      p += 4;
-+
-+      write_reg32(adev, IO_ACX_SLV_END_CTL, 0);
-+
-+#if NO_AUTO_INCREMENT
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */
-+#else
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */
-+      write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */
-+#endif
-+
-+      len = 0;
-+      size = le32_to_cpu(fw_image->size) & (~3);
-+
-+      while (likely(len < size)) {
-+              v32 = be32_to_cpu(*(u32*)p);
-+              p += 4;
-+              len += 4;
-+
-+#ifdef NOPE
-+#if NO_AUTO_INCREMENT
-+              write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4);
-+#endif
-+              udelay(10);
-+              w32 = read_reg32(adev, IO_ACX_SLV_MEM_DATA);
-+#endif
-+              w32 = read_slavemem32 (adev, offset + len - 4);
-+
-+              if (unlikely(w32 != v32)) {
-+                      printk("acx: FATAL: firmware upload: "
-+                      "data parts at offset %d don't match\n(0x%08X vs. 0x%08X)!\n"
-+                      "I/O timing issues or defective memory, with DWL-xx0+? "
-+                      "ACX_IO_WIDTH=16 may help. Please report\n",
-+                              len, v32, w32);
-+                      result = NOT_OK;
-+                      break;
-+              }
-+
-+              sum += (u8)w32 + (u8)(w32>>8) + (u8)(w32>>16) + (u8)(w32>>24);
-+      }
-+
-+      /* sum control verification */
-+      if (result != NOT_OK) {
-+              if (sum != le32_to_cpu(fw_image->chksum)) {
-+                      printk("acx: FATAL: firmware upload: "
-+                              "checksums don't match!\n");
-+                      result = NOT_OK;
-+              }
-+      }
-+
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_upload_fw
-+**
-+** Called from acx_reset_dev
-+*/
-+static int
-+acxmem_s_upload_fw(acx_device_t *adev)
-+{
-+      firmware_image_t *fw_image = NULL;
-+      int res = NOT_OK;
-+      int try;
-+      u32 file_size;
-+      char *filename = "WLANGEN.BIN";
-+#ifdef PATCH_AROUND_BAD_SPOTS
-+      u32 offset;
-+      int i;
-+        /*
-+         * arm-linux-objdump -d patch.bin, or
-+         * od -Ax -t x4 patch.bin after finding the bounds
-+         * of the .text section with arm-linux-objdump -s patch.bin
-+         */
-+        u32 patch[] = {
-+        0xe584c030, 0xe59fc008,
-+        0xe92d1000, 0xe59fc004, 0xe8bd8000, 0x0000080c,
-+        0x0000aa68, 0x605a2200, 0x2c0a689c, 0x2414d80a,
-+        0x2f00689f, 0x1c27d007, 0x06241e7c, 0x2f000e24,
-+        0xe000d1f6, 0x602e6018, 0x23036468, 0x480203db,
-+        0x60ca6003, 0xbdf0750a, 0xffff0808
-+      };
-+#endif
-+
-+      FN_ENTER;
-+      /* No combined image; tell common we need the radio firmware, too */
-+      adev->need_radio_fw = 1;
-+
-+      fw_image = acx_s_read_fw(adev->dev, filename, &file_size);
-+      if (!fw_image) {
-+        FN_EXIT1(NOT_OK);
-+        return NOT_OK;
-+      }
-+
-+      for (try = 1; try <= 5; try++) {
-+              res = acxmem_s_write_fw(adev, fw_image, 0);
-+              log(L_DEBUG|L_INIT, "acx_write_fw (main): %d\n", res);
-+              if (OK == res) {
-+                      res = acxmem_s_validate_fw(adev, fw_image, 0);
-+                      log(L_DEBUG|L_INIT, "acx_validate_fw "
-+                                      "(main): %d\n", res);
-+              }
-+
-+              if (OK == res) {
-+                      SET_BIT(adev->dev_state_mask, ACX_STATE_FW_LOADED);
-+                      break;
-+              }
-+              printk("acx: firmware upload attempt #%d FAILED, "
-+                      "retrying...\n", try);
-+              acx_s_msleep(1000); /* better wait for a while... */
-+      }
-+
-+#ifdef PATCH_AROUND_BAD_SPOTS
-+      /*
-+       * Only want to do this if the firmware is exactly what we expect for an
-+       * iPaq 4700; otherwise, bad things would ensue.
-+       */
-+      if ((HX4700_FIRMWARE_CHECKSUM == fw_image->chksum) ||
-+          (HX4700_ALTERNATE_FIRMWARE_CHECKSUM == fw_image->chksum)) {
-+        /*
-+         * Put the patch after the main firmware image.  0x950c contains
-+         * the ACX's idea of the end of the firmware.  Use that location to
-+         * load ours (which depends on that location being 0xab58) then
-+         * update that location to point to after ours.
-+         */
-+
-+        offset = read_slavemem32 (adev, 0x950c);
-+        
-+        log (L_DEBUG, "acx: patching in at 0x%04x\n", offset);
-+
-+        for (i = 0; i < sizeof(patch) / sizeof(patch[0]); i++) {
-+          write_slavemem32 (adev, offset, patch[i]);
-+          offset += sizeof(u32);
-+        }
-+
-+        /*
-+         * Patch the instruction at 0x0804 to branch to our ARM patch at 0xab58
-+         */
-+        write_slavemem32 (adev, 0x0804, 0xea000000 + (0xab58-0x0804-8)/4);
-+
-+        /*
-+         * Patch the instructions at 0x1f40 to branch to our Thumb patch at 0xab74
-+         *
-+         * 4a00 ldr r2, [pc, #0]
-+         * 4710 bx  r2
-+         * .data 0xab74+1
-+         */
-+        write_slavemem32 (adev, 0x1f40, 0x47104a00);
-+        write_slavemem32 (adev, 0x1f44, 0x0000ab74+1);
-+
-+        /*
-+         * Bump the end of the firmware up to beyond our patch.
-+         */
-+        write_slavemem32 (adev, 0x950c, offset);
-+      
-+      }
-+#endif
-+
-+      vfree(fw_image);
-+
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_upload_radio
-+**
-+** Uploads the appropriate radio module firmware into the card.
-+*/
-+int
-+acxmem_s_upload_radio(acx_device_t *adev)
-+{
-+      acx_ie_memmap_t mm;
-+      firmware_image_t *radio_image;
-+      acx_cmd_radioinit_t radioinit;
-+      int res = NOT_OK;
-+      int try;
-+      u32 offset;
-+      u32 size;
-+      char filename[sizeof("RADIONN.BIN")];
-+
-+      if (!adev->need_radio_fw) return OK;
-+
-+      FN_ENTER;
-+
-+      acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP);
-+      offset = le32_to_cpu(mm.CodeEnd);
-+
-+      snprintf(filename, sizeof(filename), "RADIO%02x.BIN",
-+              adev->radio_type);
-+      radio_image = acx_s_read_fw(adev->dev, filename, &size);
-+      if (!radio_image) {
-+              printk("acx: can't load radio module '%s'\n", filename);
-+              goto fail;
-+      }
-+
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_SLEEP, NULL, 0);
-+
-+      for (try = 1; try <= 5; try++) {
-+              res = acxmem_s_write_fw(adev, radio_image, offset);
-+              log(L_DEBUG|L_INIT, "acx_write_fw (radio): %d\n", res);
-+              if (OK == res) {
-+                      res = acxmem_s_validate_fw(adev, radio_image, offset);
-+                      log(L_DEBUG|L_INIT, "acx_validate_fw (radio): %d\n", res);
-+              }
-+
-+              if (OK == res)
-+                      break;
-+              printk("acx: radio firmware upload attempt #%d FAILED, "
-+                      "retrying...\n", try);
-+              acx_s_msleep(1000); /* better wait for a while... */
-+      }
-+
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0);
-+      radioinit.offset = cpu_to_le32(offset);
-+
-+      /* no endian conversion needed, remains in card CPU area: */
-+      radioinit.len = radio_image->size;
-+
-+      vfree(radio_image);
-+
-+      if (OK != res)
-+              goto fail;
-+
-+      /* will take a moment so let's have a big timeout */
-+      acx_s_issue_cmd_timeo(adev, ACX1xx_CMD_RADIOINIT,
-+              &radioinit, sizeof(radioinit), CMD_TIMEOUT_MS(1000));
-+
-+      res = acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP);
-+
-+fail:
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+/***********************************************************************
-+** acxmem_l_reset_mac
-+**
-+** MAC will be reset
-+** Call context: reset_dev
-+*/
-+static void
-+acxmem_l_reset_mac(acx_device_t *adev)
-+{
-+  int count;
-+      FN_ENTER;
-+
-+      /* halt eCPU */
-+      set_regbits (adev, IO_ACX_ECPU_CTRL, 0x1);
-+
-+      /* now do soft reset of eCPU, set bit */
-+      set_regbits (adev, IO_ACX_SOFT_RESET, 0x1);
-+      log(L_DEBUG, "%s: enable soft reset...\n", __func__);
-+
-+      /* Windows driver sleeps here for a while with this sequence */
-+      for (count = 0; count < 200; count++) {
-+        udelay (50);
-+      }
-+
-+      /* now clear bit again: deassert eCPU reset */
-+      log(L_DEBUG, "%s: disable soft reset and go to init mode...\n", __func__);
-+      clear_regbits (adev, IO_ACX_SOFT_RESET, 0x1);
-+
-+      /* now start a burst read from initial EEPROM */
-+      set_regbits (adev, IO_ACX_EE_START, 0x1);
-+
-+      /*
-+       * Windows driver sleeps here for a while with this sequence
-+       */
-+      for (count = 0; count < 200; count++) {
-+        udelay (50);
-+      }
-+
-+      /* Windows driver writes 0x10000 to register 0x808 here */
-+      
-+      write_reg32 (adev, 0x808, 0x10000);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_verify_init
-+*/
-+static int
-+acxmem_s_verify_init(acx_device_t *adev)
-+{
-+      int result = NOT_OK;
-+      unsigned long timeout;
-+
-+      FN_ENTER;
-+
-+      timeout = jiffies + 2*HZ;
-+      for (;;) {
-+              u32 irqstat = read_reg32(adev, IO_ACX_IRQ_STATUS_NON_DES);
-+              if ((irqstat != 0xFFFFFFFF) && (irqstat & HOST_INT_FCS_THRESHOLD)) {
-+                      result = OK;
-+                      write_reg32(adev, IO_ACX_IRQ_ACK, HOST_INT_FCS_THRESHOLD);
-+                      break;
-+              }
-+              if (time_after(jiffies, timeout))
-+                      break;
-+              /* Init may take up to ~0.5 sec total */
-+              acx_s_msleep(50);
-+      }
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** A few low-level helpers
-+**
-+** Note: these functions are not protected by lock
-+** and thus are never allowed to be called from IRQ.
-+** Also they must not race with fw upload which uses same hw regs
-+*/
-+
-+/***********************************************************************
-+** acxmem_write_cmd_type_status
-+*/
-+
-+static inline void
-+acxmem_write_cmd_type_status(acx_device_t *adev, u16 type, u16 status)
-+{
-+  write_slavemem32 (adev, (u32) adev->cmd_area, type | (status << 16));
-+  write_flush(adev);
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_read_cmd_type_status
-+*/
-+static u32
-+acxmem_read_cmd_type_status(acx_device_t *adev)
-+{
-+      u32 cmd_type, cmd_status;
-+
-+      cmd_type = read_slavemem32 (adev, (u32) adev->cmd_area);
-+
-+      cmd_status = (cmd_type >> 16);
-+      cmd_type = (u16)cmd_type;
-+
-+      log(L_CTL, "cmd_type:%04X cmd_status:%04X [%s]\n",
-+              cmd_type, cmd_status,
-+              acx_cmd_status_str(cmd_status));
-+
-+      return cmd_status;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_reset_dev
-+**
-+** Arguments:
-+**    netdevice that contains the adev variable
-+** Returns:
-+**    NOT_OK on fail
-+**    OK on success
-+** Side effects:
-+**    device is hard reset
-+** Call context:
-+**    acxmem_e_probe
-+** Comment:
-+**    This resets the device using low level hardware calls
-+**    as well as uploads and verifies the firmware to the card
-+*/
-+
-+static inline void
-+init_mboxes(acx_device_t *adev)
-+{
-+      u32 cmd_offs, info_offs;
-+
-+      cmd_offs = read_reg32(adev, IO_ACX_CMD_MAILBOX_OFFS);
-+      info_offs = read_reg32(adev, IO_ACX_INFO_MAILBOX_OFFS);
-+      adev->cmd_area = (u8*) cmd_offs;
-+      adev->info_area = (u8*) info_offs;
-+      /*
-+      log(L_DEBUG, "iobase2=%p\n"
-+      */
-+      log( L_DEBUG, "cmd_mbox_offset=%X cmd_area=%p\n"
-+              "info_mbox_offset=%X info_area=%p\n",
-+              cmd_offs, adev->cmd_area,
-+              info_offs, adev->info_area);
-+}
-+
-+
-+static inline void
-+read_eeprom_area(acx_device_t *adev)
-+{
-+#if ACX_DEBUG > 1
-+      int offs;
-+      u8 tmp;
-+
-+      for (offs = 0x8c; offs < 0xb9; offs++)
-+              acxmem_read_eeprom_byte(adev, offs, &tmp);
-+#endif
-+}
-+
-+static int
-+acxmem_s_reset_dev(acx_device_t *adev)
-+{
-+      const char* msg = "";
-+      unsigned long flags;
-+      int result = NOT_OK;
-+      u16 hardware_info;
-+      u16 ecpu_ctrl;
-+      int count;
-+      u32 tmp;
-+
-+      FN_ENTER;
-+      /*
-+      write_reg32 (adev, IO_ACX_SLV_MEM_CP, 0);
-+      */
-+      /* reset the device to make sure the eCPU is stopped
-+       * to upload the firmware correctly */
-+
-+      acx_lock(adev, flags);
-+
-+      /* Windows driver does some funny things here */
-+      /*
-+       * clear bit 0x200 in register 0x2A0
-+       */
-+      clear_regbits (adev, 0x2A0, 0x200);
-+
-+      /*
-+       * Set bit 0x200 in ACX_GPIO_OUT
-+       */
-+      set_regbits (adev, IO_ACX_GPIO_OUT, 0x200);
-+
-+      /*
-+       * read register 0x900 until its value is 0x8400104C, sleeping
-+       * in between reads if it's not immediate
-+       */
-+      tmp = read_reg32 (adev, REG_ACX_VENDOR_ID);
-+      count = 500;
-+      while (count-- && (tmp != ACX_VENDOR_ID)) {
-+        mdelay (10);
-+        tmp = read_reg32 (adev, REG_ACX_VENDOR_ID);
-+      }
-+
-+      /* end what Windows driver does */
-+
-+      acxmem_l_reset_mac(adev);
-+
-+      ecpu_ctrl = read_reg32(adev, IO_ACX_ECPU_CTRL) & 1;
-+      if (!ecpu_ctrl) {
-+              msg = "eCPU is already running. ";
-+              goto end_unlock;
-+      }
-+
-+#ifdef WE_DONT_NEED_THAT_DO_WE
-+      if (read_reg16(adev, IO_ACX_SOR_CFG) & 2) {
-+              /* eCPU most likely means "embedded CPU" */
-+              msg = "eCPU did not start after boot from flash. ";
-+              goto end_unlock;
-+      }
-+
-+      /* check sense on reset flags */
-+      if (read_reg16(adev, IO_ACX_SOR_CFG) & 0x10) {
-+              printk("%s: eCPU did not start after boot (SOR), "
-+                      "is this fatal?\n", adev->ndev->name);
-+      }
-+#endif
-+      /* scan, if any, is stopped now, setting corresponding IRQ bit */
-+      adev->irq_status |= HOST_INT_SCAN_COMPLETE;
-+
-+      acx_unlock(adev, flags);
-+      
-+      /* need to know radio type before fw load */
-+      /* Need to wait for arrival of this information in a loop,
-+       * most probably since eCPU runs some init code from EEPROM
-+       * (started burst read in reset_mac()) which also
-+       * sets the radio type ID */
-+
-+      count = 0xffff;
-+      do {
-+              hardware_info = read_reg16(adev, IO_ACX_EEPROM_INFORMATION);
-+              if (!--count) {
-+                      msg = "eCPU didn't indicate radio type";
-+                      goto end_fail;
-+              }
-+              cpu_relax();
-+      } while (!(hardware_info & 0xff00)); /* radio type still zero? */
-+      printk("ACX radio type 0x%02x\n", (hardware_info >> 8) & 0xff);
-+      /* printk("DEBUG: count %d\n", count); */
-+      adev->form_factor = hardware_info & 0xff;
-+      adev->radio_type = hardware_info >> 8;
-+
-+      /* load the firmware */
-+      if (OK != acxmem_s_upload_fw(adev))
-+              goto end_fail;
-+
-+      /* acx_s_msleep(10);    this one really shouldn't be required */
-+
-+      /* now start eCPU by clearing bit */
-+      clear_regbits (adev, IO_ACX_ECPU_CTRL, 0x1);
-+      log(L_DEBUG, "booted eCPU up and waiting for completion...\n");
-+
-+      /* Windows driver clears bit 0x200 in register 0x2A0 here */
-+      clear_regbits (adev, 0x2A0, 0x200);
-+
-+      /* Windows driver sets bit 0x200 in ACX_GPIO_OUT here */
-+      set_regbits (adev, IO_ACX_GPIO_OUT, 0x200);
-+      /* wait for eCPU bootup */
-+      if (OK != acxmem_s_verify_init(adev)) {
-+              msg = "timeout waiting for eCPU. ";
-+              goto end_fail;
-+      }
-+      log(L_DEBUG, "eCPU has woken up, card is ready to be configured\n");
-+      init_mboxes(adev);
-+      acxmem_write_cmd_type_status(adev, ACX1xx_CMD_RESET, 0);
-+
-+      /* test that EEPROM is readable */
-+      read_eeprom_area(adev);
-+
-+      result = OK;
-+      goto end;
-+
-+/* Finish error message. Indicate which function failed */
-+end_unlock:
-+      acx_unlock(adev, flags);
-+end_fail:
-+      printk("acx: %sreset_dev() FAILED\n", msg);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_issue_cmd_timeo
-+**
-+** Sends command to fw, extract result
-+**
-+** NB: we do _not_ take lock inside, so be sure to not touch anything
-+** which may interfere with IRQ handler operation
-+**
-+** TODO: busy wait is a bit silly, so:
-+** 1) stop doing many iters - go to sleep after first
-+** 2) go to waitqueue based approach: wait, not poll!
-+*/
-+#undef FUNC
-+#define FUNC "issue_cmd"
-+
-+#if !ACX_DEBUG
-+int
-+acxmem_s_issue_cmd_timeo(
-+      acx_device_t *adev,
-+      unsigned int cmd,
-+      void *buffer,
-+      unsigned buflen,
-+      unsigned cmd_timeout)
-+{
-+#else
-+int
-+acxmem_s_issue_cmd_timeo_debug(
-+      acx_device_t *adev,
-+      unsigned cmd,
-+      void *buffer,
-+      unsigned buflen,
-+      unsigned cmd_timeout,
-+      const char* cmdstr)
-+{
-+      unsigned long start = jiffies;
-+#endif
-+      const char *devname;
-+      unsigned counter;
-+      u16 irqtype;
-+      int i, j;
-+      u8 *p;
-+      u16 cmd_status;
-+      unsigned long timeout;
-+
-+      FN_ENTER;
-+
-+      devname = adev->ndev->name;
-+      if (!devname || !devname[0] || devname[4]=='%')
-+              devname = "acx";
-+
-+      log(L_CTL, FUNC"(cmd:%s,buflen:%u,timeout:%ums,type:0x%04X)\n",
-+              cmdstr, buflen, cmd_timeout,
-+              buffer ? le16_to_cpu(((acx_ie_generic_t *)buffer)->type) : -1);
-+
-+      if (!(adev->dev_state_mask & ACX_STATE_FW_LOADED)) {
-+              printk("%s: "FUNC"(): firmware is not loaded yet, "
-+                      "cannot execute commands!\n", devname);
-+              goto bad;
-+      }
-+
-+      if ((acx_debug & L_DEBUG) && (cmd != ACX1xx_CMD_INTERROGATE)) {
-+              printk("input buffer (len=%u):\n", buflen);
-+              acx_dump_bytes(buffer, buflen);
-+      }
-+
-+      /* wait for firmware to become idle for our command submission */
-+      timeout = HZ/5;
-+      counter = (timeout * 1000 / HZ) - 1; /* in ms */
-+      timeout += jiffies;
-+      do {
-+              cmd_status = acxmem_read_cmd_type_status(adev);
-+              /* Test for IDLE state */
-+              if (!cmd_status)
-+                      break;
-+              if (counter % 8 == 0) {
-+                      if (time_after(jiffies, timeout)) {
-+                              counter = 0;
-+                              break;
-+                      }
-+                      /* we waited 8 iterations, no luck. Sleep 8 ms */
-+                      acx_s_msleep(8);
-+              }
-+      } while (likely(--counter));
-+
-+      if (!counter) {
-+              /* the card doesn't get idle, we're in trouble */
-+              printk("%s: "FUNC"(): cmd_status is not IDLE: 0x%04X!=0\n",
-+                      devname, cmd_status);
-+#if DUMP_IF_SLOW > 0
-+              dump_acxmem (adev, 0, 0x10000);
-+              panic ("not idle");
-+#endif
-+              goto bad;
-+      } else if (counter < 190) { /* if waited >10ms... */
-+              log(L_CTL|L_DEBUG, FUNC"(): waited for IDLE %dms. "
-+                      "Please report\n", 199 - counter);
-+      }
-+
-+      /* now write the parameters of the command if needed */
-+      if (buffer && buflen) {
-+              /* if it's an INTERROGATE command, just pass the length
-+               * of parameters to read, as data */
-+#if CMD_DISCOVERY
-+              if (cmd == ACX1xx_CMD_INTERROGATE)
-+                      memset_io(adev->cmd_area + 4, 0xAA, buflen);
-+#endif
-+              /*
-+               * slave memory version
-+               */
-+              copy_to_slavemem (adev, (u32) (adev->cmd_area + 4), buffer, 
-+                             (cmd == ACX1xx_CMD_INTERROGATE) ? 4 : buflen);
-+      }
-+      /* now write the actual command type */
-+      acxmem_write_cmd_type_status(adev, cmd, 0);
-+
-+      /* clear CMD_COMPLETE bit. can be set only by IRQ handler: */
-+      adev->irq_status &= ~HOST_INT_CMD_COMPLETE;
-+
-+      /* execute command */
-+      write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_CMD);
-+      write_flush(adev);
-+
-+      /* wait for firmware to process command */
-+
-+      /* Ensure nonzero and not too large timeout.
-+      ** Also converts e.g. 100->99, 200->199
-+      ** which is nice but not essential */
-+      cmd_timeout = (cmd_timeout-1) | 1;
-+      if (unlikely(cmd_timeout > 1199))
-+              cmd_timeout = 1199;
-+
-+      /* we schedule away sometimes (timeout can be large) */
-+      counter = cmd_timeout;
-+      timeout = jiffies + cmd_timeout * HZ / 1000;
-+      do {
-+              if (!adev->irqs_active) { /* IRQ disabled: poll */
-+                      irqtype = read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES);
-+                      if (irqtype & HOST_INT_CMD_COMPLETE) {
-+                              write_reg16(adev, IO_ACX_IRQ_ACK,
-+                                              HOST_INT_CMD_COMPLETE);
-+                              break;
-+                      }
-+              } else { /* Wait when IRQ will set the bit */
-+                      irqtype = adev->irq_status;
-+                      if (irqtype & HOST_INT_CMD_COMPLETE)
-+                              break;
-+              }
-+
-+              if (counter % 8 == 0) {
-+                      if (time_after(jiffies, timeout)) {
-+                              counter = 0;
-+                              break;
-+                      }
-+                      /* we waited 8 iterations, no luck. Sleep 8 ms */
-+                      acx_s_msleep(8);
-+              }
-+      } while (likely(--counter));
-+
-+      /* save state for debugging */
-+      cmd_status = acxmem_read_cmd_type_status(adev);
-+
-+      /* put the card in IDLE state */
-+      acxmem_write_cmd_type_status(adev, ACX1xx_CMD_RESET, 0);
-+
-+      if (!counter) { /* timed out! */
-+              printk("%s: "FUNC"(): timed out %s for CMD_COMPLETE. "
-+                      "irq bits:0x%04X irq_status:0x%04X timeout:%dms "
-+                      "cmd_status:%d (%s)\n",
-+                      devname, (adev->irqs_active) ? "waiting" : "polling",
-+                      irqtype, adev->irq_status, cmd_timeout,
-+                      cmd_status, acx_cmd_status_str(cmd_status));
-+              printk("%s: "FUNC"(): device irq status 0x%04x\n",
-+                     devname, read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES));
-+              printk("%s: "FUNC"(): IO_ACX_IRQ_MASK 0x%04x IO_ACX_FEMR 0x%04x\n",
-+                     devname,
-+                     read_reg16 (adev, IO_ACX_IRQ_MASK),
-+                     read_reg16 (adev, IO_ACX_FEMR));
-+              if (read_reg16 (adev, IO_ACX_IRQ_MASK) == 0xffff) {
-+                      printk ("acxmem: firmware probably hosed - reloading\n");
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+                      {
-+                              pm_message_t state;
-+                              /* acxmem_e_suspend (resume_pdev, state); */
-+                              acxmem_e_suspend (adev->ndev , state);
-+                      }
-+#else
-+                      acxmem_e_suspend (adev, 0);
-+#endif
-+                      {
-+                              resume_ndev = adev->ndev;
-+                              fw_resumer (NULL);
-+                      }
-+              }
-+
-+              goto bad;
-+      } else if (cmd_timeout - counter > 30) { /* if waited >30ms... */
-+              log(L_CTL|L_DEBUG, FUNC"(): %s for CMD_COMPLETE %dms. "
-+                      "count:%d. Please report\n",
-+                      (adev->irqs_active) ? "waited" : "polled",
-+                      cmd_timeout - counter, counter);
-+      }
-+
-+      if (1 != cmd_status) { /* it is not a 'Success' */
-+              printk("%s: "FUNC"(): cmd_status is not SUCCESS: %d (%s). "
-+                      "Took %dms of %d\n",
-+                      devname, cmd_status, acx_cmd_status_str(cmd_status),
-+                      cmd_timeout - counter, cmd_timeout);
-+              /* zero out result buffer
-+               * WARNING: this will trash stack in case of illegally large input
-+               * length! */
-+              if (buflen > 388) {
-+                /*
-+                 * 388 is maximum command length
-+                 */
-+                printk ("invalid length 0x%08x\n", buflen);
-+                buflen = 388;
-+              }
-+              p = (u8 *) buffer;
-+              for (i = 0; i < buflen; i+= 16) {
-+                printk ("%04x:", i);
-+                for (j = 0; (j < 16) && (i+j < buflen); j++) {
-+                  printk (" %02x", *p++);
-+                }
-+                printk ("\n");
-+              }
-+              if (buffer && buflen)
-+                      memset(buffer, 0, buflen);
-+              goto bad;
-+      }
-+
-+      /* read in result parameters if needed */
-+      if (buffer && buflen && (cmd == ACX1xx_CMD_INTERROGATE)) {
-+              copy_from_slavemem (adev, buffer, (u32) (adev->cmd_area + 4), buflen);
-+              if (acx_debug & L_DEBUG) {
-+                      printk("output buffer (len=%u): ", buflen);
-+                      acx_dump_bytes(buffer, buflen);
-+              }
-+      }
-+
-+/* ok: */
-+      log(L_CTL, FUNC"(%s): took %ld jiffies to complete\n",
-+                       cmdstr, jiffies - start);
-+      FN_EXIT1(OK);
-+      return OK;
-+
-+bad:
-+      /* Give enough info so that callers can avoid
-+      ** printing their own diagnostic messages */
-+#if ACX_DEBUG
-+      printk("%s: "FUNC"(cmd:%s) FAILED\n", devname, cmdstr);
-+#else
-+      printk("%s: "FUNC"(cmd:0x%04X) FAILED\n", devname, cmd);
-+#endif
-+      dump_stack();
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+#if defined(NONESSENTIAL_FEATURES)
-+typedef struct device_id {
-+      unsigned char id[6];
-+      char *descr;
-+      char *type;
-+} device_id_t;
-+
-+static const device_id_t
-+device_ids[] =
-+{
-+      {
-+              {'G', 'l', 'o', 'b', 'a', 'l'},
-+              NULL,
-+              NULL,
-+      },
-+      {
-+              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-+              "uninitialized",
-+              "SpeedStream SS1021 or Gigafast WF721-AEX"
-+      },
-+      {
-+              {0x80, 0x81, 0x82, 0x83, 0x84, 0x85},
-+              "non-standard",
-+              "DrayTek Vigor 520"
-+      },
-+      {
-+              {'?', '?', '?', '?', '?', '?'},
-+              "non-standard",
-+              "Level One WPC-0200"
-+      },
-+      {
-+              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-+              "empty",
-+              "DWL-650+ variant"
-+      }
-+};
-+
-+static void
-+acx_show_card_eeprom_id(acx_device_t *adev)
-+{
-+      unsigned char buffer[CARD_EEPROM_ID_SIZE];
-+      int i;
-+
-+      memset(&buffer, 0, CARD_EEPROM_ID_SIZE);
-+      /* use direct EEPROM access */
-+      for (i = 0; i < CARD_EEPROM_ID_SIZE; i++) {
-+              if (OK != acxmem_read_eeprom_byte(adev,
-+                                       ACX100_EEPROM_ID_OFFSET + i,
-+                                       &buffer[i])) {
-+                      printk("acx: reading EEPROM FAILED\n");
-+                      break;
-+              }
-+      }
-+
-+      for (i = 0; i < VEC_SIZE(device_ids); i++) {
-+              if (!memcmp(&buffer, device_ids[i].id, CARD_EEPROM_ID_SIZE)) {
-+                      if (device_ids[i].descr) {
-+                              printk("acx: EEPROM card ID string check "
-+                                      "found %s card ID: is this %s?\n",
-+                                      device_ids[i].descr, device_ids[i].type);
-+                      }
-+                      break;
-+              }
-+      }
-+      if (i == VEC_SIZE(device_ids)) {
-+              printk("acx: EEPROM card ID string check found "
-+                      "unknown card: expected 'Global', got '%.*s\'. "
-+                      "Please report\n", CARD_EEPROM_ID_SIZE, buffer);
-+      }
-+}
-+#endif /* NONESSENTIAL_FEATURES */
-+
-+/***********************************************************************
-+** acxmem_free_desc_queues
-+**
-+** Releases the queues that have been allocated, the
-+** others have been initialised to NULL so this
-+** function can be used if only part of the queues were allocated.
-+*/
-+
-+void
-+acxmem_free_desc_queues(acx_device_t *adev)
-+{
-+#define ACX_FREE_QUEUE(size, ptr, phyaddr) \
-+        if (ptr) { \
-+                kfree(ptr); \
-+                ptr = NULL; \
-+                size = 0; \
-+        }
-+
-+      FN_ENTER;
-+
-+      ACX_FREE_QUEUE(adev->txhostdesc_area_size, adev->txhostdesc_start, adev->txhostdesc_startphy);
-+      ACX_FREE_QUEUE(adev->txbuf_area_size, adev->txbuf_start, adev->txbuf_startphy);
-+
-+      adev->txdesc_start = NULL;
-+
-+      ACX_FREE_QUEUE(adev->rxhostdesc_area_size, adev->rxhostdesc_start, adev->rxhostdesc_startphy);
-+      ACX_FREE_QUEUE(adev->rxbuf_area_size, adev->rxbuf_start, adev->rxbuf_startphy);
-+
-+      adev->rxdesc_start = NULL;
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_delete_dma_regions
-+*/
-+static void
-+acxmem_s_delete_dma_regions(acx_device_t *adev)
-+{
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+      /* disable radio Tx/Rx. Shouldn't we use the firmware commands
-+       * here instead? Or are we that much down the road that it's no
-+       * longer possible here? */
-+      /*
-+       * slave memory interface really doesn't like this.
-+       */
-+      /*
-+      write_reg16(adev, IO_ACX_ENABLE, 0);
-+      */
-+
-+      acx_s_msleep(100);
-+
-+      acx_lock(adev, flags);
-+      acxmem_free_desc_queues(adev);
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_e_probe
-+**
-+** Probe routine called when a PCI device w/ matching ID is found.
-+** Here's the sequence:
-+**   - Allocate the PCI resources.
-+**   - Read the PCMCIA attribute memory to make sure we have a WLAN card
-+**   - Reset the MAC
-+**   - Initialize the dev and wlan data
-+**   - Initialize the MAC
-+**
-+** pdev       - ptr to pci device structure containing info about pci configuration
-+** id - ptr to the device id entry that matched this device
-+*/
-+static const u16
-+IO_ACX100[] =
-+{
-+      0x0000, /* IO_ACX_SOFT_RESET */
-+
-+      0x0014, /* IO_ACX_SLV_MEM_ADDR */
-+      0x0018, /* IO_ACX_SLV_MEM_DATA */
-+      0x001c, /* IO_ACX_SLV_MEM_CTL */
-+      0x0020, /* IO_ACX_SLV_END_CTL */
-+
-+      0x0034, /* IO_ACX_FEMR */
-+
-+      0x007c, /* IO_ACX_INT_TRIG */
-+      0x0098, /* IO_ACX_IRQ_MASK */
-+      0x00a4, /* IO_ACX_IRQ_STATUS_NON_DES */
-+      0x00a8, /* IO_ACX_IRQ_STATUS_CLEAR */
-+      0x00ac, /* IO_ACX_IRQ_ACK */
-+      0x00b0, /* IO_ACX_HINT_TRIG */
-+
-+      0x0104, /* IO_ACX_ENABLE */
-+
-+      0x0250, /* IO_ACX_EEPROM_CTL */
-+      0x0254, /* IO_ACX_EEPROM_ADDR */
-+      0x0258, /* IO_ACX_EEPROM_DATA */
-+      0x025c, /* IO_ACX_EEPROM_CFG */
-+
-+      0x0268, /* IO_ACX_PHY_ADDR */
-+      0x026c, /* IO_ACX_PHY_DATA */
-+      0x0270, /* IO_ACX_PHY_CTL */
-+
-+      0x0290, /* IO_ACX_GPIO_OE */
-+
-+      0x0298, /* IO_ACX_GPIO_OUT */
-+
-+      0x02a4, /* IO_ACX_CMD_MAILBOX_OFFS */
-+      0x02a8, /* IO_ACX_INFO_MAILBOX_OFFS */
-+      0x02ac, /* IO_ACX_EEPROM_INFORMATION */
-+
-+      0x02d0, /* IO_ACX_EE_START */
-+      0x02d4, /* IO_ACX_SOR_CFG */
-+      0x02d8 /* IO_ACX_ECPU_CTRL */
-+};
-+
-+static const u16
-+IO_ACX111[] =
-+{
-+      0x0000, /* IO_ACX_SOFT_RESET */
-+
-+      0x0014, /* IO_ACX_SLV_MEM_ADDR */
-+      0x0018, /* IO_ACX_SLV_MEM_DATA */
-+      0x001c, /* IO_ACX_SLV_MEM_CTL */
-+      0x0020, /* IO_ACX_SLV_MEM_CP */
-+
-+      0x0034, /* IO_ACX_FEMR */
-+
-+      0x00b4, /* IO_ACX_INT_TRIG */
-+      0x00d4, /* IO_ACX_IRQ_MASK */
-+      /* we do mean NON_DES (0xf0), not NON_DES_MASK which is at 0xe0: */
-+      0x00f0, /* IO_ACX_IRQ_STATUS_NON_DES */
-+      0x00e4, /* IO_ACX_IRQ_STATUS_CLEAR */
-+      0x00e8, /* IO_ACX_IRQ_ACK */
-+      0x00ec, /* IO_ACX_HINT_TRIG */
-+
-+      0x01d0, /* IO_ACX_ENABLE */
-+
-+      0x0338, /* IO_ACX_EEPROM_CTL */
-+      0x033c, /* IO_ACX_EEPROM_ADDR */
-+      0x0340, /* IO_ACX_EEPROM_DATA */
-+      0x0344, /* IO_ACX_EEPROM_CFG */
-+
-+      0x0350, /* IO_ACX_PHY_ADDR */
-+      0x0354, /* IO_ACX_PHY_DATA */
-+      0x0358, /* IO_ACX_PHY_CTL */
-+
-+      0x0374, /* IO_ACX_GPIO_OE */
-+
-+      0x037c, /* IO_ACX_GPIO_OUT */
-+
-+      0x0388, /* IO_ACX_CMD_MAILBOX_OFFS */
-+      0x038c, /* IO_ACX_INFO_MAILBOX_OFFS */
-+      0x0390, /* IO_ACX_EEPROM_INFORMATION */
-+
-+      0x0100, /* IO_ACX_EE_START */
-+      0x0104, /* IO_ACX_SOR_CFG */
-+      0x0108, /* IO_ACX_ECPU_CTRL */
-+};
-+
-+static void
-+dummy_netdev_init(struct net_device *ndev) {}
-+
-+/*
-+ * Most of the acx specific pieces of hardware reset.
-+ */
-+static int
-+acxmem_complete_hw_reset (acx_device_t *adev)
-+{
-+      acx111_ie_configoption_t co;
-+
-+      /* NB: read_reg() reads may return bogus data before reset_dev(),
-+       * since the firmware which directly controls large parts of the I/O
-+       * registers isn't initialized yet.
-+       * acx100 seems to be more affected than acx111 */
-+      if (OK != acxmem_s_reset_dev (adev))
-+        return -1;
-+
-+      if (IS_ACX100(adev)) {
-+              /* ACX100: configopt struct in cmd mailbox - directly after reset */
-+              copy_from_slavemem (adev, (u8*) &co, (u32) adev->cmd_area, sizeof (co));
-+      }
-+
-+      if (OK != acx_s_init_mac(adev))
-+        return -3;
-+
-+      if (IS_ACX111(adev)) {
-+              /* ACX111: configopt struct needs to be queried after full init */
-+              acx_s_interrogate(adev, &co, ACX111_IE_CONFIG_OPTIONS);
-+      }
-+
-+      /*
-+       * Set up transmit buffer administration
-+       */
-+      init_acx_txbuf (adev);
-+
-+      /*
-+       * Windows driver writes 0x01000000 to register 0x288, RADIO_CTL, if the form factor
-+       * is 3.  It also write protects the EEPROM by writing 1<<9 to GPIO_OUT
-+       */
-+      if (adev->form_factor == 3) {
-+        set_regbits (adev, 0x288, 0x01000000);
-+        set_regbits (adev, 0x298, 1<<9);
-+      }
-+
-+/* TODO: merge them into one function, they are called just once and are the same for pci & usb */
-+      if (OK != acxmem_read_eeprom_byte(adev, 0x05, &adev->eeprom_version))
-+        return -2;
-+
-+      acx_s_parse_configoption(adev, &co);
-+      acx_s_get_firmware_version(adev); /* needs to be after acx_s_init_mac() */
-+      acx_display_hardware_details(adev);
-+
-+      return 0;
-+}
-+
-+static int acx_init_netdev(struct net_device *ndev, struct device *dev, int base_addr, int addr_size, int irq)
-+{
-+      const char *chip_name;
-+      int result = -EIO;
-+      int err;
-+      u8 chip_type;
-+      acx_device_t *adev = NULL;
-+ 
-+      FN_ENTER;
-+
-+      /* FIXME: prism54 calls pci_set_mwi() here,
-+       * should we do/support the same? */
-+
-+      /* chiptype is u8 but id->driver_data is ulong
-+      ** Works for now (possible values are 1 and 2) */
-+      chip_type = CHIPTYPE_ACX100;
-+      /* acx100 and acx111 have different PCI memory regions */
-+      if (chip_type == CHIPTYPE_ACX100) {
-+              chip_name = "ACX100";
-+      } else if (chip_type == CHIPTYPE_ACX111) {
-+              chip_name = "ACX111";
-+      } else {
-+              printk("acx: unknown chip type 0x%04X\n", chip_type);
-+              goto fail_unknown_chiptype;
-+      }
-+
-+      printk("acx: found %s-based wireless network card\n", chip_name);
-+      log(L_ANY, "initial debug setting is 0x%04X\n", acx_debug);
-+
-+
-+      dev_set_drvdata(dev, ndev);
-+
-+      ether_setup(ndev);
-+
-+      ndev->irq = irq;
-+
-+      ndev->base_addr = base_addr;
-+printk (KERN_INFO "memwinbase=%lx memwinsize=%u\n",memwin.Base,memwin.Size);
-+      if (addr_size == 0 || ndev->irq == 0)
-+              goto fail_hw_params;
-+      ndev->open = &acxmem_e_open;
-+      ndev->stop = &acxmem_e_close;
-+      //pdev->dev.release = &acxmem_e_release;
-+      ndev->hard_start_xmit = &acx_i_start_xmit;
-+      ndev->get_stats = &acx_e_get_stats;
-+#if IW_HANDLER_VERSION <= 5
-+      ndev->get_wireless_stats = &acx_e_get_wireless_stats;
-+#endif
-+      ndev->wireless_handlers = (struct iw_handler_def *)&acx_ioctl_handler_def;
-+      ndev->set_multicast_list = &acxmem_i_set_multicast_list;
-+      ndev->tx_timeout = &acxmem_i_tx_timeout;
-+      ndev->change_mtu = &acx_e_change_mtu;
-+      ndev->watchdog_timeo = 4 * HZ;
-+
-+      adev = ndev2adev(ndev);
-+      spin_lock_init(&adev->lock);    /* initial state: unlocked */
-+      spin_lock_init(&adev->txbuf_lock);
-+      /* We do not start with downed sem: we want PARANOID_LOCKING to work */
-+      sema_init(&adev->sem, 1);       /* initial state: 1 (upped) */
-+      /* since nobody can see new netdev yet, we can as well
-+      ** just _presume_ that we're under sem (instead of actually taking it): */
-+      /* acx_sem_lock(adev); */
-+      adev->dev = dev;
-+      adev->ndev = ndev;
-+      adev->dev_type = DEVTYPE_MEM;
-+      adev->chip_type = chip_type;
-+      adev->chip_name = chip_name;
-+      adev->io = (CHIPTYPE_ACX100 == chip_type) ? IO_ACX100 : IO_ACX111;
-+      adev->membase = (volatile u32 *) ndev->base_addr;
-+      adev->iobase = (volatile u32 *) ioremap_nocache (ndev->base_addr, addr_size);
-+      /* to find crashes due to weird driver access
-+       * to unconfigured interface (ifup) */
-+      adev->mgmt_timer.function = (void (*)(unsigned long))0x0000dead;
-+
-+#if defined(NONESSENTIAL_FEATURES)
-+      acx_show_card_eeprom_id(adev);
-+#endif /* NONESSENTIAL_FEATURES */
-+
-+#ifdef SET_MODULE_OWNER
-+      SET_MODULE_OWNER(ndev);
-+#endif
-+      // need to fix that @@
-+      SET_NETDEV_DEV(ndev, dev);
-+
-+      log(L_IRQ|L_INIT, "using IRQ %d\n", ndev->irq);
-+
-+      /* ok, pci setup is finished, now start initializing the card */
-+
-+      if (OK != acxmem_complete_hw_reset (adev))
-+        goto fail_reset;
-+
-+      /*
-+       * Set up default things for most of the card settings.
-+       */
-+      acx_s_set_defaults(adev);
-+
-+      /* Register the card, AFTER everything else has been set up,
-+       * since otherwise an ioctl could step on our feet due to
-+       * firmware operations happening in parallel or uninitialized data */
-+      err = register_netdev(ndev);
-+      if (OK != err) {
-+              printk("acx: register_netdev() FAILED: %d\n", err);
-+              goto fail_register_netdev;
-+      }
-+
-+      acx_proc_register_entries(ndev);
-+
-+      /* Now we have our device, so make sure the kernel doesn't try
-+       * to send packets even though we're not associated to a network yet */
-+      acx_stop_queue(ndev, "on probe");
-+      acx_carrier_off(ndev, "on probe");
-+
-+      /*
-+       * Set up a default monitor type so that poor combinations of initialization
-+       * sequences in monitor mode don't end up destroying the hardware type.
-+       */
-+      adev->monitor_type = ARPHRD_ETHER;
-+
-+      /*
-+       * Register to receive inetaddr notifier changes.  This will allow us to
-+       * catch if the user changes the MAC address of the interface.
-+       */
-+      register_netdevice_notifier(&acx_netdev_notifier);
-+
-+      /* after register_netdev() userspace may start working with dev
-+       * (in particular, on other CPUs), we only need to up the sem */
-+      /* acx_sem_unlock(adev); */
-+
-+      printk("acx "ACX_RELEASE": net device %s, driver compiled "
-+              "against wireless extensions %d and Linux %s\n",
-+              ndev->name, WIRELESS_EXT, UTS_RELEASE);
-+
-+#if CMD_DISCOVERY
-+      great_inquisitor(adev);
-+#endif
-+
-+      result = OK;
-+      goto done;
-+
-+      /* error paths: undo everything in reverse order... */
-+
-+fail_register_netdev:
-+
-+      acxmem_s_delete_dma_regions(adev);
-+
-+fail_reset:
-+fail_hw_params:
-+      free_netdev(ndev);
-+fail_unknown_chiptype:
-+
-+
-+done:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_e_remove
-+**
-+** Shut device down (if not hot unplugged)
-+** and deallocate PCI resources for the acx chip.
-+**
-+** pdev - ptr to PCI device structure containing info about pci configuration
-+*/
-+static int __devexit
-+acxmem_e_remove(struct pcmcia_device *link)
-+{
-+      struct net_device *ndev;
-+      acx_device_t *adev;
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      ndev = ((local_info_t*)link->priv)->ndev;
-+      if (!ndev) {
-+              log(L_DEBUG, "%s: card is unused. Skipping any release code\n",
-+                      __func__);
-+              goto end;
-+      }
-+
-+      adev = ndev2adev(ndev);
-+
-+      /* If device wasn't hot unplugged... */
-+      if (adev_present(adev)) {
-+
-+              acx_sem_lock(adev);
-+
-+              /* disable both Tx and Rx to shut radio down properly */
-+              acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0);
-+              acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0);
-+
-+#ifdef REDUNDANT
-+              /* put the eCPU to sleep to save power
-+               * Halting is not possible currently,
-+               * since not supported by all firmware versions */
-+              acx_s_issue_cmd(adev, ACX100_CMD_SLEEP, NULL, 0);
-+#endif
-+              acx_lock(adev, flags);
-+
-+              /* disable power LED to save power :-) */
-+              log(L_INIT, "switching off power LED to save power\n");
-+              acxmem_l_power_led(adev, 0);
-+
-+              /* stop our eCPU */
-+              if (IS_ACX111(adev)) {
-+                      /* FIXME: does this actually keep halting the eCPU?
-+                       * I don't think so...
-+                       */
-+                      acxmem_l_reset_mac(adev);
-+              } else {
-+                      u16 temp;
-+
-+                      /* halt eCPU */
-+                      temp = read_reg16(adev, IO_ACX_ECPU_CTRL) | 0x1;
-+                      write_reg16(adev, IO_ACX_ECPU_CTRL, temp);
-+                      write_flush(adev);
-+              }
-+
-+              acx_unlock(adev, flags);
-+
-+              acx_sem_unlock(adev);
-+      }
-+
-+
-+      /*
-+       * Unregister the notifier chain
-+       */
-+      unregister_netdevice_notifier(&acx_netdev_notifier);
-+
-+      /* unregister the device to not let the kernel
-+       * (e.g. ioctls) access a half-deconfigured device
-+       * NB: this will cause acxmem_e_close() to be called,
-+       * thus we shouldn't call it under sem! */
-+      log(L_INIT, "removing device %s\n", ndev->name);
-+      unregister_netdev(ndev);
-+
-+      /* unregister_netdev ensures that no references to us left.
-+       * For paranoid reasons we continue to follow the rules */
-+      acx_sem_lock(adev);
-+
-+      if (adev->dev_state_mask & ACX_STATE_IFACE_UP) {
-+              acxmem_s_down(ndev);
-+              CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      }
-+
-+      acx_proc_unregister_entries(ndev);
-+
-+      acxmem_s_delete_dma_regions(adev);
-+
-+      /* finally, clean up PCI bus state */
-+      if (adev->iobase) iounmap((void *)adev->iobase);
-+
-+      acx_sem_unlock(adev);
-+
-+      /* Free netdev (quite late,
-+       * since otherwise we might get caught off-guard
-+       * by a netdev timeout handler execution
-+       * expecting to see a working dev...) */
-+      free_netdev(ndev);
-+
-+      printk ("e_remove done\n");
-+end:
-+      FN_EXIT0;
-+
-+      return 0;
-+}
-+
-+
-+/***********************************************************************
-+** TODO: PM code needs to be fixed / debugged / tested.
-+*/
-+#ifdef CONFIG_PM
-+static int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+acxmem_e_suspend( struct net_device *ndev, pm_message_t state)
-+#else
-+acxmem_e_suspend( struct net_device *ndev, u32 state)
-+#endif
-+{
-+      FN_ENTER;
-+      acx_device_t *adev;
-+      printk("acx: suspend handler is experimental!\n");
-+      printk("sus: dev %p\n", ndev);
-+
-+      if (!netif_running(ndev))
-+              goto end;
-+      // @@ need to get it from link or something like that
-+      adev = ndev2adev(ndev);
-+      printk("sus: adev %p\n", adev);
-+
-+      acx_sem_lock(adev);
-+
-+      netif_device_detach(adev->ndev);        /* this one cannot sleep */
-+      acxmem_s_down(adev->ndev);
-+      /* down() does not set it to 0xffff, but here we really want that */
-+      write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff);
-+      write_reg16(adev, IO_ACX_FEMR, 0x0);
-+      acxmem_s_delete_dma_regions(adev);
-+
-+      /*
-+       * Turn the ACX chip off.
-+       */
-+
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT0;
-+      return OK;
-+}
-+
-+
-+static void
-+fw_resumer(struct work_struct *notused)
-+{
-+      acx_device_t *adev;
-+      struct net_device *ndev = resume_ndev;
-+
-+      printk("acx: resume handler is experimental!\n");
-+      printk("rsm: got dev %p\n", ndev);
-+
-+      if (!netif_running(ndev))
-+              return;
-+
-+      adev = ndev2adev(ndev);
-+      printk("rsm: got adev %p\n", adev);
-+
-+      acx_sem_lock(adev);
-+
-+      /*
-+       * Turn on the ACX.
-+       */
-+
-+      acxmem_complete_hw_reset (adev);
-+
-+      /*
-+       * done by acx_s_set_defaults for initial startup
-+       */
-+      acxmem_set_interrupt_mask(adev);
-+
-+      printk ("rsm: bringing up interface\n");
-+      SET_BIT (adev->set_mask, GETSET_ALL);
-+      acxmem_s_up(ndev);
-+      printk("rsm: acx up done\n");
-+
-+      /* now even reload all card parameters as they were before suspend,
-+       * and possibly be back in the network again already :-) 
-+       */
-+      /* - most settings updated in acxmem_s_up()
-+      if (ACX_STATE_IFACE_UP & adev->dev_state_mask) {
-+              adev->set_mask = GETSET_ALL;
-+              acx_s_update_card_settings(adev);
-+              printk("rsm: settings updated\n");
-+      }
-+      */
-+      netif_device_attach(ndev);
-+      printk("rsm: device attached\n");
-+
-+      acx_sem_unlock(adev);
-+}
-+
-+DECLARE_WORK( fw_resume_work, fw_resumer );
-+
-+static int
-+acxmem_e_resume(struct pcmcia_device *link)
-+{
-+      FN_ENTER;
-+
-+      //resume_pdev = pdev;
-+      schedule_work( &fw_resume_work );
-+
-+      FN_EXIT0;
-+      return OK;
-+}
-+#endif /* CONFIG_PM */
-+
-+
-+/***********************************************************************
-+** acxmem_s_up
-+**
-+** This function is called by acxmem_e_open (when ifconfig sets the device as up)
-+**
-+** Side effects:
-+** - Enables on-card interrupt requests
-+** - calls acx_s_start
-+*/
-+
-+static void
-+enable_acx_irq(acx_device_t *adev)
-+{
-+      FN_ENTER;
-+      write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask);
-+      write_reg16(adev, IO_ACX_FEMR, 0x8000);
-+      adev->irqs_active = 1;
-+      FN_EXIT0;
-+}
-+
-+static void
-+acxmem_s_up(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+      enable_acx_irq(adev);
-+      acx_unlock(adev, flags);
-+
-+      /* acx fw < 1.9.3.e has a hardware timer, and older drivers
-+      ** used to use it. But we don't do that anymore, our OS
-+      ** has reliable software timers */
-+      init_timer(&adev->mgmt_timer);
-+      adev->mgmt_timer.function = acx_i_timer;
-+      adev->mgmt_timer.data = (unsigned long)adev;
-+
-+      /* Need to set ACX_STATE_IFACE_UP first, or else
-+      ** timer won't be started by acx_set_status() */
-+      SET_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+      case ACX_MODE_2_STA:
-+              /* actual scan cmd will happen in start() */
-+              acx_set_status(adev, ACX_STATUS_1_SCANNING); break;
-+      case ACX_MODE_3_AP:
-+      case ACX_MODE_MONITOR:
-+              acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); break;
-+      }
-+
-+      acx_s_start(adev);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_down
-+**
-+** This disables the netdevice
-+**
-+** Side effects:
-+** - disables on-card interrupt request
-+*/
-+
-+static void
-+disable_acx_irq(acx_device_t *adev)
-+{
-+      FN_ENTER;
-+
-+      /* I guess mask is not 0xffff because acx100 won't signal
-+      ** cmd completion then (needed for ifup).
-+      ** Someone with acx100 please confirm */
-+      write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask_off);
-+      write_reg16(adev, IO_ACX_FEMR, 0x0);
-+      adev->irqs_active = 0;
-+      FN_EXIT0;
-+}
-+
-+static void
-+acxmem_s_down(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      /* Disable IRQs first, so that IRQs cannot race with us */
-+      /* then wait until interrupts have finished executing on other CPUs */
-+      acx_lock(adev, flags);
-+      disable_acx_irq(adev);
-+      synchronize_irq(adev->pdev->irq);
-+      acx_unlock(adev, flags);
-+
-+      /* we really don't want to have an asynchronous tasklet disturb us
-+      ** after something vital for its job has been shut down, so
-+      ** end all remaining work now.
-+      **
-+      ** NB: carrier_off (done by set_status below) would lead to
-+      ** not yet fully understood deadlock in FLUSH_SCHEDULED_WORK().
-+      ** That's why we do FLUSH first.
-+      **
-+      ** NB2: we have a bad locking bug here: FLUSH_SCHEDULED_WORK()
-+      ** waits for acx_e_after_interrupt_task to complete if it is running
-+      ** on another CPU, but acx_e_after_interrupt_task
-+      ** will sleep on sem forever, because it is taken by us!
-+      ** Work around that by temporary sem unlock.
-+      ** This will fail miserably if we'll be hit by concurrent
-+      ** iwconfig or something in between. TODO! */
-+      acx_sem_unlock(adev);
-+      FLUSH_SCHEDULED_WORK();
-+      acx_sem_lock(adev);
-+
-+      /* This is possible:
-+      ** FLUSH_SCHEDULED_WORK -> acx_e_after_interrupt_task ->
-+      ** -> set_status(ASSOCIATED) -> wake_queue()
-+      ** That's why we stop queue _after_ FLUSH_SCHEDULED_WORK
-+      ** lock/unlock is just paranoia, maybe not needed */
-+      acx_lock(adev, flags);
-+      acx_stop_queue(ndev, "on ifdown");
-+      acx_set_status(adev, ACX_STATUS_0_STOPPED);
-+      acx_unlock(adev, flags);
-+
-+      /* kernel/timer.c says it's illegal to del_timer_sync()
-+      ** a timer which restarts itself. We guarantee this cannot
-+      ** ever happen because acx_i_timer() never does this if
-+      ** status is ACX_STATUS_0_STOPPED */
-+      del_timer_sync(&adev->mgmt_timer);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_e_open
-+**
-+** Called as a result of SIOCSIFFLAGS ioctl changing the flags bit IFF_UP
-+** from clear to set. In other words: ifconfig up.
-+**
-+** Returns:
-+**    0       success
-+**    >0      f/w reported error
-+**    <0      driver reported error
-+*/
-+static int
-+acxmem_e_open(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result = OK;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      acx_init_task_scheduler(adev);
-+
-+/* TODO: pci_set_power_state(pdev, PCI_D0); ? */
-+
-+#if 0
-+      /* request shared IRQ handler */
-+      if (request_irq(ndev->irq, acxmem_i_interrupt, SA_INTERRUPT, ndev->name, ndev)) {
-+              printk("%s: request_irq FAILED\n", ndev->name);
-+              result = -EAGAIN;
-+              goto done;
-+      }
-+      set_irq_type (ndev->irq, IRQT_FALLING);
-+      log(L_DEBUG|L_IRQ, "request_irq %d successful\n", ndev->irq);
-+#endif
-+
-+      /* ifup device */
-+      acxmem_s_up(ndev);
-+
-+      /* We don't currently have to do anything else.
-+       * The setup of the MAC should be subsequently completed via
-+       * the mlme commands.
-+       * Higher layers know we're ready from dev->start==1 and
-+       * dev->tbusy==0.  Our rx path knows to pass up received/
-+       * frames because of dev->flags&IFF_UP is true.
-+       */
-+done:
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_e_close
-+**
-+** Called as a result of SIOCSIIFFLAGS ioctl changing the flags bit IFF_UP
-+** from set to clear. I.e. called by "ifconfig DEV down"
-+**
-+** Returns:
-+**    0       success
-+**    >0      f/w reported error
-+**    <0      driver reported error
-+*/
-+static int
-+acxmem_e_close(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      /* ifdown device */
-+      CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      if (netif_device_present(ndev)) {
-+              acxmem_s_down(ndev);
-+      }
-+
-+      /* disable all IRQs, release shared IRQ handler */
-+      write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff);
-+      write_reg16(adev, IO_ACX_FEMR, 0x0);
-+      free_irq(ndev->irq, ndev);
-+
-+/* TODO: pci_set_power_state(pdev, PCI_D3hot); ? */
-+
-+      /* We currently don't have to do anything else.
-+       * Higher layers know we're not ready from dev->start==0 and
-+       * dev->tbusy==1.  Our rx path knows to not pass up received
-+       * frames because of dev->flags&IFF_UP is false.
-+       */
-+      acx_sem_unlock(adev);
-+
-+      log(L_INIT, "closed device\n");
-+      FN_EXIT0;
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_i_tx_timeout
-+**
-+** Called from network core. Must not sleep!
-+*/
-+static void
-+acxmem_i_tx_timeout(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      unsigned int tx_num_cleaned;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+
-+      /* clean processed tx descs, they may have been completely full */
-+      tx_num_cleaned = acxmem_l_clean_txdesc(adev);
-+
-+      /* nothing cleaned, yet (almost) no free buffers available?
-+       * --> clean all tx descs, no matter which status!!
-+       * Note that I strongly suspect that doing emergency cleaning
-+       * may confuse the firmware. This is a last ditch effort to get
-+       * ANYTHING to work again...
-+       *
-+       * TODO: it's best to simply reset & reinit hw from scratch...
-+       */
-+      if ((adev->tx_free <= TX_EMERG_CLEAN) && (tx_num_cleaned == 0)) {
-+              printk("%s: FAILED to free any of the many full tx buffers. "
-+                      "Switching to emergency freeing. "
-+                      "Please report!\n", ndev->name);
-+              acxmem_l_clean_txdesc_emergency(adev);
-+      }
-+
-+      if (acx_queue_stopped(ndev) && (ACX_STATUS_4_ASSOCIATED == adev->status))
-+              acx_wake_queue(ndev, "after tx timeout");
-+
-+      /* stall may have happened due to radio drift, so recalib radio */
-+      acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB);
-+
-+      /* do unimportant work last */
-+      printk("%s: tx timeout!\n", ndev->name);
-+      adev->stats.tx_errors++;
-+
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_i_set_multicast_list
-+** FIXME: most likely needs refinement
-+*/
-+static void
-+acxmem_i_set_multicast_list(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+
-+      /* firmwares don't have allmulti capability,
-+       * so just use promiscuous mode instead in this case. */
-+      if (ndev->flags & (IFF_PROMISC|IFF_ALLMULTI)) {
-+              SET_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS);
-+              CLEAR_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI);
-+              SET_BIT(adev->set_mask, SET_RXCONFIG);
-+              /* let kernel know in case *we* needed to set promiscuous */
-+              ndev->flags |= (IFF_PROMISC|IFF_ALLMULTI);
-+      } else {
-+              CLEAR_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS);
-+              SET_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI);
-+              SET_BIT(adev->set_mask, SET_RXCONFIG);
-+              ndev->flags &= ~(IFF_PROMISC|IFF_ALLMULTI);
-+      }
-+
-+      /* cannot update card settings directly here, atomic context */
-+      acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG);
-+
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_l_process_rxdesc
-+**
-+** Called directly and only from the IRQ handler
-+*/
-+
-+#if !ACX_DEBUG
-+static inline void log_rxbuffer(const acx_device_t *adev) {}
-+#else
-+static void
-+log_rxbuffer(const acx_device_t *adev)
-+{
-+      register const struct rxhostdesc *rxhostdesc;
-+      int i;
-+      /* no FN_ENTER here, we don't want that */
-+
-+      rxhostdesc = adev->rxhostdesc_start;
-+      if (unlikely(!rxhostdesc)) return;
-+      for (i = 0; i < RX_CNT; i++) {
-+              if ((rxhostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN))
-+               && (rxhostdesc->Status & cpu_to_le32(DESC_STATUS_FULL)))
-+                      printk("rx: buf %d full\n", i);
-+              rxhostdesc++;
-+      }
-+}
-+#endif
-+
-+static void
-+acxmem_l_process_rxdesc(acx_device_t *adev)
-+{
-+      register rxhostdesc_t *hostdesc;
-+      register rxdesc_t *rxdesc;
-+      unsigned count, tail;
-+      u32 addr;
-+      u8 Ctl_8;
-+
-+      FN_ENTER;
-+
-+      if (unlikely(acx_debug & L_BUFR))
-+              log_rxbuffer(adev);
-+
-+      /* First, have a loop to determine the first descriptor that's
-+       * full, just in case there's a mismatch between our current
-+       * rx_tail and the full descriptor we're supposed to handle. */
-+      tail = adev->rx_tail;
-+      count = RX_CNT;
-+      while (1) {
-+              hostdesc = &adev->rxhostdesc_start[tail];
-+              rxdesc = &adev->rxdesc_start[tail];
-+              /* advance tail regardless of outcome of the below test */
-+              tail = (tail + 1) % RX_CNT;
-+
-+              /*
-+               * Unlike the PCI interface, where the ACX can write directly to
-+               * the host descriptors, on the slave memory interface we have to
-+               * pull these.  All we really need to do is check the Ctl_8 field
-+               * in the rx descriptor on the ACX, which should be 0x11000000 if
-+               * we should process it.
-+               */
-+              Ctl_8 = hostdesc->Ctl_16 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8));
-+                if ((Ctl_8 & DESC_CTL_HOSTOWN) &&
-+                  (Ctl_8 & DESC_CTL_ACXDONE))
-+                break;                /* found it! */
-+
-+              if (unlikely(!--count)) /* hmm, no luck: all descs empty, bail out */
-+                      goto end;
-+      }
-+
-+      /* now process descriptors, starting with the first we figured out */
-+      while (1) {
-+              log(L_BUFR, "rx: tail=%u Ctl_8=%02X\n", tail, Ctl_8);
-+              /*
-+               * If the ACX has CTL_RECLAIM set on this descriptor there
-+               * is no buffer associated; it just wants us to tell it to
-+               * reclaim the memory.
-+               */
-+              if (!(Ctl_8 & DESC_CTL_RECLAIM)) {
-+
-+                /*
-+               * slave interface - pull data now
-+               */
-+              hostdesc->length = read_slavemem16 (adev, (u32) &(rxdesc->total_length));
-+
-+              /*
-+               * hostdesc->data is an rxbuffer_t, which includes header information,
-+               * but the length in the data packet doesn't.  The header information
-+               * takes up an additional 12 bytes, so add that to the length we copy.
-+               */
-+              addr = read_slavemem32 (adev, (u32) &(rxdesc->ACXMemPtr));
-+                if (addr) {
-+                  /*
-+                   * How can &(rxdesc->ACXMemPtr) above ever be zero?  Looks like we
-+                   * get that now and then - try to trap it for debug.
-+                   */
-+                  if (addr & 0xffff0000) {
-+                    printk("rxdesc 0x%08x\n", (u32) rxdesc);
-+                    dump_acxmem (adev, 0, 0x10000);
-+                    panic ("Bad access!");
-+                  }
-+                chaincopy_from_slavemem (adev, (u8 *) hostdesc->data, addr,
-+                                         hostdesc->length +
-+                                         (u32) &((rxbuffer_t *)0)->hdr_a3);
-+              acx_l_process_rxbuf(adev, hostdesc->data);
-+                }
-+              }
-+              else {
-+                printk ("rx reclaim only!\n");
-+              }
-+
-+              hostdesc->Status = 0;
-+
-+              /*
-+               * Let the ACX know we're done.
-+               */
-+              CLEAR_BIT (Ctl_8, DESC_CTL_HOSTOWN);
-+                SET_BIT (Ctl_8, DESC_CTL_HOSTDONE);
-+              SET_BIT (Ctl_8, DESC_CTL_RECLAIM);
-+              write_slavemem8 (adev, (u32) &rxdesc->Ctl_8, Ctl_8);
-+
-+              /*
-+               * Now tell the ACX we've finished with the receive buffer so 
-+               * it can finish the reclaim.
-+               */
-+              write_reg16 (adev, IO_ACX_INT_TRIG, INT_TRIG_RXPRC);
-+
-+              /* ok, descriptor is handled, now check the next descriptor */
-+              hostdesc = &adev->rxhostdesc_start[tail];
-+              rxdesc = &adev->rxdesc_start[tail];
-+
-+              Ctl_8 = hostdesc->Ctl_16 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8));
-+
-+              /* if next descriptor is empty, then bail out */
-+              if (!(Ctl_8 & DESC_CTL_HOSTOWN) || !(Ctl_8 & DESC_CTL_ACXDONE))
-+                      break;
-+
-+              tail = (tail + 1) % RX_CNT;
-+      }
-+end:
-+      adev->rx_tail = tail;
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_i_interrupt
-+**
-+** IRQ handler (atomic context, must not sleep, blah, blah)
-+*/
-+
-+/* scan is complete. all frames now on the receive queue are valid */
-+#define INFO_SCAN_COMPLETE      0x0001
-+#define INFO_WEP_KEY_NOT_FOUND  0x0002
-+/* hw has been reset as the result of a watchdog timer timeout */
-+#define INFO_WATCH_DOG_RESET    0x0003
-+/* failed to send out NULL frame from PS mode notification to AP */
-+/* recommended action: try entering 802.11 PS mode again */
-+#define INFO_PS_FAIL            0x0004
-+/* encryption/decryption process on a packet failed */
-+#define INFO_IV_ICV_FAILURE     0x0005
-+
-+/* Info mailbox format:
-+2 bytes: type
-+2 bytes: status
-+more bytes may follow
-+    rumors say about status:
-+      0x0000 info available (set by hw)
-+      0x0001 information received (must be set by host)
-+      0x1000 info available, mailbox overflowed (messages lost) (set by hw)
-+    but in practice we've seen:
-+      0x9000 when we did not set status to 0x0001 on prev message
-+      0x1001 when we did set it
-+      0x0000 was never seen
-+    conclusion: this is really a bitfield:
-+    0x1000 is 'info available' bit
-+    'mailbox overflowed' bit is 0x8000, not 0x1000
-+    value of 0x0000 probably means that there are no messages at all
-+    P.S. I dunno how in hell hw is supposed to notice that messages are lost -
-+    it does NOT clear bit 0x0001, and this bit will probably stay forever set
-+    after we set it once. Let's hope this will be fixed in firmware someday
-+*/
-+
-+static void
-+handle_info_irq(acx_device_t *adev)
-+{
-+#if ACX_DEBUG
-+      static const char * const info_type_msg[] = {
-+              "(unknown)",
-+              "scan complete",
-+              "WEP key not found",
-+              "internal watchdog reset was done",
-+              "failed to send powersave (NULL frame) notification to AP",
-+              "encrypt/decrypt on a packet has failed",
-+              "TKIP tx keys disabled",
-+              "TKIP rx keys disabled",
-+              "TKIP rx: key ID not found",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "TKIP IV value exceeds thresh"
-+      };
-+#endif
-+      u32 info_type, info_status;
-+
-+      info_type = read_slavemem32 (adev, (u32) adev->info_area);
-+
-+      info_status = (info_type >> 16);
-+      info_type = (u16)info_type;
-+
-+      /* inform fw that we have read this info message */
-+      write_slavemem32(adev, (u32) adev->info_area, info_type | 0x00010000);
-+      write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_INFOACK);
-+      write_flush(adev);
-+
-+      log(L_CTL, "info_type:%04X info_status:%04X\n",
-+                      info_type, info_status);
-+
-+      log(L_IRQ, "got Info IRQ: status %04X type %04X: %s\n",
-+              info_status, info_type,
-+              info_type_msg[(info_type >= VEC_SIZE(info_type_msg)) ?
-+                              0 : info_type]
-+      );
-+}
-+
-+
-+static void
-+log_unusual_irq(u16 irqtype) {
-+      /*
-+      if (!printk_ratelimit())
-+              return;
-+      */
-+
-+      printk("acx: got");
-+      if (irqtype & HOST_INT_TX_XFER) {
-+              printk(" Tx_Xfer");
-+      }
-+      if (irqtype & HOST_INT_RX_COMPLETE) {
-+              printk(" Rx_Complete");
-+      }
-+      if (irqtype & HOST_INT_DTIM) {
-+              printk(" DTIM");
-+      }
-+      if (irqtype & HOST_INT_BEACON) {
-+              printk(" Beacon");
-+      }
-+      if (irqtype & HOST_INT_TIMER) {
-+              log(L_IRQ, " Timer");
-+      }
-+      if (irqtype & HOST_INT_KEY_NOT_FOUND) {
-+              printk(" Key_Not_Found");
-+      }
-+      if (irqtype & HOST_INT_IV_ICV_FAILURE) {
-+              printk(" IV_ICV_Failure (crypto)");
-+      }
-+              /* HOST_INT_CMD_COMPLETE  */
-+              /* HOST_INT_INFO          */
-+      if (irqtype & HOST_INT_OVERFLOW) {
-+              printk(" Overflow");
-+      }
-+      if (irqtype & HOST_INT_PROCESS_ERROR) {
-+              printk(" Process_Error");
-+      }
-+              /* HOST_INT_SCAN_COMPLETE */
-+      if (irqtype & HOST_INT_FCS_THRESHOLD) {
-+              printk(" FCS_Threshold");
-+      }
-+      if (irqtype & HOST_INT_UNKNOWN) {
-+              printk(" Unknown");
-+      }
-+      printk(" IRQ(s)\n");
-+}
-+
-+
-+static void
-+update_link_quality_led(acx_device_t *adev)
-+{
-+      int qual;
-+
-+      qual = acx_signal_determine_quality(adev->wstats.qual.level, adev->wstats.qual.noise);
-+      if (qual > adev->brange_max_quality)
-+              qual = adev->brange_max_quality;
-+
-+      if (time_after(jiffies, adev->brange_time_last_state_change +
-+                              (HZ/2 - HZ/2 * (unsigned long)qual / adev->brange_max_quality ) )) {
-+              acxmem_l_power_led(adev, (adev->brange_last_state == 0));
-+              adev->brange_last_state ^= 1; /* toggle */
-+              adev->brange_time_last_state_change = jiffies;
-+      }
-+}
-+
-+
-+#define MAX_IRQLOOPS_PER_JIFFY  (20000/HZ) /* a la orinoco.c */
-+
-+static irqreturn_t
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
-+acxmem_i_interrupt(int irq, void *dev_id)
-+#else
-+acxmwm_i_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+#endif
-+{
-+      acx_device_t *adev;
-+      unsigned long flags;
-+      unsigned int irqcount = MAX_IRQLOOPS_PER_JIFFY;
-+      register u16 irqtype;
-+      u16 unmasked;
-+
-+      adev = ndev2adev((struct net_device*)dev_id);
-+
-+      /* LOCKING: can just spin_lock() since IRQs are disabled anyway.
-+       * I am paranoid */
-+      acx_lock(adev, flags);
-+
-+      unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR);
-+      if (unlikely(0xffff == unmasked)) {
-+              /* 0xffff value hints at missing hardware,
-+               * so don't do anything.
-+               * Not very clean, but other drivers do the same... */
-+              log(L_IRQ, "IRQ type:FFFF - device removed? IRQ_NONE\n");
-+              goto none;
-+      }
-+
-+      /* We will check only "interesting" IRQ types */
-+      irqtype = unmasked & ~adev->irq_mask;
-+      if (!irqtype) {
-+              /* We are on a shared IRQ line and it wasn't our IRQ */
-+              log(L_IRQ, "IRQ type:%04X, mask:%04X - all are masked, IRQ_NONE\n",
-+                      unmasked, adev->irq_mask);
-+              goto none;
-+      }
-+
-+      /* Done here because IRQ_NONEs taking three lines of log
-+      ** drive me crazy */
-+      FN_ENTER;
-+
-+#define IRQ_ITERATE 1
-+#if IRQ_ITERATE
-+if (jiffies != adev->irq_last_jiffies) {
-+      adev->irq_loops_this_jiffy = 0;
-+      adev->irq_last_jiffies = jiffies;
-+}
-+
-+/* safety condition; we'll normally abort loop below
-+ * in case no IRQ type occurred */
-+while (likely(--irqcount)) {
-+#endif
-+      /* ACK all IRQs ASAP */
-+      write_reg16(adev, IO_ACX_IRQ_ACK, 0xffff);
-+
-+      log(L_IRQ, "IRQ type:%04X, mask:%04X, type & ~mask:%04X\n",
-+                              unmasked, adev->irq_mask, irqtype);
-+
-+      /* Handle most important IRQ types first */
-+      if (irqtype & HOST_INT_RX_DATA) {
-+              log(L_IRQ, "got Rx_Data IRQ\n");
-+              acxmem_l_process_rxdesc(adev);
-+      }
-+      if (irqtype & HOST_INT_TX_COMPLETE) {
-+              log(L_IRQ, "got Tx_Complete IRQ\n");
-+              /* don't clean up on each Tx complete, wait a bit
-+               * unless we're going towards full, in which case
-+               * we do it immediately, too (otherwise we might lockup
-+               * with a full Tx buffer if we go into
-+               * acxmem_l_clean_txdesc() at a time when we won't wakeup
-+               * the net queue in there for some reason...) */
-+              if (adev->tx_free <= TX_START_CLEAN) {
-+#if TX_CLEANUP_IN_SOFTIRQ
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_TX_CLEANUP);
-+#else
-+                      acxmem_l_clean_txdesc(adev);
-+#endif
-+              }
-+      }
-+
-+      /* Less frequent ones */
-+      if (irqtype & (0
-+              | HOST_INT_CMD_COMPLETE
-+              | HOST_INT_INFO
-+              | HOST_INT_SCAN_COMPLETE
-+      )) {
-+              if (irqtype & HOST_INT_CMD_COMPLETE) {
-+                      log(L_IRQ, "got Command_Complete IRQ\n");
-+                      /* save the state for the running issue_cmd() */
-+                      SET_BIT(adev->irq_status, HOST_INT_CMD_COMPLETE);
-+              }
-+              if (irqtype & HOST_INT_INFO) {
-+                      handle_info_irq(adev);
-+              }
-+              if (irqtype & HOST_INT_SCAN_COMPLETE) {
-+                      log(L_IRQ, "got Scan_Complete IRQ\n");
-+                      /* need to do that in process context */
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_COMPLETE_SCAN);
-+                      /* remember that fw is not scanning anymore */
-+                      SET_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE);
-+              }
-+      }
-+
-+      /* These we just log, but either they happen rarely
-+       * or we keep them masked out */
-+      if (irqtype & (0
-+              /* | HOST_INT_RX_DATA */
-+              /* | HOST_INT_TX_COMPLETE   */
-+              | HOST_INT_TX_XFER
-+              | HOST_INT_RX_COMPLETE
-+              | HOST_INT_DTIM
-+              | HOST_INT_BEACON
-+              | HOST_INT_TIMER
-+              | HOST_INT_KEY_NOT_FOUND
-+              | HOST_INT_IV_ICV_FAILURE
-+              /* | HOST_INT_CMD_COMPLETE  */
-+              /* | HOST_INT_INFO          */
-+              | HOST_INT_OVERFLOW
-+              | HOST_INT_PROCESS_ERROR
-+              /* | HOST_INT_SCAN_COMPLETE */
-+              | HOST_INT_FCS_THRESHOLD
-+              | HOST_INT_UNKNOWN
-+      )) {
-+              log_unusual_irq(irqtype);
-+      }
-+
-+#if IRQ_ITERATE
-+      unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR);
-+      irqtype = unmasked & ~adev->irq_mask;
-+      /* Bail out if no new IRQ bits or if all are masked out */
-+      if (!irqtype)
-+              break;
-+
-+      if (unlikely(++adev->irq_loops_this_jiffy > MAX_IRQLOOPS_PER_JIFFY)) {
-+              printk(KERN_ERR "acx: too many interrupts per jiffy!\n");
-+              /* Looks like card floods us with IRQs! Try to stop that */
-+              write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff);
-+              /* This will short-circuit all future attempts to handle IRQ.
-+               * We cant do much more... */
-+              adev->irq_mask = 0;
-+              break;
-+      }
-+}
-+#endif
-+      /* Routine to perform blink with range */
-+      if (unlikely(adev->led_power == 2))
-+              update_link_quality_led(adev);
-+
-+/* handled: */
-+      /* write_flush(adev); - not needed, last op was read anyway */
-+      acx_unlock(adev, flags);
-+      FN_EXIT0;
-+      return IRQ_HANDLED;
-+
-+none:
-+      acx_unlock(adev, flags);
-+      return IRQ_NONE;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_l_power_led
-+*/
-+void
-+acxmem_l_power_led(acx_device_t *adev, int enable)
-+{
-+      u16 gpio_pled = IS_ACX111(adev) ? 0x0040 : 0x0800;
-+
-+      /* A hack. Not moving message rate limiting to adev->xxx
-+       * (it's only a debug message after all) */
-+      static int rate_limit = 0;
-+
-+      if (rate_limit++ < 3)
-+              log(L_IOCTL, "Please report in case toggling the power "
-+                              "LED doesn't work for your card!\n");
-+      if (enable)
-+              write_reg16(adev, IO_ACX_GPIO_OUT,
-+                      read_reg16(adev, IO_ACX_GPIO_OUT) & ~gpio_pled);
-+      else
-+              write_reg16(adev, IO_ACX_GPIO_OUT,
-+                      read_reg16(adev, IO_ACX_GPIO_OUT) | gpio_pled);
-+}
-+
-+
-+/***********************************************************************
-+** Ioctls
-+*/
-+
-+/***********************************************************************
-+*/
-+int
-+acx111pci_ioctl_info(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra)
-+{
-+#if ACX_DEBUG > 1
-+      acx_device_t *adev = ndev2adev(ndev);
-+      rxdesc_t *rxdesc;
-+      txdesc_t *txdesc;
-+      rxhostdesc_t *rxhostdesc;
-+      txhostdesc_t *txhostdesc;
-+      struct acx111_ie_memoryconfig memconf;
-+      struct acx111_ie_queueconfig queueconf;
-+      unsigned long flags;
-+      int i;
-+      char memmap[0x34];
-+      char rxconfig[0x8];
-+      char fcserror[0x8];
-+      char ratefallback[0x5];
-+
-+      if ( !(acx_debug & (L_IOCTL|L_DEBUG)) )
-+              return OK;
-+      /* using printk() since we checked debug flag already */
-+
-+      acx_sem_lock(adev);
-+
-+      if (!IS_ACX111(adev)) {
-+              printk("acx111-specific function called "
-+                      "with non-acx111 chip, aborting\n");
-+              goto end_ok;
-+      }
-+
-+      /* get Acx111 Memory Configuration */
-+      memset(&memconf, 0, sizeof(memconf));
-+      /* BTW, fails with 12 (Write only) error code.
-+      ** Retained for easy testing of issue_cmd error handling :) */
-+      printk ("Interrogating queue config\n");
-+      acx_s_interrogate(adev, &memconf, ACX1xx_IE_QUEUE_CONFIG);
-+      printk ("done with queue config\n");
-+
-+      /* get Acx111 Queue Configuration */
-+      memset(&queueconf, 0, sizeof(queueconf));
-+      printk ("Interrogating mem config options\n");
-+      acx_s_interrogate(adev, &queueconf, ACX1xx_IE_MEMORY_CONFIG_OPTIONS);
-+      printk ("done with mem config options\n");
-+
-+      /* get Acx111 Memory Map */
-+      memset(memmap, 0, sizeof(memmap));
-+      printk ("Interrogating mem map\n");
-+      acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP);
-+      printk ("done with mem map\n");
-+
-+      /* get Acx111 Rx Config */
-+      memset(rxconfig, 0, sizeof(rxconfig));
-+      printk ("Interrogating rxconfig\n");
-+      acx_s_interrogate(adev, &rxconfig, ACX1xx_IE_RXCONFIG);
-+      printk ("done with queue rxconfig\n");
-+
-+      /* get Acx111 fcs error count */
-+      memset(fcserror, 0, sizeof(fcserror));
-+      printk ("Interrogating fcs err count\n");
-+      acx_s_interrogate(adev, &fcserror, ACX1xx_IE_FCS_ERROR_COUNT);
-+      printk ("done with err count\n");
-+
-+      /* get Acx111 rate fallback */
-+      memset(ratefallback, 0, sizeof(ratefallback));
-+      printk ("Interrogating rate fallback\n");
-+      acx_s_interrogate(adev, &ratefallback, ACX1xx_IE_RATE_FALLBACK);
-+      printk ("done with rate fallback\n");
-+
-+      /* force occurrence of a beacon interrupt */
-+      /* TODO: comment why is this necessary */
-+      write_reg16(adev, IO_ACX_HINT_TRIG, HOST_INT_BEACON);
-+
-+      /* dump Acx111 Mem Configuration */
-+      printk("dump mem config:\n"
-+              "data read: %d, struct size: %d\n"
-+              "Number of stations: %1X\n"
-+              "Memory block size: %1X\n"
-+              "tx/rx memory block allocation: %1X\n"
-+              "count rx: %X / tx: %X queues\n"
-+              "options %1X\n"
-+              "fragmentation %1X\n"
-+              "Rx Queue 1 Count Descriptors: %X\n"
-+              "Rx Queue 1 Host Memory Start: %X\n"
-+              "Tx Queue 1 Count Descriptors: %X\n"
-+              "Tx Queue 1 Attributes: %X\n",
-+              memconf.len, (int) sizeof(memconf),
-+              memconf.no_of_stations,
-+              memconf.memory_block_size,
-+              memconf.tx_rx_memory_block_allocation,
-+              memconf.count_rx_queues, memconf.count_tx_queues,
-+              memconf.options,
-+              memconf.fragmentation,
-+              memconf.rx_queue1_count_descs,
-+      acx2cpu(memconf.rx_queue1_host_rx_start),
-+              memconf.tx_queue1_count_descs,
-+              memconf.tx_queue1_attributes);
-+
-+      /* dump Acx111 Queue Configuration */
-+      printk("dump queue head:\n"
-+              "data read: %d, struct size: %d\n"
-+              "tx_memory_block_address (from card): %X\n"
-+              "rx_memory_block_address (from card): %X\n"
-+              "rx1_queue address (from card): %X\n"
-+              "tx1_queue address (from card): %X\n"
-+              "tx1_queue attributes (from card): %X\n",
-+              queueconf.len, (int) sizeof(queueconf),
-+              queueconf.tx_memory_block_address,
-+              queueconf.rx_memory_block_address,
-+              queueconf.rx1_queue_address,
-+              queueconf.tx1_queue_address,
-+              queueconf.tx1_attributes);
-+
-+      /* dump Acx111 Mem Map */
-+      printk("dump mem map:\n"
-+              "data read: %d, struct size: %d\n"
-+              "Code start: %X\n"
-+              "Code end: %X\n"
-+              "WEP default key start: %X\n"
-+              "WEP default key end: %X\n"
-+              "STA table start: %X\n"
-+              "STA table end: %X\n"
-+              "Packet template start: %X\n"
-+              "Packet template end: %X\n"
-+              "Queue memory start: %X\n"
-+              "Queue memory end: %X\n"
-+              "Packet memory pool start: %X\n"
-+              "Packet memory pool end: %X\n"
-+              "iobase: %p\n"
-+              "iobase2: %p\n",
-+              *((u16 *)&memmap[0x02]), (int) sizeof(memmap),
-+              *((u32 *)&memmap[0x04]),
-+              *((u32 *)&memmap[0x08]),
-+              *((u32 *)&memmap[0x0C]),
-+              *((u32 *)&memmap[0x10]),
-+              *((u32 *)&memmap[0x14]),
-+              *((u32 *)&memmap[0x18]),
-+              *((u32 *)&memmap[0x1C]),
-+              *((u32 *)&memmap[0x20]),
-+              *((u32 *)&memmap[0x24]),
-+              *((u32 *)&memmap[0x28]),
-+              *((u32 *)&memmap[0x2C]),
-+              *((u32 *)&memmap[0x30]),
-+              adev->iobase,
-+              adev->iobase2);
-+
-+      /* dump Acx111 Rx Config */
-+      printk("dump rx config:\n"
-+              "data read: %d, struct size: %d\n"
-+              "rx config: %X\n"
-+              "rx filter config: %X\n",
-+              *((u16 *)&rxconfig[0x02]), (int) sizeof(rxconfig),
-+              *((u16 *)&rxconfig[0x04]),
-+              *((u16 *)&rxconfig[0x06]));
-+
-+      /* dump Acx111 fcs error */
-+      printk("dump fcserror:\n"
-+              "data read: %d, struct size: %d\n"
-+              "fcserrors: %X\n",
-+              *((u16 *)&fcserror[0x02]), (int) sizeof(fcserror),
-+              *((u32 *)&fcserror[0x04]));
-+
-+      /* dump Acx111 rate fallback */
-+      printk("dump rate fallback:\n"
-+              "data read: %d, struct size: %d\n"
-+              "ratefallback: %X\n",
-+              *((u16 *)&ratefallback[0x02]), (int) sizeof(ratefallback),
-+              *((u8 *)&ratefallback[0x04]));
-+
-+      /* protect against IRQ */
-+      acx_lock(adev, flags);
-+
-+      /* dump acx111 internal rx descriptor ring buffer */
-+      rxdesc = adev->rxdesc_start;
-+
-+      /* loop over complete receive pool */
-+      if (rxdesc) for (i = 0; i < RX_CNT; i++) {
-+              printk("\ndump internal rxdesc %d:\n"
-+                      "mem pos %p\n"
-+                      "next 0x%X\n"
-+                      "acx mem pointer (dynamic) 0x%X\n"
-+                      "CTL (dynamic) 0x%X\n"
-+                      "Rate (dynamic) 0x%X\n"
-+                      "RxStatus (dynamic) 0x%X\n"
-+                      "Mod/Pre (dynamic) 0x%X\n",
-+                      i,
-+                      rxdesc,
-+                      acx2cpu(rxdesc->pNextDesc),
-+                      acx2cpu(rxdesc->ACXMemPtr),
-+                      rxdesc->Ctl_8,
-+                      rxdesc->rate,
-+                      rxdesc->error,
-+                      rxdesc->SNR);
-+              rxdesc++;
-+      }
-+
-+      /* dump host rx descriptor ring buffer */
-+
-+      rxhostdesc = adev->rxhostdesc_start;
-+
-+      /* loop over complete receive pool */
-+      if (rxhostdesc) for (i = 0; i < RX_CNT; i++) {
-+              printk("\ndump host rxdesc %d:\n"
-+                      "mem pos %p\n"
-+                      "buffer mem pos 0x%X\n"
-+                      "buffer mem offset 0x%X\n"
-+                      "CTL 0x%X\n"
-+                      "Length 0x%X\n"
-+                      "next 0x%X\n"
-+                      "Status 0x%X\n",
-+                      i,
-+                      rxhostdesc,
-+                      acx2cpu(rxhostdesc->data_phy),
-+                      rxhostdesc->data_offset,
-+                      le16_to_cpu(rxhostdesc->Ctl_16),
-+                      le16_to_cpu(rxhostdesc->length),
-+                      acx2cpu(rxhostdesc->desc_phy_next),
-+                      rxhostdesc->Status);
-+              rxhostdesc++;
-+      }
-+
-+      /* dump acx111 internal tx descriptor ring buffer */
-+      txdesc = adev->txdesc_start;
-+
-+      /* loop over complete transmit pool */
-+      if (txdesc) for (i = 0; i < TX_CNT; i++) {
-+              printk("\ndump internal txdesc %d:\n"
-+                      "size 0x%X\n"
-+                      "mem pos %p\n"
-+                      "next 0x%X\n"
-+                      "acx mem pointer (dynamic) 0x%X\n"
-+                      "host mem pointer (dynamic) 0x%X\n"
-+                      "length (dynamic) 0x%X\n"
-+                      "CTL (dynamic) 0x%X\n"
-+                      "CTL2 (dynamic) 0x%X\n"
-+                      "Status (dynamic) 0x%X\n"
-+                      "Rate (dynamic) 0x%X\n",
-+                      i,
-+                      (int) sizeof(struct txdesc),
-+                      txdesc,
-+                      acx2cpu(txdesc->pNextDesc),
-+                      acx2cpu(txdesc->AcxMemPtr),
-+                      acx2cpu(txdesc->HostMemPtr),
-+                      le16_to_cpu(txdesc->total_length),
-+                      txdesc->Ctl_8,
-+                      txdesc->Ctl2_8, txdesc->error,
-+                      txdesc->u.r1.rate);
-+              txdesc = advance_txdesc(adev, txdesc, 1);
-+      }
-+
-+      /* dump host tx descriptor ring buffer */
-+
-+      txhostdesc = adev->txhostdesc_start;
-+
-+      /* loop over complete host send pool */
-+      if (txhostdesc) for (i = 0; i < TX_CNT * 2; i++) {
-+              printk("\ndump host txdesc %d:\n"
-+                      "mem pos %p\n"
-+                      "buffer mem pos 0x%X\n"
-+                      "buffer mem offset 0x%X\n"
-+                      "CTL 0x%X\n"
-+                      "Length 0x%X\n"
-+                      "next 0x%X\n"
-+                      "Status 0x%X\n",
-+                      i,
-+                      txhostdesc,
-+                      acx2cpu(txhostdesc->data_phy),
-+                      txhostdesc->data_offset,
-+                      le16_to_cpu(txhostdesc->Ctl_16),
-+                      le16_to_cpu(txhostdesc->length),
-+                      acx2cpu(txhostdesc->desc_phy_next),
-+                      le32_to_cpu(txhostdesc->Status));
-+              txhostdesc++;
-+      }
-+
-+      /* write_reg16(adev, 0xb4, 0x4); */
-+
-+      acx_unlock(adev, flags);
-+end_ok:
-+
-+      acx_sem_unlock(adev);
-+#endif /* ACX_DEBUG */
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acx100mem_ioctl_set_phy_amp_bias(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      u16 gpio_old;
-+
-+      if (!IS_ACX100(adev)) {
-+              /* WARNING!!!
-+               * Removing this check *might* damage
-+               * hardware, since we're tweaking GPIOs here after all!!!
-+               * You've been warned...
-+               * WARNING!!! */
-+              printk("acx: sorry, setting bias level for non-acx100 "
-+                      "is not supported yet\n");
-+              return OK;
-+      }
-+
-+      if (*extra > 7) {
-+              printk("acx: invalid bias parameter, range is 0-7\n");
-+              return -EINVAL;
-+      }
-+
-+      acx_sem_lock(adev);
-+
-+      /* Need to lock accesses to [IO_ACX_GPIO_OUT]:
-+       * IRQ handler uses it to update LED */
-+      acx_lock(adev, flags);
-+      gpio_old = read_reg16(adev, IO_ACX_GPIO_OUT);
-+      write_reg16(adev, IO_ACX_GPIO_OUT, (gpio_old & 0xf8ff) | ((u16)*extra << 8));
-+      acx_unlock(adev, flags);
-+
-+      log(L_DEBUG, "gpio_old: 0x%04X\n", gpio_old);
-+      printk("%s: PHY power amplifier bias: old:%d, new:%d\n",
-+              ndev->name,
-+              (gpio_old & 0x0700) >> 8, (unsigned char)*extra);
-+
-+      acx_sem_unlock(adev);
-+
-+      return OK;
-+}
-+
-+/***************************************************************
-+** acxmem_l_alloc_tx
-+** Actually returns a txdesc_t* ptr
-+**
-+** FIXME: in case of fragments, should allocate multiple descrs
-+** after figuring out how many we need and whether we still have
-+** sufficiently many.
-+*/
-+tx_t*
-+acxmem_l_alloc_tx(acx_device_t *adev)
-+{
-+      struct txdesc *txdesc;
-+      unsigned head;
-+      u8 ctl8;
-+      static int txattempts = 0;
-+
-+      FN_ENTER;
-+
-+      if (unlikely(!adev->tx_free)) {
-+              printk("acx: BUG: no free txdesc left\n");
-+              /*
-+               * Probably the ACX ignored a transmit attempt and now there's a packet
-+               * sitting in the queue we think should be transmitting but the ACX doesn't
-+               * know about.
-+               * On the first pass, send the ACX a TxProc interrupt to try moving
-+               * things along, and if that doesn't work (ie, we get called again) completely
-+               * flush the transmit queue.
-+               */
-+              if (txattempts < 10) {
-+                txattempts++;
-+                printk ("acx: trying to wake up ACX\n");
-+                write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC);
-+                write_flush(adev);            }
-+              else  {
-+                txattempts = 0;
-+                printk ("acx: flushing transmit queue.\n");
-+                acxmem_l_clean_txdesc_emergency (adev);
-+              }
-+              txdesc = NULL;
-+              goto end;
-+      }
-+
-+      /*
-+       * Make a quick check to see if there is transmit buffer space on
-+       * the ACX.  This can't guarantee there is enough space for the packet
-+       * since we don't yet know how big it is, but it will prevent at least some
-+       * annoyances.
-+       */
-+      if (!adev->acx_txbuf_blocks_free) {
-+        txdesc = NULL;
-+        goto end;
-+      }
-+
-+      head = adev->tx_head;
-+      /*
-+       * txdesc points to ACX memory
-+       */
-+      txdesc = get_txdesc(adev, head);
-+      ctl8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+
-+      /* 
-+       * If we don't own the buffer (HOSTOWN) it is certainly not free; however,
-+       * we may have previously thought we had enough memory to send
-+       * a packet, allocated the buffer then gave up when we found not enough
-+       * transmit buffer space on the ACX. In that case, HOSTOWN and
-+       * ACXDONE will both be set.
-+       */
-+      if (unlikely(DESC_CTL_HOSTOWN != (ctl8 & DESC_CTL_HOSTOWN))) {
-+              /* whoops, descr at current index is not free, so probably
-+               * ring buffer already full */
-+                printk("acx: BUG: tx_head:%d Ctl8:0x%02X - failed to find "
-+                        "free txdesc\n", head, ctl8);
-+              txdesc = NULL;
-+              goto end;
-+      }
-+
-+      /* Needed in case txdesc won't be eventually submitted for tx */
-+      write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_ACXDONE_HOSTOWN);
-+
-+      adev->tx_free--;
-+      log(L_BUFT, "tx: got desc %u, %u remain\n",
-+                      head, adev->tx_free);
-+      /* Keep a few free descs between head and tail of tx ring.
-+      ** It is not absolutely needed, just feels safer */
-+      if (adev->tx_free < TX_STOP_QUEUE) {
-+              log(L_BUF, "stop queue (%u tx desc left)\n",
-+                              adev->tx_free);
-+              acx_stop_queue(adev->ndev, NULL);
-+      }
-+
-+      /* returning current descriptor, so advance to next free one */
-+      adev->tx_head = (head + 1) % TX_CNT;
-+end:
-+      FN_EXIT0;
-+
-+      return (tx_t*)txdesc;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_l_dealloc_tx
-+** Clears out a previously allocatedvoid acxmem_l_dealloc_tx(tx_t *tx_opaque);
-+ transmit descriptor.  The ACX
-+** can get confused if we skip transmit descriptors in the queue,
-+** so when we don't need a descriptor return it to its original
-+** state and move the queue head pointer back.
-+**
-+*/
-+void
-+acxmem_l_dealloc_tx(acx_device_t *adev, tx_t *tx_opaque)
-+{
-+  /*
-+   * txdesc is the address of the descriptor on the ACX.
-+   */
-+  txdesc_t *txdesc = (txdesc_t*)tx_opaque;
-+  txdesc_t tmptxdesc;
-+  int index;
-+
-+  memset (&tmptxdesc, 0, sizeof(tmptxdesc));
-+  tmptxdesc.Ctl_8 = DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG;
-+  tmptxdesc.u.r1.rate = 0x0a;
-+
-+  /*
-+   * Clear out all of the transmit descriptor except for the next pointer
-+   */
-+  copy_to_slavemem (adev, (u32) &(txdesc->HostMemPtr),
-+                  (u8 *) &(tmptxdesc.HostMemPtr),
-+                  sizeof (tmptxdesc) - sizeof(tmptxdesc.pNextDesc));
-+  
-+  /*
-+   * This is only called immediately after we've allocated, so we should
-+   * be able to set the head back to this descriptor.
-+   */
-+  index = ((u8*) txdesc - (u8*)adev->txdesc_start) / adev->txdesc_size;
-+  printk ("acx_dealloc: moving head from %d to %d\n", adev->tx_head, index);
-+  adev->tx_head = index;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+void*
-+acxmem_l_get_txbuf(acx_device_t *adev, tx_t* tx_opaque)
-+{
-+      return get_txhostdesc(adev, (txdesc_t*)tx_opaque)->data;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_l_tx_data
-+**
-+** Can be called from IRQ (rx -> (AP bridging or mgmt response) -> tx).
-+** Can be called from acx_i_start_xmit (data frames from net core).
-+**
-+** FIXME: in case of fragments, should loop over the number of
-+** pre-allocated tx descrs, properly setting up transfer data and
-+** CTL_xxx flags according to fragment number.
-+*/
-+void
-+acxmem_update_queue_indicator (acx_device_t *adev, int txqueue)
-+{
-+#ifdef USING_MORE_THAN_ONE_TRANSMIT_QUEUE
-+  u32 indicator;
-+  unsigned long flags;
-+  int count;
-+
-+  /*
-+   * Can't handle an interrupt while we're fiddling with the ACX's lock,
-+   * according to TI.  The ACX is supposed to hold fw_lock for at most
-+   * 500ns.
-+   */
-+  local_irq_save (flags);
-+
-+  /*
-+   * Wait for ACX to release the lock (at most 500ns).
-+   */
-+  count = 0;
-+  while (read_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->fw_lock))
-+       && (count++ < 50)) {
-+    ndelay (10);
-+  }
-+  if (count < 50) {
-+
-+    /*
-+     * Take out the host lock - anything non-zero will work, so don't worry about
-+     * be/le
-+     */
-+    write_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->host_lock), 1);
-+
-+    /*
-+     * Avoid a race condition
-+     */
-+    count = 0;
-+    while (read_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->fw_lock))
-+         && (count++ < 50)) {
-+      ndelay (10);
-+    }
-+
-+    if (count < 50) {
-+      /*
-+       * Mark the queue active
-+       */
-+      indicator = read_slavemem32 (adev, (u32) &(adev->acx_queue_indicator->indicator));
-+      indicator |= cpu_to_le32 (1 << txqueue);
-+      write_slavemem32 (adev, (u32) &(adev->acx_queue_indicator->indicator), indicator);
-+    }
-+
-+    /*
-+     * Release the host lock
-+     */
-+    write_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->host_lock), 0);
-+
-+  }
-+
-+  /*
-+   * Restore interrupts
-+   */
-+  local_irq_restore (flags);
-+#endif
-+}
-+
-+void
-+acxmem_l_tx_data(acx_device_t *adev, tx_t* tx_opaque, int len)
-+{
-+  /*
-+   * txdesc is the address on the ACX
-+   */
-+      txdesc_t *txdesc = (txdesc_t*)tx_opaque;
-+      txhostdesc_t *hostdesc1, *hostdesc2;
-+      client_t *clt;
-+      u16 rate_cur;
-+      u8 Ctl_8, Ctl2_8;
-+      u32 addr;
-+
-+      FN_ENTER;
-+      /* fw doesn't tx such packets anyhow */
-+      if (unlikely(len < WLAN_HDR_A3_LEN))
-+              goto end;
-+
-+      hostdesc1 = get_txhostdesc(adev, txdesc);
-+      /* modify flag status in separate variable to be able to write it back
-+       * in one big swoop later (also in order to have less device memory
-+       * accesses) */
-+      Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+      Ctl2_8 = 0; /* really need to init it to 0, not txdesc->Ctl2_8, it seems */
-+
-+      hostdesc2 = hostdesc1 + 1;
-+
-+      /* DON'T simply set Ctl field to 0 here globally,
-+       * it needs to maintain a consistent flag status (those are state flags!!),
-+       * otherwise it may lead to severe disruption. Only set or reset particular
-+       * flags at the exact moment this is needed... */
-+
-+      /* let chip do RTS/CTS handshaking before sending
-+       * in case packet size exceeds threshold */
-+      if (len > adev->rts_threshold)
-+              SET_BIT(Ctl2_8, DESC_CTL2_RTS);
-+      else
-+              CLEAR_BIT(Ctl2_8, DESC_CTL2_RTS);
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+      case ACX_MODE_3_AP:
-+              clt = acx_l_sta_list_get(adev, ((wlan_hdr_t*)hostdesc1->data)->a1);
-+              break;
-+      case ACX_MODE_2_STA:
-+              clt = adev->ap_client;
-+              break;
-+#if 0
-+/* testing was done on acx111: */
-+      case ACX_MODE_MONITOR:
-+              SET_BIT(Ctl2_8, 0
-+/* sends CTS to self before packet */
-+                      + DESC_CTL2_SEQ         /* don't increase sequence field */
-+/* not working (looks like good fcs is still added) */
-+                      + DESC_CTL2_FCS         /* don't add the FCS */
-+/* not tested */
-+                      + DESC_CTL2_MORE_FRAG
-+/* not tested */
-+                      + DESC_CTL2_RETRY       /* don't increase retry field */
-+/* not tested */
-+                      + DESC_CTL2_POWER       /* don't increase power mgmt. field */
-+/* no effect */
-+                      + DESC_CTL2_WEP         /* encrypt this frame */
-+/* not tested */
-+                      + DESC_CTL2_DUR         /* don't increase duration field */
-+                      );
-+              /* fallthrough */
-+#endif
-+      default: /* ACX_MODE_OFF, ACX_MODE_MONITOR */
-+              clt = NULL;
-+              break;
-+      }
-+
-+      rate_cur = clt ? clt->rate_cur : adev->rate_bcast;
-+      if (unlikely(!rate_cur)) {
-+              printk("acx: driver bug! bad ratemask\n");
-+              goto end;
-+      }
-+
-+      /* used in tx cleanup routine for auto rate and accounting: */
-+      put_txcr(adev, txdesc, clt, rate_cur);
-+
-+      write_slavemem16 (adev, (u32) &(txdesc->total_length), cpu_to_le16(len));
-+      hostdesc2->length = cpu_to_le16(len - WLAN_HDR_A3_LEN);
-+      if (IS_ACX111(adev)) {
-+              /* note that if !txdesc->do_auto, txrate->cur
-+              ** has only one nonzero bit */
-+              txdesc->u.r2.rate111 = cpu_to_le16(
-+                      rate_cur
-+                      /* WARNING: I was never able to make it work with prism54 AP.
-+                      ** It was falling down to 1Mbit where shortpre is not applicable,
-+                      ** and not working at all at "5,11 basic rates only" setting.
-+                      ** I even didn't see tx packets in radio packet capture.
-+                      ** Disabled for now --vda */
-+                      /*| ((clt->shortpre && clt->cur!=RATE111_1) ? RATE111_SHORTPRE : 0) */
-+                      );
-+#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS
-+                      /* should add this to rate111 above as necessary */
-+                      | (clt->pbcc511 ? RATE111_PBCC511 : 0)
-+#endif
-+              hostdesc1->length = cpu_to_le16(len);
-+      } else { /* ACX100 */
-+              u8 rate_100 = clt ? clt->rate_100 : adev->rate_bcast100;
-+              write_slavemem8 (adev, (u32) &(txdesc->u.r1.rate), rate_100);
-+#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS
-+              if (clt->pbcc511) {
-+                      if (n == RATE100_5 || n == RATE100_11)
-+                              n |= RATE100_PBCC511;
-+              }
-+
-+              if (clt->shortpre && (clt->cur != RATE111_1))
-+                      SET_BIT(Ctl_8, DESC_CTL_SHORT_PREAMBLE); /* set Short Preamble */
-+#endif
-+              /* set autodma and reclaim and 1st mpdu */
-+              SET_BIT(Ctl_8, DESC_CTL_FIRSTFRAG);
-+
-+#if ACX_FRAGMENTATION
-+              /* SET_BIT(Ctl2_8, DESC_CTL2_MORE_FRAG); cannot set it unconditionally, needs to be set for all non-last fragments */
-+#endif
-+              hostdesc1->length = cpu_to_le16(WLAN_HDR_A3_LEN);
-+
-+              /*
-+               * Since we're not using autodma copy the packet data to the acx now.
-+               * Even host descriptors point to the packet header, and the odd indexed
-+               * descriptor following points to the packet data.
-+               *
-+               * The first step is to find free memory in the ACX transmit buffers.
-+               * They don't necessarily map one to one with the transmit queue entries,
-+               * so search through them starting just after the last one used.
-+               */
-+              addr = allocate_acx_txbuf_space (adev, len);
-+              if (addr) {
-+                chaincopy_to_slavemem (adev, addr, hostdesc1->data, len);
-+              }
-+              else {
-+                /*
-+                 * Bummer.  We thought we might have enough room in the transmit
-+                 * buffers to send this packet, but it turns out we don't.  alloc_tx
-+                 * has already marked this transmit descriptor as HOSTOWN and ACXDONE,
-+                 * which means the ACX will hang when it gets to this descriptor unless
-+                 * we do something about it.  Having a bubble in the transmit queue just
-+                 * doesn't seem to work, so we have to reset this transmit queue entry's
-+                 * state to its original value and back up our head pointer to point
-+                 * back to this entry.
-+                 */
-+                hostdesc1->length = 0;
-+                hostdesc2->length = 0;
-+                write_slavemem16 (adev, (u32) &(txdesc->total_length), 0);
-+                write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG);
-+                adev->tx_head  = ((u8*) txdesc - (u8*) adev->txdesc_start) / adev->txdesc_size;
-+                goto end;
-+              }
-+              /*
-+               * Tell the ACX where the packet is.
-+               */
-+              write_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr), addr);
-+
-+      }
-+      /* don't need to clean ack/rts statistics here, already
-+       * done on descr cleanup */
-+
-+      /* clears HOSTOWN and ACXDONE bits, thus telling that the descriptors
-+       * are now owned by the acx100; do this as LAST operation */
-+      CLEAR_BIT(Ctl_8, DESC_CTL_ACXDONE_HOSTOWN);
-+      /* flush writes before we release hostdesc to the adapter here */
-+      //wmb();
-+
-+      /* write back modified flags */
-+      /*
-+       * At this point Ctl_8 should just be FIRSTFRAG
-+       */
-+      write_slavemem8 (adev, (u32) &(txdesc->Ctl2_8),Ctl2_8);
-+      write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), Ctl_8);
-+      /* unused: txdesc->tx_time = cpu_to_le32(jiffies); */
-+
-+      /*
-+       * Update the queue indicator to say there's data on the first queue.
-+       */
-+      acxmem_update_queue_indicator (adev, 0);
-+
-+      /* flush writes before we tell the adapter that it's its turn now */
-+      mmiowb();
-+      write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC);
-+      write_flush(adev);
-+
-+      /* log the packet content AFTER sending it,
-+       * in order to not delay sending any further than absolutely needed
-+       * Do separate logs for acx100/111 to have human-readable rates */
-+      if (unlikely(acx_debug & (L_XFER|L_DATA))) {
-+              u16 fc = ((wlan_hdr_t*)hostdesc1->data)->fc;
-+              if (IS_ACX111(adev))
-+                      printk("tx: pkt (%s): len %d "
-+                              "rate %04X%s status %u\n",
-+                              acx_get_packet_type_string(le16_to_cpu(fc)), len,
-+                              le16_to_cpu(txdesc->u.r2.rate111),
-+                              (le16_to_cpu(txdesc->u.r2.rate111) & RATE111_SHORTPRE) ? "(SPr)" : "",
-+                              adev->status);
-+              else
-+                      printk("tx: pkt (%s): len %d rate %03u%s status %u\n",
-+                              acx_get_packet_type_string(fc), len,
-+                              read_slavemem8 (adev, (u32) &(txdesc->u.r1.rate)),
-+                              (Ctl_8 & DESC_CTL_SHORT_PREAMBLE) ? "(SPr)" : "",
-+                              adev->status);
-+
-+              if (acx_debug & L_DATA) {
-+                      printk("tx: 802.11 [%d]: ", len);
-+                      acx_dump_bytes(hostdesc1->data, len);
-+              }
-+      }
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_l_clean_txdesc
-+**
-+** This function resets the txdescs' status when the ACX100
-+** signals the TX done IRQ (txdescs have been processed), starting with
-+** the pool index of the descriptor which we would use next,
-+** in order to make sure that we can be as fast as possible
-+** in filling new txdescs.
-+** Everytime we get called we know where the next packet to be cleaned is.
-+*/
-+
-+#if !ACX_DEBUG
-+static inline void log_txbuffer(const acx_device_t *adev) {}
-+#else
-+static void
-+log_txbuffer(acx_device_t *adev)
-+{
-+      txdesc_t *txdesc;
-+      int i;
-+      u8 Ctl_8;
-+
-+      /* no FN_ENTER here, we don't want that */
-+      /* no locks here, since it's entirely non-critical code */
-+      txdesc = adev->txdesc_start;
-+      if (unlikely(!txdesc)) return;
-+      printk("tx: desc->Ctl8's:");
-+      for (i = 0; i < TX_CNT; i++) {
-+        Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+              printk(" %02X", Ctl_8);
-+              txdesc = advance_txdesc(adev, txdesc, 1);
-+      }
-+      printk("\n");
-+}
-+#endif
-+
-+
-+static void
-+handle_tx_error(acx_device_t *adev, u8 error, unsigned int finger)
-+{
-+      const char *err = "unknown error";
-+
-+      /* hmm, should we handle this as a mask
-+       * of *several* bits?
-+       * For now I think only caring about
-+       * individual bits is ok... */
-+      switch (error) {
-+      case 0x01:
-+              err = "no Tx due to error in other fragment";
-+              adev->wstats.discard.fragment++;
-+              break;
-+      case 0x02:
-+              err = "Tx aborted";
-+              adev->stats.tx_aborted_errors++;
-+              break;
-+      case 0x04:
-+              err = "Tx desc wrong parameters";
-+              adev->wstats.discard.misc++;
-+              break;
-+      case 0x08:
-+              err = "WEP key not found";
-+              adev->wstats.discard.misc++;
-+              break;
-+      case 0x10:
-+              err = "MSDU lifetime timeout? - try changing "
-+                              "'iwconfig retry lifetime XXX'";
-+              adev->wstats.discard.misc++;
-+              break;
-+      case 0x20:
-+              err = "excessive Tx retries due to either distance "
-+                      "too high or unable to Tx or Tx frame error - "
-+                      "try changing 'iwconfig txpower XXX' or "
-+                      "'sens'itivity or 'retry'";
-+              adev->wstats.discard.retries++;
-+              /* Tx error 0x20 also seems to occur on
-+               * overheating, so I'm not sure whether we
-+               * actually want to do aggressive radio recalibration,
-+               * since people maybe won't notice then that their hardware
-+               * is slowly getting cooked...
-+               * Or is it still a safe long distance from utter
-+               * radio non-functionality despite many radio recalibs
-+               * to final destructive overheating of the hardware?
-+               * In this case we really should do recalib here...
-+               * I guess the only way to find out is to do a
-+               * potentially fatal self-experiment :-\
-+               * Or maybe only recalib in case we're using Tx
-+               * rate auto (on errors switching to lower speed
-+               * --> less heat?) or 802.11 power save mode?
-+               *
-+               * ok, just do it. */
-+              if (++adev->retry_errors_msg_ratelimit % 4 == 0) {
-+                      if (adev->retry_errors_msg_ratelimit <= 20) {
-+                              printk("%s: several excessive Tx "
-+                                      "retry errors occurred, attempting "
-+                                      "to recalibrate radio. Radio "
-+                                      "drift might be caused by increasing "
-+                                      "card temperature, please check the card "
-+                                      "before it's too late!\n",
-+                                      adev->ndev->name);
-+                              if (adev->retry_errors_msg_ratelimit == 20)
-+                                      printk("disabling above message\n");
-+                      }
-+
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB);
-+              }
-+              break;
-+      case 0x40:
-+              err = "Tx buffer overflow";
-+              adev->stats.tx_fifo_errors++;
-+              break;
-+      case 0x80:
-+              err = "DMA error";
-+              adev->wstats.discard.misc++;
-+              break;
-+      }
-+      adev->stats.tx_errors++;
-+      if (adev->stats.tx_errors <= 20)
-+              printk("%s: tx error 0x%02X, buf %02u! (%s)\n",
-+                              adev->ndev->name, error, finger, err);
-+      else
-+              printk("%s: tx error 0x%02X, buf %02u!\n",
-+                              adev->ndev->name, error, finger);
-+}
-+
-+
-+unsigned int
-+acxmem_l_clean_txdesc(acx_device_t *adev)
-+{
-+      txdesc_t *txdesc;
-+      unsigned finger;
-+      int num_cleaned;
-+      u16 r111;
-+      u8 error, ack_failures, rts_failures, rts_ok, r100, Ctl_8;
-+      u32 acxmem;
-+      txdesc_t tmptxdesc;
-+
-+      FN_ENTER;
-+
-+      /*
-+       * Set up a template descriptor for re-initialization.  The only
-+       * things that get set are Ctl_8 and the rate, and the rate defaults
-+       * to 1Mbps.
-+       */
-+      memset (&tmptxdesc, 0, sizeof (tmptxdesc));
-+      tmptxdesc.Ctl_8 = DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG;
-+      tmptxdesc.u.r1.rate = 0x0a;
-+
-+      if (unlikely(acx_debug & L_DEBUG))
-+              log_txbuffer(adev);
-+
-+      log(L_BUFT, "tx: cleaning up bufs from %u\n", adev->tx_tail);
-+
-+      /* We know first descr which is not free yet. We advance it as far
-+      ** as we see correct bits set in following descs (if next desc
-+      ** is NOT free, we shouldn't advance at all). We know that in
-+      ** front of tx_tail may be "holes" with isolated free descs.
-+      ** We will catch up when all intermediate descs will be freed also */
-+
-+      finger = adev->tx_tail;
-+      num_cleaned = 0;
-+      while (likely(finger != adev->tx_head)) {
-+              txdesc = get_txdesc(adev, finger);
-+
-+              /* If we allocated txdesc on tx path but then decided
-+              ** to NOT use it, then it will be left as a free "bubble"
-+              ** in the "allocated for tx" part of the ring.
-+              ** We may meet it on the next ring pass here. */
-+
-+              /* stop if not marked as "tx finished" and "host owned" */
-+              Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+              if ((Ctl_8 & DESC_CTL_ACXDONE_HOSTOWN)
-+                                      != DESC_CTL_ACXDONE_HOSTOWN) {
-+                      if (unlikely(!num_cleaned)) { /* maybe remove completely */
-+                              log(L_BUFT, "clean_txdesc: tail isn't free. "
-+                                      "tail:%d head:%d\n",
-+                                      adev->tx_tail, adev->tx_head);
-+                      }
-+                      break;
-+              }
-+
-+              /* remember desc values... */
-+              error = read_slavemem8 (adev, (u32) &(txdesc->error));
-+              ack_failures = read_slavemem8 (adev, (u32) &(txdesc->ack_failures));
-+              rts_failures = read_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_failures));
-+              rts_ok = read_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_ok));
-+              r100 = read_slavemem8 (adev, (u32) &(txdesc->u.r1.rate));
-+              r111 = le16_to_cpu(read_slavemem16 (adev, (u32) &(txdesc->u.r2.rate111)));
-+
-+              /* need to check for certain error conditions before we
-+               * clean the descriptor: we still need valid descr data here */
-+              if (unlikely(0x30 & error)) {
-+                      /* only send IWEVTXDROP in case of retry or lifetime exceeded;
-+                       * all other errors mean we screwed up locally */
-+                      union iwreq_data wrqu;
-+                      wlan_hdr_t *hdr;
-+                      txhostdesc_t *hostdesc;
-+
-+                      hostdesc = get_txhostdesc(adev, txdesc);
-+                      hdr = (wlan_hdr_t *)hostdesc->data;
-+                      MAC_COPY(wrqu.addr.sa_data, hdr->a1);
-+                      wireless_send_event(adev->ndev, IWEVTXDROP, &wrqu, NULL);
-+              }
-+
-+              /*
-+               * Free up the transmit data buffers
-+               */
-+              acxmem = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr));
-+              if (acxmem) {
-+                reclaim_acx_txbuf_space (adev, acxmem);
-+              }
-+
-+              /* ...and free the desc by clearing all the fields 
-+                 except the next pointer */
-+              copy_to_slavemem (adev,
-+                                (u32) &(txdesc->HostMemPtr), 
-+                                (u8 *) &(tmptxdesc.HostMemPtr),
-+                                sizeof (tmptxdesc) - sizeof(tmptxdesc.pNextDesc)
-+                                );
-+
-+              adev->tx_free++;
-+              num_cleaned++;
-+
-+              if ((adev->tx_free >= TX_START_QUEUE)
-+               && (adev->status == ACX_STATUS_4_ASSOCIATED)
-+               && (acx_queue_stopped(adev->ndev))
-+              ) {
-+                      log(L_BUF, "tx: wake queue (avail. Tx desc %u)\n",
-+                                      adev->tx_free);
-+                      acx_wake_queue(adev->ndev, NULL);
-+              }
-+
-+              /* do error checking, rate handling and logging
-+               * AFTER having done the work, it's faster */
-+
-+              /* do rate handling */
-+              if (adev->rate_auto) {
-+                      struct client *clt = get_txc(adev, txdesc);
-+                      if (clt) {
-+                              u16 cur = get_txr(adev, txdesc);
-+                              if (clt->rate_cur == cur) {
-+                                      acx_l_handle_txrate_auto(adev, clt,
-+                                              cur, /* intended rate */
-+                                              r100, r111, /* actually used rate */
-+                                              (error & 0x30), /* was there an error? */
-+                                              TX_CNT + TX_CLEAN_BACKLOG - adev->tx_free);
-+                              }
-+                      }
-+              }
-+
-+              if (unlikely(error))
-+                      handle_tx_error(adev, error, finger);
-+
-+              if (IS_ACX111(adev))
-+                      log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u r111=%04X\n",
-+                              finger, ack_failures, rts_failures, rts_ok, r111);
-+              else
-+                      log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u rate=%u\n",
-+                              finger, ack_failures, rts_failures, rts_ok, r100);
-+
-+              /* update pointer for descr to be cleaned next */
-+              finger = (finger + 1) % TX_CNT;
-+      }
-+
-+      /* remember last position */
-+      adev->tx_tail = finger;
-+/* end: */
-+      FN_EXIT1(num_cleaned);
-+      return num_cleaned;
-+}
-+
-+/* clean *all* Tx descriptors, and regardless of their previous state.
-+ * Used for brute-force reset handling. */
-+void
-+acxmem_l_clean_txdesc_emergency(acx_device_t *adev)
-+{
-+      txdesc_t *txdesc;
-+      int i;
-+      u32 acxmem;
-+
-+      FN_ENTER;
-+
-+      for (i = 0; i < TX_CNT; i++) {
-+              txdesc = get_txdesc(adev, i);
-+
-+              /* free it */
-+              write_slavemem8 (adev, (u32) &(txdesc->ack_failures), 0);
-+              write_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_failures), 0);
-+              write_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_ok), 0);
-+              write_slavemem8 (adev, (u32) &(txdesc->error), 0);
-+              write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_HOSTOWN);
-+
-+              /*
-+               * Clean up the memory allocated on the ACX for this transmit descriptor.
-+               */
-+              acxmem = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr));
-+              if (acxmem) {
-+                reclaim_acx_txbuf_space (adev, acxmem);
-+              }               
-+              
-+              write_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr), 0);
-+      }
-+
-+      adev->tx_free = TX_CNT;
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_create_tx_host_desc_queue
-+*/
-+
-+static void*
-+allocate(acx_device_t *adev, size_t size, dma_addr_t *phy, const char *msg)
-+{
-+      void *ptr;
-+        ptr = kmalloc (size, GFP_KERNEL);
-+      /*
-+       * The ACX can't use the physical address, so we'll have to fake it
-+       * later and it might be handy to have the virtual address.
-+       */
-+      *phy = (dma_addr_t) NULL;
-+
-+      if (ptr) {
-+              log(L_DEBUG, "%s sz=%d adr=0x%p phy=0x%08llx\n",
-+                              msg, (int)size, ptr, (unsigned long long)*phy);
-+              memset(ptr, 0, size);
-+              return ptr;
-+      }
-+      printk(KERN_ERR "acx: %s allocation FAILED (%d bytes)\n",
-+                                      msg, (int)size);
-+      return NULL;
-+}
-+
-+
-+/*
-+ * In the generic slave memory access mode, most of the stuff in
-+ * the txhostdesc_t is unused.  It's only here because the rest of
-+ * the ACX driver expects it to be since the PCI version uses indirect
-+ * host memory organization with DMA.  Since we're not using DMA the
-+ * only use we have for the host descriptors is to store the packets
-+ * on the way out.
-+ */
-+static int
-+acxmem_s_create_tx_host_desc_queue(acx_device_t *adev)
-+{
-+      txhostdesc_t *hostdesc;
-+      u8 *txbuf;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* allocate TX buffer */
-+      adev->txbuf_area_size = TX_CNT * WLAN_A4FR_MAXLEN_WEP_FCS;
-+
-+      adev->txbuf_start = allocate(adev, adev->txbuf_area_size,
-+                                   &adev->txbuf_startphy, "txbuf_start");
-+      if (!adev->txbuf_start)
-+        goto fail;
-+
-+      /* allocate the TX host descriptor queue pool */
-+      adev->txhostdesc_area_size = TX_CNT * 2*sizeof(*hostdesc);
-+
-+      adev->txhostdesc_start = allocate(adev, adev->txhostdesc_area_size,
-+                                        &adev->txhostdesc_startphy, "txhostdesc_start");
-+      if (!adev->txhostdesc_start)
-+        goto fail;
-+
-+      /* check for proper alignment of TX host descriptor pool */
-+      if ((long) adev->txhostdesc_start & 3) {
-+              printk("acx: driver bug: dma alloc returns unaligned address\n");
-+              goto fail;
-+      }
-+
-+      hostdesc = adev->txhostdesc_start;
-+      txbuf = adev->txbuf_start;
-+
-+#if 0
-+/* Each tx buffer is accessed by hardware via
-+** txdesc -> txhostdesc(s) -> txbuffer(s).
-+** We use only one txhostdesc per txdesc, but it looks like
-+** acx111 is buggy: it accesses second txhostdesc
-+** (via hostdesc.desc_phy_next field) even if
-+** txdesc->length == hostdesc->length and thus
-+** entire packet was placed into first txhostdesc.
-+** Due to this bug acx111 hangs unless second txhostdesc
-+** has le16_to_cpu(hostdesc.length) = 3 (or larger)
-+** Storing NULL into hostdesc.desc_phy_next
-+** doesn't seem to help.
-+**
-+** Update: although it worked on Xterasys XN-2522g
-+** with len=3 trick, WG311v2 is even more bogus, doesn't work.
-+** Keeping this code (#ifdef'ed out) for documentational purposes.
-+*/
-+      for (i = 0; i < TX_CNT*2; i++) {
-+              hostdesc_phy += sizeof(*hostdesc);
-+              if (!(i & 1)) {
-+                      hostdesc->data_phy = cpu2acx(txbuf_phy);
-+                      /* hostdesc->data_offset = ... */
-+                      /* hostdesc->reserved = ... */
-+                      hostdesc->Ctl_16 = cpu_to_le16(DESC_CTL_HOSTOWN);
-+                      /* hostdesc->length = ... */
-+                      hostdesc->desc_phy_next = cpu2acx(hostdesc_phy);
-+                      hostdesc->pNext = ptr2acx(NULL);
-+                      /* hostdesc->Status = ... */
-+                      /* below: non-hardware fields */
-+                      hostdesc->data = txbuf;
-+
-+                      txbuf += WLAN_A4FR_MAXLEN_WEP_FCS;
-+                      txbuf_phy += WLAN_A4FR_MAXLEN_WEP_FCS;
-+              } else {
-+                      /* hostdesc->data_phy = ... */
-+                      /* hostdesc->data_offset = ... */
-+                      /* hostdesc->reserved = ... */
-+                      /* hostdesc->Ctl_16 = ... */
-+                      hostdesc->length = cpu_to_le16(3); /* bug workaround */
-+                      /* hostdesc->desc_phy_next = ... */
-+                      /* hostdesc->pNext = ... */
-+                      /* hostdesc->Status = ... */
-+                      /* below: non-hardware fields */
-+                      /* hostdesc->data = ... */
-+              }
-+              hostdesc++;
-+      }
-+#endif
-+/* We initialize two hostdescs so that they point to adjacent
-+** memory areas. Thus txbuf is really just a contiguous memory area */
-+      for (i = 0; i < TX_CNT*2; i++) {
-+              /* ->data is a non-hardware field: */
-+              hostdesc->data = txbuf;
-+
-+              if (!(i & 1)) {
-+                      txbuf += WLAN_HDR_A3_LEN;
-+              } else {
-+                      txbuf += WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN;
-+              }
-+              hostdesc++;
-+      }
-+      hostdesc--;
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+fail:
-+      printk("acx: create_tx_host_desc_queue FAILED\n");
-+      /* dealloc will be done by free function on error case */
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_s_create_rx_host_desc_queue
-+*/
-+/* the whole size of a data buffer (header plus data body)
-+ * plus 32 bytes safety offset at the end */
-+#define RX_BUFFER_SIZE (sizeof(rxbuffer_t) + 32)
-+
-+static int
-+acxmem_s_create_rx_host_desc_queue(acx_device_t *adev)
-+{
-+      rxhostdesc_t *hostdesc;
-+      rxbuffer_t *rxbuf;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* allocate the RX host descriptor queue pool */
-+      adev->rxhostdesc_area_size = RX_CNT * sizeof(*hostdesc);
-+
-+      adev->rxhostdesc_start = allocate(adev, adev->rxhostdesc_area_size,
-+                                        &adev->rxhostdesc_startphy, "rxhostdesc_start");
-+      if (!adev->rxhostdesc_start)
-+        goto fail;
-+
-+      /* check for proper alignment of RX host descriptor pool */
-+      if ((long) adev->rxhostdesc_start & 3) {
-+              printk("acx: driver bug: dma alloc returns unaligned address\n");
-+              goto fail;
-+      }
-+
-+      /* allocate Rx buffer pool which will be used by the acx
-+       * to store the whole content of the received frames in it */
-+      adev->rxbuf_area_size = RX_CNT * RX_BUFFER_SIZE;
-+
-+      adev->rxbuf_start = allocate(adev, adev->rxbuf_area_size,
-+                                   &adev->rxbuf_startphy, "rxbuf_start");
-+      if (!adev->rxbuf_start)
-+        goto fail;
-+
-+      rxbuf = adev->rxbuf_start;
-+      hostdesc = adev->rxhostdesc_start;
-+
-+      /* don't make any popular C programming pointer arithmetic mistakes
-+       * here, otherwise I'll kill you...
-+       * (and don't dare asking me why I'm warning you about that...) */
-+      for (i = 0; i < RX_CNT; i++) {
-+              hostdesc->data = rxbuf;
-+              hostdesc->length = cpu_to_le16(RX_BUFFER_SIZE);
-+              rxbuf++;
-+              hostdesc++;
-+      }
-+      hostdesc--;
-+      FN_EXIT1(OK);
-+      return OK;
-+fail:
-+      printk("acx: create_rx_host_desc_queue FAILED\n");
-+      /* dealloc will be done by free function on error case */
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_s_create_hostdesc_queues
-+*/
-+int
-+acxmem_s_create_hostdesc_queues(acx_device_t *adev)
-+{
-+      int result;
-+      result = acxmem_s_create_tx_host_desc_queue(adev);
-+      if (OK != result) return result;
-+      result = acxmem_s_create_rx_host_desc_queue(adev);
-+      return result;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_create_tx_desc_queue
-+*/
-+static void
-+acxmem_create_tx_desc_queue(acx_device_t *adev, u32 tx_queue_start)
-+{
-+      txdesc_t *txdesc;
-+      u32 clr;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      if (IS_ACX100(adev))
-+              adev->txdesc_size = sizeof(*txdesc);
-+      else
-+              /* the acx111 txdesc is 4 bytes larger */
-+              adev->txdesc_size = sizeof(*txdesc) + 4;
-+
-+      /*
-+       * This refers to an ACX address, not one of ours
-+       */
-+      adev->txdesc_start = (txdesc_t *) tx_queue_start;
-+
-+      log(L_DEBUG, "adev->txdesc_start=%p\n",
-+                      adev->txdesc_start);
-+
-+      adev->tx_free = TX_CNT;
-+      /* done by memset: adev->tx_head = 0; */
-+      /* done by memset: adev->tx_tail = 0; */
-+      txdesc = adev->txdesc_start;
-+
-+      if (IS_ACX111(adev)) {
-+              /* ACX111 has a preinitialized Tx buffer! */
-+              /* loop over whole send pool */
-+              /* FIXME: do we have to do the hostmemptr stuff here?? */
-+              for (i = 0; i < TX_CNT; i++) {
-+                      txdesc->Ctl_8 = DESC_CTL_HOSTOWN;
-+                      /* reserve two (hdr desc and payload desc) */
-+                      txdesc = advance_txdesc(adev, txdesc, 1);
-+              }
-+      } else {
-+              /* ACX100 Tx buffer needs to be initialized by us */
-+              /* clear whole send pool. sizeof is safe here (we are acx100) */
-+
-+              /*
-+               * adev->txdesc_start refers to device memory, so we can't write
-+               * directly to it.
-+               */
-+              clr = (u32) adev->txdesc_start;
-+              while (clr < (u32) adev->txdesc_start + (TX_CNT * sizeof(*txdesc))) {
-+                write_slavemem32 (adev, clr, 0);
-+                clr += 4;
-+              }
-+
-+              /* loop over whole send pool */
-+              for (i = 0; i < TX_CNT; i++) {
-+                      log(L_DEBUG, "configure card tx descriptor: 0x%p, "
-+                              "size: 0x%X\n", txdesc, adev->txdesc_size);
-+
-+                      /* initialise ctl */
-+                      /*
-+                       * No auto DMA here
-+                       */
-+                      write_slavemem8 (adev, (u32) &(txdesc->Ctl_8),
-+                                      (u8) (DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG));
-+                      /* done by memset(0): txdesc->Ctl2_8 = 0; */
-+
-+                      /* point to next txdesc */
-+                      write_slavemem32 (adev, (u32) &(txdesc->pNextDesc),
-+                                        (u32) cpu_to_le32 ((u8 *) txdesc + adev->txdesc_size));
-+
-+                      /* go to the next one */
-+                      /* ++ is safe here (we are acx100) */
-+                      txdesc++;
-+              }
-+              /* go back to the last one */
-+              txdesc--;
-+              /* and point to the first making it a ring buffer */
-+              write_slavemem32 (adev, (u32) &(txdesc->pNextDesc),
-+                                (u32) cpu_to_le32 (tx_queue_start));
-+      }
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_create_rx_desc_queue
-+*/
-+static void
-+acxmem_create_rx_desc_queue(acx_device_t *adev, u32 rx_queue_start)
-+{
-+      rxdesc_t *rxdesc;
-+      u32 mem_offs;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* done by memset: adev->rx_tail = 0; */
-+
-+      /* ACX111 doesn't need any further config: preconfigures itself.
-+       * Simply print ring buffer for debugging */
-+      if (IS_ACX111(adev)) {
-+              /* rxdesc_start already set here */
-+
-+              adev->rxdesc_start = (rxdesc_t *) rx_queue_start;
-+
-+              rxdesc = adev->rxdesc_start;
-+              for (i = 0; i < RX_CNT; i++) {
-+                      log(L_DEBUG, "rx descriptor %d @ 0x%p\n", i, rxdesc);
-+                      rxdesc = adev->rxdesc_start = (rxdesc_t *)
-+                        acx2cpu(rxdesc->pNextDesc);
-+              }
-+      } else {
-+              /* we didn't pre-calculate rxdesc_start in case of ACX100 */
-+              /* rxdesc_start should be right AFTER Tx pool */
-+              adev->rxdesc_start = (rxdesc_t *)
-+                      ((u8 *) adev->txdesc_start + (TX_CNT * sizeof(txdesc_t)));
-+              /* NB: sizeof(txdesc_t) above is valid because we know
-+              ** we are in if (acx100) block. Beware of cut-n-pasting elsewhere!
-+              ** acx111's txdesc is larger! */
-+
-+              mem_offs = (u32) adev->rxdesc_start;
-+              while (mem_offs < (u32) adev->rxdesc_start + (RX_CNT * sizeof (*rxdesc))) {
-+                write_slavemem32 (adev, mem_offs, 0);
-+                mem_offs += 4;
-+              }
-+
-+              /* loop over whole receive pool */
-+              rxdesc = adev->rxdesc_start;
-+              for (i = 0; i < RX_CNT; i++) {
-+                      log(L_DEBUG, "rx descriptor @ 0x%p\n", rxdesc);
-+                      /* point to next rxdesc */
-+                      write_slavemem32 (adev, (u32) &(rxdesc->pNextDesc),
-+                                        (u32) cpu_to_le32 ((u8 *) rxdesc + sizeof(*rxdesc)));
-+                      /* go to the next one */
-+                      rxdesc++;
-+              }
-+              /* go to the last one */
-+              rxdesc--;
-+
-+              /* and point to the first making it a ring buffer */
-+              write_slavemem32 (adev, (u32) &(rxdesc->pNextDesc),
-+                                (u32) cpu_to_le32 (rx_queue_start));
-+      }
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_create_desc_queues
-+*/
-+void
-+acxmem_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start)
-+{
-+  u32 *p;
-+  int i;
-+
-+      acxmem_create_tx_desc_queue(adev, tx_queue_start);
-+      acxmem_create_rx_desc_queue(adev, rx_queue_start);
-+      p = (u32 *) adev->acx_queue_indicator;
-+      for (i = 0; i < 4; i++) {
-+        write_slavemem32 (adev, (u32) p, 0);
-+        p++;
-+      }
-+}
-+
-+
-+/***************************************************************
-+** acxmem_s_proc_diag_output
-+*/
-+char*
-+acxmem_s_proc_diag_output(char *p, acx_device_t *adev)
-+{
-+      const char *rtl, *thd, *ttl;
-+      txdesc_t *txdesc;
-+      u8 Ctl_8;
-+      rxdesc_t *rxdesc;
-+      int i;
-+      u32 tmp;
-+      txdesc_t txd;
-+      u8 buf[0x200];
-+      int j, k;
-+
-+      FN_ENTER;
-+
-+#if DUMP_MEM_DURING_DIAG > 0
-+      dump_acxmem (adev, 0, 0x10000);
-+      panic ("dump finished");
-+#endif
-+      
-+      p += sprintf(p, "** Rx buf **\n");
-+      rxdesc = adev->rxdesc_start;
-+      if (rxdesc) for (i = 0; i < RX_CNT; i++) {
-+              rtl = (i == adev->rx_tail) ? " [tail]" : "";
-+              Ctl_8 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8));
-+              if (Ctl_8 & DESC_CTL_HOSTOWN)
-+                      p += sprintf(p, "%02u (%02x) FULL%s\n", i, Ctl_8, rtl);
-+              else
-+                      p += sprintf(p, "%02u (%02x) empty%s\n", i, Ctl_8, rtl);
-+              rxdesc++;
-+      }
-+      p += sprintf(p, "** Tx buf (free %d, Linux netqueue %s) **\n", adev->tx_free,
-+                              acx_queue_stopped(adev->ndev) ? "STOPPED" : "running");
-+      
-+      p += sprintf(p, "** Tx buf %d blocks total, %d available, free list head %04x\n",
-+                   adev->acx_txbuf_numblocks, adev->acx_txbuf_blocks_free, adev->acx_txbuf_free);
-+      txdesc = adev->txdesc_start;
-+      if (txdesc) {
-+        for (i = 0; i < TX_CNT; i++) {
-+          thd = (i == adev->tx_head) ? " [head]" : "";
-+          ttl = (i == adev->tx_tail) ? " [tail]" : "";
-+          copy_from_slavemem (adev, (u8 *) &txd, (u32) txdesc, sizeof (txd));
-+          Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+          if (Ctl_8 & DESC_CTL_ACXDONE)
-+            p += sprintf(p, "%02u ready to free (%02X)%s%s", i, Ctl_8, thd, ttl);
-+          else if (Ctl_8 & DESC_CTL_HOSTOWN)
-+            p += sprintf(p, "%02u available     (%02X)%s%s", i, Ctl_8, thd, ttl);
-+          else
-+            p += sprintf(p, "%02u busy          (%02X)%s%s", i, Ctl_8, thd, ttl);
-+          tmp = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr));
-+          if (tmp) {
-+            p += sprintf (p, " %04x", tmp);
-+            while ((tmp = read_slavemem32 (adev, (u32) tmp)) != 0x02000000) {
-+              tmp <<= 5;
-+              p += sprintf (p, " %04x", tmp);
-+            }
-+          }
-+          p += sprintf (p, "\n");
-+          p += sprintf (p, "  %04x: %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %02x %02x %02x %02x\n"
-+                           "%02x %02x %02x %02x %04x\n",
-+                        (u32) txdesc,
-+                        txd.pNextDesc.v, txd.HostMemPtr.v, txd.AcxMemPtr.v, txd.tx_time,
-+                        txd.total_length, txd.Reserved,
-+                        txd.dummy[0], txd.dummy[1], txd.dummy[2], txd.dummy[3],
-+                        txd.Ctl_8, txd.Ctl2_8, txd.error, txd.ack_failures,
-+                        txd.u.rts.rts_failures, txd.u.rts.rts_ok, txd.u.r1.rate, txd.u.r1.queue_ctrl,
-+                        txd.queue_info
-+                        );
-+          if (txd.AcxMemPtr.v) {
-+            copy_from_slavemem (adev, buf, txd.AcxMemPtr.v, sizeof (buf));
-+            for (j = 0; (j < txd.total_length) && (j<(sizeof(buf)-4)); j+=16) {
-+              p += sprintf (p, "    ");
-+              for (k = 0; (k < 16) && (j+k < txd.total_length); k++) {
-+                p += sprintf (p, " %02x", buf[j+k+4]);
-+              }
-+              p += sprintf (p, "\n");
-+            }
-+          }
-+          txdesc = advance_txdesc(adev, txdesc, 1);
-+        }
-+      }
-+      
-+      p += sprintf(p,
-+              "\n"
-+              "** Generic slave data **\n"
-+                "irq_mask 0x%04x irq_status 0x%04x irq on acx 0x%04x\n"
-+              "txbuf_start 0x%p, txbuf_area_size %u\n"
-+              "txdesc_size %u, txdesc_start 0x%p\n"
-+              "txhostdesc_start 0x%p, txhostdesc_area_size %u\n"
-+              "txbuf start 0x%04x, txbuf size %d\n"
-+              "rxdesc_start 0x%p\n"
-+              "rxhostdesc_start 0x%p, rxhostdesc_area_size %u\n"
-+              "rxbuf_start 0x%p, rxbuf_area_size %u\n",
-+              adev->irq_mask, adev->irq_status, read_reg32(adev, IO_ACX_IRQ_STATUS_NON_DES),
-+              adev->txbuf_start, adev->txbuf_area_size,
-+              adev->txdesc_size, adev->txdesc_start,
-+              adev->txhostdesc_start, adev->txhostdesc_area_size,
-+                adev->acx_txbuf_start, adev->acx_txbuf_numblocks * adev->memblocksize,
-+              adev->rxdesc_start,
-+              adev->rxhostdesc_start, adev->rxhostdesc_area_size,
-+              adev->rxbuf_start, adev->rxbuf_area_size);
-+      FN_EXIT0;
-+      return p;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acxmem_proc_eeprom_output(char *buf, acx_device_t *adev)
-+{
-+      char *p = buf;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      for (i = 0; i < 0x400; i++) {
-+              acxmem_read_eeprom_byte(adev, i, p++);
-+      }
-+
-+      FN_EXIT1(p - buf);
-+      return p - buf;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+void
-+acxmem_set_interrupt_mask(acx_device_t *adev)
-+{
-+      if (IS_ACX111(adev)) {
-+              adev->irq_mask = (u16) ~(0
-+                              | HOST_INT_RX_DATA       
-+                              | HOST_INT_TX_COMPLETE
-+                              /* | HOST_INT_TX_XFER        */
-+                              /* | HOST_INT_RX_COMPLETE    */
-+                              /* | HOST_INT_DTIM           */
-+                              /* | HOST_INT_BEACON         */
-+                              /* | HOST_INT_TIMER          */
-+                              /* | HOST_INT_KEY_NOT_FOUND  */
-+                              | HOST_INT_IV_ICV_FAILURE
-+                              | HOST_INT_CMD_COMPLETE
-+                              | HOST_INT_INFO
-+                              | HOST_INT_OVERFLOW    
-+                              /* | HOST_INT_PROCESS_ERROR  */
-+                              | HOST_INT_SCAN_COMPLETE
-+                              | HOST_INT_FCS_THRESHOLD
-+                              | HOST_INT_UNKNOWN
-+                              );
-+              /* Or else acx100 won't signal cmd completion, right? */
-+              adev->irq_mask_off = (u16)~( HOST_INT_CMD_COMPLETE ); /* 0xfdff */
-+      } else {
-+              adev->irq_mask = (u16) ~(0
-+                              | HOST_INT_RX_DATA 
-+                              | HOST_INT_TX_COMPLETE
-+                              /* | HOST_INT_TX_XFER        */
-+                              /* | HOST_INT_RX_COMPLETE    */
-+                              /* | HOST_INT_DTIM           */
-+                              /* | HOST_INT_BEACON         */
-+                              /* | HOST_INT_TIMER          */
-+                              /* | HOST_INT_KEY_NOT_FOUND  */
-+                              /* | HOST_INT_IV_ICV_FAILURE */
-+                              | HOST_INT_CMD_COMPLETE
-+                              | HOST_INT_INFO
-+                              /* | HOST_INT_OVERFLOW       */
-+                              /* | HOST_INT_PROCESS_ERROR  */
-+                              | HOST_INT_SCAN_COMPLETE
-+                              /* | HOST_INT_FCS_THRESHOLD  */
-+                              /* | HOST_INT_BEACON_MISSED        */
-+                              );
-+              adev->irq_mask_off = (u16)~( HOST_INT_UNKNOWN ); /* 0x7fff */
-+      }
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acx100mem_s_set_tx_level(acx_device_t *adev, u8 level_dbm)
-+{
-+      struct acx111_ie_tx_level tx_level;
-+
-+      /* since it can be assumed that at least the Maxim radio has a
-+       * maximum power output of 20dBm and since it also can be
-+       * assumed that these values drive the DAC responsible for
-+       * setting the linear Tx level, I'd guess that these values
-+       * should be the corresponding linear values for a dBm value,
-+       * in other words: calculate the values from that formula:
-+       * Y [dBm] = 10 * log (X [mW])
-+       * then scale the 0..63 value range onto the 1..100mW range (0..20 dBm)
-+       * and you're done...
-+       * Hopefully that's ok, but you never know if we're actually
-+       * right... (especially since Windows XP doesn't seem to show
-+       * actual Tx dBm values :-P) */
-+
-+      /* NOTE: on Maxim, value 30 IS 30mW, and value 10 IS 10mW - so the
-+       * values are EXACTLY mW!!! Not sure about RFMD and others,
-+       * though... */
-+      static const u8 dbm2val_maxim[21] = {
-+              63, 63, 63, 62,
-+              61, 61, 60, 60,
-+              59, 58, 57, 55,
-+              53, 50, 47, 43,
-+              38, 31, 23, 13,
-+              0
-+      };
-+      static const u8 dbm2val_rfmd[21] = {
-+               0,  0,  0,  1,
-+               2,  2,  3,  3,
-+               4,  5,  6,  8,
-+              10, 13, 16, 20,
-+              25, 32, 41, 50,
-+              63
-+      };
-+      const u8 *table;
-+
-+      switch (adev->radio_type) {
-+      case RADIO_MAXIM_0D:
-+              table = &dbm2val_maxim[0];
-+              break;
-+      case RADIO_RFMD_11:
-+      case RADIO_RALINK_15:
-+              table = &dbm2val_rfmd[0];
-+              break;
-+      default:
-+              printk("%s: unknown/unsupported radio type, "
-+                      "cannot modify tx power level yet!\n",
-+                              adev->ndev->name);
-+              return NOT_OK;
-+      }
-+      /*
-+       * The hx4700 EEPROM, at least, only supports 1 power setting.  The configure
-+       * routine matches the PA bias with the gain, so just use its default value.
-+       * The values are: 0x2b for the gain and 0x03 for the PA bias.  The firmware
-+       * writes the gain level to the Tx gain control DAC and the PA bias to the Maxim
-+       * radio's PA bias register.  The firmware limits itself to 0 - 64 when writing to the
-+       * gain control DAC.
-+       *
-+       * Physically between the ACX and the radio, higher Tx gain control DAC values result
-+       * in less power output; 0 volts to the Maxim radio results in the highest output power
-+       * level, which I'm assuming matches up with 0 in the Tx Gain DAC register.
-+       *
-+       * Although there is only the 1 power setting, one of the radio firmware functions adjusts
-+       * the transmit power level up and down.  That function is called by the ACX FIQ handler
-+       * under certain conditions.
-+       */
-+      tx_level.level = 1;
-+      //return acx_s_configure(adev, &tx_level, ACX1xx_IE_DOT11_TX_POWER_LEVEL);
-+
-+      printk("%s: changing radio power level to %u dBm (%u)\n",
-+                      adev->ndev->name, level_dbm, table[level_dbm]);
-+      acxmem_s_write_phy_reg(adev, 0x11, table[level_dbm]);
-+
-+      return 0;
-+}
-+
-+void acxmem_e_release(struct device *dev) {
-+}
-+
-+/***********************************************************************
-+** acx_cs part
-+**
-+** called by pcmcia card service
-+*/
-+
-+/*
-+   The event() function is this driver's Card Services event handler.
-+   It will be called by Card Services when an appropriate card status
-+   event is received.  The config() and release() entry points are
-+   used to configure or release a socket, in response to card
-+   insertion and ejection events.  They are invoked from the acx_cs
-+   event handler. 
-+*/
-+
-+static int acx_cs_config(struct pcmcia_device *link);
-+static void acx_cs_release(struct pcmcia_device *link);
-+
-+/*
-+   The attach() and detach() entry points are used to create and destroy
-+   "instances" of the driver, where each instance represents everything
-+   needed to manage one actual PCMCIA card.
-+*/
-+
-+static void acx_cs_detach(struct pcmcia_device *p_dev);
-+
-+/*
-+   You'll also need to prototype all the functions that will actually
-+   be used to talk to your device.  See 'pcmem_cs' for a good example
-+   of a fully self-sufficient driver; the other drivers rely more or
-+   less on other parts of the kernel.
-+*/
-+
-+/*
-+   A linked list of "instances" of the  acxnet device.  Each actual
-+   PCMCIA card corresponds to one device instance, and is described
-+   by one struct pcmcia_device structure (defined in ds.h).
-+
-+   You may not want to use a linked list for this -- for example, the
-+   memory card driver uses an array of struct pcmcia_device pointers, where minor
-+   device numbers are used to derive the corresponding array index.
-+*/
-+
-+/*
-+   A driver needs to provide a dev_node_t structure for each device
-+   on a card.  In some cases, there is only one device per card (for
-+   example, ethernet cards, modems).  In other cases, there may be
-+   many actual or logical devices (SCSI adapters, memory cards with
-+   multiple partitions).  The dev_node_t structures need to be kept
-+   in a linked list starting at the 'dev' field of a struct pcmcia_device
-+   structure.  We allocate them in the card's private data structure,
-+   because they generally shouldn't be allocated dynamically.
-+
-+   In this case, we also provide a flag to indicate if a device is
-+   "stopped" due to a power management event, or card ejection.  The
-+   device IO routines can use a flag like this to throttle IO to a
-+   card that is not ready to accept it.
-+*/
-+   
-+
-+/*======================================================================
-+  
-+  acx_attach() creates an "instance" of the driver, allocating
-+  local data structures for one device.  The device is registered
-+  with Card Services.
-+  
-+  The dev_link structure is initialized, but we don't actually
-+  configure the card at this point -- we wait until we receive a
-+  card insertion event.
-+  
-+  ======================================================================*/
-+
-+static int acx_cs_probe(struct pcmcia_device *link)
-+{
-+      local_info_t *local;
-+      struct net_device *ndev;
-+
-+      DEBUG(0, "acx_attach()\n");
-+
-+        ndev = alloc_netdev(sizeof(acx_device_t), "wlan%d", dummy_netdev_init);
-+        if (!ndev) {
-+                printk("acx: no memory for netdevice struct\n");
-+                return -ENOMEM;
-+        }
-+
-+        /* Interrupt setup */
-+        link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
-+        link->irq.IRQInfo1 = IRQ_LEVEL_ID;
-+        link->irq.Handler = acxmem_i_interrupt;
-+        link->irq.Instance = ndev;
-+
-+      /*
-+        General socket configuration defaults can go here.  In this
-+        client, we assume very little, and rely on the CIS for almost
-+        everything.  In most clients, many details (i.e., number, sizes,
-+        and attributes of IO windows) are fixed by the nature of the
-+        device, and can be hard-wired here.
-+      */
-+      link->conf.Attributes = CONF_ENABLE_IRQ;
-+      link->conf.IntType = INT_MEMORY_AND_IO;
-+      link->conf.Present = PRESENT_OPTION | PRESENT_COPY;
-+      
-+      /* Allocate space for private device-specific data */
-+      local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
-+      if (!local) {
-+              printk(KERN_ERR "acx_cs: no memory for new device\n");
-+              return -ENOMEM;
-+      }
-+      local->ndev = ndev;
-+      
-+      link->priv = local;
-+
-+      return acx_cs_config(link);
-+} /* acx_attach */
-+
-+/*======================================================================
-+  
-+  This deletes a driver "instance".  The device is de-registered
-+  with Card Services.  If it has been released, all local data
-+  structures are freed.  Otherwise, the structures will be freed
-+  when the device is released.
-+  
-+  ======================================================================*/
-+
-+static void acx_cs_detach(struct pcmcia_device *link)
-+{
-+      DEBUG(0, "acx_detach(0x%p)\n", link);
-+
-+
-+      if ( ((local_info_t*)link->priv)->ndev ) {
-+              acxmem_e_close( ((local_info_t*)link->priv)->ndev );
-+      }
-+
-+      acx_cs_release(link);
-+
-+      ((local_info_t*)link->priv)->ndev = NULL;
-+
-+      kfree(link->priv);
-+} /* acx_detach */
-+
-+/*======================================================================
-+  
-+  acx_config() is scheduled to run after a CARD_INSERTION event
-+  is received, to configure the PCMCIA socket, and to make the
-+  device available to the system.
-+  
-+  ======================================================================*/
-+
-+#define CS_CHECK(fn, ret) \
-+do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
-+
-+static int acx_cs_config(struct pcmcia_device *link)
-+{
-+      tuple_t tuple;
-+      cisparse_t parse;
-+      local_info_t *local = link->priv;
-+      int last_fn, last_ret;
-+      u_char buf[64];
-+      win_req_t req;
-+      memreq_t map;
-+//    int i;
-+//        acx_device_t *adev;
-+
-+//    adev = (acx_device_t *)link->priv;
-+
-+      DEBUG(0, "acx_cs_config(0x%p)\n", link);
-+
-+      /*
-+        In this loop, we scan the CIS for configuration table entries,
-+        each of which describes a valid card configuration, including
-+        voltage, IO window, memory window, and interrupt settings.
-+        
-+        We make no assumptions about the card to be configured: we use
-+        just the information available in the CIS.  In an ideal world,
-+        this would work for any PCMCIA card, but it requires a complete
-+        and accurate CIS.  In practice, a driver usually "knows" most of
-+        these things without consulting the CIS, and most client drivers
-+        will only use the CIS to fill in implementation-defined details.
-+      */
-+    tuple.Attributes = 0;
-+    tuple.TupleData = (cisdata_t *)buf;
-+    tuple.TupleDataMax = sizeof(buf);
-+    tuple.TupleOffset = 0;
-+    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
-+
-+    /* don't trust the CIS on this; Linksys got it wrong */
-+    //link->conf.Present = 0x63;
-+
-+    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
-+        while (1) {
-+                cistpl_cftable_entry_t dflt = { 0 };
-+                cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
-+                if (pcmcia_get_tuple_data(link, &tuple) != 0 ||
-+                                pcmcia_parse_tuple(link, &tuple, &parse) != 0)
-+                        goto next_entry;
-+
-+                if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;
-+                if (cfg->index == 0) goto next_entry;
-+                link->conf.ConfigIndex = cfg->index;
-+
-+                /* Does this card need audio output? */
-+                if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
-+                        link->conf.Attributes |= CONF_ENABLE_SPKR;
-+                        link->conf.Status = CCSR_AUDIO_ENA;
-+                }
-+
-+                /* Use power settings for Vcc and Vpp if present */
-+                /*  Note that the CIS values need to be rescaled */
-+                if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
-+                        link->conf.Vpp =
-+                                cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
-+                else if (dflt.vpp1.present & (1<<CISTPL_POWER_VNOM))
-+                        link->conf.Vpp =
-+                                dflt.vpp1.param[CISTPL_POWER_VNOM]/10000;
-+
-+                /* Do we need to allocate an interrupt? */
-+                if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1)
-+                        link->conf.Attributes |= CONF_ENABLE_IRQ;
-+                if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) {
-+                        cistpl_mem_t *mem =
-+                                (cfg->mem.nwin) ? &cfg->mem : &dflt.mem;
-+//                        req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_AM|WIN_ENABLE|WIN_USE_WAIT;
-+                      req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE|WIN_USE_WAIT;
-+                        req.Base = mem->win[0].host_addr;
-+                        req.Size = mem->win[0].len;
-+                        req.Size=0x1000;
-+                        req.AccessSpeed = 0;
-+                        if (pcmcia_request_window(&link, &req, &link->win) != 0)
-+                                goto next_entry;
-+                        map.Page = 0; map.CardOffset = mem->win[0].card_addr;
-+                        if (pcmcia_map_mem_page(link->win, &map) != 0)
-+                                goto next_entry;
-+                        else
-+                           printk(KERN_INFO "MEMORY WINDOW FOUND!!!\n");
-+                }
-+                /* If we got this far, we're cool! */
-+                break;
-+
-+        next_entry:
-+                CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
-+        }
-+
-+       if (link->conf.Attributes & CONF_ENABLE_IRQ) {
-+                printk(KERN_INFO "requesting Irq...\n");
-+                CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
-+       }
-+
-+        /*
-+          This actually configures the PCMCIA socket -- setting up
-+          the I/O windows and the interrupt mapping, and putting the
-+          card and host interface into "Memory and IO" mode.
-+        */
-+        CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
-+      DEBUG(0,"RequestConfiguration OK\n");
-+
-+
-+          memwin.Base=req.Base;
-+          memwin.Size=req.Size;
-+
-+      acx_init_netdev(local->ndev, &link->dev, memwin.Base, memwin.Size, link->irq.AssignedIRQ);
-+
-+#if 1 
-+      /*
-+        At this point, the dev_node_t structure(s) need to be
-+        initialized and arranged in a linked list at link->dev_node.
-+      */
-+      strcpy(local->node.dev_name, local->ndev->name );
-+      local->node.major = local->node.minor = 0;
-+      link->dev_node = &local->node;
-+      
-+      /* Finally, report what we've done */
-+      printk(KERN_INFO "%s: index 0x%02x: ",
-+             local->ndev->name, link->conf.ConfigIndex);
-+#endif
-+      if (link->conf.Attributes & CONF_ENABLE_IRQ)
-+              printk("irq %d", link->irq.AssignedIRQ);
-+      if (link->io.NumPorts1)
-+              printk(", io 0x%04x-0x%04x", link->io.BasePort1,
-+                     link->io.BasePort1+link->io.NumPorts1-1);
-+      if (link->io.NumPorts2)
-+              printk(" & 0x%04x-0x%04x", link->io.BasePort2,
-+                     link->io.BasePort2+link->io.NumPorts2-1);
-+      if (link->win)
-+              printk(", mem 0x%06lx-0x%06lx\n", req.Base,
-+                     req.Base+req.Size-1);
-+      return 0;
-+
-+ cs_failed:
-+      cs_error(link, last_fn, last_ret);
-+      acx_cs_release(link);
-+      return -ENODEV;
-+} /* acx_config */
-+
-+/*======================================================================
-+  
-+  After a card is removed, acx_release() will unregister the
-+  device, and release the PCMCIA configuration.  If the device is
-+  still open, this will be postponed until it is closed.
-+  
-+  ======================================================================*/
-+
-+static void acx_cs_release(struct pcmcia_device *link)
-+{
-+      DEBUG(0, "acx_release(0x%p)\n", link);
-+      acxmem_e_remove(link);
-+      pcmcia_disable_device(link);
-+}
-+
-+static int acx_cs_suspend(struct pcmcia_device *link)
-+{
-+      local_info_t *local = link->priv;
-+
-+      pm_message_t state;
-+      acxmem_e_suspend ( local->ndev, state);
-+      /* Already done in suspend
-+       * netif_device_detach(local->ndev); */
-+
-+      return 0;
-+}
-+
-+static int acx_cs_resume(struct pcmcia_device *link)
-+{
-+      local_info_t *local = link->priv;
-+      
-+      FN_ENTER;
-+      resume_ndev = local->ndev;
-+
-+      schedule_work( &fw_resume_work );
-+      
-+      /* Already done in suspend
-+      if (link->open) {
-+        // do we need reset for ACX, if so what function nane is ?
-+              //reset_acx_card(local->eth_dev);
-+              netif_device_attach(local->ndev);
-+      } */
-+      
-+      FN_EXIT0;
-+      return 0;
-+}
-+
-+static struct pcmcia_device_id acx_ids[] = {
-+      PCMCIA_DEVICE_MANF_CARD(0x0097, 0x8402),
-+        PCMCIA_DEVICE_MANF_CARD(0x0250, 0xb001),
-+      PCMCIA_DEVICE_NULL,
-+};
-+MODULE_DEVICE_TABLE(pcmcia, acx_ids);
-+
-+static struct pcmcia_driver acx_driver = {
-+      .owner          = THIS_MODULE,
-+      .drv            = {
-+              .name   = "acx_cs",
-+      },
-+      .probe          = acx_cs_probe,
-+      .remove         = acx_cs_detach,
-+      .id_table = acx_ids,
-+      .suspend        = acx_cs_suspend,
-+      .resume         = acx_cs_resume,
-+};
-+
-+int acx_cs_init(void)
-+{
-+        /* return success if at least one succeeded */
-+      DEBUG(0, "acxcs_init()\n");
-+      return pcmcia_register_driver(&acx_driver);
-+}
-+
-+void acx_cs_cleanup(void)
-+{
-+      pcmcia_unregister_driver(&acx_driver);
-+}
-+
-+/*
-+    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.
-+
-+    In addition:
-+
-+    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.
-+
-+    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.    
-+*/
-+
-+MODULE_DESCRIPTION( "ACX Cardbus Driver" );
-+MODULE_LICENSE( "GPL" );
-+
-Index: linux-2.6.22/drivers/net/wireless/acx/htcsable_acx.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/htcsable_acx.c       2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,118 @@
-+/*
-+ * WLAN (TI TNETW1100B) support in the HTC Sable
-+ *
-+ * Copyright (c) 2006 SDG Systems, LLC
-+ *
-+ * 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.
-+ *
-+ * 28-March-2006          Todd Blumer <todd@sdgsystems.com>
-+ */
-+
-+
-+#include <linux/kernel.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+
-+#include <asm/hardware.h>
-+
-+#include <asm/arch/pxa-regs.h>
-+#include <linux/mfd/asic3_base.h>
-+#include <asm/arch/htcsable-gpio.h>
-+#include <asm/arch/htcsable-asic.h>
-+#include <asm/io.h>
-+
-+#include "acx_hw.h"
-+
-+#define WLAN_BASE     PXA_CS2_PHYS
-+
-+/*
-+off: b15 c8 d3
-+on: d3 c8 b5 b5-
-+*/
-+
-+#define GPIO_NR_HTCSABLE_ACX111 111
-+
-+static int
-+htcsable_wlan_stop( void );
-+
-+static int
-+htcsable_wlan_start( void )
-+{
-+      printk( "htcsable_wlan_start\n" );
-+
-+  /*asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_RESET, 0);*/
-+  asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_PWR_3, 1<<GPIOC_ACX_PWR_3); /* related to acx */
-+  SET_HTCSABLE_GPIO(ACX111, 1);
-+      asic3_set_gpio_out_b(&htcsable_asic3.dev, 1<<GPIOB_ACX_PWR_1, 1<<GPIOB_ACX_PWR_1);
-+      asic3_set_gpio_out_d(&htcsable_asic3.dev, 1<<GPIOD_ACX_PWR_2, 1<<GPIOD_ACX_PWR_2);
-+  mdelay(260);
-+  asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_RESET, 1<<GPIOC_ACX_RESET);
-+
-+      return 0;
-+}
-+
-+static int
-+htcsable_wlan_stop( void )
-+{
-+      printk( "htcsable_wlan_stop\n" );
-+      asic3_set_gpio_out_b(&htcsable_asic3.dev, 1<<GPIOB_ACX_PWR_1, 0);
-+      asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_RESET, 0);
-+      asic3_set_gpio_out_d(&htcsable_asic3.dev, 1<<GPIOD_ACX_PWR_2, 0);
-+  SET_HTCSABLE_GPIO(ACX111, 0); /* not necessary to power down this one? */
-+      asic3_set_gpio_out_c(&htcsable_asic3.dev, 1<<GPIOC_ACX_PWR_3, 0); /* not necessary to power down this one? */
-+
-+      return 0;
-+}
-+
-+static struct resource acx_resources[] = {
-+      [0] = {
-+              .start  = WLAN_BASE,
-+              .end    = WLAN_BASE + 0x20,
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+//            .start  = asic3_irq_base(&htcsable_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N,
-+//            .end    = asic3_irq_base(&htcsable_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N,
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct acx_hardware_data acx_data = {
-+      .start_hw       = htcsable_wlan_start,
-+      .stop_hw        = htcsable_wlan_stop,
-+};
-+
-+static struct platform_device acx_device = {
-+      .name   = "acx-mem",
-+      .dev    = {
-+              .platform_data = &acx_data,
-+      },
-+      .num_resources  = ARRAY_SIZE( acx_resources ),
-+      .resource       = acx_resources,
-+};
-+
-+static int __init
-+htcsable_wlan_init( void )
-+{
-+      printk( "htcsable_wlan_init: acx-mem platform_device_register\n" );
-+      acx_device.resource[1].start = asic3_irq_base(&htcsable_asic3.dev) + ASIC3_GPIOB_IRQ_BASE+GPIOB_ACX_IRQ_N;
-+      acx_device.resource[1].end = asic3_irq_base(&htcsable_asic3.dev) + ASIC3_GPIOB_IRQ_BASE+GPIOB_ACX_IRQ_N;
-+      return platform_device_register( &acx_device );
-+}
-+
-+
-+static void __exit
-+htcsable_wlan_exit( void )
-+{
-+      platform_device_unregister( &acx_device );
-+}
-+
-+module_init( htcsable_wlan_init );
-+module_exit( htcsable_wlan_exit );
-+
-+MODULE_AUTHOR( "Todd Blumer <todd@sdgsystems.com>" );
-+MODULE_DESCRIPTION( "WLAN driver for HTC Sable" );
-+MODULE_LICENSE( "GPL" );
-+
-Index: linux-2.6.22/drivers/net/wireless/acx/htcuniversal_acx.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/htcuniversal_acx.c   2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,108 @@
-+/*
-+ * WLAN (TI TNETW1100B) support in the HTC Universal
-+ *
-+ * Copyright (c) 2006 SDG Systems, LLC
-+ *
-+ * 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.
-+ *
-+ * 28-March-2006          Todd Blumer <todd@sdgsystems.com>
-+ */
-+
-+
-+#include <linux/kernel.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+
-+#include <asm/hardware.h>
-+
-+#include <asm/arch/pxa-regs.h>
-+#include <linux/soc/asic3_base.h>
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+#include <asm/io.h>
-+
-+#include "acx_hw.h"
-+
-+#define WLAN_BASE     PXA_CS2_PHYS
-+
-+
-+static int
-+htcuniversal_wlan_start( void )
-+{
-+      htcuniversal_egpio_enable(1<<EGPIO6_WIFI_ON);
-+      asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_PWR1_ON, 1<<GPIOC_WIFI_PWR1_ON);
-+      asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_WIFI_PWR3_ON, 1<<GPIOD_WIFI_PWR3_ON);
-+      asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_WIFI_PWR2_ON, 1<<GPIOD_WIFI_PWR2_ON);
-+      mdelay(100);
-+
-+      asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_RESET, 0);
-+      mdelay(100);
-+      asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_RESET, 1<<GPIOC_WIFI_RESET);
-+      mdelay(100);
-+      return 0;
-+}
-+
-+static int
-+htcuniversal_wlan_stop( void )
-+{
-+      asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_RESET, 0);
-+
-+      htcuniversal_egpio_disable(1<<EGPIO6_WIFI_ON);
-+      asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_WIFI_PWR1_ON, 0);
-+      asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_WIFI_PWR2_ON, 0);
-+      asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_WIFI_PWR3_ON, 0);
-+      return 0;
-+}
-+
-+static struct resource acx_resources[] = {
-+      [0] = {
-+              .start  = WLAN_BASE,
-+              .end    = WLAN_BASE + 0x20,
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+//            .start  = asic3_irq_base(&htcuniversal_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N,
-+//            .end    = asic3_irq_base(&htcuniversal_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N,
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct acx_hardware_data acx_data = {
-+      .start_hw       = htcuniversal_wlan_start,
-+      .stop_hw        = htcuniversal_wlan_stop,
-+};
-+
-+static struct platform_device acx_device = {
-+      .name   = "acx-mem",
-+      .dev    = {
-+              .platform_data = &acx_data,
-+      },
-+      .num_resources  = ARRAY_SIZE( acx_resources ),
-+      .resource       = acx_resources,
-+};
-+
-+static int __init
-+htcuniversal_wlan_init( void )
-+{
-+      printk( "htcuniversal_wlan_init: acx-mem platform_device_register\n" );
-+      acx_device.resource[1].start = asic3_irq_base(&htcuniversal_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N;
-+      acx_device.resource[1].end = asic3_irq_base(&htcuniversal_asic3.dev) + ASIC3_GPIOC_IRQ_BASE+GPIOC_WIFI_IRQ_N;
-+      return platform_device_register( &acx_device );
-+}
-+
-+
-+static void __exit
-+htcuniversal_wlan_exit( void )
-+{
-+      platform_device_unregister( &acx_device );
-+}
-+
-+module_init( htcuniversal_wlan_init );
-+module_exit( htcuniversal_wlan_exit );
-+
-+MODULE_AUTHOR( "Todd Blumer <todd@sdgsystems.com>" );
-+MODULE_DESCRIPTION( "WLAN driver for HTC Universal" );
-+MODULE_LICENSE( "GPL" );
-+
-Index: linux-2.6.22/drivers/net/wireless/acx/hx4700_acx.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/hx4700_acx.c 2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,108 @@
-+/*
-+ * WLAN (TI TNETW1100B) support in the hx470x.
-+ *
-+ * Copyright (c) 2006 SDG Systems, LLC
-+ *
-+ * 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.
-+ *
-+ * 28-March-2006          Todd Blumer <todd@sdgsystems.com>
-+ */
-+
-+
-+#include <linux/kernel.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+#include <linux/leds.h>
-+
-+#include <asm/hardware.h>
-+
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/hx4700-gpio.h>
-+#include <asm/arch/hx4700-core.h>
-+#include <asm/io.h>
-+
-+#include "acx_hw.h"
-+
-+#define WLAN_OFFSET   0x1000000
-+#define WLAN_BASE     (PXA_CS5_PHYS+WLAN_OFFSET)
-+
-+
-+static int
-+hx4700_wlan_start( void )
-+{
-+      SET_HX4700_GPIO( WLAN_RESET_N, 0 );
-+      mdelay(5);
-+      hx4700_egpio_enable( EGPIO0_VCC_3V3_EN );
-+      mdelay(100);
-+      hx4700_egpio_enable( EGPIO7_VCC_3V3_WL_EN );
-+      mdelay(150);
-+      hx4700_egpio_enable( EGPIO1_WL_VREG_EN | EGPIO2_VCC_2V1_WL_EN |
-+                             EGPIO6_WL1V8_EN );
-+      mdelay(10);
-+      SET_HX4700_GPIO( WLAN_RESET_N, 1 );
-+      mdelay(50);
-+      led_trigger_event_shared(hx4700_radio_trig, LED_FULL);
-+      return 0;
-+}
-+
-+static int
-+hx4700_wlan_stop( void )
-+{
-+      hx4700_egpio_disable( EGPIO0_VCC_3V3_EN | EGPIO1_WL_VREG_EN |
-+                              EGPIO7_VCC_3V3_WL_EN | EGPIO2_VCC_2V1_WL_EN |
-+                              EGPIO6_WL1V8_EN );
-+      SET_HX4700_GPIO( WLAN_RESET_N, 0 );
-+      led_trigger_event_shared(hx4700_radio_trig, LED_OFF);
-+      return 0;
-+}
-+
-+static struct resource acx_resources[] = {
-+      [0] = {
-+              .start  = WLAN_BASE,
-+              .end    = WLAN_BASE + 0x20,
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start  = HX4700_IRQ(WLAN_IRQ_N),
-+              .end    = HX4700_IRQ(WLAN_IRQ_N),
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct acx_hardware_data acx_data = {
-+      .start_hw       = hx4700_wlan_start,
-+      .stop_hw        = hx4700_wlan_stop,
-+};
-+
-+static struct platform_device acx_device = {
-+      .name   = "acx-mem",
-+      .dev    = {
-+              .platform_data = &acx_data,
-+      },
-+      .num_resources  = ARRAY_SIZE( acx_resources ),
-+      .resource       = acx_resources,
-+};
-+
-+static int __init
-+hx4700_wlan_init( void )
-+{
-+      printk( "hx4700_wlan_init: acx-mem platform_device_register\n" );
-+      return platform_device_register( &acx_device );
-+}
-+
-+
-+static void __exit
-+hx4700_wlan_exit( void )
-+{
-+      platform_device_unregister( &acx_device );
-+}
-+
-+module_init( hx4700_wlan_init );
-+module_exit( hx4700_wlan_exit );
-+
-+MODULE_AUTHOR( "Todd Blumer <todd@sdgsystems.com>" );
-+MODULE_DESCRIPTION( "WLAN driver for iPAQ hx4700" );
-+MODULE_LICENSE( "GPL" );
-+
-Index: linux-2.6.22/drivers/net/wireless/acx/ioctl.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/ioctl.c      2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,2748 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
-+#include <linux/config.h>
-+#endif
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <asm/io.h>
-+/* #include <asm/uaccess.h> */ /* required for 2.4.x kernels; verify_write() */
-+#include <linux/if_arp.h>
-+#include <linux/wireless.h>
-+#include <net/iw_handler.h>
-+
-+#include "acx.h"
-+
-+
-+/***********************************************************************
-+*/
-+
-+/* channel frequencies
-+ * TODO: Currently, every other 802.11 driver keeps its own copy of this. In
-+ * the long run this should be integrated into ieee802_11.h or wireless.h or
-+ * whatever IEEE802.11x framework evolves */
-+static const u16 acx_channel_freq[] = {
-+      2412, 2417, 2422, 2427, 2432, 2437, 2442,
-+      2447, 2452, 2457, 2462, 2467, 2472, 2484,
-+};
-+
-+
-+/***********************************************************************
-+** acx_ioctl_commit
-+*/
-+static int
-+acx_ioctl_commit(struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+      if (ACX_STATE_IFACE_UP & adev->dev_state_mask)
-+              acx_s_update_card_settings(adev);
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT0;
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_ioctl_get_name(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      static const char * const names[] = { "IEEE 802.11b+/g+", "IEEE 802.11b+" };
-+
-+      strcpy(wrqu->name, names[IS_ACX111(adev) ? 0 : 1]);
-+
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_freq
-+*/
-+static int
-+acx_ioctl_set_freq(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int channel = -1;
-+      unsigned int mult = 1;
-+      int result;
-+
-+      FN_ENTER;
-+
-+      if (wrqu->freq.e == 0 && wrqu->freq.m <= 1000) {
-+              /* Setting by channel number */
-+              channel = wrqu->freq.m;
-+      } else {
-+              /* If setting by frequency, convert to a channel */
-+              int i;
-+
-+              for (i = 0; i < (6 - wrqu->freq.e); i++)
-+                      mult *= 10;
-+
-+              for (i = 1; i <= 14; i++)
-+                      if (wrqu->freq.m == acx_channel_freq[i - 1] * mult)
-+                              channel = i;
-+      }
-+
-+      if (channel > 14) {
-+              result = -EINVAL;
-+              goto end;
-+      }
-+
-+      acx_sem_lock(adev);
-+
-+      adev->channel = channel;
-+      /* hmm, the following code part is strange, but this is how
-+       * it was being done before... */
-+      log(L_IOCTL, "Changing to channel %d\n", channel);
-+      SET_BIT(adev->set_mask, GETSET_CHANNEL);
-+
-+      result = -EINPROGRESS; /* need to call commit handler */
-+
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static inline int
-+acx_ioctl_get_freq(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      wrqu->freq.e = 0;
-+      wrqu->freq.m = adev->channel;
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_mode
-+*/
-+static int
-+acx_ioctl_set_mode(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      switch (wrqu->mode) {
-+      case IW_MODE_AUTO:
-+              adev->mode = ACX_MODE_OFF;
-+              break;
-+      case IW_MODE_MONITOR:
-+              adev->mode = ACX_MODE_MONITOR;
-+              break;
-+      case IW_MODE_ADHOC:
-+              adev->mode = ACX_MODE_0_ADHOC;
-+              break;
-+      case IW_MODE_INFRA:
-+              adev->mode = ACX_MODE_2_STA;
-+              break;
-+      case IW_MODE_MASTER:
-+              printk("acx: master mode (HostAP) is very, very "
-+                      "experimental! It might work partially, but "
-+                      "better get prepared for nasty surprises "
-+                      "at any time\n");
-+              adev->mode = ACX_MODE_3_AP;
-+              break;
-+      case IW_MODE_REPEAT:
-+      case IW_MODE_SECOND:
-+      default:
-+              result = -EOPNOTSUPP;
-+              goto end_unlock;
-+      }
-+
-+      log(L_ASSOC, "new adev->mode=%d\n", adev->mode);
-+      SET_BIT(adev->set_mask, GETSET_MODE);
-+      result = -EINPROGRESS;
-+
-+end_unlock:
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_ioctl_get_mode(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result = 0;
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_OFF:
-+              wrqu->mode = IW_MODE_AUTO; break;
-+      case ACX_MODE_MONITOR:
-+              wrqu->mode = IW_MODE_MONITOR; break;
-+      case ACX_MODE_0_ADHOC:
-+              wrqu->mode = IW_MODE_ADHOC; break;
-+      case ACX_MODE_2_STA:
-+              wrqu->mode = IW_MODE_INFRA; break;
-+      case ACX_MODE_3_AP:
-+              wrqu->mode = IW_MODE_MASTER; break;
-+      default:
-+              result = -EOPNOTSUPP;
-+      }
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_ioctl_set_sens(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->sens;
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      acx_sem_lock(adev);
-+
-+      adev->sensitivity = (1 == vwrq->disabled) ? 0 : vwrq->value;
-+      SET_BIT(adev->set_mask, GETSET_SENSITIVITY);
-+
-+      acx_sem_unlock(adev);
-+
-+      return -EINPROGRESS;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_ioctl_get_sens(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->sens;
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      if (IS_USB(adev))
-+              /* setting the PHY reg via fw cmd doesn't work yet */
-+              return -EOPNOTSUPP;
-+
-+      /* acx_sem_lock(adev); */
-+
-+      vwrq->value = adev->sensitivity;
-+      vwrq->disabled = (vwrq->value == 0);
-+      vwrq->fixed = 1;
-+
-+      /* acx_sem_unlock(adev); */
-+
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_ap
-+**
-+** Sets the MAC address of the AP to associate with
-+*/
-+static int
-+acx_ioctl_set_ap(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct sockaddr *awrq = &wrqu->ap_addr;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result = 0;
-+      const u8 *ap;
-+
-+      FN_ENTER;
-+      if (NULL == awrq) {
-+              result = -EFAULT;
-+              goto end;
-+      }
-+      if (ARPHRD_ETHER != awrq->sa_family) {
-+              result = -EINVAL;
-+              goto end;
-+      }
-+
-+      ap = awrq->sa_data;
-+      acxlog_mac(L_IOCTL, "set AP=", ap, "\n");
-+
-+      MAC_COPY(adev->ap, ap);
-+
-+      /* We want to start rescan in managed or ad-hoc mode,
-+      ** otherwise just set adev->ap.
-+      ** "iwconfig <if> ap <mac> mode managed": we must be able
-+      ** to set ap _first_ and _then_ set mode */
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+      case ACX_MODE_2_STA:
-+              /* FIXME: if there is a convention on what zero AP means,
-+              ** please add a comment about that. I don't know of any --vda */
-+              if (mac_is_zero(ap)) {
-+                      /* "off" == 00:00:00:00:00:00 */
-+                      MAC_BCAST(adev->ap);
-+                      log(L_IOCTL, "Not reassociating\n");
-+              } else {
-+                      log(L_IOCTL, "Forcing reassociation\n");
-+                      SET_BIT(adev->set_mask, GETSET_RESCAN);
-+              }
-+              break;
-+      }
-+      result = -EINPROGRESS;
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_ioctl_get_ap(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct sockaddr *awrq = &wrqu->ap_addr;
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      if (ACX_STATUS_4_ASSOCIATED == adev->status) {
-+              /* as seen in Aironet driver, airo.c */
-+              MAC_COPY(awrq->sa_data, adev->bssid);
-+      } else {
-+              MAC_ZERO(awrq->sa_data);
-+      }
-+      awrq->sa_family = ARPHRD_ETHER;
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_aplist
-+**
-+** Deprecated in favor of iwscan.
-+** We simply return the list of currently available stations in range,
-+** don't do a new scan.
-+*/
-+static int
-+acx_ioctl_get_aplist(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_point *dwrq = &wrqu->data;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      struct sockaddr *address = (struct sockaddr *) extra;
-+      struct iw_quality qual[IW_MAX_AP];
-+      int i, cur;
-+      int result = OK;
-+
-+      FN_ENTER;
-+
-+      /* we have AP list only in STA mode */
-+      if (ACX_MODE_2_STA != adev->mode) {
-+              result = -EOPNOTSUPP;
-+              goto end;
-+      }
-+
-+      cur = 0;
-+      for (i = 0; i < VEC_SIZE(adev->sta_list); i++) {
-+              struct client *bss = &adev->sta_list[i];
-+              if (!bss->used) continue;
-+              MAC_COPY(address[cur].sa_data, bss->bssid);
-+              address[cur].sa_family = ARPHRD_ETHER;
-+              qual[cur].level = bss->sir;
-+              qual[cur].noise = bss->snr;
-+#ifndef OLD_QUALITY
-+              qual[cur].qual = acx_signal_determine_quality(qual[cur].level,
-+                                                  qual[cur].noise);
-+#else
-+              qual[cur].qual = (qual[cur].noise <= 100) ?
-+                             100 - qual[cur].noise : 0;
-+#endif
-+              /* no scan: level/noise/qual not updated: */
-+              qual[cur].updated = 0;
-+              cur++;
-+      }
-+      if (cur) {
-+              dwrq->flags = 1;
-+              memcpy(extra + sizeof(struct sockaddr)*cur, &qual,
-+                              sizeof(struct iw_quality)*cur);
-+      }
-+      dwrq->length = cur;
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_ioctl_set_scan(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      /* don't start scan if device is not up yet */
-+      if (!(adev->dev_state_mask & ACX_STATE_IFACE_UP)) {
-+              result = -EAGAIN;
-+              goto end_unlock;
-+      }
-+
-+      /* This is NOT a rescan for new AP!
-+      ** Do not use SET_BIT(GETSET_RESCAN); */
-+      acx_s_cmd_start_scan(adev);
-+      result = OK;
-+
-+end_unlock:
-+      acx_sem_unlock(adev);
-+/* end: */
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_s_scan_add_station
-+*/
-+/* helper. not sure whether it's really a _s_leeping fn */
-+static char*
-+acx_s_scan_add_station(
-+      acx_device_t *adev,
-+      char *ptr,
-+      char *end_buf,
-+      struct client *bss)
-+{
-+      struct iw_event iwe;
-+      char *ptr_rate;
-+
-+      FN_ENTER;
-+
-+      /* MAC address has to be added first */
-+      iwe.cmd = SIOCGIWAP;
-+      iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
-+      MAC_COPY(iwe.u.ap_addr.sa_data, bss->bssid);
-+      acxlog_mac(L_IOCTL, "scan, station address: ", bss->bssid, "\n");
-+      ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_ADDR_LEN);
-+
-+      /* Add ESSID */
-+      iwe.cmd = SIOCGIWESSID;
-+      iwe.u.data.length = bss->essid_len;
-+      iwe.u.data.flags = 1;
-+      log(L_IOCTL, "scan, essid: %s\n", bss->essid);
-+      ptr = iwe_stream_add_point(ptr, end_buf, &iwe, bss->essid);
-+
-+      /* Add mode */
-+      iwe.cmd = SIOCGIWMODE;
-+      if (bss->cap_info & (WF_MGMT_CAP_ESS | WF_MGMT_CAP_IBSS)) {
-+              if (bss->cap_info & WF_MGMT_CAP_ESS)
-+                      iwe.u.mode = IW_MODE_MASTER;
-+              else
-+                      iwe.u.mode = IW_MODE_ADHOC;
-+              log(L_IOCTL, "scan, mode: %d\n", iwe.u.mode);
-+              ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_UINT_LEN);
-+      }
-+
-+      /* Add frequency */
-+      iwe.cmd = SIOCGIWFREQ;
-+      iwe.u.freq.m = acx_channel_freq[bss->channel - 1] * 100000;
-+      iwe.u.freq.e = 1;
-+      log(L_IOCTL, "scan, frequency: %d\n", iwe.u.freq.m);
-+      ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_FREQ_LEN);
-+
-+      /* Add link quality */
-+      iwe.cmd = IWEVQUAL;
-+      /* FIXME: these values should be expressed in dBm, but we don't know
-+       * how to calibrate it yet */
-+      iwe.u.qual.level = bss->sir;
-+      iwe.u.qual.noise = bss->snr;
-+#ifndef OLD_QUALITY
-+      iwe.u.qual.qual = acx_signal_determine_quality(iwe.u.qual.level,
-+                                                      iwe.u.qual.noise);
-+#else
-+      iwe.u.qual.qual = (iwe.u.qual.noise <= 100) ?
-+                              100 - iwe.u.qual.noise : 0;
-+#endif
-+      iwe.u.qual.updated = 7;
-+      log(L_IOCTL, "scan, link quality: %d/%d/%d\n",
-+                      iwe.u.qual.level, iwe.u.qual.noise, iwe.u.qual.qual);
-+      ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_QUAL_LEN);
-+
-+      /* Add encryption */
-+      iwe.cmd = SIOCGIWENCODE;
-+      if (bss->cap_info & WF_MGMT_CAP_PRIVACY)
-+              iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
-+      else
-+              iwe.u.data.flags = IW_ENCODE_DISABLED;
-+      iwe.u.data.length = 0;
-+      log(L_IOCTL, "scan, encryption flags: %X\n", iwe.u.data.flags);
-+      ptr = iwe_stream_add_point(ptr, end_buf, &iwe, bss->essid);
-+
-+      /* add rates */
-+      iwe.cmd = SIOCGIWRATE;
-+      iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
-+      ptr_rate = ptr + IW_EV_LCP_LEN;
-+
-+      {
-+      u16 rate = bss->rate_cap;
-+      const u8* p = acx_bitpos2ratebyte;
-+      while (rate) {
-+              if (rate & 1) {
-+                      iwe.u.bitrate.value = *p * 500000; /* units of 500kb/s */
-+                      log(L_IOCTL, "scan, rate: %d\n", iwe.u.bitrate.value);
-+                      ptr_rate = iwe_stream_add_value(ptr, ptr_rate, end_buf,
-+                                              &iwe, IW_EV_PARAM_LEN);
-+              }
-+              rate >>= 1;
-+              p++;
-+      }}
-+
-+      if ((ptr_rate - ptr) > (ptrdiff_t)IW_EV_LCP_LEN)
-+              ptr = ptr_rate;
-+
-+      /* drop remaining station data items for now */
-+
-+      FN_EXIT0;
-+      return ptr;
-+}
-+
-+
-+/***********************************************************************
-+ * acx_ioctl_get_scan
-+ */
-+static int
-+acx_ioctl_get_scan(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_point *dwrq = &wrqu->data;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      char *ptr = extra;
-+      int i;
-+      int result = OK;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      /* no scan available if device is not up yet */
-+      if (!(adev->dev_state_mask & ACX_STATE_IFACE_UP)) {
-+              log(L_IOCTL, "iface not up yet\n");
-+              result = -EAGAIN;
-+              goto end_unlock;
-+      }
-+
-+#ifdef ENODATA_TO_BE_USED_AFTER_SCAN_ERROR_ONLY
-+      if (adev->bss_table_count == 0) {
-+              /* no stations found */
-+              result = -ENODATA;
-+              goto end_unlock;
-+      }
-+#endif
-+
-+      for (i = 0; i < VEC_SIZE(adev->sta_list); i++) {
-+              struct client *bss = &adev->sta_list[i];
-+              if (!bss->used) continue;
-+              ptr = acx_s_scan_add_station(adev, ptr,
-+                      extra + IW_SCAN_MAX_DATA, bss);
-+      }
-+      dwrq->length = ptr - extra;
-+      dwrq->flags = 0;
-+
-+end_unlock:
-+      acx_sem_unlock(adev);
-+/* end: */
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_essid
-+*/
-+static int
-+acx_ioctl_set_essid(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_point *dwrq = &wrqu->essid;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int len = dwrq->length;
-+      int result;
-+
-+      FN_ENTER;
-+
-+      if (len < 0) {
-+              result = -EINVAL;
-+              goto end;
-+      }
-+
-+      log(L_IOCTL, "set ESSID '%*s', length %d, flags 0x%04X\n",
-+                                      len, extra, len, dwrq->flags);
-+
-+#if WIRELESS_EXT >= 21
-+      /* WE 21 gives real ESSID strlen, not +1 (trailing zero):
-+       * see LKML "[patch] drivers/net/wireless: correct reported ssid lengths" */
-+      len += 1;
-+#endif
-+
-+      acx_sem_lock(adev);
-+
-+      /* ESSID disabled? */
-+      if (0 == dwrq->flags) {
-+              adev->essid_active = 0;
-+
-+      } else {
-+              if (len > IW_ESSID_MAX_SIZE)    {
-+                      result = -E2BIG;
-+                      goto end_unlock;
-+              }
-+
-+              if (len >= sizeof(adev->essid))
-+                      len = sizeof(adev->essid) - 1;
-+              memcpy(adev->essid, extra, len);
-+              adev->essid[len] = '\0';
-+              /* Paranoia: just in case there is a '\0'... */
-+              adev->essid_len = strlen(adev->essid);
-+              adev->essid_active = 1;
-+      }
-+
-+      SET_BIT(adev->set_mask, GETSET_RESCAN);
-+
-+      result = -EINPROGRESS;
-+
-+end_unlock:
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_ioctl_get_essid(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_point *dwrq = &wrqu->essid;
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      dwrq->flags = adev->essid_active;
-+      if (adev->essid_active) {
-+              memcpy(extra, adev->essid, adev->essid_len);
-+              extra[adev->essid_len] = '\0';
-+              dwrq->length = adev->essid_len + 1;
-+              dwrq->flags = 1;
-+      }
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_l_update_client_rates
-+*/
-+static void
-+acx_l_update_client_rates(acx_device_t *adev, u16 rate)
-+{
-+      int i;
-+      for (i = 0; i < VEC_SIZE(adev->sta_list); i++) {
-+              client_t *clt = &adev->sta_list[i];
-+              if (!clt->used) continue;
-+              clt->rate_cfg = (clt->rate_cap & rate);
-+              if (!clt->rate_cfg) {
-+                      /* no compatible rates left: kick client */
-+                      acxlog_mac(L_ASSOC, "client ",clt->address," kicked: "
-+                              "rates are not compatible anymore\n");
-+                      acx_l_sta_list_del(adev, clt);
-+                      continue;
-+              }
-+              clt->rate_cur &= clt->rate_cfg;
-+              if (!clt->rate_cur) {
-+                      /* current rate become invalid, choose a valid one */
-+                      clt->rate_cur = 1 << lowest_bit(clt->rate_cfg);
-+              }
-+              if (IS_ACX100(adev))
-+                      clt->rate_100 = acx_bitpos2rate100[highest_bit(clt->rate_cur)];
-+              clt->fallback_count = clt->stepup_count = 0;
-+              clt->ignore_count = 16;
-+      }
-+      switch (adev->mode) {
-+      case ACX_MODE_2_STA:
-+              if (adev->ap_client && !adev->ap_client->used) {
-+                      /* Owwww... we kicked our AP!! :) */
-+                      SET_BIT(adev->set_mask, GETSET_RESCAN);
-+              }
-+      }
-+}
-+
-+
-+/***********************************************************************
-+*/
-+/* maps bits from acx111 rate to rate in Mbits */
-+static const unsigned int
-+acx111_rate_tbl[] = {
-+     1000000, /* 0 */
-+     2000000, /* 1 */
-+     5500000, /* 2 */
-+     6000000, /* 3 */
-+     9000000, /* 4 */
-+    11000000, /* 5 */
-+    12000000, /* 6 */
-+    18000000, /* 7 */
-+    22000000, /* 8 */
-+    24000000, /* 9 */
-+    36000000, /* 10 */
-+    48000000, /* 11 */
-+    54000000, /* 12 */
-+      500000, /* 13, should not happen */
-+      500000, /* 14, should not happen */
-+      500000, /* 15, should not happen */
-+};
-+
-+/***********************************************************************
-+ * acx_ioctl_set_rate
-+ */
-+static int
-+acx_ioctl_set_rate(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->param;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      u16 txrate_cfg = 1;
-+      unsigned long flags;
-+      int autorate;
-+      int result = -EINVAL;
-+
-+      FN_ENTER;
-+      log(L_IOCTL, "rate %d fixed 0x%X disabled 0x%X flags 0x%X\n",
-+              vwrq->value, vwrq->fixed, vwrq->disabled, vwrq->flags);
-+
-+      if ((0 == vwrq->fixed) || (1 == vwrq->fixed)) {
-+              int i = VEC_SIZE(acx111_rate_tbl)-1;
-+              if (vwrq->value == -1)
-+                      /* "iwconfig rate auto" --> choose highest */
-+                      vwrq->value = IS_ACX100(adev) ? 22000000 : 54000000;
-+              while (i >= 0) {
-+                      if (vwrq->value == acx111_rate_tbl[i]) {
-+                              txrate_cfg <<= i;
-+                              i = 0;
-+                              break;
-+                      }
-+                      i--;
-+              }
-+              if (i == -1) { /* no matching rate */
-+                      result = -EINVAL;
-+                      goto end;
-+              }
-+      } else {        /* rate N, N<1000 (driver specific): we don't use this */
-+              result = -EOPNOTSUPP;
-+              goto end;
-+      }
-+      /* now: only one bit is set in txrate_cfg, corresponding to
-+      ** indicated rate */
-+
-+      autorate = (vwrq->fixed == 0) && (RATE111_1 != txrate_cfg);
-+      if (autorate) {
-+              /* convert 00100000 -> 00111111 */
-+              txrate_cfg = (txrate_cfg<<1)-1;
-+      }
-+
-+      if (IS_ACX100(adev)) {
-+              txrate_cfg &= RATE111_ACX100_COMPAT;
-+              if (!txrate_cfg) {
-+                      result = -ENOTSUPP; /* rate is not supported by acx100 */
-+                      goto end;
-+              }
-+      }
-+
-+      acx_sem_lock(adev);
-+      acx_lock(adev, flags);
-+
-+      adev->rate_auto = autorate;
-+      adev->rate_oper = txrate_cfg;
-+      adev->rate_basic = txrate_cfg;
-+      /* only do that in auto mode, non-auto will be able to use
-+       * one specific Tx rate only anyway */
-+      if (autorate) {
-+              /* only use 802.11b base rates, for standard 802.11b H/W
-+               * compatibility */
-+              adev->rate_basic &= RATE111_80211B_COMPAT;
-+      }
-+      adev->rate_bcast = 1 << lowest_bit(txrate_cfg);
-+      if (IS_ACX100(adev))
-+              adev->rate_bcast100 = acx_rate111to100(adev->rate_bcast);
-+      acx_l_update_ratevector(adev);
-+      acx_l_update_client_rates(adev, txrate_cfg);
-+
-+      /* Do/don't do tx rate fallback; beacon contents and rate */
-+      SET_BIT(adev->set_mask, SET_RATE_FALLBACK|SET_TEMPLATES);
-+      result = -EINPROGRESS;
-+
-+      acx_unlock(adev, flags);
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_rate
-+*/
-+static int
-+acx_ioctl_get_rate(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->param;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      u16 rate;
-+
-+      acx_lock(adev, flags);
-+      rate = adev->rate_oper;
-+      if (adev->ap_client)
-+              rate = adev->ap_client->rate_cur;
-+      vwrq->value = acx111_rate_tbl[highest_bit(rate)];
-+      vwrq->fixed = !adev->rate_auto;
-+      vwrq->disabled = 0;
-+      acx_unlock(adev, flags);
-+
-+      return OK;
-+}
-+
-+static int
-+acx_ioctl_set_rts(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->rts;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int val = vwrq->value;
-+
-+      if (vwrq->disabled)
-+              val = 2312;
-+      if ((val < 0) || (val > 2312))
-+              return -EINVAL;
-+
-+      adev->rts_threshold = val;
-+      return OK;
-+}
-+
-+static inline int
-+acx_ioctl_get_rts(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->rts;
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      vwrq->value = adev->rts_threshold;
-+      vwrq->disabled = (vwrq->value >= 2312);
-+      vwrq->fixed = 1;
-+      return OK;
-+}
-+
-+
-+#if ACX_FRAGMENTATION
-+static int
-+acx_ioctl_set_frag(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int val = vwrq->value;
-+
-+      if (vwrq->disabled)
-+              val = 32767;
-+      else
-+      if ((val < 256) || (val > 2347))
-+              return -EINVAL;
-+
-+      adev->frag_threshold = val;
-+      return OK;
-+}
-+
-+static inline int
-+acx_ioctl_get_frag(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->frag;
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      vwrq->value = adev->frag_threshold;
-+      vwrq->disabled = (vwrq->value >= 2347);
-+      vwrq->fixed = 1;
-+      return OK;
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_encode
-+*/
-+static int
-+acx_ioctl_set_encode(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_point *dwrq = &wrqu->encoding;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int index;
-+      int result;
-+
-+      FN_ENTER;
-+
-+      log(L_IOCTL, "set encoding flags=0x%04X, size=%d, key: %s\n",
-+                      dwrq->flags, dwrq->length, extra ? "set" : "No key");
-+
-+      acx_sem_lock(adev);
-+
-+      index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
-+
-+      if (dwrq->length > 0) {
-+              /* if index is 0 or invalid, use default key */
-+              if ((index < 0) || (index > 3))
-+                      index = (int)adev->wep_current_index;
-+
-+              if (0 == (dwrq->flags & IW_ENCODE_NOKEY)) {
-+                      if (dwrq->length > 29)
-+                              dwrq->length = 29; /* restrict it */
-+
-+                      if (dwrq->length > 13) {
-+                              /* 29*8 == 232, WEP256 */
-+                              adev->wep_keys[index].size = 29;
-+                      } else if (dwrq->length > 5) {
-+                              /* 13*8 == 104bit, WEP128 */
-+                              adev->wep_keys[index].size = 13;
-+                      } else if (dwrq->length > 0) {
-+                              /* 5*8 == 40bit, WEP64 */
-+                              adev->wep_keys[index].size = 5;
-+                      } else {
-+                              /* disable key */
-+                              adev->wep_keys[index].size = 0;
-+                      }
-+
-+                      memset(adev->wep_keys[index].key, 0,
-+                              sizeof(adev->wep_keys[index].key));
-+                      memcpy(adev->wep_keys[index].key, extra, dwrq->length);
-+              }
-+      } else {
-+              /* set transmit key */
-+              if ((index >= 0) && (index <= 3))
-+                      adev->wep_current_index = index;
-+              else if (0 == (dwrq->flags & IW_ENCODE_MODE)) {
-+                      /* complain if we were not just setting
-+                       * the key mode */
-+                      result = -EINVAL;
-+                      goto end_unlock;
-+              }
-+      }
-+
-+      adev->wep_enabled = !(dwrq->flags & IW_ENCODE_DISABLED);
-+
-+      if (dwrq->flags & IW_ENCODE_OPEN) {
-+              adev->auth_alg = WLAN_AUTH_ALG_OPENSYSTEM;
-+              adev->wep_restricted = 0;
-+
-+      } else if (dwrq->flags & IW_ENCODE_RESTRICTED) {
-+              adev->auth_alg = WLAN_AUTH_ALG_SHAREDKEY;
-+              adev->wep_restricted = 1;
-+      }
-+
-+      /* set flag to make sure the card WEP settings get updated */
-+      SET_BIT(adev->set_mask, GETSET_WEP);
-+
-+      log(L_IOCTL, "len=%d, key at 0x%p, flags=0x%X\n",
-+              dwrq->length, extra, dwrq->flags);
-+
-+      for (index = 0; index <= 3; index++) {
-+              if (adev->wep_keys[index].size) {
-+                      log(L_IOCTL,    "index=%d, size=%d, key at 0x%p\n",
-+                              adev->wep_keys[index].index,
-+                              (int) adev->wep_keys[index].size,
-+                              adev->wep_keys[index].key);
-+              }
-+      }
-+      result = -EINPROGRESS;
-+
-+end_unlock:
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_encode
-+*/
-+static int
-+acx_ioctl_get_encode(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_point *dwrq = &wrqu->encoding;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int index = (dwrq->flags & IW_ENCODE_INDEX) - 1;
-+
-+      FN_ENTER;
-+
-+      if (adev->wep_enabled == 0) {
-+              dwrq->flags = IW_ENCODE_DISABLED;
-+      } else {
-+              if ((index < 0) || (index > 3))
-+                      index = (int)adev->wep_current_index;
-+
-+              dwrq->flags = (adev->wep_restricted == 1) ?
-+                              IW_ENCODE_RESTRICTED : IW_ENCODE_OPEN;
-+              dwrq->length = adev->wep_keys[index].size;
-+
-+              memcpy(extra, adev->wep_keys[index].key,
-+                            adev->wep_keys[index].size);
-+      }
-+
-+      /* set the current index */
-+      SET_BIT(dwrq->flags, index + 1);
-+
-+      log(L_IOCTL, "len=%d, key=%p, flags=0x%X\n",
-+             dwrq->length, dwrq->pointer,
-+             dwrq->flags);
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_ioctl_set_power(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->power;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result = -EINPROGRESS;
-+
-+      FN_ENTER;
-+
-+      log(L_IOCTL, "set 802.11 powersave flags=0x%04X\n", vwrq->flags);
-+
-+      acx_sem_lock(adev);
-+
-+      if (vwrq->disabled) {
-+              CLEAR_BIT(adev->ps_wakeup_cfg, PS_CFG_ENABLE);
-+              SET_BIT(adev->set_mask, GETSET_POWER_80211);
-+              goto end;
-+      }
-+      if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
-+              u16 ps_timeout = (vwrq->value * 1024) / 1000;
-+
-+              if (ps_timeout > 255)
-+                      ps_timeout = 255;
-+              log(L_IOCTL, "setting PS timeout value to %d time units "
-+                              "due to %dus\n", ps_timeout, vwrq->value);
-+              adev->ps_hangover_period = ps_timeout;
-+      } else if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_PERIOD) {
-+              u16 ps_periods = vwrq->value / 1000000;
-+
-+              if (ps_periods > 255)
-+                      ps_periods = 255;
-+              log(L_IOCTL, "setting PS period value to %d periods "
-+                              "due to %dus\n", ps_periods, vwrq->value);
-+              adev->ps_listen_interval = ps_periods;
-+              CLEAR_BIT(adev->ps_wakeup_cfg, PS_CFG_WAKEUP_MODE_MASK);
-+              SET_BIT(adev->ps_wakeup_cfg, PS_CFG_WAKEUP_EACH_ITVL);
-+      }
-+
-+      switch (vwrq->flags & IW_POWER_MODE) {
-+              /* FIXME: are we doing the right thing here? */
-+              case IW_POWER_UNICAST_R:
-+                      CLEAR_BIT(adev->ps_options, PS_OPT_STILL_RCV_BCASTS);
-+                      break;
-+              case IW_POWER_MULTICAST_R:
-+                      SET_BIT(adev->ps_options, PS_OPT_STILL_RCV_BCASTS);
-+                      break;
-+              case IW_POWER_ALL_R:
-+                      SET_BIT(adev->ps_options, PS_OPT_STILL_RCV_BCASTS);
-+                      break;
-+              case IW_POWER_ON:
-+                      break;
-+              default:
-+                      log(L_IOCTL, "unknown PS mode\n");
-+                      result = -EINVAL;
-+                      goto end;
-+      }
-+
-+      SET_BIT(adev->ps_wakeup_cfg, PS_CFG_ENABLE);
-+      SET_BIT(adev->set_mask, GETSET_POWER_80211);
-+end:
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx_ioctl_get_power(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->power;
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      FN_ENTER;
-+
-+      log(L_IOCTL, "Get 802.11 Power Save flags = 0x%04X\n", vwrq->flags);
-+      vwrq->disabled = ((adev->ps_wakeup_cfg & PS_CFG_ENABLE) == 0);
-+      if (vwrq->disabled)
-+              goto end;
-+
-+      if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
-+              vwrq->value = adev->ps_hangover_period * 1000 / 1024;
-+              vwrq->flags = IW_POWER_TIMEOUT;
-+      } else {
-+              vwrq->value = adev->ps_listen_interval * 1000000;
-+              vwrq->flags = IW_POWER_PERIOD|IW_POWER_RELATIVE;
-+      }
-+      if (adev->ps_options & PS_OPT_STILL_RCV_BCASTS)
-+              SET_BIT(vwrq->flags, IW_POWER_ALL_R);
-+      else
-+              SET_BIT(vwrq->flags, IW_POWER_UNICAST_R);
-+end:
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_txpow
-+*/
-+static inline int
-+acx_ioctl_get_txpow(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->power;
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      FN_ENTER;
-+
-+      vwrq->flags = IW_TXPOW_DBM;
-+      vwrq->disabled = 0;
-+      vwrq->fixed = 1;
-+      vwrq->value = adev->tx_level_dbm;
-+
-+      log(L_IOCTL, "get txpower:%d dBm\n", adev->tx_level_dbm);
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_txpow
-+*/
-+static int
-+acx_ioctl_set_txpow(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->power;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      FN_ENTER;
-+
-+      log(L_IOCTL, "set txpower:%d, disabled:%d, flags:0x%04X\n",
-+                      vwrq->value, vwrq->disabled, vwrq->flags);
-+
-+      acx_sem_lock(adev);
-+
-+      if (vwrq->disabled != adev->tx_disabled) {
-+              SET_BIT(adev->set_mask, GETSET_TX);
-+      }
-+
-+      adev->tx_disabled = vwrq->disabled;
-+      if (vwrq->value == -1) {
-+              if (vwrq->disabled) {
-+                      adev->tx_level_dbm = 0;
-+                      log(L_IOCTL, "disable radio tx\n");
-+              } else {
-+                      /* adev->tx_level_auto = 1; */
-+                      log(L_IOCTL, "set tx power auto (NIY)\n");
-+              }
-+      } else {
-+              adev->tx_level_dbm = vwrq->value <= 20 ? vwrq->value : 20;
-+              /* adev->tx_level_auto = 0; */
-+              log(L_IOCTL, "set txpower=%d dBm\n", adev->tx_level_dbm);
-+      }
-+      SET_BIT(adev->set_mask, GETSET_TXPOWER);
-+
-+      result = -EINPROGRESS;
-+
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_range
-+*/
-+static int
-+acx_ioctl_get_range(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_point *dwrq = &wrqu->data;
-+      struct iw_range *range = (struct iw_range *)extra;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int i,n;
-+
-+      FN_ENTER;
-+
-+      if (!dwrq->pointer)
-+              goto end;
-+
-+      dwrq->length = sizeof(struct iw_range);
-+      memset(range, 0, sizeof(struct iw_range));
-+      n = 0;
-+      for (i = 1; i <= 14; i++) {
-+              if (adev->reg_dom_chanmask & (1 << (i - 1))) {
-+                      range->freq[n].i = i;
-+                      range->freq[n].m = acx_channel_freq[i - 1] * 100000;
-+                      range->freq[n].e = 1; /* units are MHz */
-+                      n++;
-+              }
-+      }
-+      range->num_channels = n;
-+      range->num_frequency = n;
-+
-+      range->min_rts = 0;
-+      range->max_rts = 2312;
-+
-+#if ACX_FRAGMENTATION
-+      range->min_frag = 256;
-+      range->max_frag = 2312;
-+#endif
-+
-+      range->encoding_size[0] = 5;
-+      range->encoding_size[1] = 13;
-+      range->encoding_size[2] = 29;
-+      range->num_encoding_sizes = 3;
-+      range->max_encoding_tokens = 4;
-+
-+      range->min_pmp = 0;
-+      range->max_pmp = 5000000;
-+      range->min_pmt = 0;
-+      range->max_pmt = 65535 * 1000;
-+      range->pmp_flags = IW_POWER_PERIOD;
-+      range->pmt_flags = IW_POWER_TIMEOUT;
-+      range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R;
-+
-+      if (IS_ACX100(adev)) { /* ACX100 has direct radio programming - arbitrary levels, so offer a lot */
-+              for (i = 0; i <= IW_MAX_TXPOWER - 1; i++)
-+                      range->txpower[i] = 20 * i / (IW_MAX_TXPOWER - 1);
-+              range->num_txpower = IW_MAX_TXPOWER;
-+              range->txpower_capa = IW_TXPOW_DBM;
-+      }
-+      else {
-+              int count = min(IW_MAX_TXPOWER, (int)adev->cfgopt_power_levels.len);
-+              for (i = 0; i <= count; i++)
-+                      range->txpower[i] = adev->cfgopt_power_levels.list[i];
-+              range->num_txpower = count;
-+              /* this list is given in mW */
-+              range->txpower_capa = IW_TXPOW_MWATT;
-+      }
-+
-+      range->we_version_compiled = WIRELESS_EXT;
-+      range->we_version_source = 0x9;
-+
-+      range->retry_capa = IW_RETRY_LIMIT;
-+      range->retry_flags = IW_RETRY_LIMIT;
-+      range->min_retry = 1;
-+      range->max_retry = 255;
-+
-+      range->r_time_flags = IW_RETRY_LIFETIME;
-+      range->min_r_time = 0;
-+      /* FIXME: lifetime ranges and orders of magnitude are strange?? */
-+      range->max_r_time = 65535;
-+
-+      if (IS_USB(adev))
-+              range->sensitivity = 0;
-+      else if (IS_ACX111(adev))
-+              range->sensitivity = 3;
-+      else
-+              range->sensitivity = 255;
-+
-+      for (i=0; i < adev->rate_supported_len; i++) {
-+              range->bitrate[i] = (adev->rate_supported[i] & ~0x80) * 500000;
-+              /* never happens, but keep it, to be safe: */
-+              if (range->bitrate[i] == 0)
-+                      break;
-+      }
-+      range->num_bitrates = i;
-+
-+      range->max_qual.qual = 100;
-+      range->max_qual.level = 100;
-+      range->max_qual.noise = 100;
-+      /* TODO: better values */
-+      range->avg_qual.qual = 90;
-+      range->avg_qual.level = 80;
-+      range->avg_qual.noise = 2;
-+
-+end:
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** Private functions
-+*/
-+
-+/***********************************************************************
-+** acx_ioctl_get_nick
-+*/
-+static inline int
-+acx_ioctl_get_nick(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_point *dwrq = &wrqu->data;
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      strcpy(extra, adev->nick);
-+      dwrq->length = strlen(extra) + 1;
-+
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_nick
-+*/
-+static int
-+acx_ioctl_set_nick(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_point *dwrq = &wrqu->data;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      if (dwrq->length > IW_ESSID_MAX_SIZE + 1) {
-+              result = -E2BIG;
-+              goto end_unlock;
-+      }
-+
-+      /* extra includes trailing \0, so it's ok */
-+      strcpy(adev->nick, extra);
-+      result = OK;
-+
-+end_unlock:
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_retry
-+*/
-+static int
-+acx_ioctl_get_retry(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->retry;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned int type = vwrq->flags & IW_RETRY_TYPE;
-+      unsigned int modifier = vwrq->flags & IW_RETRY_MODIFIER;
-+      int result;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      /* return the short retry number by default */
-+      if (type == IW_RETRY_LIFETIME) {
-+              vwrq->flags = IW_RETRY_LIFETIME;
-+              vwrq->value = adev->msdu_lifetime;
-+      } else if (modifier == IW_RETRY_MAX) {
-+              vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_MAX;
-+              vwrq->value = adev->long_retry;
-+      } else {
-+              vwrq->flags = IW_RETRY_LIMIT;
-+              if (adev->long_retry != adev->short_retry)
-+                      SET_BIT(vwrq->flags, IW_RETRY_MIN);
-+              vwrq->value = adev->short_retry;
-+      }
-+
-+      /* can't be disabled */
-+      vwrq->disabled = (u8)0;
-+      result = OK;
-+
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_retry
-+*/
-+static int
-+acx_ioctl_set_retry(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->retry;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      FN_ENTER;
-+
-+      if (!vwrq) {
-+              result = -EFAULT;
-+              goto end;
-+      }
-+      if (vwrq->disabled) {
-+              result = -EINVAL;
-+              goto end;
-+      }
-+
-+      acx_sem_lock(adev);
-+
-+      result = -EINVAL;
-+      if (IW_RETRY_LIMIT == (vwrq->flags & IW_RETRY_TYPE)) {
-+              printk("old retry limits: short %d long %d\n",
-+                              adev->short_retry, adev->long_retry);
-+              if (vwrq->flags & IW_RETRY_MAX) {
-+                      adev->long_retry = vwrq->value;
-+              } else if (vwrq->flags & IW_RETRY_MIN) {
-+                      adev->short_retry = vwrq->value;
-+              } else {
-+                      /* no modifier: set both */
-+                      adev->long_retry = vwrq->value;
-+                      adev->short_retry = vwrq->value;
-+              }
-+              printk("new retry limits: short %d long %d\n",
-+                              adev->short_retry, adev->long_retry);
-+              SET_BIT(adev->set_mask, GETSET_RETRY);
-+              result = -EINPROGRESS;
-+      }
-+      else if (vwrq->flags & IW_RETRY_LIFETIME) {
-+              adev->msdu_lifetime = vwrq->value;
-+              printk("new MSDU lifetime: %d\n", adev->msdu_lifetime);
-+              SET_BIT(adev->set_mask, SET_MSDU_LIFETIME);
-+              result = -EINPROGRESS;
-+      }
-+
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/************************ private ioctls ******************************/
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_debug
-+*/
-+#if ACX_DEBUG
-+static int
-+acx_ioctl_set_debug(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      unsigned int debug_new = *((unsigned int *)extra);
-+      int result = -EINVAL;
-+
-+      log(L_ANY, "setting debug from %04X to %04X\n", acx_debug, debug_new);
-+      acx_debug = debug_new;
-+
-+      result = OK;
-+      return result;
-+
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** acx_ioctl_list_reg_domain
-+*/
-+static int
-+acx_ioctl_list_reg_domain(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      int i = 1;
-+      const char * const *entry = acx_reg_domain_strings;
-+
-+      printk("dom# chan# domain/country\n");
-+      while (*entry)
-+              printk("%4d %s\n", i++, *entry++);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_reg_domain
-+*/
-+static int
-+acx_ioctl_set_reg_domain(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      FN_ENTER;
-+
-+      if ((*extra < 1) || ((size_t)*extra > acx_reg_domain_ids_len)) {
-+              result = -EINVAL;
-+              goto end;
-+      }
-+
-+      acx_sem_lock(adev);
-+
-+      adev->reg_dom_id = acx_reg_domain_ids[*extra - 1];
-+      SET_BIT(adev->set_mask, GETSET_REG_DOMAIN);
-+
-+      result = -EINPROGRESS;
-+
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_reg_domain
-+*/
-+static int
-+acx_ioctl_get_reg_domain(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int dom,i;
-+
-+      /* no locking */
-+      dom = adev->reg_dom_id;
-+
-+      for (i = 1; i <= acx_reg_domain_ids_len; i++) {
-+              if (acx_reg_domain_ids[i-1] == dom) {
-+                      log(L_IOCTL, "regulatory domain is currently set "
-+                              "to %d (0x%X): %s\n", i, dom,
-+                              acx_reg_domain_strings[i-1]);
-+                      *extra = i;
-+                      break;
-+              }
-+      }
-+
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_short_preamble
-+*/
-+static const char * const
-+preamble_modes[] = {
-+      "off",
-+      "on",
-+      "auto (peer capability dependent)",
-+      "unknown mode, error"
-+};
-+
-+static int
-+acx_ioctl_set_short_preamble(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int i;
-+      int result;
-+
-+      FN_ENTER;
-+
-+      if ((unsigned char)*extra > 2) {
-+              result = -EINVAL;
-+              goto end;
-+      }
-+
-+      acx_sem_lock(adev);
-+
-+      adev->preamble_mode = (u8)*extra;
-+      switch (adev->preamble_mode) {
-+      case 0: /* long */
-+              adev->preamble_cur = 0;
-+              break;
-+      case 1:
-+              /* short, kick incapable peers */
-+              adev->preamble_cur = 1;
-+              for (i = 0; i < VEC_SIZE(adev->sta_list); i++) {
-+                      client_t *clt = &adev->sta_list[i];
-+                      if (!clt->used) continue;
-+                      if (!(clt->cap_info & WF_MGMT_CAP_SHORT)) {
-+                              clt->used = CLIENT_EMPTY_SLOT_0;
-+                      }
-+              }
-+              switch (adev->mode) {
-+              case ACX_MODE_2_STA:
-+                      if (adev->ap_client && !adev->ap_client->used) {
-+                              /* We kicked our AP :) */
-+                              SET_BIT(adev->set_mask, GETSET_RESCAN);
-+                      }
-+              }
-+              break;
-+      case 2: /* auto. short only if all peers are short-capable */
-+              adev->preamble_cur = 1;
-+              for (i = 0; i < VEC_SIZE(adev->sta_list); i++) {
-+                      client_t *clt = &adev->sta_list[i];
-+                      if (!clt->used) continue;
-+                      if (!(clt->cap_info & WF_MGMT_CAP_SHORT)) {
-+                              adev->preamble_cur = 0;
-+                              break;
-+                      }
-+              }
-+              break;
-+      }
-+      printk("new short preamble setting: configured %s, active %s\n",
-+                      preamble_modes[adev->preamble_mode],
-+                      preamble_modes[adev->preamble_cur]);
-+      result = OK;
-+
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_short_preamble
-+*/
-+static int
-+acx_ioctl_get_short_preamble(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      acx_sem_lock(adev);
-+
-+      printk("current short preamble setting: configured %s, active %s\n",
-+                      preamble_modes[adev->preamble_mode],
-+                      preamble_modes[adev->preamble_cur]);
-+
-+      *extra = (char)adev->preamble_mode;
-+
-+      acx_sem_unlock(adev);
-+
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_antenna
-+**
-+** TX and RX antenna can be set separately but this function good
-+** for testing 0-4 bits
-+*/
-+static int
-+acx_ioctl_set_antenna(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      acx_sem_lock(adev);
-+
-+      printk("old antenna value: 0x%02X (COMBINED bit mask)\n"
-+                   "Rx antenna selection:\n"
-+                   "0x00 ant. 1\n"
-+                   "0x40 ant. 2\n"
-+                   "0x80 full diversity\n"
-+                   "0xc0 partial diversity\n"
-+                   "0x0f dwell time mask (in units of us)\n"
-+                   "Tx antenna selection:\n"
-+                   "0x00 ant. 2\n" /* yep, those ARE reversed! */
-+                   "0x20 ant. 1\n"
-+                   "new antenna value: 0x%02X\n",
-+                   adev->antenna, (u8)*extra);
-+
-+      adev->antenna = (u8)*extra;
-+      SET_BIT(adev->set_mask, GETSET_ANTENNA);
-+
-+      acx_sem_unlock(adev);
-+
-+      return -EINPROGRESS;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_antenna
-+*/
-+static int
-+acx_ioctl_get_antenna(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      /* no locking. it's pointless to lock a single load */
-+      printk("current antenna value: 0x%02X (COMBINED bit mask)\n"
-+                   "Rx antenna selection:\n"
-+                   "0x00 ant. 1\n"
-+                   "0x40 ant. 2\n"
-+                   "0x80 full diversity\n"
-+                   "0xc0 partial diversity\n"
-+                   "Tx antenna selection:\n"
-+                   "0x00 ant. 2\n" /* yep, those ARE reversed! */
-+                   "0x20 ant. 1\n", adev->antenna);
-+
-+      return 0;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_rx_antenna
-+**
-+** 0 = antenna1; 1 = antenna2; 2 = full diversity; 3 = partial diversity
-+** Could anybody test which antenna is the external one?
-+*/
-+static int
-+acx_ioctl_set_rx_antenna(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      FN_ENTER;
-+
-+      if (*extra > 3) {
-+              result = -EINVAL;
-+              goto end;
-+      }
-+
-+      printk("old antenna value: 0x%02X\n", adev->antenna);
-+
-+      acx_sem_lock(adev);
-+
-+      adev->antenna &= 0x3f;
-+      SET_BIT(adev->antenna, (*extra << 6));
-+      SET_BIT(adev->set_mask, GETSET_ANTENNA);
-+      printk("new antenna value: 0x%02X\n", adev->antenna);
-+      result = -EINPROGRESS;
-+
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_tx_antenna
-+**
-+** Arguments: 0 == antenna2; 1 == antenna1;
-+** Could anybody test which antenna is the external one?
-+*/
-+static int
-+acx_ioctl_set_tx_antenna(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      FN_ENTER;
-+
-+      if (*extra > 1) {
-+              result = -EINVAL;
-+              goto end;
-+      }
-+
-+      printk("old antenna value: 0x%02X\n", adev->antenna);
-+
-+      acx_sem_lock(adev);
-+
-+      adev->antenna &= ~0x30;
-+      SET_BIT(adev->antenna, ((*extra & 0x01) << 5));
-+      SET_BIT(adev->set_mask, GETSET_ANTENNA);
-+      printk("new antenna value: 0x%02X\n", adev->antenna);
-+      result = -EINPROGRESS;
-+
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_wlansniff
-+**
-+** can we just remove this in favor of monitor mode? --vda
-+*/
-+static int
-+acx_ioctl_wlansniff(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned int *params = (unsigned int*)extra;
-+      unsigned int enable = (unsigned int)(params[0] > 0);
-+      int result;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      /* not using printk() here, since it distorts kismet display
-+       * when printk messages activated */
-+      log(L_IOCTL, "setting monitor to: 0x%02X\n", params[0]);
-+
-+      switch (params[0]) {
-+      case 0:
-+              /* no monitor mode. hmm, should we simply ignore it
-+               * or go back to enabling adev->netdev->type ARPHRD_ETHER? */
-+              break;
-+      case 1:
-+              adev->monitor_type = ARPHRD_IEEE80211_PRISM;
-+              break;
-+      case 2:
-+              adev->monitor_type = ARPHRD_IEEE80211;
-+              break;
-+      }
-+
-+      if (params[0]) {
-+              adev->mode = ACX_MODE_MONITOR;
-+              SET_BIT(adev->set_mask, GETSET_MODE);
-+      }
-+
-+      if (enable) {
-+              adev->channel = params[1];
-+              SET_BIT(adev->set_mask, GETSET_RX);
-+      }
-+      result = -EINPROGRESS;
-+
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_unknown11
-+** FIXME: looks like some sort of "iwpriv kick_sta MAC" but it's broken
-+*/
-+static int
-+acx_ioctl_unknown11(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+#ifdef BROKEN
-+      struct iw_param *vwrq = &wrqu->param;
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      client_t client;
-+      int result;
-+
-+      acx_sem_lock(adev);
-+      acx_lock(adev, flags);
-+
-+      acx_l_transmit_disassoc(adev, &client);
-+      result = OK;
-+
-+      acx_unlock(adev, flags);
-+      acx_sem_unlock(adev);
-+
-+      return result;
-+#endif
-+      return -EINVAL;
-+}
-+
-+
-+/***********************************************************************
-+** debug helper function to be able to debug various issues relatively easily
-+*/
-+static int
-+acx_ioctl_dbg_set_masks(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      const unsigned int *params = (unsigned int*)extra;
-+      int result;
-+
-+      acx_sem_lock(adev);
-+
-+      log(L_IOCTL, "setting flags in settings mask: "
-+                      "get_mask %08X set_mask %08X\n"
-+                      "before: get_mask %08X set_mask %08X\n",
-+                      params[0], params[1],
-+                      adev->get_mask, adev->set_mask);
-+      SET_BIT(adev->get_mask, params[0]);
-+      SET_BIT(adev->set_mask, params[1]);
-+      log(L_IOCTL, "after: get_mask %08X set_mask %08X\n",
-+                      adev->get_mask, adev->set_mask);
-+      result = -EINPROGRESS; /* immediately call commit handler */
-+
-+      acx_sem_unlock(adev);
-+
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+* acx_ioctl_set_rates
-+*
-+* This ioctl takes string parameter. Examples:
-+* iwpriv wlan0 SetRates "1,2"
-+*     use 1 and 2 Mbit rates, both are in basic rate set
-+* iwpriv wlan0 SetRates "1,2 5,11"
-+*     use 1,2,5.5,11 Mbit rates. 1 and 2 are basic
-+* iwpriv wlan0 SetRates "1,2 5c,11c"
-+*     same ('c' means 'CCK modulation' and it is a default for 5 and 11)
-+* iwpriv wlan0 SetRates "1,2 5p,11p"
-+*     use 1,2,5.5,11 Mbit, 1,2 are basic. 5 and 11 are using PBCC
-+* iwpriv wlan0 SetRates "1,2,5,11 22p"
-+*     use 1,2,5.5,11,22 Mbit. 1,2,5.5 and 11 are basic. 22 is using PBCC
-+*     (this is the maximum acx100 can do (modulo x4 mode))
-+* iwpriv wlan0 SetRates "1,2,5,11 22"
-+*     same. 802.11 defines only PBCC modulation
-+*     for 22 and 33 Mbit rates, so there is no ambiguity
-+* iwpriv wlan0 SetRates "1,2,5,11 6o,9o,12o,18o,24o,36o,48o,54o"
-+*     1,2,5.5 and 11 are basic. 11g OFDM rates are enabled but
-+*     they are not in basic rate set. 22 Mbit is disabled.
-+* iwpriv wlan0 SetRates "1,2,5,11 6,9,12,18,24,36,48,54"
-+*     same. OFDM is default for 11g rates except 22 and 33 Mbit,
-+*     thus 'o' is optional
-+* iwpriv wlan0 SetRates "1,2,5,11 6d,9d,12d,18d,24d,36d,48d,54d"
-+*     1,2,5.5 and 11 are basic. 11g CCK-OFDM rates are enabled
-+*     (acx111 does not support CCK-OFDM, driver will reject this cmd)
-+* iwpriv wlan0 SetRates "6,9,12 18,24,36,48,54"
-+*     6,9,12 are basic, rest of 11g rates is enabled. Using OFDM
-+*/
-+#include "setrate.c"
-+
-+/* disallow: 33Mbit (unsupported by hw) */
-+/* disallow: CCKOFDM (unsupported by hw) */
-+static int
-+acx111_supported(int mbit, int modulation, void *opaque)
-+{
-+      if (mbit==33) return -ENOTSUPP;
-+      if (modulation==DOT11_MOD_CCKOFDM) return -ENOTSUPP;
-+      return OK;
-+}
-+
-+static const u16
-+acx111mask[] = {
-+      [DOT11_RATE_1 ] = RATE111_1 ,
-+      [DOT11_RATE_2 ] = RATE111_2 ,
-+      [DOT11_RATE_5 ] = RATE111_5 ,
-+      [DOT11_RATE_11] = RATE111_11,
-+      [DOT11_RATE_22] = RATE111_22,
-+      /* [DOT11_RATE_33] = */
-+      [DOT11_RATE_6 ] = RATE111_6 ,
-+      [DOT11_RATE_9 ] = RATE111_9 ,
-+      [DOT11_RATE_12] = RATE111_12,
-+      [DOT11_RATE_18] = RATE111_18,
-+      [DOT11_RATE_24] = RATE111_24,
-+      [DOT11_RATE_36] = RATE111_36,
-+      [DOT11_RATE_48] = RATE111_48,
-+      [DOT11_RATE_54] = RATE111_54,
-+};
-+
-+static u32
-+acx111_gen_mask(int mbit, int modulation, void *opaque)
-+{
-+      /* lower 16 bits show selected 1, 2, CCK and OFDM rates */
-+      /* upper 16 bits show selected PBCC rates */
-+      u32 m = acx111mask[rate_mbit2enum(mbit)];
-+      if (modulation==DOT11_MOD_PBCC)
-+              return m<<16;
-+      return m;
-+}
-+
-+static int
-+verify_rate(u32 rate, int chip_type)
-+{
-+      /* never happens. be paranoid */
-+      if (!rate) return -EINVAL;
-+
-+      /* disallow: mixing PBCC and CCK at 5 and 11Mbit
-+      ** (can be supported, but needs complicated handling in tx code) */
-+      if (( rate & ((RATE111_11+RATE111_5)<<16) )
-+      &&  ( rate & (RATE111_11+RATE111_5) )
-+      ) {
-+              return -ENOTSUPP;
-+      }
-+      if (CHIPTYPE_ACX100 == chip_type) {
-+              if ( rate & ~(RATE111_ACX100_COMPAT+(RATE111_ACX100_COMPAT<<16)) )
-+                      return -ENOTSUPP;
-+      }
-+      return 0;
-+}
-+
-+static int
-+acx_ioctl_set_rates(struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      int result;
-+      u32 brate = 0, orate = 0; /* basic, operational rate set */
-+
-+      FN_ENTER;
-+
-+      log(L_IOCTL, "set_rates %s\n", extra);
-+      result = fill_ratemasks(extra, &brate, &orate,
-+                              acx111_supported, acx111_gen_mask, 0);
-+      if (result) goto end;
-+      SET_BIT(orate, brate);
-+      log(L_IOCTL, "brate %08X orate %08X\n", brate, orate);
-+
-+      result = verify_rate(brate, adev->chip_type);
-+      if (result) goto end;
-+      result = verify_rate(orate, adev->chip_type);
-+      if (result) goto end;
-+
-+      acx_sem_lock(adev);
-+      acx_lock(adev, flags);
-+
-+      adev->rate_basic = brate;
-+      adev->rate_oper = orate;
-+      /* TODO: ideally, we shall monitor highest basic rate
-+      ** which was successfully sent to every peer
-+      ** (say, last we checked, everybody could hear 5.5 Mbits)
-+      ** and use that for bcasts when we want to reach all peers.
-+      ** For beacons, we probably shall use lowest basic rate
-+      ** because we want to reach all *potential* new peers too */
-+      adev->rate_bcast = 1 << lowest_bit(brate);
-+      if (IS_ACX100(adev))
-+              adev->rate_bcast100 = acx_rate111to100(adev->rate_bcast);
-+      adev->rate_auto = !has_only_one_bit(orate);
-+      acx_l_update_client_rates(adev, orate);
-+      /* TODO: get rid of ratevector, build it only when needed */
-+      acx_l_update_ratevector(adev);
-+
-+      /* Do/don't do tx rate fallback; beacon contents and rate */
-+      SET_BIT(adev->set_mask, SET_RATE_FALLBACK|SET_TEMPLATES);
-+      result = -EINPROGRESS;
-+
-+      acx_unlock(adev, flags);
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_get_phy_chan_busy_percentage
-+*/
-+static int
-+acx_ioctl_get_phy_chan_busy_percentage(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      struct {
-+              u16 type;
-+              u16 len;
-+              u32 busytime;
-+              u32 totaltime;
-+      } ACX_PACKED usage;
-+      int result;
-+
-+      acx_sem_lock(adev);
-+
-+      if (OK != acx_s_interrogate(adev, &usage, ACX1xx_IE_MEDIUM_USAGE)) {
-+              result = NOT_OK;
-+              goto end_unlock;
-+      }
-+
-+      usage.busytime = le32_to_cpu(usage.busytime);
-+      usage.totaltime = le32_to_cpu(usage.totaltime);
-+      
-+      /* yes, this is supposed to be "Medium" (singular of media),
-+         not "average"! OK, reword the message to make it obvious... */
-+      printk("%s: busy percentage of medium (since last invocation): %d%% "
-+              "(%u of %u microseconds)\n",
-+              ndev->name,
-+              usage.busytime / ((usage.totaltime / 100) + 1),
-+              usage.busytime, usage.totaltime);
-+
-+      result = OK;
-+
-+end_unlock:
-+      acx_sem_unlock(adev);
-+
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_ed_threshold
-+*/
-+static inline int
-+acx_ioctl_set_ed_threshold(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      acx_sem_lock(adev);
-+
-+      printk("old ED threshold value: %d\n", adev->ed_threshold);
-+      adev->ed_threshold = (unsigned char)*extra;
-+      printk("new ED threshold value: %d\n", (unsigned char)*extra);
-+      SET_BIT(adev->set_mask, GETSET_ED_THRESH);
-+
-+      acx_sem_unlock(adev);
-+
-+      return -EINPROGRESS;
-+}
-+
-+
-+/***********************************************************************
-+** acx_ioctl_set_cca
-+*/
-+static inline int
-+acx_ioctl_set_cca(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      acx_sem_lock(adev);
-+
-+      printk("old CCA value: 0x%02X\n", adev->cca);
-+      adev->cca = (unsigned char)*extra;
-+      printk("new CCA value: 0x%02X\n", (unsigned char)*extra);
-+      SET_BIT(adev->set_mask, GETSET_CCA);
-+      result = -EINPROGRESS;
-+
-+      acx_sem_unlock(adev);
-+
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static const char * const
-+scan_modes[] = { "active", "passive", "background" };
-+
-+static void
-+acx_print_scan_params(acx_device_t *adev, const char* head)
-+{
-+      printk("%s: %smode %d (%s), min chan time %dTU, "
-+              "max chan time %dTU, max scan rate byte: %d\n",
-+              adev->ndev->name, head,
-+              adev->scan_mode, scan_modes[adev->scan_mode],
-+              adev->scan_probe_delay, adev->scan_duration, adev->scan_rate);
-+}
-+
-+static int
-+acx_ioctl_set_scan_params(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+      const int *params = (int *)extra;
-+
-+      acx_sem_lock(adev);
-+
-+      acx_print_scan_params(adev, "old scan parameters: ");
-+      if ((params[0] != -1) && (params[0] >= 0) && (params[0] <= 2))
-+              adev->scan_mode = params[0];
-+      if (params[1] != -1)
-+              adev->scan_probe_delay = params[1];
-+      if (params[2] != -1)
-+              adev->scan_duration = params[2];
-+      if ((params[3] != -1) && (params[3] <= 255))
-+              adev->scan_rate = params[3];
-+      acx_print_scan_params(adev, "new scan parameters: ");
-+      SET_BIT(adev->set_mask, GETSET_RESCAN);
-+      result = -EINPROGRESS;
-+
-+      acx_sem_unlock(adev);
-+
-+      return result;
-+}
-+
-+static int
-+acx_ioctl_get_scan_params(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+      int *params = (int *)extra;
-+
-+      acx_sem_lock(adev);
-+
-+      acx_print_scan_params(adev, "current scan parameters: ");
-+      params[0] = adev->scan_mode;
-+      params[1] = adev->scan_probe_delay;
-+      params[2] = adev->scan_duration;
-+      params[3] = adev->scan_rate;
-+      result = OK;
-+
-+      acx_sem_unlock(adev);
-+
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx100_ioctl_set_led_power(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      static const char * const led_modes[] = { "off", "on", "LinkQuality" };
-+
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result;
-+
-+      acx_sem_lock(adev);
-+
-+      printk("%s: power LED status: old %d (%s), ",
-+                      ndev->name,
-+                      adev->led_power,
-+                      led_modes[adev->led_power]);
-+      adev->led_power = extra[0];
-+      if (adev->led_power > 2) adev->led_power = 2;
-+      printk("new %d (%s)\n",
-+                      adev->led_power,
-+                      led_modes[adev->led_power]);
-+
-+      if (adev->led_power == 2) {
-+              printk("%s: max link quality setting: old %d, ",
-+                      ndev->name, adev->brange_max_quality);
-+              if (extra[1])
-+                      adev->brange_max_quality = extra[1];
-+              printk("new %d\n", adev->brange_max_quality);
-+      }
-+
-+      SET_BIT(adev->set_mask, GETSET_LED_POWER);
-+
-+      result = -EINPROGRESS;
-+
-+      acx_sem_unlock(adev);
-+
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static inline int
-+acx100_ioctl_get_led_power(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      acx_sem_lock(adev);
-+
-+      extra[0] = adev->led_power;
-+      if (adev->led_power == 2)
-+              extra[1] = adev->brange_max_quality;
-+      else
-+              extra[1] = -1;
-+
-+      acx_sem_unlock(adev);
-+
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx111_ioctl_info(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->param;
-+      if (!IS_PCI(ndev2adev(ndev)))
-+              return OK;
-+      return acx111pci_ioctl_info(ndev, info, vwrq, extra);
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static int
-+acx100_ioctl_set_phy_amp_bias(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      union iwreq_data *wrqu,
-+      char *extra)
-+{
-+      struct iw_param *vwrq = &wrqu->param;
-+      if (IS_USB(ndev2adev(ndev))) {
-+              printk("acx: set_phy_amp_bias() is not supported on USB\n");
-+              return OK;
-+      }
-+#ifdef ACX_MEM
-+      return acx100mem_ioctl_set_phy_amp_bias(ndev, info, vwrq, extra);
-+#else
-+      return acx100pci_ioctl_set_phy_amp_bias(ndev, info, vwrq, extra);
-+#endif
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static const iw_handler acx_ioctl_handler[] =
-+{
-+      acx_ioctl_commit,               /* SIOCSIWCOMMIT */
-+      acx_ioctl_get_name,             /* SIOCGIWNAME */
-+      NULL,                           /* SIOCSIWNWID */
-+      NULL,                           /* SIOCGIWNWID */
-+      acx_ioctl_set_freq,             /* SIOCSIWFREQ */
-+      acx_ioctl_get_freq,             /* SIOCGIWFREQ */
-+      acx_ioctl_set_mode,             /* SIOCSIWMODE */
-+      acx_ioctl_get_mode,             /* SIOCGIWMODE */
-+      acx_ioctl_set_sens,             /* SIOCSIWSENS */
-+      acx_ioctl_get_sens,             /* SIOCGIWSENS */
-+      NULL,                           /* SIOCSIWRANGE */
-+      acx_ioctl_get_range,            /* SIOCGIWRANGE */
-+      NULL,                           /* SIOCSIWPRIV */
-+      NULL,                           /* SIOCGIWPRIV */
-+      NULL,                           /* SIOCSIWSTATS */
-+      NULL,                           /* SIOCGIWSTATS */
-+#if IW_HANDLER_VERSION > 4
-+      iw_handler_set_spy,             /* SIOCSIWSPY */
-+      iw_handler_get_spy,             /* SIOCGIWSPY */
-+      iw_handler_set_thrspy,          /* SIOCSIWTHRSPY */
-+      iw_handler_get_thrspy,          /* SIOCGIWTHRSPY */
-+#else /* IW_HANDLER_VERSION > 4 */
-+#ifdef WIRELESS_SPY
-+      NULL /* acx_ioctl_set_spy FIXME */,     /* SIOCSIWSPY */
-+      NULL /* acx_ioctl_get_spy */,   /* SIOCGIWSPY */
-+#else /* WSPY */
-+      NULL,                           /* SIOCSIWSPY */
-+      NULL,                           /* SIOCGIWSPY */
-+#endif /* WSPY */
-+      NULL,                           /* [nothing] */
-+      NULL,                           /* [nothing] */
-+#endif /* IW_HANDLER_VERSION > 4 */
-+      acx_ioctl_set_ap,               /* SIOCSIWAP */
-+      acx_ioctl_get_ap,               /* SIOCGIWAP */
-+      NULL,                           /* [nothing] */
-+      acx_ioctl_get_aplist,           /* SIOCGIWAPLIST */
-+      acx_ioctl_set_scan,             /* SIOCSIWSCAN */
-+      acx_ioctl_get_scan,             /* SIOCGIWSCAN */
-+      acx_ioctl_set_essid,            /* SIOCSIWESSID */
-+      acx_ioctl_get_essid,            /* SIOCGIWESSID */
-+      acx_ioctl_set_nick,             /* SIOCSIWNICKN */
-+      acx_ioctl_get_nick,             /* SIOCGIWNICKN */
-+      NULL,                           /* [nothing] */
-+      NULL,                           /* [nothing] */
-+      acx_ioctl_set_rate,             /* SIOCSIWRATE */
-+      acx_ioctl_get_rate,             /* SIOCGIWRATE */
-+      acx_ioctl_set_rts,              /* SIOCSIWRTS */
-+      acx_ioctl_get_rts,              /* SIOCGIWRTS */
-+#if ACX_FRAGMENTATION
-+      acx_ioctl_set_frag,             /* SIOCSIWFRAG */
-+      acx_ioctl_get_frag,             /* SIOCGIWFRAG */
-+#else
-+      NULL,                           /* SIOCSIWFRAG */
-+      NULL,                           /* SIOCGIWFRAG */
-+#endif
-+      acx_ioctl_set_txpow,            /* SIOCSIWTXPOW */
-+      acx_ioctl_get_txpow,            /* SIOCGIWTXPOW */
-+      acx_ioctl_set_retry,            /* SIOCSIWRETRY */
-+      acx_ioctl_get_retry,            /* SIOCGIWRETRY */
-+      acx_ioctl_set_encode,           /* SIOCSIWENCODE */
-+      acx_ioctl_get_encode,           /* SIOCGIWENCODE */
-+      acx_ioctl_set_power,            /* SIOCSIWPOWER */
-+      acx_ioctl_get_power,            /* SIOCGIWPOWER */
-+};
-+
-+
-+/***********************************************************************
-+*/
-+
-+/* if you plan to reorder something, make sure to reorder all other places
-+ * accordingly! */
-+/* SET/GET convention: SETs must have even position, GETs odd */
-+#define ACX100_IOCTL SIOCIWFIRSTPRIV
-+enum {
-+      ACX100_IOCTL_DEBUG = ACX100_IOCTL,
-+      ACX100_IOCTL_GET__________UNUSED1,
-+      ACX100_IOCTL_SET_PLED,
-+      ACX100_IOCTL_GET_PLED,
-+      ACX100_IOCTL_SET_RATES,
-+      ACX100_IOCTL_LIST_DOM,
-+      ACX100_IOCTL_SET_DOM,
-+      ACX100_IOCTL_GET_DOM,
-+      ACX100_IOCTL_SET_SCAN_PARAMS,
-+      ACX100_IOCTL_GET_SCAN_PARAMS,
-+      ACX100_IOCTL_SET_PREAMB,
-+      ACX100_IOCTL_GET_PREAMB,
-+      ACX100_IOCTL_SET_ANT,
-+      ACX100_IOCTL_GET_ANT,
-+      ACX100_IOCTL_RX_ANT,
-+      ACX100_IOCTL_TX_ANT,
-+      ACX100_IOCTL_SET_PHY_AMP_BIAS,
-+      ACX100_IOCTL_GET_PHY_CHAN_BUSY,
-+      ACX100_IOCTL_SET_ED,
-+      ACX100_IOCTL_GET__________UNUSED3,
-+      ACX100_IOCTL_SET_CCA,
-+      ACX100_IOCTL_GET__________UNUSED4,
-+      ACX100_IOCTL_MONITOR,
-+      ACX100_IOCTL_TEST,
-+      ACX100_IOCTL_DBG_SET_MASKS,
-+      ACX111_IOCTL_INFO,
-+      ACX100_IOCTL_DBG_SET_IO,
-+      ACX100_IOCTL_DBG_GET_IO
-+};
-+
-+
-+static const iw_handler acx_ioctl_private_handler[] =
-+{
-+#if ACX_DEBUG
-+[ACX100_IOCTL_DEBUG           - ACX100_IOCTL] = acx_ioctl_set_debug,
-+#endif
-+[ACX100_IOCTL_SET_PLED                - ACX100_IOCTL] = acx100_ioctl_set_led_power,
-+[ACX100_IOCTL_GET_PLED                - ACX100_IOCTL] = acx100_ioctl_get_led_power,
-+[ACX100_IOCTL_SET_RATES               - ACX100_IOCTL] = acx_ioctl_set_rates,
-+[ACX100_IOCTL_LIST_DOM                - ACX100_IOCTL] = acx_ioctl_list_reg_domain,
-+[ACX100_IOCTL_SET_DOM         - ACX100_IOCTL] = acx_ioctl_set_reg_domain,
-+[ACX100_IOCTL_GET_DOM         - ACX100_IOCTL] = acx_ioctl_get_reg_domain,
-+[ACX100_IOCTL_SET_SCAN_PARAMS - ACX100_IOCTL] = acx_ioctl_set_scan_params,
-+[ACX100_IOCTL_GET_SCAN_PARAMS - ACX100_IOCTL] = acx_ioctl_get_scan_params,
-+[ACX100_IOCTL_SET_PREAMB      - ACX100_IOCTL] = acx_ioctl_set_short_preamble,
-+[ACX100_IOCTL_GET_PREAMB      - ACX100_IOCTL] = acx_ioctl_get_short_preamble,
-+[ACX100_IOCTL_SET_ANT         - ACX100_IOCTL] = acx_ioctl_set_antenna,
-+[ACX100_IOCTL_GET_ANT         - ACX100_IOCTL] = acx_ioctl_get_antenna,
-+[ACX100_IOCTL_RX_ANT          - ACX100_IOCTL] = acx_ioctl_set_rx_antenna,
-+[ACX100_IOCTL_TX_ANT          - ACX100_IOCTL] = acx_ioctl_set_tx_antenna,
-+[ACX100_IOCTL_SET_PHY_AMP_BIAS        - ACX100_IOCTL] = acx100_ioctl_set_phy_amp_bias,
-+[ACX100_IOCTL_GET_PHY_CHAN_BUSY       - ACX100_IOCTL] = acx_ioctl_get_phy_chan_busy_percentage,
-+[ACX100_IOCTL_SET_ED          - ACX100_IOCTL] = acx_ioctl_set_ed_threshold,
-+[ACX100_IOCTL_SET_CCA         - ACX100_IOCTL] = acx_ioctl_set_cca,
-+[ACX100_IOCTL_MONITOR         - ACX100_IOCTL] = acx_ioctl_wlansniff,
-+[ACX100_IOCTL_TEST            - ACX100_IOCTL] = acx_ioctl_unknown11,
-+[ACX100_IOCTL_DBG_SET_MASKS   - ACX100_IOCTL] = acx_ioctl_dbg_set_masks,
-+[ACX111_IOCTL_INFO            - ACX100_IOCTL] = acx111_ioctl_info,
-+};
-+
-+
-+static const struct iw_priv_args acx_ioctl_private_args[] = {
-+#if ACX_DEBUG
-+{ cmd : ACX100_IOCTL_DEBUG,
-+      set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-+      get_args : 0,
-+      name : "SetDebug" },
-+#endif
-+{ cmd : ACX100_IOCTL_SET_PLED,
-+      set_args : IW_PRIV_TYPE_BYTE | 2,
-+      get_args : 0,
-+      name : "SetLEDPower" },
-+{ cmd : ACX100_IOCTL_GET_PLED,
-+      set_args : 0,
-+      get_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 2,
-+      name : "GetLEDPower" },
-+{ cmd : ACX100_IOCTL_SET_RATES,
-+      set_args : IW_PRIV_TYPE_CHAR | 256,
-+      get_args : 0,
-+      name : "SetRates" },
-+{ cmd : ACX100_IOCTL_LIST_DOM,
-+      set_args : 0,
-+      get_args : 0,
-+      name : "ListRegDomain" },
-+{ cmd : ACX100_IOCTL_SET_DOM,
-+      set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
-+      get_args : 0,
-+      name : "SetRegDomain" },
-+{ cmd : ACX100_IOCTL_GET_DOM,
-+      set_args : 0,
-+      get_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
-+      name : "GetRegDomain" },
-+{ cmd : ACX100_IOCTL_SET_SCAN_PARAMS,
-+      set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 4,
-+      get_args : 0,
-+      name : "SetScanParams" },
-+{ cmd : ACX100_IOCTL_GET_SCAN_PARAMS,
-+      set_args : 0,
-+      get_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 4,
-+      name : "GetScanParams" },
-+{ cmd : ACX100_IOCTL_SET_PREAMB,
-+      set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
-+      get_args : 0,
-+      name : "SetSPreamble" },
-+{ cmd : ACX100_IOCTL_GET_PREAMB,
-+      set_args : 0,
-+      get_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
-+      name : "GetSPreamble" },
-+{ cmd : ACX100_IOCTL_SET_ANT,
-+      set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
-+      get_args : 0,
-+      name : "SetAntenna" },
-+{ cmd : ACX100_IOCTL_GET_ANT,
-+      set_args : 0,
-+      get_args : 0,
-+      name : "GetAntenna" },
-+{ cmd : ACX100_IOCTL_RX_ANT,
-+      set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
-+      get_args : 0,
-+      name : "SetRxAnt" },
-+{ cmd : ACX100_IOCTL_TX_ANT,
-+      set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
-+      get_args : 0,
-+      name : "SetTxAnt" },
-+{ cmd : ACX100_IOCTL_SET_PHY_AMP_BIAS,
-+      set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
-+      get_args : 0,
-+      name : "SetPhyAmpBias"},
-+{ cmd : ACX100_IOCTL_GET_PHY_CHAN_BUSY,
-+      set_args : 0,
-+      get_args : 0,
-+      name : "GetPhyChanBusy" },
-+{ cmd : ACX100_IOCTL_SET_ED,
-+      set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
-+      get_args : 0,
-+      name : "SetED" },
-+{ cmd : ACX100_IOCTL_SET_CCA,
-+      set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1,
-+      get_args : 0,
-+      name : "SetCCA" },
-+{ cmd : ACX100_IOCTL_MONITOR,
-+      set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
-+      get_args : 0,
-+      name : "monitor" },
-+{ cmd : ACX100_IOCTL_TEST,
-+      set_args : 0,
-+      get_args : 0,
-+      name : "Test" },
-+{ cmd : ACX100_IOCTL_DBG_SET_MASKS,
-+      set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2,
-+      get_args : 0,
-+      name : "DbgSetMasks" },
-+{ cmd : ACX111_IOCTL_INFO,
-+      set_args : 0,
-+      get_args : 0,
-+      name : "GetAcx111Info" },
-+{ cmd : ACX100_IOCTL_DBG_SET_IO,
-+      set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 4,
-+      get_args : 0,
-+      name : "DbgSetIO" },
-+{ cmd : ACX100_IOCTL_DBG_GET_IO,
-+      set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
-+      get_args : 0,
-+      name : "DbgGetIO" },
-+};
-+
-+
-+const struct iw_handler_def acx_ioctl_handler_def =
-+{
-+      .num_standard = VEC_SIZE(acx_ioctl_handler),
-+      .num_private = VEC_SIZE(acx_ioctl_private_handler),
-+      .num_private_args = VEC_SIZE(acx_ioctl_private_args),
-+      .standard = (iw_handler *) acx_ioctl_handler,
-+      .private = (iw_handler *) acx_ioctl_private_handler,
-+      .private_args = (struct iw_priv_args *) acx_ioctl_private_args,
-+#if IW_HANDLER_VERSION > 5
-+      .get_wireless_stats = acx_e_get_wireless_stats
-+#endif /* IW > 5 */
-+};
-Index: linux-2.6.22/drivers/net/wireless/acx/Kconfig
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/Kconfig      2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,113 @@
-+config ACX
-+      tristate "TI acx100/acx111 802.11b/g wireless chipsets"
-+      depends on NET_RADIO && EXPERIMENTAL
-+      select FW_LOADER
-+      ---help---
-+      A driver for 802.11b/g wireless cards based on
-+      Texas Instruments acx100 and acx111 chipsets.
-+
-+      This driver supports Host AP mode that allows
-+      your computer to act as an IEEE 802.11 access point.
-+      This driver is new and experimental.
-+
-+      Texas Instruments did not take part in development of this driver
-+      in any way, shape or form.
-+
-+      The driver can be compiled as a module and will be named "acx".
-+
-+config ACX_PCI
-+      bool "TI acx100/acx111 802.11b/g PCI"
-+      depends on ACX && PCI
-+      ---help---
-+      Include PCI and CardBus support in acx.
-+
-+      acx chipsets need their firmware loaded at startup.
-+      You will need to provide a firmware image via hotplug.
-+
-+      Firmware may be in a form of single image 40-100kb in size
-+      (a 'combined' firmware) or two images - main image
-+      (again 40-100kb) and radio image (~10kb or less).
-+
-+      Firmware images are requested from hotplug using following names:
-+
-+      tiacx100 - main firmware image for acx100 chipset
-+      tiacx100rNN - radio acx100 firmware for radio type NN
-+      tiacx100cNN - combined acx100 firmware for radio type NN
-+      tiacx111 - main acx111 firmware
-+      tiacx111rNN - radio acx111 firmware for radio type NN
-+      tiacx111cNN - combined acx111 firmware for radio type NN
-+
-+      Driver will attempt to load combined image first.
-+      If no such image is found, it will try to load main image
-+      and radio image instead.
-+
-+      Firmware files are not covered by GPL and are not distributed
-+      with this driver for legal reasons.
-+
-+config ACX_USB
-+      bool "TI acx100/acx111 802.11b/g USB"
-+      depends on ACX && (USB=y || USB=ACX)
-+      ---help---
-+      Include USB support in acx.
-+
-+      There is only one currently known device in this category,
-+      D-Link DWL-120+, but newer devices seem to be on the horizon.
-+
-+      acx chipsets need their firmware loaded at startup.
-+      You will need to provide a firmware image via hotplug.
-+
-+      Firmware for USB device is requested from hotplug
-+      by the 'tiacx100usb' name.
-+
-+      Firmware files are not covered by GPL and are not distributed
-+      with this driver for legal reasons.
-+
-+config ACX_MEM
-+      bool "TI acx100/acx111 802.11b/g memory mapped slave 16 interface"
-+      depends on ACX
-+      ---help---
-+      acx chipsets need their firmware loaded at startup.
-+      You will need to provide a firmware image via hotplug.
-+
-+      Firmware for USB device is requested from hotplug
-+      by the 'tiacx100usb' name.
-+
-+      Firmware files are not covered by GPL and are not distributed
-+      with this driver for legal reasons.
-+
-+config ACX_CS
-+      bool "TI acx100/acx111 802.11b/g cardbus interface"
-+      depends on ACX
-+      ---help---
-+      acx chipsets need their firmware loaded at startup.
-+      You will need to provide a firmware image via hotplug.
-+      
-+      This driver is based on memory mapped driver.
-+
-+      Firmware files are not covered by GPL and are not distributed
-+      with this driver for legal reasons.
-+
-+config ACX_HX4700
-+      tristate "ACX support for the iPAQ hx4700 using ACX_MEM"
-+      depends on HX4700_CORE && ACX_MEM
-+      ---help---
-+      Include memory interface support in acx for the iPAQ hx4700.
-+
-+config ACX_HTCUNIVERSAL
-+      tristate "ACX support for the HTC Universal using ACX_MEM"
-+      depends on HTCUNIVERSAL_CORE && HTC_ASIC3 && ACX_MEM
-+      ---help---
-+      Include memory interface support in acx for the HTC Universal.
-+
-+config ACX_HTCSABLE
-+      tristate "ACX support for the HTC Sable (IPAQ hw6915) using ACX_MEM"
-+      depends on MACH_HW6900 && HTC_ASIC3 && ACX_MEM
-+      ---help---
-+      Include memory interface support in acx for the HTC Sable (IPAQ hw6915).
-+
-+config ACX_RX3000
-+      tristate "ACX support for the iPAQ RX3000 using ACX_MEM"
-+      depends on MACH_RX3715 && ACX_MEM && LEDS_ASIC3
-+      ---help---
-+      Include memory interface support in acx for the IPAQ RX3000.
-+
-Index: linux-2.6.22/drivers/net/wireless/acx/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/Makefile     2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,21 @@
-+#obj-m += acx.o
-+
-+#acx-obj-y += pci.o
-+#acx-obj-y += usb.o
-+
-+#acx-objs := wlan.o conv.o ioctl.o common.o $(acx-obj-y)
-+
-+# Use this if you have proper Kconfig integration:
-+
-+obj-$(CONFIG_ACX) += acx.o
-+obj-$(CONFIG_ACX_HX4700) += hx4700_acx.o
-+obj-$(CONFIG_ACX_HTCUNIVERSAL) += htcuniversal_acx.o
-+obj-$(CONFIG_ACX_HTCSABLE) += htcsable_acx.o
-+obj-$(CONFIG_ACX_RX3000) += rx3000_acx.o
-+#
-+acx-obj-$(CONFIG_ACX_PCI) += pci.o
-+acx-obj-$(CONFIG_ACX_USB) += usb.o
-+acx-obj-$(CONFIG_ACX_MEM) += mem.o
-+acx-obj-$(CONFIG_ACX_CS) += cs.o
-+#
-+acx-objs := wlan.o conv.o ioctl.o common.o $(acx-obj-y)
-Index: linux-2.6.22/drivers/net/wireless/acx/mem.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/mem.c        2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,5363 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+**
-+** Slave memory interface support:
-+**
-+** Todd Blumer - SDG Systems
-+** Bill Reese - HP
-+** Eric McCorkle - Shadowsun
-+*/
-+#define ACX_MEM 1
-+
-+/*
-+ * non-zero makes it dump the ACX memory to the console then
-+ * panic when you cat /proc/driver/acx_wlan0_diag
-+ */
-+#define DUMP_MEM_DEFINED 1
-+
-+#define DUMP_MEM_DURING_DIAG 0
-+#define DUMP_IF_SLOW 0
-+
-+#define PATCH_AROUND_BAD_SPOTS 1
-+#define HX4700_FIRMWARE_CHECKSUM 0x0036862e
-+#define HX4700_ALTERNATE_FIRMWARE_CHECKSUM 0x00368a75
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
-+#include <linux/config.h>
-+#endif
-+
-+/* Linux 2.6.18+ uses <linux/utsrelease.h> */
-+#ifndef UTS_RELEASE
-+#include <linux/utsrelease.h>
-+#endif
-+
-+#include <linux/compiler.h> /* required for Lx 2.6.8 ?? */
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/sched.h>
-+#include <linux/types.h>
-+#include <linux/skbuff.h>
-+#include <linux/slab.h>
-+#include <linux/if_arp.h>
-+#include <linux/irq.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/wireless.h>
-+#include <net/iw_handler.h>
-+#include <linux/netdevice.h>
-+#include <linux/ioport.h>
-+#include <linux/pci.h>
-+#include <linux/platform_device.h>
-+#include <linux/pm.h>
-+#include <linux/vmalloc.h>
-+#include <linux/delay.h>
-+#include <linux/workqueue.h>
-+#include <linux/inetdevice.h>
-+
-+#include "acx.h"
-+#include "acx_hw.h"
-+
-+/***********************************************************************
-+*/
-+
-+#define CARD_EEPROM_ID_SIZE 6
-+
-+#include <asm/io.h>
-+
-+#define REG_ACX_VENDOR_ID 0x900
-+/*
-+ * This is the vendor id on the HX4700, anyway
-+ */
-+#define ACX_VENDOR_ID 0x8400104c
-+
-+typedef enum {
-+      ACX_SOFT_RESET = 0,
-+
-+      ACX_SLV_REG_ADDR,
-+      ACX_SLV_REG_DATA,
-+      ACX_SLV_REG_ADATA,
-+
-+      ACX_SLV_MEM_CP,
-+      ACX_SLV_MEM_ADDR,
-+      ACX_SLV_MEM_DATA,
-+      ACX_SLV_MEM_CTL,
-+} acxreg_t;
-+
-+/***********************************************************************
-+*/
-+static void acxmem_i_tx_timeout(struct net_device *ndev);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
-+static irqreturn_t acxmem_i_interrupt(int irq, void *dev_id);
-+#else
-+static irqreturn_t acxmem_i_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-+#endif
-+static void acxmem_i_set_multicast_list(struct net_device *ndev);
-+
-+static int acxmem_e_open(struct net_device *ndev);
-+static int acxmem_e_close(struct net_device *ndev);
-+static void acxmem_s_up(struct net_device *ndev);
-+static void acxmem_s_down(struct net_device *ndev);
-+
-+static void dump_acxmem (acx_device_t *adev, u32 start, int length);
-+static int acxmem_complete_hw_reset (acx_device_t *adev);
-+static void acxmem_s_delete_dma_regions(acx_device_t *adev);
-+
-+static struct platform_device *resume_pdev;
-+
-+static int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+acxmem_e_suspend(struct platform_device *pdev, pm_message_t state);
-+#else
-+acxmem_e_suspend(struct device *pdev, u32 state);
-+#endif
-+static void
-+fw_resumer(struct work_struct *notused);
-+//fw_resumer( void *data );
-+
-+static int acx_netdev_event(struct notifier_block *this, unsigned long event, void *ptr)
-+{
-+  struct net_device *ndev = ptr;
-+  acx_device_t *adev = ndev2adev(ndev);
-+
-+  /*
-+   * Upper level ioctl() handlers send a NETDEV_CHANGEADDR if the MAC address changes.
-+   */
-+
-+  if (NETDEV_CHANGEADDR == event) {
-+    /*
-+     * the upper layers put the new MAC address in ndev->dev_addr; we just copy
-+     * it over and update the ACX with it.
-+     */
-+    MAC_COPY(adev->dev_addr, adev->ndev->dev_addr);
-+    adev->set_mask |= GETSET_STATION_ID;
-+    acx_s_update_card_settings (adev);
-+  }
-+
-+  return 0;
-+}
-+
-+static struct notifier_block acx_netdev_notifier = {
-+        .notifier_call = acx_netdev_event,
-+};
-+
-+/***********************************************************************
-+** Register access
-+*/
-+
-+/* Pick one */
-+/* #define INLINE_IO static */
-+#define INLINE_IO static inline
-+
-+INLINE_IO u32
-+read_id_register (acx_device_t *adev)
-+{
-+  writel (0x24, &adev->iobase[ACX_SLV_REG_ADDR]);
-+  return readl (&adev->iobase[ACX_SLV_REG_DATA]);
-+}
-+
-+INLINE_IO u32
-+read_reg32(acx_device_t *adev, unsigned int offset)
-+{
-+        u32 val;
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+        return readl(((u8*)adev->iobase) + addr);
-+      }
-+
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      val = readl( &adev->iobase[ACX_SLV_REG_DATA] );
-+
-+      return val;
-+}
-+
-+INLINE_IO u16
-+read_reg16(acx_device_t *adev, unsigned int offset)
-+{
-+      u16 lo;
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+          return readw(((u8 *) adev->iobase) + addr);
-+      }
-+
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      lo = readw( (u16 *)&adev->iobase[ACX_SLV_REG_DATA] );
-+
-+      return lo;
-+}
-+
-+INLINE_IO u8
-+read_reg8(acx_device_t *adev, unsigned int offset)
-+{
-+      u8 lo;
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20)
-+          return readb(((u8 *)adev->iobase) + addr);
-+
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      lo = readw( (u8 *)&adev->iobase[ACX_SLV_REG_DATA] );
-+
-+      return (u8)lo;
-+}
-+
-+INLINE_IO void
-+write_reg32(acx_device_t *adev, unsigned int offset, u32 val)
-+{
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+          writel(val, ((u8*)adev->iobase) + addr);
-+          return;
-+      }
-+
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      writel( val, &adev->iobase[ACX_SLV_REG_DATA] );
-+}
-+
-+INLINE_IO void
-+write_reg16(acx_device_t *adev, unsigned int offset, u16 val)
-+{
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+          writew(val, ((u8 *)adev->iobase) + addr);
-+          return;
-+      }
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      writew( val, (u16 *) &adev->iobase[ACX_SLV_REG_DATA] );
-+}
-+
-+INLINE_IO void
-+write_reg8(acx_device_t *adev, unsigned int offset, u8 val)
-+{
-+      u32 addr;
-+
-+        if (offset > IO_ACX_ECPU_CTRL)
-+        addr = offset;
-+      else
-+        addr = adev->io[offset];
-+
-+      if (addr < 0x20) {
-+          writeb(val, ((u8 *) adev->iobase) + addr);
-+          return;
-+      }
-+      writel( addr, &adev->iobase[ACX_SLV_REG_ADDR] );
-+      writeb( val, (u8 *)&adev->iobase[ACX_SLV_REG_DATA] );
-+}
-+
-+/* Handle PCI posting properly:
-+ * Make sure that writes reach the adapter in case they require to be executed
-+ * *before* the next write, by reading a random (and safely accessible) register.
-+ * This call has to be made if there is no read following (which would flush the data
-+ * to the adapter), yet the written data has to reach the adapter immediately. */
-+INLINE_IO void
-+write_flush(acx_device_t *adev)
-+{
-+      /* readb(adev->iobase + adev->io[IO_ACX_INFO_MAILBOX_OFFS]); */
-+      /* faster version (accesses the first register, IO_ACX_SOFT_RESET,
-+       * which should also be safe): */
-+      (void) readl(adev->iobase);
-+}
-+
-+INLINE_IO void
-+set_regbits (acx_device_t *adev, unsigned int offset, u32 bits) {
-+  u32 tmp;
-+
-+  tmp = read_reg32 (adev, offset);
-+  tmp = tmp | bits;
-+  write_reg32 (adev, offset, tmp);
-+  write_flush (adev);
-+}
-+
-+INLINE_IO void
-+clear_regbits (acx_device_t *adev, unsigned int offset, u32 bits) {
-+  u32 tmp;
-+
-+  tmp = read_reg32 (adev, offset);
-+  tmp = tmp & ~bits;
-+  write_reg32 (adev, offset, tmp);
-+  write_flush (adev);
-+}
-+
-+/*
-+ * Copy from PXA memory to the ACX memory.  This assumes both the PXA and ACX
-+ * addresses are 32 bit aligned.  Count is in bytes.
-+ */
-+INLINE_IO void
-+write_slavemem32 (acx_device_t *adev, u32 slave_address, u32 val)
-+{
-+  write_reg32 (adev, IO_ACX_SLV_MEM_CTL, 0x0);
-+  write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, slave_address);
-+  udelay (10);
-+  write_reg32 (adev, IO_ACX_SLV_MEM_DATA, val);
-+}
-+
-+INLINE_IO u32
-+read_slavemem32 (acx_device_t *adev, u32 slave_address)
-+{
-+  u32 val;
-+
-+  write_reg32 (adev, IO_ACX_SLV_MEM_CTL, 0x0);
-+  write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, slave_address);
-+  udelay (10);
-+  val = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
-+
-+  return val;
-+}
-+
-+INLINE_IO void
-+write_slavemem8 (acx_device_t *adev, u32 slave_address, u8 val)
-+{
-+  u32 data;
-+  u32 base;
-+  int offset;
-+
-+  /*
-+   * Get the word containing the target address and the byte offset in that word.
-+   */
-+  base = slave_address & ~3;
-+  offset = (slave_address & 3) * 8;
-+
-+  data = read_slavemem32 (adev, base);
-+  data &= ~(0xff << offset);
-+  data |= val << offset;
-+  write_slavemem32 (adev, base, data);
-+}
-+
-+INLINE_IO u8
-+read_slavemem8 (acx_device_t *adev, u32 slave_address)
-+{
-+  u8 val;
-+  u32 base;
-+  u32 data;
-+  int offset;
-+
-+  base = slave_address & ~3;
-+  offset = (slave_address & 3) * 8;
-+
-+  data = read_slavemem32 (adev, base);
-+ 
-+  val = (data >> offset) & 0xff;
-+
-+  return val;
-+}
-+
-+/*
-+ * doesn't split across word boundaries
-+ */
-+INLINE_IO void
-+write_slavemem16 (acx_device_t *adev, u32 slave_address, u16 val)
-+{
-+  u32 data;
-+  u32 base;
-+  int offset;
-+
-+  /*
-+   * Get the word containing the target address and the byte offset in that word.
-+   */
-+  base = slave_address & ~3;
-+  offset = (slave_address & 3) * 8;
-+
-+  data = read_slavemem32 (adev, base);
-+  data &= ~(0xffff << offset);
-+  data |= val << offset;
-+  write_slavemem32 (adev, base, data);
-+}
-+
-+/*
-+ * doesn't split across word boundaries
-+ */
-+INLINE_IO u16
-+read_slavemem16 (acx_device_t *adev, u32 slave_address)
-+{
-+  u16 val;
-+  u32 base;
-+  u32 data;
-+  int offset;
-+
-+  base = slave_address & ~3;
-+  offset = (slave_address & 3) * 8;
-+
-+  data = read_slavemem32 (adev, base);
-+ 
-+  val = (data >> offset) & 0xffff;
-+
-+  return val;
-+}
-+
-+/*
-+ * Copy from slave memory
-+ *
-+ * TODO - rewrite using address autoincrement, handle partial words
-+ */
-+void
-+copy_from_slavemem (acx_device_t *adev, u8 *destination, u32 source, int count) {
-+  u32 tmp = 0;
-+  u8 *ptmp = (u8 *) &tmp;
-+
-+  /*
-+   * Right now I'm making the assumption that the destination is aligned, but
-+   * I'd better check.
-+   */
-+  if ((u32) destination & 3) {
-+    printk ("acx copy_from_slavemem: warning!  destination not word-aligned!\n");
-+  }
-+
-+  while (count >= 4) {
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source);
-+    udelay (10);
-+    *((u32 *) destination) = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
-+    count -= 4;
-+    source += 4;
-+    destination += 4;
-+  }
-+
-+  /*
-+   * If the word reads above didn't satisfy the count, read one more word
-+   * and transfer a byte at a time until the request is satisfied.
-+   */
-+  if (count) {
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, source);
-+    udelay (10);
-+    tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
-+    while (count--) {
-+      *destination++ = *ptmp++;
-+    }
-+  }
-+}
-+
-+/*
-+ * Copy to slave memory
-+ *
-+ * TODO - rewrite using autoincrement, handle partial words
-+ */
-+void
-+copy_to_slavemem (acx_device_t *adev, u32 destination, u8 *source, int count)
-+{
-+  u32 tmp = 0;
-+  u8* ptmp = (u8 *) &tmp;
-+  static u8 src[512]; /* make static to avoid huge stack objects */
-+
-+  /*
-+   * For now, make sure the source is word-aligned by copying it to a word-aligned
-+   * buffer.  Someday rewrite to avoid the extra copy.
-+   */
-+  if (count > sizeof (src)) {
-+    printk ("acx copy_to_slavemem: Warning! buffer overflow!\n");
-+    count = sizeof (src);
-+  }
-+  memcpy (src, source, count);
-+  source = src;
-+
-+  while (count >= 4) {
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination);
-+    udelay (10);
-+    write_reg32 (adev, IO_ACX_SLV_MEM_DATA, *((u32 *) source));
-+    count -= 4;
-+    source += 4;
-+    destination += 4;
-+  }
-+
-+  /*
-+   * If there are leftovers read the next word from the acx and merge in
-+   * what they want to write.
-+   */
-+  if (count) {
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination);
-+    udelay (10);
-+    tmp = read_reg32 (adev, IO_ACX_SLV_MEM_DATA);
-+    while (count--) {
-+      *ptmp++ = *source++;
-+    }
-+    /*
-+     * reset address in case we're currently in auto-increment mode
-+     */
-+    write_reg32 (adev, IO_ACX_SLV_MEM_ADDR, destination);
-+    udelay (10);
-+    write_reg32 (adev, IO_ACX_SLV_MEM_DATA, tmp);
-+    udelay (10);
-+  }
-+  
-+}
-+
-+/*
-+ * Block copy to slave buffers using memory block chain mode.  Copies to the ACX
-+ * transmit buffer structure with minimal intervention on our part.
-+ * Interrupts should be disabled when calling this.
-+ */
-+void
-+chaincopy_to_slavemem (acx_device_t *adev, u32 destination, u8 *source, int count)
-+{
-+  u32 val;
-+  u32 *data = (u32 *) source;
-+  static u8 aligned_source[WLAN_A4FR_MAXLEN_WEP_FCS];
-+
-+  /*
-+   * Warn if the pointers don't look right.  Destination must fit in [23:5] with
-+   * zero elsewhere and source should be 32 bit aligned.
-+   * This should never happen since we're in control of both, but I want to know about
-+   * it if it does.
-+   */
-+  if ((destination & 0x00ffffe0) != destination) {
-+    printk ("acx chaincopy: destination block 0x%04x not aligned!\n", destination);
-+  }
-+  if (count > sizeof aligned_source) {
-+      printk( KERN_ERR "chaincopy_to_slavemem overflow!\n" );
-+      count = sizeof aligned_source;
-+  }
-+  if ((u32) source & 3) {
-+    memcpy (aligned_source, source, count);
-+    data = (u32 *) aligned_source;
-+  }
-+
-+  /*
-+   * SLV_MEM_CTL[17:16] = memory block chain mode with auto-increment
-+   * SLV_MEM_CTL[5:2] = offset to data portion = 1 word
-+   */
-+  val = 2 << 16 | 1 << 2;
-+  writel (val, &adev->iobase[ACX_SLV_MEM_CTL]);
-+
-+  /*
-+   * SLV_MEM_CP[23:5] = start of 1st block
-+   * SLV_MEM_CP[3:2] = offset to memblkptr = 0
-+   */
-+  val = destination & 0x00ffffe0;
-+  writel (val, &adev->iobase[ACX_SLV_MEM_CP]);
-+
-+  /*
-+   * SLV_MEM_ADDR[23:2] = SLV_MEM_CTL[5:2] + SLV_MEM_CP[23:5]
-+   */
-+  val = (destination & 0x00ffffe0) + (1<<2);
-+  writel (val, &adev->iobase[ACX_SLV_MEM_ADDR]);
-+
-+  /*
-+   * Write the data to the slave data register, rounding up to the end
-+   * of the word containing the last byte (hence the > 0)
-+   */
-+  while (count > 0) {
-+    writel (*data++, &adev->iobase[ACX_SLV_MEM_DATA]);
-+    count -= 4;
-+  }
-+}
-+
-+
-+/*
-+ * Block copy from slave buffers using memory block chain mode.  Copies from the ACX
-+ * receive buffer structures with minimal intervention on our part.
-+ * Interrupts should be disabled when calling this.
-+ */
-+void
-+chaincopy_from_slavemem (acx_device_t *adev, u8 *destination, u32 source, int count)
-+{
-+  u32 val;
-+  u32 *data = (u32 *) destination;
-+  static u8 aligned_destination[WLAN_A4FR_MAXLEN_WEP_FCS];
-+  int saved_count = count;
-+
-+  /*
-+   * Warn if the pointers don't look right.  Destination must fit in [23:5] with
-+   * zero elsewhere and source should be 32 bit aligned.
-+   * Turns out the network stack sends unaligned things, so fix them before
-+   * copying to the ACX.
-+   */
-+  if ((source & 0x00ffffe0) != source) {
-+    printk ("acx chaincopy: source block 0x%04x not aligned!\n", source);
-+    dump_acxmem (adev, 0, 0x10000);
-+  }
-+  if ((u32) destination & 3) {
-+    //printk ("acx chaincopy: data destination not word aligned!\n");
-+    data = (u32 *) aligned_destination;
-+    if (count > sizeof aligned_destination) {
-+      printk( KERN_ERR "chaincopy_from_slavemem overflow!\n" );
-+      count = sizeof aligned_destination;
-+    }
-+  }
-+
-+  /*
-+   * SLV_MEM_CTL[17:16] = memory block chain mode with auto-increment
-+   * SLV_MEM_CTL[5:2] = offset to data portion = 1 word
-+   */
-+  val = (2 << 16) | (1 << 2);
-+  writel (val, &adev->iobase[ACX_SLV_MEM_CTL]);
-+
-+  /*
-+   * SLV_MEM_CP[23:5] = start of 1st block
-+   * SLV_MEM_CP[3:2] = offset to memblkptr = 0
-+   */
-+  val = source & 0x00ffffe0;
-+  writel (val, &adev->iobase[ACX_SLV_MEM_CP]);
-+
-+  /*
-+   * SLV_MEM_ADDR[23:2] = SLV_MEM_CTL[5:2] + SLV_MEM_CP[23:5]
-+   */
-+  val = (source & 0x00ffffe0) + (1<<2);
-+  writel (val, &adev->iobase[ACX_SLV_MEM_ADDR]);
-+
-+  /*
-+   * Read the data from the slave data register, rounding up to the end
-+   * of the word containing the last byte (hence the > 0)
-+   */
-+  while (count > 0) {
-+    *data++ = readl (&adev->iobase[ACX_SLV_MEM_DATA]);
-+    count -= 4;
-+  }
-+
-+  /*
-+   * If the destination wasn't aligned, we would have saved it in
-+   * the aligned buffer, so copy it where it should go.
-+   */
-+  if ((u32) destination & 3) {
-+    memcpy (destination, aligned_destination, saved_count);
-+  }
-+}
-+
-+char
-+printable (char c) 
-+{
-+  return ((c >= 20) && (c < 127)) ? c : '.';
-+}
-+
-+#if DUMP_MEM_DEFINED > 0
-+static void
-+dump_acxmem (acx_device_t *adev, u32 start, int length)
-+{
-+  int i;
-+  u8 buf[16];
-+
-+  while (length > 0) {
-+    printk ("%04x ", start);
-+    copy_from_slavemem (adev, buf, start, 16);
-+    for (i = 0; (i < 16) && (i < length); i++) {
-+      printk ("%02x ", buf[i]);
-+    }
-+    for (i = 0; (i < 16) && (i < length); i++) {
-+      printk ("%c", printable (buf[i]));
-+    }
-+    printk ("\n");
-+    start += 16;
-+    length -= 16;
-+  }
-+}
-+#endif
-+
-+static void
-+enable_acx_irq(acx_device_t *adev);
-+static void
-+disable_acx_irq(acx_device_t *adev);
-+
-+/*
-+ * Return an acx pointer to the next transmit data block.
-+ */
-+u32
-+allocate_acx_txbuf_space (acx_device_t *adev, int count) {
-+  u32 block, next, last_block;
-+  int blocks_needed;
-+  unsigned long flags;
-+
-+  spin_lock_irqsave(&adev->txbuf_lock, flags);
-+  /*
-+   * Take 4 off the memory block size to account for the reserved word at the start of
-+   * the block.
-+   */
-+  blocks_needed = count / (adev->memblocksize - 4);
-+  if (count % (adev->memblocksize - 4))
-+    blocks_needed++;
-+
-+  if (blocks_needed <= adev->acx_txbuf_blocks_free) {
-+    /*
-+     * Take blocks at the head of the free list.
-+     */
-+    last_block = block = adev->acx_txbuf_free;
-+
-+    /*
-+     * Follow block pointers through the requested number of blocks both to
-+     * find the new head of the free list and to set the flags for the blocks
-+     * appropriately.
-+     */
-+    while (blocks_needed--) {
-+      /*
-+       * Keep track of the last block of the allocation
-+       */
-+      last_block = adev->acx_txbuf_free;
-+
-+      /*
-+       * Make sure the end control flag is not set.
-+       */
-+      next = read_slavemem32 (adev, adev->acx_txbuf_free) & 0x7ffff;
-+      write_slavemem32 (adev, adev->acx_txbuf_free, next);
-+
-+      /*
-+       * Update the new head of the free list
-+       */
-+      adev->acx_txbuf_free = next << 5;
-+      adev->acx_txbuf_blocks_free--;
-+
-+    }
-+
-+    /*
-+     * Flag the last block both by clearing out the next pointer
-+     * and marking the control field.
-+     */
-+    write_slavemem32 (adev, last_block, 0x02000000);
-+
-+    /*
-+     * If we're out of buffers make sure the free list pointer is NULL
-+     */
-+    if (!adev->acx_txbuf_blocks_free) {
-+      adev->acx_txbuf_free = 0;
-+    }
-+  }
-+  else {
-+    block = 0;
-+  }
-+  spin_unlock_irqrestore (&adev->txbuf_lock, flags);
-+  return block;
-+}
-+
-+/*
-+ * Return buffer space back to the pool by following the next pointers until we find
-+ * the block marked as the end.  Point the last block to the head of the free list,
-+ * then update the head of the free list to point to the newly freed memory.
-+ * This routine gets called in interrupt context, so it shouldn't block to protect
-+ * the integrity of the linked list.  The ISR already holds the lock.
-+ */
-+void
-+reclaim_acx_txbuf_space (acx_device_t *adev, u32 blockptr) {
-+  u32 cur, last, next;
-+  unsigned long flags;
-+
-+  spin_lock_irqsave (&adev->txbuf_lock, flags);
-+  if ((blockptr >= adev->acx_txbuf_start) &&
-+      (blockptr <= adev->acx_txbuf_start +
-+       (adev->acx_txbuf_numblocks - 1) * adev->memblocksize)) {
-+    cur = blockptr;
-+    do {
-+      last = cur;
-+      next = read_slavemem32 (adev, cur);
-+      
-+      /*
-+       * Advance to the next block in this allocation
-+       */
-+      cur = (next & 0x7ffff) << 5;
-+      
-+      /*
-+       * This block now counts as free.
-+       */
-+      adev->acx_txbuf_blocks_free++;
-+    } while (!(next & 0x02000000));
-+    
-+    /*
-+     * last now points to the last block of that allocation.  Update the pointer
-+     * in that block to point to the free list and reset the free list to the
-+     * first block of the free call.  If there were no free blocks, make sure
-+     * the new end of the list marks itself as truly the end.
-+     */
-+    if (adev->acx_txbuf_free) {
-+      write_slavemem32 (adev, last, adev->acx_txbuf_free >> 5);
-+    }
-+    else {
-+      write_slavemem32 (adev, last, 0x02000000);
-+    }
-+    adev->acx_txbuf_free = blockptr;
-+  } 
-+  spin_unlock_irqrestore(&adev->txbuf_lock, flags);
-+}
-+
-+/*
-+ * Initialize the pieces managing the transmit buffer pool on the ACX.  The transmit
-+ * buffer is a circular queue with one 32 bit word reserved at the beginning of each
-+ * block.  The upper 13 bits are a control field, of which only 0x02000000 has any
-+ * meaning.  The lower 19 bits are the address of the next block divided by 32.
-+ */
-+void
-+init_acx_txbuf (acx_device_t *adev) {
-+  
-+  /*
-+   * acx100_s_init_memory_pools set up txbuf_start and txbuf_numblocks for us.
-+   * All we need to do is reset the rest of the bookeeping.
-+   */
-+  
-+  adev->acx_txbuf_free = adev->acx_txbuf_start;
-+  adev->acx_txbuf_blocks_free = adev->acx_txbuf_numblocks;
-+  
-+  /*
-+   * Initialization leaves the last transmit pool block without a pointer back to
-+   * the head of the list, but marked as the end of the list.  That's how we want
-+   * to see it, too, so leave it alone.  This is only ever called after a firmware
-+   * reset, so the ACX memory is in the state we want.
-+   */
-+      
-+}
-+
-+INLINE_IO int
-+adev_present(acx_device_t *adev)
-+{
-+      /* fast version (accesses the first register, IO_ACX_SOFT_RESET,
-+       * which should be safe): */
-+      return readl(adev->iobase) != 0xffffffff;
-+}
-+
-+/***********************************************************************
-+*/
-+static inline txdesc_t*
-+get_txdesc(acx_device_t *adev, int index)
-+{
-+      return (txdesc_t*) (((u8*)adev->txdesc_start) + index * adev->txdesc_size);
-+}
-+
-+static inline txdesc_t*
-+advance_txdesc(acx_device_t *adev, txdesc_t* txdesc, int inc)
-+{
-+      return (txdesc_t*) (((u8*)txdesc) + inc * adev->txdesc_size);
-+}
-+
-+static txhostdesc_t*
-+get_txhostdesc(acx_device_t *adev, txdesc_t* txdesc)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      index /= adev->txdesc_size;
-+      if (unlikely(ACX_DEBUG && (index >= TX_CNT))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      return &adev->txhostdesc_start[index*2];
-+}
-+
-+static inline client_t*
-+get_txc(acx_device_t *adev, txdesc_t* txdesc)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      index /= adev->txdesc_size;
-+      if (unlikely(ACX_DEBUG && (index >= TX_CNT))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      return adev->txc[index];
-+}
-+
-+static inline u16
-+get_txr(acx_device_t *adev, txdesc_t* txdesc)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      index /= adev->txdesc_size;
-+      return adev->txr[index];
-+}
-+
-+static inline void
-+put_txcr(acx_device_t *adev, txdesc_t* txdesc, client_t* c, u16 r111)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return;
-+      }
-+      index /= adev->txdesc_size;
-+      if (unlikely(ACX_DEBUG && (index >= TX_CNT))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return;
-+      }
-+      adev->txc[index] = c;
-+      adev->txr[index] = r111;
-+}
-+
-+
-+/***********************************************************************
-+** EEPROM and PHY read/write helpers
-+*/
-+/***********************************************************************
-+** acxmem_read_eeprom_byte
-+**
-+** Function called to read an octet in the EEPROM.
-+**
-+** This function is used by acxmem_e_probe to check if the
-+** connected card is a legal one or not.
-+**
-+** Arguments:
-+**    adev            ptr to acx_device structure
-+**    addr            address to read in the EEPROM
-+**    charbuf         ptr to a char. This is where the read octet
-+**                    will be stored
-+*/
-+int
-+acxmem_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf)
-+{
-+      int result;
-+      int count;
-+
-+      write_reg32(adev, IO_ACX_EEPROM_CFG, 0);
-+      write_reg32(adev, IO_ACX_EEPROM_ADDR, addr);
-+      write_flush(adev);
-+      write_reg32(adev, IO_ACX_EEPROM_CTL, 2);
-+
-+      count = 0xffff;
-+      while (read_reg16(adev, IO_ACX_EEPROM_CTL)) {
-+              /* scheduling away instead of CPU burning loop
-+               * doesn't seem to work here at all:
-+               * awful delay, sometimes also failure.
-+               * Doesn't matter anyway (only small delay). */
-+              if (unlikely(!--count)) {
-+                      printk("%s: timeout waiting for EEPROM read\n",
-+                                                      adev->ndev->name);
-+                      result = NOT_OK;
-+                      goto fail;
-+              }
-+              cpu_relax();
-+      }
-+
-+      *charbuf = read_reg8(adev, IO_ACX_EEPROM_DATA);
-+      log(L_DEBUG, "EEPROM at 0x%04X = 0x%02X\n", addr, *charbuf);
-+      result = OK;
-+
-+fail:
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** We don't lock hw accesses here since we never r/w eeprom in IRQ
-+** Note: this function sleeps only because of GFP_KERNEL alloc
-+*/
-+#ifdef UNUSED
-+int
-+acxmem_s_write_eeprom(acx_device_t *adev, u32 addr, u32 len, const u8 *charbuf)
-+{
-+      u8 *data_verify = NULL;
-+      unsigned long flags;
-+      int count, i;
-+      int result = NOT_OK;
-+      u16 gpio_orig;
-+
-+      printk("acx: WARNING! I would write to EEPROM now. "
-+              "Since I really DON'T want to unless you know "
-+              "what you're doing (THIS CODE WILL PROBABLY "
-+              "NOT WORK YET!), I will abort that now. And "
-+              "definitely make sure to make a "
-+              "/proc/driver/acx_wlan0_eeprom backup copy first!!! "
-+              "(the EEPROM content includes the PCI config header!! "
-+              "If you kill important stuff, then you WILL "
-+              "get in trouble and people DID get in trouble already)\n");
-+      return OK;
-+
-+      FN_ENTER;
-+
-+      data_verify = kmalloc(len, GFP_KERNEL);
-+      if (!data_verify) {
-+              goto end;
-+      }
-+
-+      /* first we need to enable the OE (EEPROM Output Enable) GPIO line
-+       * to be able to write to the EEPROM.
-+       * NOTE: an EEPROM writing success has been reported,
-+       * but you probably have to modify GPIO_OUT, too,
-+       * and you probably need to activate a different GPIO
-+       * line instead! */
-+      gpio_orig = read_reg16(adev, IO_ACX_GPIO_OE);
-+      write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig & ~1);
-+      write_flush(adev);
-+
-+      /* ok, now start writing the data out */
-+      for (i = 0; i < len; i++) {
-+              write_reg32(adev, IO_ACX_EEPROM_CFG, 0);
-+              write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i);
-+              write_reg32(adev, IO_ACX_EEPROM_DATA, *(charbuf + i));
-+              write_flush(adev);
-+              write_reg32(adev, IO_ACX_EEPROM_CTL, 1);
-+
-+              count = 0xffff;
-+              while (read_reg16(adev, IO_ACX_EEPROM_CTL)) {
-+                      if (unlikely(!--count)) {
-+                              printk("WARNING, DANGER!!! "
-+                                      "Timeout waiting for EEPROM write\n");
-+                              goto end;
-+                      }
-+                      cpu_relax();
-+              }
-+      }
-+
-+      /* disable EEPROM writing */
-+      write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig);
-+      write_flush(adev);
-+
-+      /* now start a verification run */
-+      for (i = 0; i < len; i++) {
-+              write_reg32(adev, IO_ACX_EEPROM_CFG, 0);
-+              write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i);
-+              write_flush(adev);
-+              write_reg32(adev, IO_ACX_EEPROM_CTL, 2);
-+
-+              count = 0xffff;
-+              while (read_reg16(adev, IO_ACX_EEPROM_CTL)) {
-+                      if (unlikely(!--count)) {
-+                              printk("timeout waiting for EEPROM read\n");
-+                              goto end;
-+                      }
-+                      cpu_relax();
-+              }
-+
-+              data_verify[i] = read_reg16(adev, IO_ACX_EEPROM_DATA);
-+      }
-+
-+      if (0 == memcmp(charbuf, data_verify, len))
-+              result = OK; /* read data matches, success */
-+
-+end:
-+      kfree(data_verify);
-+      FN_EXIT1(result);
-+      return result;
-+}
-+#endif /* UNUSED */
-+
-+
-+/***********************************************************************
-+** acxmem_s_read_phy_reg
-+**
-+** Messing with rx/tx disabling and enabling here
-+** (write_reg32(adev, IO_ACX_ENABLE, 0b000000xx)) kills traffic
-+*/
-+int
-+acxmem_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf)
-+{
-+      int result = NOT_OK;
-+      int count;
-+
-+      FN_ENTER;
-+
-+      write_reg32(adev, IO_ACX_PHY_ADDR, reg);
-+      write_flush(adev);
-+      write_reg32(adev, IO_ACX_PHY_CTL, 2);
-+
-+      count = 0xffff;
-+      while (read_reg32(adev, IO_ACX_PHY_CTL)) {
-+              /* scheduling away instead of CPU burning loop
-+               * doesn't seem to work here at all:
-+               * awful delay, sometimes also failure.
-+               * Doesn't matter anyway (only small delay). */
-+              if (unlikely(!--count)) {
-+                      printk("%s: timeout waiting for phy read\n",
-+                                                      adev->ndev->name);
-+                      *charbuf = 0;
-+                      goto fail;
-+              }
-+              cpu_relax();
-+      }
-+
-+      log(L_DEBUG, "count was %u\n", count);
-+      *charbuf = read_reg8(adev, IO_ACX_PHY_DATA);
-+
-+      log(L_DEBUG, "radio PHY at 0x%04X = 0x%02X\n", *charbuf, reg);
-+      result = OK;
-+      goto fail; /* silence compiler warning */
-+fail:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acxmem_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value)
-+{
-+        int count;
-+      FN_ENTER;
-+
-+      /* mprusko said that 32bit accesses result in distorted sensitivity
-+       * on his card. Unconfirmed, looks like it's not true (most likely since we
-+       * now properly flush writes). */
-+      write_reg32(adev, IO_ACX_PHY_DATA, value);
-+      write_reg32(adev, IO_ACX_PHY_ADDR, reg);
-+      write_flush(adev);
-+      write_reg32(adev, IO_ACX_PHY_CTL, 1);
-+      write_flush(adev);
-+
-+      count = 0xffff;
-+      while (read_reg32(adev, IO_ACX_PHY_CTL)) {
-+              /* scheduling away instead of CPU burning loop
-+               * doesn't seem to work here at all:
-+               * awful delay, sometimes also failure.
-+               * Doesn't matter anyway (only small delay). */
-+              if (unlikely(!--count)) {
-+                      printk("%s: timeout waiting for phy read\n",
-+                                                      adev->ndev->name);
-+                      goto fail;
-+              }
-+              cpu_relax();
-+      }
-+
-+      log(L_DEBUG, "radio PHY write 0x%02X at 0x%04X\n", value, reg);
-+ fail:
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+#define NO_AUTO_INCREMENT     1
-+
-+/***********************************************************************
-+** acxmem_s_write_fw
-+**
-+** Write the firmware image into the card.
-+**
-+** Arguments:
-+**    adev            wlan device structure
-+**    fw_image        firmware image.
-+**
-+** Returns:
-+**    1       firmware image corrupted
-+**    0       success
-+*/
-+static int
-+acxmem_s_write_fw(acx_device_t *adev, const firmware_image_t *fw_image, u32 offset)
-+{
-+      int len, size, checkMismatch = -1;
-+      u32 sum, v32, tmp, id;
-+      /* we skip the first four bytes which contain the control sum */
-+      const u8 *p = (u8*)fw_image + 4;
-+
-+      /* start the image checksum by adding the image size value */
-+      sum = p[0]+p[1]+p[2]+p[3];
-+      p += 4;
-+
-+#ifdef NOPE
-+#if NO_AUTO_INCREMENT
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */
-+#else
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */
-+      write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */
-+      write_flush(adev);
-+#endif
-+#endif
-+      len = 0;
-+      size = le32_to_cpu(fw_image->size) & (~3);
-+
-+      while (likely(len < size)) {
-+              v32 = be32_to_cpu(*(u32*)p);
-+              sum += p[0]+p[1]+p[2]+p[3];
-+              p += 4;
-+              len += 4;
-+
-+#ifdef NOPE
-+#if NO_AUTO_INCREMENT 
-+              write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4);
-+              write_flush(adev);
-+#endif
-+              write_reg32(adev, IO_ACX_SLV_MEM_DATA, v32);
-+              write_flush(adev);
-+#endif
-+              write_slavemem32 (adev, offset + len - 4, v32);
-+
-+              id = read_id_register (adev);
-+              
-+              /*
-+               * check the data written
-+               */
-+              tmp = read_slavemem32 (adev, offset + len - 4);
-+              if (checkMismatch && (tmp != v32)) {
-+                printk ("first data mismatch at 0x%08x good 0x%08x bad 0x%08x id 0x%08x\n",
-+                        offset + len - 4, v32, tmp, id);
-+                checkMismatch = 0;
-+              }
-+      }
-+      log(L_DEBUG, "firmware written, size:%d sum1:%x sum2:%x\n",
-+                      size, sum, le32_to_cpu(fw_image->chksum));
-+
-+      /* compare our checksum with the stored image checksum */
-+      return (sum != le32_to_cpu(fw_image->chksum));
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_validate_fw
-+**
-+** Compare the firmware image given with
-+** the firmware image written into the card.
-+**
-+** Arguments:
-+**    adev            wlan device structure
-+**    fw_image        firmware image.
-+**
-+** Returns:
-+**    NOT_OK  firmware image corrupted or not correctly written
-+**    OK      success
-+*/
-+static int
-+acxmem_s_validate_fw(acx_device_t *adev, const firmware_image_t *fw_image,
-+                              u32 offset)
-+{
-+      u32 sum, v32, w32;
-+      int len, size;
-+      int result = OK;
-+      /* we skip the first four bytes which contain the control sum */
-+      const u8 *p = (u8*)fw_image + 4;
-+
-+      /* start the image checksum by adding the image size value */
-+      sum = p[0]+p[1]+p[2]+p[3];
-+      p += 4;
-+
-+      write_reg32(adev, IO_ACX_SLV_END_CTL, 0);
-+
-+#if NO_AUTO_INCREMENT
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */
-+#else
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */
-+      write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */
-+#endif
-+
-+      len = 0;
-+      size = le32_to_cpu(fw_image->size) & (~3);
-+
-+      while (likely(len < size)) {
-+              v32 = be32_to_cpu(*(u32*)p);
-+              p += 4;
-+              len += 4;
-+
-+#ifdef NOPE
-+#if NO_AUTO_INCREMENT
-+              write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4);
-+#endif
-+              udelay(10);
-+              w32 = read_reg32(adev, IO_ACX_SLV_MEM_DATA);
-+#endif
-+              w32 = read_slavemem32 (adev, offset + len - 4);
-+
-+              if (unlikely(w32 != v32)) {
-+                      printk("acx: FATAL: firmware upload: "
-+                      "data parts at offset %d don't match\n(0x%08X vs. 0x%08X)!\n"
-+                      "I/O timing issues or defective memory, with DWL-xx0+? "
-+                      "ACX_IO_WIDTH=16 may help. Please report\n",
-+                              len, v32, w32);
-+                      result = NOT_OK;
-+                      break;
-+              }
-+
-+              sum += (u8)w32 + (u8)(w32>>8) + (u8)(w32>>16) + (u8)(w32>>24);
-+      }
-+
-+      /* sum control verification */
-+      if (result != NOT_OK) {
-+              if (sum != le32_to_cpu(fw_image->chksum)) {
-+                      printk("acx: FATAL: firmware upload: "
-+                              "checksums don't match!\n");
-+                      result = NOT_OK;
-+              }
-+      }
-+
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_upload_fw
-+**
-+** Called from acx_reset_dev
-+*/
-+static int
-+acxmem_s_upload_fw(acx_device_t *adev)
-+{
-+      firmware_image_t *fw_image = NULL;
-+      int res = NOT_OK;
-+      int try;
-+      u32 file_size;
-+      char *filename = "WLANGEN.BIN";
-+#ifdef PATCH_AROUND_BAD_SPOTS
-+      u32 offset;
-+      int i;
-+        /*
-+         * arm-linux-objdump -d patch.bin, or
-+         * od -Ax -t x4 patch.bin after finding the bounds
-+         * of the .text section with arm-linux-objdump -s patch.bin
-+         */
-+        u32 patch[] = {
-+        0xe584c030, 0xe59fc008,
-+        0xe92d1000, 0xe59fc004, 0xe8bd8000, 0x0000080c,
-+        0x0000aa68, 0x605a2200, 0x2c0a689c, 0x2414d80a,
-+        0x2f00689f, 0x1c27d007, 0x06241e7c, 0x2f000e24,
-+        0xe000d1f6, 0x602e6018, 0x23036468, 0x480203db,
-+        0x60ca6003, 0xbdf0750a, 0xffff0808
-+      };
-+#endif
-+
-+      FN_ENTER;
-+      /* No combined image; tell common we need the radio firmware, too */
-+      adev->need_radio_fw = 1;
-+
-+      fw_image = acx_s_read_fw(adev->dev, filename, &file_size);
-+      if (!fw_image) {
-+        FN_EXIT1(NOT_OK);
-+        return NOT_OK;
-+      }
-+
-+      for (try = 1; try <= 5; try++) {
-+              res = acxmem_s_write_fw(adev, fw_image, 0);
-+              log(L_DEBUG|L_INIT, "acx_write_fw (main): %d\n", res);
-+              if (OK == res) {
-+                      res = acxmem_s_validate_fw(adev, fw_image, 0);
-+                      log(L_DEBUG|L_INIT, "acx_validate_fw "
-+                                      "(main): %d\n", res);
-+              }
-+
-+              if (OK == res) {
-+                      SET_BIT(adev->dev_state_mask, ACX_STATE_FW_LOADED);
-+                      break;
-+              }
-+              printk("acx: firmware upload attempt #%d FAILED, "
-+                      "retrying...\n", try);
-+              acx_s_msleep(1000); /* better wait for a while... */
-+      }
-+
-+#ifdef PATCH_AROUND_BAD_SPOTS
-+      /*
-+       * Only want to do this if the firmware is exactly what we expect for an
-+       * iPaq 4700; otherwise, bad things would ensue.
-+       */
-+      if ((HX4700_FIRMWARE_CHECKSUM == fw_image->chksum) ||
-+          (HX4700_ALTERNATE_FIRMWARE_CHECKSUM == fw_image->chksum)) {
-+        /*
-+         * Put the patch after the main firmware image.  0x950c contains
-+         * the ACX's idea of the end of the firmware.  Use that location to
-+         * load ours (which depends on that location being 0xab58) then
-+         * update that location to point to after ours.
-+         */
-+
-+        offset = read_slavemem32 (adev, 0x950c);
-+        
-+        log (L_DEBUG, "acx: patching in at 0x%04x\n", offset);
-+
-+        for (i = 0; i < sizeof(patch) / sizeof(patch[0]); i++) {
-+          write_slavemem32 (adev, offset, patch[i]);
-+          offset += sizeof(u32);
-+        }
-+
-+        /*
-+         * Patch the instruction at 0x0804 to branch to our ARM patch at 0xab58
-+         */
-+        write_slavemem32 (adev, 0x0804, 0xea000000 + (0xab58-0x0804-8)/4);
-+
-+        /*
-+         * Patch the instructions at 0x1f40 to branch to our Thumb patch at 0xab74
-+         *
-+         * 4a00 ldr r2, [pc, #0]
-+         * 4710 bx  r2
-+         * .data 0xab74+1
-+         */
-+        write_slavemem32 (adev, 0x1f40, 0x47104a00);
-+        write_slavemem32 (adev, 0x1f44, 0x0000ab74+1);
-+
-+        /*
-+         * Bump the end of the firmware up to beyond our patch.
-+         */
-+        write_slavemem32 (adev, 0x950c, offset);
-+      
-+      }
-+#endif
-+
-+      vfree(fw_image);
-+
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_upload_radio
-+**
-+** Uploads the appropriate radio module firmware into the card.
-+*/
-+int
-+acxmem_s_upload_radio(acx_device_t *adev)
-+{
-+      acx_ie_memmap_t mm;
-+      firmware_image_t *radio_image;
-+      acx_cmd_radioinit_t radioinit;
-+      int res = NOT_OK;
-+      int try;
-+      u32 offset;
-+      u32 size;
-+      char filename[sizeof("RADIONN.BIN")];
-+
-+      if (!adev->need_radio_fw) return OK;
-+
-+      FN_ENTER;
-+
-+      acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP);
-+      offset = le32_to_cpu(mm.CodeEnd);
-+
-+      snprintf(filename, sizeof(filename), "RADIO%02x.BIN",
-+              adev->radio_type);
-+      radio_image = acx_s_read_fw(adev->dev, filename, &size);
-+      if (!radio_image) {
-+              printk("acx: can't load radio module '%s'\n", filename);
-+              goto fail;
-+      }
-+
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_SLEEP, NULL, 0);
-+
-+      for (try = 1; try <= 5; try++) {
-+              res = acxmem_s_write_fw(adev, radio_image, offset);
-+              log(L_DEBUG|L_INIT, "acx_write_fw (radio): %d\n", res);
-+              if (OK == res) {
-+                      res = acxmem_s_validate_fw(adev, radio_image, offset);
-+                      log(L_DEBUG|L_INIT, "acx_validate_fw (radio): %d\n", res);
-+              }
-+
-+              if (OK == res)
-+                      break;
-+              printk("acx: radio firmware upload attempt #%d FAILED, "
-+                      "retrying...\n", try);
-+              acx_s_msleep(1000); /* better wait for a while... */
-+      }
-+
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0);
-+      radioinit.offset = cpu_to_le32(offset);
-+
-+      /* no endian conversion needed, remains in card CPU area: */
-+      radioinit.len = radio_image->size;
-+
-+      vfree(radio_image);
-+
-+      if (OK != res)
-+              goto fail;
-+
-+      /* will take a moment so let's have a big timeout */
-+      acx_s_issue_cmd_timeo(adev, ACX1xx_CMD_RADIOINIT,
-+              &radioinit, sizeof(radioinit), CMD_TIMEOUT_MS(1000));
-+
-+      res = acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP);
-+
-+fail:
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+/***********************************************************************
-+** acxmem_l_reset_mac
-+**
-+** MAC will be reset
-+** Call context: reset_dev
-+*/
-+static void
-+acxmem_l_reset_mac(acx_device_t *adev)
-+{
-+  int count;
-+      FN_ENTER;
-+
-+      /* halt eCPU */
-+      set_regbits (adev, IO_ACX_ECPU_CTRL, 0x1);
-+
-+      /* now do soft reset of eCPU, set bit */
-+      set_regbits (adev, IO_ACX_SOFT_RESET, 0x1);
-+      log(L_DEBUG, "%s: enable soft reset...\n", __func__);
-+
-+      /* Windows driver sleeps here for a while with this sequence */
-+      for (count = 0; count < 200; count++) {
-+        udelay (50);
-+      }
-+
-+      /* now clear bit again: deassert eCPU reset */
-+      log(L_DEBUG, "%s: disable soft reset and go to init mode...\n", __func__);
-+      clear_regbits (adev, IO_ACX_SOFT_RESET, 0x1);
-+
-+      /* now start a burst read from initial EEPROM */
-+      set_regbits (adev, IO_ACX_EE_START, 0x1);
-+
-+      /*
-+       * Windows driver sleeps here for a while with this sequence
-+       */
-+      for (count = 0; count < 200; count++) {
-+        udelay (50);
-+      }
-+
-+      /* Windows driver writes 0x10000 to register 0x808 here */
-+      
-+      write_reg32 (adev, 0x808, 0x10000);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_verify_init
-+*/
-+static int
-+acxmem_s_verify_init(acx_device_t *adev)
-+{
-+      int result = NOT_OK;
-+      unsigned long timeout;
-+
-+      FN_ENTER;
-+
-+      timeout = jiffies + 2*HZ;
-+      for (;;) {
-+              u32 irqstat = read_reg32(adev, IO_ACX_IRQ_STATUS_NON_DES);
-+              if ((irqstat != 0xFFFFFFFF) && (irqstat & HOST_INT_FCS_THRESHOLD)) {
-+                      result = OK;
-+                      write_reg32(adev, IO_ACX_IRQ_ACK, HOST_INT_FCS_THRESHOLD);
-+                      break;
-+              }
-+              if (time_after(jiffies, timeout))
-+                      break;
-+              /* Init may take up to ~0.5 sec total */
-+              acx_s_msleep(50);
-+      }
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** A few low-level helpers
-+**
-+** Note: these functions are not protected by lock
-+** and thus are never allowed to be called from IRQ.
-+** Also they must not race with fw upload which uses same hw regs
-+*/
-+
-+/***********************************************************************
-+** acxmem_write_cmd_type_status
-+*/
-+
-+static inline void
-+acxmem_write_cmd_type_status(acx_device_t *adev, u16 type, u16 status)
-+{
-+  write_slavemem32 (adev, (u32) adev->cmd_area, type | (status << 16));
-+  write_flush(adev);
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_read_cmd_type_status
-+*/
-+static u32
-+acxmem_read_cmd_type_status(acx_device_t *adev)
-+{
-+      u32 cmd_type, cmd_status;
-+
-+      cmd_type = read_slavemem32 (adev, (u32) adev->cmd_area);
-+
-+      cmd_status = (cmd_type >> 16);
-+      cmd_type = (u16)cmd_type;
-+
-+      log(L_CTL, "cmd_type:%04X cmd_status:%04X [%s]\n",
-+              cmd_type, cmd_status,
-+              acx_cmd_status_str(cmd_status));
-+
-+      return cmd_status;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_reset_dev
-+**
-+** Arguments:
-+**    netdevice that contains the adev variable
-+** Returns:
-+**    NOT_OK on fail
-+**    OK on success
-+** Side effects:
-+**    device is hard reset
-+** Call context:
-+**    acxmem_e_probe
-+** Comment:
-+**    This resets the device using low level hardware calls
-+**    as well as uploads and verifies the firmware to the card
-+*/
-+
-+static inline void
-+init_mboxes(acx_device_t *adev)
-+{
-+      u32 cmd_offs, info_offs;
-+
-+      cmd_offs = read_reg32(adev, IO_ACX_CMD_MAILBOX_OFFS);
-+      info_offs = read_reg32(adev, IO_ACX_INFO_MAILBOX_OFFS);
-+      adev->cmd_area = (u8*) cmd_offs;
-+      adev->info_area = (u8*) info_offs;
-+      /*
-+      log(L_DEBUG, "iobase2=%p\n"
-+      */
-+      log( L_DEBUG, "cmd_mbox_offset=%X cmd_area=%p\n"
-+              "info_mbox_offset=%X info_area=%p\n",
-+              cmd_offs, adev->cmd_area,
-+              info_offs, adev->info_area);
-+}
-+
-+
-+static inline void
-+read_eeprom_area(acx_device_t *adev)
-+{
-+#if ACX_DEBUG > 1
-+      int offs;
-+      u8 tmp;
-+
-+      for (offs = 0x8c; offs < 0xb9; offs++)
-+              acxmem_read_eeprom_byte(adev, offs, &tmp);
-+#endif
-+}
-+
-+static int
-+acxmem_s_reset_dev(acx_device_t *adev)
-+{
-+      const char* msg = "";
-+      unsigned long flags;
-+      int result = NOT_OK;
-+      u16 hardware_info;
-+      u16 ecpu_ctrl;
-+      int count;
-+      u32 tmp;
-+
-+      FN_ENTER;
-+      /*
-+      write_reg32 (adev, IO_ACX_SLV_MEM_CP, 0);
-+      */
-+      /* reset the device to make sure the eCPU is stopped
-+       * to upload the firmware correctly */
-+
-+      acx_lock(adev, flags);
-+
-+      /* Windows driver does some funny things here */
-+      /*
-+       * clear bit 0x200 in register 0x2A0
-+       */
-+      clear_regbits (adev, 0x2A0, 0x200);
-+
-+      /*
-+       * Set bit 0x200 in ACX_GPIO_OUT
-+       */
-+      set_regbits (adev, IO_ACX_GPIO_OUT, 0x200);
-+
-+      /*
-+       * read register 0x900 until its value is 0x8400104C, sleeping
-+       * in between reads if it's not immediate
-+       */
-+      tmp = read_reg32 (adev, REG_ACX_VENDOR_ID);
-+      count = 500;
-+      while (count-- && (tmp != ACX_VENDOR_ID)) {
-+        mdelay (10);
-+        tmp = read_reg32 (adev, REG_ACX_VENDOR_ID);
-+      }
-+
-+      /* end what Windows driver does */
-+
-+      acxmem_l_reset_mac(adev);
-+
-+      ecpu_ctrl = read_reg32(adev, IO_ACX_ECPU_CTRL) & 1;
-+      if (!ecpu_ctrl) {
-+              msg = "eCPU is already running. ";
-+              goto end_unlock;
-+      }
-+
-+#ifdef WE_DONT_NEED_THAT_DO_WE
-+      if (read_reg16(adev, IO_ACX_SOR_CFG) & 2) {
-+              /* eCPU most likely means "embedded CPU" */
-+              msg = "eCPU did not start after boot from flash. ";
-+              goto end_unlock;
-+      }
-+
-+      /* check sense on reset flags */
-+      if (read_reg16(adev, IO_ACX_SOR_CFG) & 0x10) {
-+              printk("%s: eCPU did not start after boot (SOR), "
-+                      "is this fatal?\n", adev->ndev->name);
-+      }
-+#endif
-+      /* scan, if any, is stopped now, setting corresponding IRQ bit */
-+      adev->irq_status |= HOST_INT_SCAN_COMPLETE;
-+
-+      acx_unlock(adev, flags);
-+      
-+      /* need to know radio type before fw load */
-+      /* Need to wait for arrival of this information in a loop,
-+       * most probably since eCPU runs some init code from EEPROM
-+       * (started burst read in reset_mac()) which also
-+       * sets the radio type ID */
-+
-+      count = 0xffff;
-+      do {
-+              hardware_info = read_reg16(adev, IO_ACX_EEPROM_INFORMATION);
-+              if (!--count) {
-+                      msg = "eCPU didn't indicate radio type";
-+                      goto end_fail;
-+              }
-+              cpu_relax();
-+      } while (!(hardware_info & 0xff00)); /* radio type still zero? */
-+      printk("ACX radio type 0x%02x\n", (hardware_info >> 8) & 0xff);
-+      /* printk("DEBUG: count %d\n", count); */
-+      adev->form_factor = hardware_info & 0xff;
-+      adev->radio_type = hardware_info >> 8;
-+
-+      /* load the firmware */
-+      if (OK != acxmem_s_upload_fw(adev))
-+              goto end_fail;
-+
-+      /* acx_s_msleep(10);    this one really shouldn't be required */
-+
-+      /* now start eCPU by clearing bit */
-+      clear_regbits (adev, IO_ACX_ECPU_CTRL, 0x1);
-+      log(L_DEBUG, "booted eCPU up and waiting for completion...\n");
-+
-+      /* Windows driver clears bit 0x200 in register 0x2A0 here */
-+      clear_regbits (adev, 0x2A0, 0x200);
-+
-+      /* Windows driver sets bit 0x200 in ACX_GPIO_OUT here */
-+      set_regbits (adev, IO_ACX_GPIO_OUT, 0x200);
-+      /* wait for eCPU bootup */
-+      if (OK != acxmem_s_verify_init(adev)) {
-+              msg = "timeout waiting for eCPU. ";
-+              goto end_fail;
-+      }
-+      log(L_DEBUG, "eCPU has woken up, card is ready to be configured\n");
-+      init_mboxes(adev);
-+      acxmem_write_cmd_type_status(adev, ACX1xx_CMD_RESET, 0);
-+
-+      /* test that EEPROM is readable */
-+      read_eeprom_area(adev);
-+
-+      result = OK;
-+      goto end;
-+
-+/* Finish error message. Indicate which function failed */
-+end_unlock:
-+      acx_unlock(adev, flags);
-+end_fail:
-+      printk("acx: %sreset_dev() FAILED\n", msg);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_issue_cmd_timeo
-+**
-+** Sends command to fw, extract result
-+**
-+** NB: we do _not_ take lock inside, so be sure to not touch anything
-+** which may interfere with IRQ handler operation
-+**
-+** TODO: busy wait is a bit silly, so:
-+** 1) stop doing many iters - go to sleep after first
-+** 2) go to waitqueue based approach: wait, not poll!
-+*/
-+#undef FUNC
-+#define FUNC "issue_cmd"
-+
-+#if !ACX_DEBUG
-+int
-+acxmem_s_issue_cmd_timeo(
-+      acx_device_t *adev,
-+      unsigned int cmd,
-+      void *buffer,
-+      unsigned buflen,
-+      unsigned cmd_timeout)
-+{
-+#else
-+int
-+acxmem_s_issue_cmd_timeo_debug(
-+      acx_device_t *adev,
-+      unsigned cmd,
-+      void *buffer,
-+      unsigned buflen,
-+      unsigned cmd_timeout,
-+      const char* cmdstr)
-+{
-+      unsigned long start = jiffies;
-+#endif
-+      const char *devname;
-+      unsigned counter;
-+      u16 irqtype;
-+      int i, j;
-+      u8 *p;
-+      u16 cmd_status;
-+      unsigned long timeout;
-+
-+      FN_ENTER;
-+
-+      devname = adev->ndev->name;
-+      if (!devname || !devname[0] || devname[4]=='%')
-+              devname = "acx";
-+
-+      log(L_CTL, FUNC"(cmd:%s,buflen:%u,timeout:%ums,type:0x%04X)\n",
-+              cmdstr, buflen, cmd_timeout,
-+              buffer ? le16_to_cpu(((acx_ie_generic_t *)buffer)->type) : -1);
-+
-+      if (!(adev->dev_state_mask & ACX_STATE_FW_LOADED)) {
-+              printk("%s: "FUNC"(): firmware is not loaded yet, "
-+                      "cannot execute commands!\n", devname);
-+              goto bad;
-+      }
-+
-+      if ((acx_debug & L_DEBUG) && (cmd != ACX1xx_CMD_INTERROGATE)) {
-+              printk("input buffer (len=%u):\n", buflen);
-+              acx_dump_bytes(buffer, buflen);
-+      }
-+
-+      /* wait for firmware to become idle for our command submission */
-+      timeout = HZ/5;
-+      counter = (timeout * 1000 / HZ) - 1; /* in ms */
-+      timeout += jiffies;
-+      do {
-+              cmd_status = acxmem_read_cmd_type_status(adev);
-+              /* Test for IDLE state */
-+              if (!cmd_status)
-+                      break;
-+              if (counter % 8 == 0) {
-+                      if (time_after(jiffies, timeout)) {
-+                              counter = 0;
-+                              break;
-+                      }
-+                      /* we waited 8 iterations, no luck. Sleep 8 ms */
-+                      acx_s_msleep(8);
-+              }
-+      } while (likely(--counter));
-+
-+      if (!counter) {
-+              /* the card doesn't get idle, we're in trouble */
-+              printk("%s: "FUNC"(): cmd_status is not IDLE: 0x%04X!=0\n",
-+                      devname, cmd_status);
-+#if DUMP_IF_SLOW > 0
-+              dump_acxmem (adev, 0, 0x10000);
-+              panic ("not idle");
-+#endif
-+              goto bad;
-+      } else if (counter < 190) { /* if waited >10ms... */
-+              log(L_CTL|L_DEBUG, FUNC"(): waited for IDLE %dms. "
-+                      "Please report\n", 199 - counter);
-+      }
-+
-+      /* now write the parameters of the command if needed */
-+      if (buffer && buflen) {
-+              /* if it's an INTERROGATE command, just pass the length
-+               * of parameters to read, as data */
-+#if CMD_DISCOVERY
-+              if (cmd == ACX1xx_CMD_INTERROGATE)
-+                      memset_io(adev->cmd_area + 4, 0xAA, buflen);
-+#endif
-+              /*
-+               * slave memory version
-+               */
-+              copy_to_slavemem (adev, (u32) (adev->cmd_area + 4), buffer, 
-+                             (cmd == ACX1xx_CMD_INTERROGATE) ? 4 : buflen);
-+      }
-+      /* now write the actual command type */
-+      acxmem_write_cmd_type_status(adev, cmd, 0);
-+
-+      /* clear CMD_COMPLETE bit. can be set only by IRQ handler: */
-+      adev->irq_status &= ~HOST_INT_CMD_COMPLETE;
-+
-+      /* execute command */
-+      write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_CMD);
-+      write_flush(adev);
-+
-+      /* wait for firmware to process command */
-+
-+      /* Ensure nonzero and not too large timeout.
-+      ** Also converts e.g. 100->99, 200->199
-+      ** which is nice but not essential */
-+      cmd_timeout = (cmd_timeout-1) | 1;
-+      if (unlikely(cmd_timeout > 1199))
-+              cmd_timeout = 1199;
-+
-+      /* we schedule away sometimes (timeout can be large) */
-+      counter = cmd_timeout;
-+      timeout = jiffies + cmd_timeout * HZ / 1000;
-+      do {
-+              if (!adev->irqs_active) { /* IRQ disabled: poll */
-+                      irqtype = read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES);
-+                      if (irqtype & HOST_INT_CMD_COMPLETE) {
-+                              write_reg16(adev, IO_ACX_IRQ_ACK,
-+                                              HOST_INT_CMD_COMPLETE);
-+                              break;
-+                      }
-+              } else { /* Wait when IRQ will set the bit */
-+                      irqtype = adev->irq_status;
-+                      if (irqtype & HOST_INT_CMD_COMPLETE)
-+                              break;
-+              }
-+
-+              if (counter % 8 == 0) {
-+                      if (time_after(jiffies, timeout)) {
-+                              counter = 0;
-+                              break;
-+                      }
-+                      /* we waited 8 iterations, no luck. Sleep 8 ms */
-+                      acx_s_msleep(8);
-+              }
-+      } while (likely(--counter));
-+
-+      /* save state for debugging */
-+      cmd_status = acxmem_read_cmd_type_status(adev);
-+
-+      /* put the card in IDLE state */
-+      acxmem_write_cmd_type_status(adev, ACX1xx_CMD_RESET, 0);
-+
-+      if (!counter) { /* timed out! */
-+              printk("%s: "FUNC"(): timed out %s for CMD_COMPLETE. "
-+                      "irq bits:0x%04X irq_status:0x%04X timeout:%dms "
-+                      "cmd_status:%d (%s)\n",
-+                      devname, (adev->irqs_active) ? "waiting" : "polling",
-+                      irqtype, adev->irq_status, cmd_timeout,
-+                      cmd_status, acx_cmd_status_str(cmd_status));
-+              printk("%s: "FUNC"(): device irq status 0x%04x\n",
-+                     devname, read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES));
-+              printk("%s: "FUNC"(): IO_ACX_IRQ_MASK 0x%04x IO_ACX_FEMR 0x%04x\n",
-+                     devname,
-+                     read_reg16 (adev, IO_ACX_IRQ_MASK),
-+                     read_reg16 (adev, IO_ACX_FEMR));
-+              if (read_reg16 (adev, IO_ACX_IRQ_MASK) == 0xffff) {
-+                      printk ("acxmem: firmware probably hosed - reloading\n");
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+                      {
-+                              pm_message_t state;
-+                              acxmem_e_suspend (resume_pdev, state);
-+                      }
-+#else
-+                      acxmem_e_suspend (adev->dev, 0);
-+#endif
-+                      {
-+                              struct work_struct *notused;
-+                              fw_resumer (notused);
-+                      }
-+              }
-+
-+              goto bad;
-+      } else if (cmd_timeout - counter > 30) { /* if waited >30ms... */
-+              log(L_CTL|L_DEBUG, FUNC"(): %s for CMD_COMPLETE %dms. "
-+                      "count:%d. Please report\n",
-+                      (adev->irqs_active) ? "waited" : "polled",
-+                      cmd_timeout - counter, counter);
-+      }
-+
-+      if (1 != cmd_status) { /* it is not a 'Success' */
-+              printk("%s: "FUNC"(): cmd_status is not SUCCESS: %d (%s). "
-+                      "Took %dms of %d\n",
-+                      devname, cmd_status, acx_cmd_status_str(cmd_status),
-+                      cmd_timeout - counter, cmd_timeout);
-+              /* zero out result buffer
-+               * WARNING: this will trash stack in case of illegally large input
-+               * length! */
-+              if (buflen > 388) {
-+                /*
-+                 * 388 is maximum command length
-+                 */
-+                printk ("invalid length 0x%08x\n", buflen);
-+                buflen = 388;
-+              }
-+              p = (u8 *) buffer;
-+              for (i = 0; i < buflen; i+= 16) {
-+                printk ("%04x:", i);
-+                for (j = 0; (j < 16) && (i+j < buflen); j++) {
-+                  printk (" %02x", *p++);
-+                }
-+                printk ("\n");
-+              }
-+
-+              if (buffer && buflen)
-+                      memset(buffer, 0, buflen);
-+              goto bad;
-+      }
-+
-+      /* read in result parameters if needed */
-+      if (buffer && buflen && (cmd == ACX1xx_CMD_INTERROGATE)) {
-+              copy_from_slavemem (adev, buffer, (u32) (adev->cmd_area + 4), buflen);
-+              if (acx_debug & L_DEBUG) {
-+                      printk("output buffer (len=%u): ", buflen);
-+                      acx_dump_bytes(buffer, buflen);
-+              }
-+      }
-+
-+/* ok: */
-+      log(L_CTL, FUNC"(%s): took %ld jiffies to complete\n",
-+                       cmdstr, jiffies - start);
-+      FN_EXIT1(OK);
-+      return OK;
-+
-+bad:
-+      /* Give enough info so that callers can avoid
-+      ** printing their own diagnostic messages */
-+#if ACX_DEBUG
-+      printk("%s: "FUNC"(cmd:%s) FAILED\n", devname, cmdstr);
-+#else
-+      printk("%s: "FUNC"(cmd:0x%04X) FAILED\n", devname, cmd);
-+#endif
-+      dump_stack();
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+#if defined(NONESSENTIAL_FEATURES)
-+typedef struct device_id {
-+      unsigned char id[6];
-+      char *descr;
-+      char *type;
-+} device_id_t;
-+
-+static const device_id_t
-+device_ids[] =
-+{
-+      {
-+              {'G', 'l', 'o', 'b', 'a', 'l'},
-+              NULL,
-+              NULL,
-+      },
-+      {
-+              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-+              "uninitialized",
-+              "SpeedStream SS1021 or Gigafast WF721-AEX"
-+      },
-+      {
-+              {0x80, 0x81, 0x82, 0x83, 0x84, 0x85},
-+              "non-standard",
-+              "DrayTek Vigor 520"
-+      },
-+      {
-+              {'?', '?', '?', '?', '?', '?'},
-+              "non-standard",
-+              "Level One WPC-0200"
-+      },
-+      {
-+              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-+              "empty",
-+              "DWL-650+ variant"
-+      }
-+};
-+
-+static void
-+acx_show_card_eeprom_id(acx_device_t *adev)
-+{
-+      unsigned char buffer[CARD_EEPROM_ID_SIZE];
-+      int i;
-+
-+      memset(&buffer, 0, CARD_EEPROM_ID_SIZE);
-+      /* use direct EEPROM access */
-+      for (i = 0; i < CARD_EEPROM_ID_SIZE; i++) {
-+              if (OK != acxmem_read_eeprom_byte(adev,
-+                                       ACX100_EEPROM_ID_OFFSET + i,
-+                                       &buffer[i])) {
-+                      printk("acx: reading EEPROM FAILED\n");
-+                      break;
-+              }
-+      }
-+
-+      for (i = 0; i < VEC_SIZE(device_ids); i++) {
-+              if (!memcmp(&buffer, device_ids[i].id, CARD_EEPROM_ID_SIZE)) {
-+                      if (device_ids[i].descr) {
-+                              printk("acx: EEPROM card ID string check "
-+                                      "found %s card ID: is this %s?\n",
-+                                      device_ids[i].descr, device_ids[i].type);
-+                      }
-+                      break;
-+              }
-+      }
-+      if (i == VEC_SIZE(device_ids)) {
-+              printk("acx: EEPROM card ID string check found "
-+                      "unknown card: expected 'Global', got '%.*s\'. "
-+                      "Please report\n", CARD_EEPROM_ID_SIZE, buffer);
-+      }
-+}
-+#endif /* NONESSENTIAL_FEATURES */
-+
-+/***********************************************************************
-+** acxmem_free_desc_queues
-+**
-+** Releases the queues that have been allocated, the
-+** others have been initialised to NULL so this
-+** function can be used if only part of the queues were allocated.
-+*/
-+
-+void
-+acxmem_free_desc_queues(acx_device_t *adev)
-+{
-+#define ACX_FREE_QUEUE(size, ptr, phyaddr) \
-+        if (ptr) { \
-+                kfree(ptr); \
-+                ptr = NULL; \
-+                size = 0; \
-+        }
-+
-+      FN_ENTER;
-+
-+      ACX_FREE_QUEUE(adev->txhostdesc_area_size, adev->txhostdesc_start, adev->txhostdesc_startphy);
-+      ACX_FREE_QUEUE(adev->txbuf_area_size, adev->txbuf_start, adev->txbuf_startphy);
-+
-+      adev->txdesc_start = NULL;
-+
-+      ACX_FREE_QUEUE(adev->rxhostdesc_area_size, adev->rxhostdesc_start, adev->rxhostdesc_startphy);
-+      ACX_FREE_QUEUE(adev->rxbuf_area_size, adev->rxbuf_start, adev->rxbuf_startphy);
-+
-+      adev->rxdesc_start = NULL;
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_delete_dma_regions
-+*/
-+static void
-+acxmem_s_delete_dma_regions(acx_device_t *adev)
-+{
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+      /* disable radio Tx/Rx. Shouldn't we use the firmware commands
-+       * here instead? Or are we that much down the road that it's no
-+       * longer possible here? */
-+      /*
-+       * slave memory interface really doesn't like this.
-+       */
-+      /*
-+      write_reg16(adev, IO_ACX_ENABLE, 0);
-+      */
-+
-+      acx_s_msleep(100);
-+
-+      acx_lock(adev, flags);
-+      acxmem_free_desc_queues(adev);
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_e_probe
-+**
-+** Probe routine called when a PCI device w/ matching ID is found.
-+** Here's the sequence:
-+**   - Allocate the PCI resources.
-+**   - Read the PCMCIA attribute memory to make sure we have a WLAN card
-+**   - Reset the MAC
-+**   - Initialize the dev and wlan data
-+**   - Initialize the MAC
-+**
-+** pdev       - ptr to pci device structure containing info about pci configuration
-+** id - ptr to the device id entry that matched this device
-+*/
-+static const u16
-+IO_ACX100[] =
-+{
-+      0x0000, /* IO_ACX_SOFT_RESET */
-+
-+      0x0014, /* IO_ACX_SLV_MEM_ADDR */
-+      0x0018, /* IO_ACX_SLV_MEM_DATA */
-+      0x001c, /* IO_ACX_SLV_MEM_CTL */
-+      0x0020, /* IO_ACX_SLV_END_CTL */
-+
-+      0x0034, /* IO_ACX_FEMR */
-+
-+      0x007c, /* IO_ACX_INT_TRIG */
-+      0x0098, /* IO_ACX_IRQ_MASK */
-+      0x00a4, /* IO_ACX_IRQ_STATUS_NON_DES */
-+      0x00a8, /* IO_ACX_IRQ_STATUS_CLEAR */
-+      0x00ac, /* IO_ACX_IRQ_ACK */
-+      0x00b0, /* IO_ACX_HINT_TRIG */
-+
-+      0x0104, /* IO_ACX_ENABLE */
-+
-+      0x0250, /* IO_ACX_EEPROM_CTL */
-+      0x0254, /* IO_ACX_EEPROM_ADDR */
-+      0x0258, /* IO_ACX_EEPROM_DATA */
-+      0x025c, /* IO_ACX_EEPROM_CFG */
-+
-+      0x0268, /* IO_ACX_PHY_ADDR */
-+      0x026c, /* IO_ACX_PHY_DATA */
-+      0x0270, /* IO_ACX_PHY_CTL */
-+
-+      0x0290, /* IO_ACX_GPIO_OE */
-+
-+      0x0298, /* IO_ACX_GPIO_OUT */
-+
-+      0x02a4, /* IO_ACX_CMD_MAILBOX_OFFS */
-+      0x02a8, /* IO_ACX_INFO_MAILBOX_OFFS */
-+      0x02ac, /* IO_ACX_EEPROM_INFORMATION */
-+
-+      0x02d0, /* IO_ACX_EE_START */
-+      0x02d4, /* IO_ACX_SOR_CFG */
-+      0x02d8 /* IO_ACX_ECPU_CTRL */
-+};
-+
-+static const u16
-+IO_ACX111[] =
-+{
-+      0x0000, /* IO_ACX_SOFT_RESET */
-+
-+      0x0014, /* IO_ACX_SLV_MEM_ADDR */
-+      0x0018, /* IO_ACX_SLV_MEM_DATA */
-+      0x001c, /* IO_ACX_SLV_MEM_CTL */
-+      0x0020, /* IO_ACX_SLV_MEM_CP */
-+
-+      0x0034, /* IO_ACX_FEMR */
-+
-+      0x00b4, /* IO_ACX_INT_TRIG */
-+      0x00d4, /* IO_ACX_IRQ_MASK */
-+      /* we do mean NON_DES (0xf0), not NON_DES_MASK which is at 0xe0: */
-+      0x00f0, /* IO_ACX_IRQ_STATUS_NON_DES */
-+      0x00e4, /* IO_ACX_IRQ_STATUS_CLEAR */
-+      0x00e8, /* IO_ACX_IRQ_ACK */
-+      0x00ec, /* IO_ACX_HINT_TRIG */
-+
-+      0x01d0, /* IO_ACX_ENABLE */
-+
-+      0x0338, /* IO_ACX_EEPROM_CTL */
-+      0x033c, /* IO_ACX_EEPROM_ADDR */
-+      0x0340, /* IO_ACX_EEPROM_DATA */
-+      0x0344, /* IO_ACX_EEPROM_CFG */
-+
-+      0x0350, /* IO_ACX_PHY_ADDR */
-+      0x0354, /* IO_ACX_PHY_DATA */
-+      0x0358, /* IO_ACX_PHY_CTL */
-+
-+      0x0374, /* IO_ACX_GPIO_OE */
-+
-+      0x037c, /* IO_ACX_GPIO_OUT */
-+
-+      0x0388, /* IO_ACX_CMD_MAILBOX_OFFS */
-+      0x038c, /* IO_ACX_INFO_MAILBOX_OFFS */
-+      0x0390, /* IO_ACX_EEPROM_INFORMATION */
-+
-+      0x0100, /* IO_ACX_EE_START */
-+      0x0104, /* IO_ACX_SOR_CFG */
-+      0x0108, /* IO_ACX_ECPU_CTRL */
-+};
-+
-+static void
-+dummy_netdev_init(struct net_device *ndev) {}
-+
-+/*
-+ * Most of the acx specific pieces of hardware reset.
-+ */
-+static int
-+acxmem_complete_hw_reset (acx_device_t *adev)
-+{
-+      acx111_ie_configoption_t co;
-+
-+      /* NB: read_reg() reads may return bogus data before reset_dev(),
-+       * since the firmware which directly controls large parts of the I/O
-+       * registers isn't initialized yet.
-+       * acx100 seems to be more affected than acx111 */
-+      if (OK != acxmem_s_reset_dev (adev))
-+        return -1;
-+
-+      if (IS_ACX100(adev)) {
-+              /* ACX100: configopt struct in cmd mailbox - directly after reset */
-+              copy_from_slavemem (adev, (u8*) &co, (u32) adev->cmd_area, sizeof (co));
-+      }
-+
-+      if (OK != acx_s_init_mac(adev))
-+        return -3;
-+
-+      if (IS_ACX111(adev)) {
-+              /* ACX111: configopt struct needs to be queried after full init */
-+              acx_s_interrogate(adev, &co, ACX111_IE_CONFIG_OPTIONS);
-+      }
-+
-+      /*
-+       * Set up transmit buffer administration
-+       */
-+      init_acx_txbuf (adev);
-+
-+      /*
-+       * Windows driver writes 0x01000000 to register 0x288, RADIO_CTL, if the form factor
-+       * is 3.  It also write protects the EEPROM by writing 1<<9 to GPIO_OUT
-+       */
-+      if (adev->form_factor == 3) {
-+        set_regbits (adev, 0x288, 0x01000000);
-+        set_regbits (adev, 0x298, 1<<9);
-+      }
-+
-+/* TODO: merge them into one function, they are called just once and are the same for pci & usb */
-+      if (OK != acxmem_read_eeprom_byte(adev, 0x05, &adev->eeprom_version))
-+        return -2;
-+
-+      acx_s_parse_configoption(adev, &co);
-+      acx_s_get_firmware_version(adev); /* needs to be after acx_s_init_mac() */
-+      acx_display_hardware_details(adev);
-+
-+      return 0;
-+}
-+
-+static int __devinit
-+acxmem_e_probe(struct platform_device *pdev)
-+{
-+      struct acx_hardware_data *hwdata = pdev->dev.platform_data;
-+      acx_device_t *adev = NULL;
-+      struct net_device *ndev = NULL;
-+      const char *chip_name;
-+      int result = -EIO;
-+      int err;
-+      int i;
-+      unsigned long addr_size=0;
-+      u8 chip_type;
-+
-+      FN_ENTER;
-+      (void) hwdata->start_hw();
-+
-+      /* FIXME: prism54 calls pci_set_mwi() here,
-+       * should we do/support the same? */
-+
-+      /* chiptype is u8 but id->driver_data is ulong
-+      ** Works for now (possible values are 1 and 2) */
-+      chip_type = CHIPTYPE_ACX100;
-+      /* acx100 and acx111 have different PCI memory regions */
-+      if (chip_type == CHIPTYPE_ACX100) {
-+              chip_name = "ACX100";
-+      } else if (chip_type == CHIPTYPE_ACX111) {
-+              chip_name = "ACX111";
-+      } else {
-+              printk("acx: unknown chip type 0x%04X\n", chip_type);
-+              goto fail_unknown_chiptype;
-+      }
-+
-+      printk("acx: found %s-based wireless network card\n", chip_name);
-+      log(L_ANY, "initial debug setting is 0x%04X\n", acx_debug);
-+
-+      ndev = alloc_netdev(sizeof(*adev), "wlan%d", dummy_netdev_init);
-+      /* (NB: memsets to 0 entire area) */
-+      if (!ndev) {
-+              printk("acx: no memory for netdevice struct\n");
-+              goto fail_alloc_netdev;
-+      }
-+
-+      platform_set_drvdata (pdev, ndev);
-+
-+      ether_setup(ndev);
-+
-+      /*
-+       * use platform_data resources that were provided
-+       */
-+      ndev->irq = 0;
-+      for (i=0; i<pdev->num_resources; i++) {
-+              if (pdev->resource[i].flags == IORESOURCE_IRQ) {
-+                      ndev->irq = pdev->resource[i].start;
-+              }
-+              else if (pdev->resource[i].flags == IORESOURCE_MEM) {
-+                      ndev->base_addr = pdev->resource[i].start;
-+                      addr_size = pdev->resource[i].end - pdev->resource[i].start;
-+              }
-+      }
-+      if (addr_size == 0 || ndev->irq == 0)
-+              goto fail_hw_params;
-+      ndev->open = &acxmem_e_open;
-+      ndev->stop = &acxmem_e_close;
-+      pdev->dev.release = &acxmem_e_release;
-+      ndev->hard_start_xmit = &acx_i_start_xmit;
-+      ndev->get_stats = &acx_e_get_stats;
-+#if IW_HANDLER_VERSION <= 5
-+      ndev->get_wireless_stats = &acx_e_get_wireless_stats;
-+#endif
-+      ndev->wireless_handlers = (struct iw_handler_def *)&acx_ioctl_handler_def;
-+      ndev->set_multicast_list = &acxmem_i_set_multicast_list;
-+      ndev->tx_timeout = &acxmem_i_tx_timeout;
-+      ndev->change_mtu = &acx_e_change_mtu;
-+      ndev->watchdog_timeo = 4 * HZ;
-+
-+      adev = ndev2adev(ndev);
-+      spin_lock_init(&adev->lock);    /* initial state: unlocked */
-+      spin_lock_init(&adev->txbuf_lock);
-+      /* We do not start with downed sem: we want PARANOID_LOCKING to work */
-+      sema_init(&adev->sem, 1);       /* initial state: 1 (upped) */
-+      /* since nobody can see new netdev yet, we can as well
-+      ** just _presume_ that we're under sem (instead of actually taking it): */
-+      /* acx_sem_lock(adev); */
-+      adev->dev = &pdev->dev;
-+      adev->ndev = ndev;
-+      adev->dev_type = DEVTYPE_MEM;
-+      adev->chip_type = chip_type;
-+      adev->chip_name = chip_name;
-+      adev->io = (CHIPTYPE_ACX100 == chip_type) ? IO_ACX100 : IO_ACX111;
-+      adev->membase = (volatile u32 *) ndev->base_addr;
-+      adev->iobase = (volatile u32 *) ioremap_nocache (ndev->base_addr, addr_size);
-+      /* to find crashes due to weird driver access
-+       * to unconfigured interface (ifup) */
-+      adev->mgmt_timer.function = (void (*)(unsigned long))0x0000dead;
-+
-+#if defined(NONESSENTIAL_FEATURES)
-+      acx_show_card_eeprom_id(adev);
-+#endif /* NONESSENTIAL_FEATURES */
-+
-+#ifdef SET_MODULE_OWNER
-+      SET_MODULE_OWNER(ndev);
-+#endif
-+      SET_NETDEV_DEV(ndev, &pdev->dev);
-+
-+      log(L_IRQ|L_INIT, "using IRQ %d\n", ndev->irq);
-+
-+      /* ok, pci setup is finished, now start initializing the card */
-+
-+      if (OK != acxmem_complete_hw_reset (adev))
-+        goto fail_reset;
-+
-+      /*
-+       * Set up default things for most of the card settings.
-+       */
-+      acx_s_set_defaults(adev);
-+
-+      /* Register the card, AFTER everything else has been set up,
-+       * since otherwise an ioctl could step on our feet due to
-+       * firmware operations happening in parallel or uninitialized data */
-+      err = register_netdev(ndev);
-+      if (OK != err) {
-+              printk("acx: register_netdev() FAILED: %d\n", err);
-+              goto fail_register_netdev;
-+      }
-+
-+      acx_proc_register_entries(ndev);
-+
-+      /* Now we have our device, so make sure the kernel doesn't try
-+       * to send packets even though we're not associated to a network yet */
-+      acx_stop_queue(ndev, "on probe");
-+      acx_carrier_off(ndev, "on probe");
-+
-+      /*
-+       * Set up a default monitor type so that poor combinations of initialization
-+       * sequences in monitor mode don't end up destroying the hardware type.
-+       */
-+      adev->monitor_type = ARPHRD_ETHER;
-+
-+      /*
-+       * Register to receive inetaddr notifier changes.  This will allow us to
-+       * catch if the user changes the MAC address of the interface.
-+       */
-+      register_netdevice_notifier(&acx_netdev_notifier);
-+
-+      /* after register_netdev() userspace may start working with dev
-+       * (in particular, on other CPUs), we only need to up the sem */
-+      /* acx_sem_unlock(adev); */
-+
-+      printk("acx "ACX_RELEASE": net device %s, driver compiled "
-+              "against wireless extensions %d and Linux %s\n",
-+              ndev->name, WIRELESS_EXT, UTS_RELEASE);
-+
-+#if CMD_DISCOVERY
-+      great_inquisitor(adev);
-+#endif
-+
-+      result = OK;
-+      goto done;
-+
-+      /* error paths: undo everything in reverse order... */
-+
-+fail_register_netdev:
-+
-+      acxmem_s_delete_dma_regions(adev);
-+
-+fail_reset:
-+fail_hw_params:
-+      free_netdev(ndev);
-+fail_alloc_netdev:
-+fail_unknown_chiptype:
-+
-+
-+done:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_e_remove
-+**
-+** Shut device down (if not hot unplugged)
-+** and deallocate PCI resources for the acx chip.
-+**
-+** pdev - ptr to PCI device structure containing info about pci configuration
-+*/
-+static int __devexit
-+acxmem_e_remove(struct platform_device *pdev)
-+{
-+      struct acx_hardware_data *hwdata = pdev->dev.platform_data;
-+      struct net_device *ndev;
-+      acx_device_t *adev;
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      ndev = (struct net_device*) platform_get_drvdata(pdev);
-+      if (!ndev) {
-+              log(L_DEBUG, "%s: card is unused. Skipping any release code\n",
-+                      __func__);
-+              goto end;
-+      }
-+
-+      adev = ndev2adev(ndev);
-+
-+      /* If device wasn't hot unplugged... */
-+      if (adev_present(adev)) {
-+
-+              acx_sem_lock(adev);
-+
-+              /* disable both Tx and Rx to shut radio down properly */
-+              acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0);
-+              acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0);
-+
-+#ifdef REDUNDANT
-+              /* put the eCPU to sleep to save power
-+               * Halting is not possible currently,
-+               * since not supported by all firmware versions */
-+              acx_s_issue_cmd(adev, ACX100_CMD_SLEEP, NULL, 0);
-+#endif
-+              acx_lock(adev, flags);
-+
-+              /* disable power LED to save power :-) */
-+              log(L_INIT, "switching off power LED to save power\n");
-+              acxmem_l_power_led(adev, 0);
-+
-+              /* stop our eCPU */
-+              if (IS_ACX111(adev)) {
-+                      /* FIXME: does this actually keep halting the eCPU?
-+                       * I don't think so...
-+                       */
-+                      acxmem_l_reset_mac(adev);
-+              } else {
-+                      u16 temp;
-+
-+                      /* halt eCPU */
-+                      temp = read_reg16(adev, IO_ACX_ECPU_CTRL) | 0x1;
-+                      write_reg16(adev, IO_ACX_ECPU_CTRL, temp);
-+                      write_flush(adev);
-+              }
-+
-+              acx_unlock(adev, flags);
-+
-+              acx_sem_unlock(adev);
-+      }
-+
-+
-+      /*
-+       * Unregister the notifier chain
-+       */
-+      unregister_netdevice_notifier(&acx_netdev_notifier);
-+
-+      /* unregister the device to not let the kernel
-+       * (e.g. ioctls) access a half-deconfigured device
-+       * NB: this will cause acxmem_e_close() to be called,
-+       * thus we shouldn't call it under sem! */
-+      log(L_INIT, "removing device %s\n", ndev->name);
-+      unregister_netdev(ndev);
-+
-+      /* unregister_netdev ensures that no references to us left.
-+       * For paranoid reasons we continue to follow the rules */
-+      acx_sem_lock(adev);
-+
-+      if (adev->dev_state_mask & ACX_STATE_IFACE_UP) {
-+              acxmem_s_down(ndev);
-+              CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      }
-+
-+      acx_proc_unregister_entries(ndev);
-+
-+      acxmem_s_delete_dma_regions(adev);
-+
-+      /* finally, clean up PCI bus state */
-+      if (adev->iobase) iounmap((void *)adev->iobase);
-+
-+      acx_sem_unlock(adev);
-+
-+      /* Free netdev (quite late,
-+       * since otherwise we might get caught off-guard
-+       * by a netdev timeout handler execution
-+       * expecting to see a working dev...) */
-+      free_netdev(ndev);
-+
-+      (void) hwdata->stop_hw();
-+
-+      printk ("e_remove done\n");
-+end:
-+      FN_EXIT0;
-+
-+      return 0;
-+}
-+
-+
-+/***********************************************************************
-+** TODO: PM code needs to be fixed / debugged / tested.
-+*/
-+#ifdef CONFIG_PM
-+static int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+acxmem_e_suspend(struct platform_device *pdev, pm_message_t state)
-+#else
-+acxmem_e_suspend(struct device *pdev, u32 state)
-+#endif
-+{
-+      struct net_device *ndev = platform_get_drvdata(pdev);
-+      acx_device_t *adev;
-+      struct acx_hardware_data *hwdata;
-+
-+      FN_ENTER;
-+      printk("acx: suspend handler is experimental!\n");
-+      printk("sus: dev %p\n", ndev);
-+
-+      if (!netif_running(ndev))
-+              goto end;
-+
-+      adev = ndev2adev(ndev);
-+      printk("sus: adev %p\n", adev);
-+
-+      hwdata = adev->dev->platform_data;
-+
-+      acx_sem_lock(adev);
-+
-+      netif_device_detach(ndev);      /* this one cannot sleep */
-+      acxmem_s_down(ndev);
-+      /* down() does not set it to 0xffff, but here we really want that */
-+      write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff);
-+      write_reg16(adev, IO_ACX_FEMR, 0x0);
-+      acxmem_s_delete_dma_regions(adev);
-+
-+      /*
-+       * Turn the ACX chip off.
-+       */
-+      hwdata->stop_hw();
-+
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT0;
-+      return OK;
-+}
-+
-+
-+
-+static void
-+fw_resumer(struct work_struct *notused)
-+{
-+        struct platform_device *pdev = resume_pdev;
-+      struct net_device *ndev = platform_get_drvdata(pdev);
-+      acx_device_t *adev;
-+      struct acx_hardware_data *hwdata;
-+
-+      printk("acx: resume handler is experimental!\n");
-+      printk("rsm: got dev %p\n", ndev);
-+
-+      if (!netif_running(ndev))
-+              return;
-+
-+      adev = ndev2adev(ndev);
-+      printk("rsm: got adev %p\n", adev);
-+
-+      acx_sem_lock(adev);
-+
-+      hwdata = adev->dev->platform_data;
-+
-+      /*
-+       * Turn on the ACX.
-+       */
-+      hwdata->start_hw();
-+
-+      acxmem_complete_hw_reset (adev);
-+
-+      /*
-+       * done by acx_s_set_defaults for initial startup
-+       */
-+      acxmem_set_interrupt_mask(adev);
-+
-+      printk ("rsm: bringing up interface\n");
-+      SET_BIT (adev->set_mask, GETSET_ALL);
-+      acxmem_s_up(ndev);
-+      printk("rsm: acx up done\n");
-+
-+      /* now even reload all card parameters as they were before suspend,
-+       * and possibly be back in the network again already :-) 
-+       */
-+      /* - most settings updated in acxmem_s_up()
-+      if (ACX_STATE_IFACE_UP & adev->dev_state_mask) {
-+              adev->set_mask = GETSET_ALL;
-+              acx_s_update_card_settings(adev);
-+              printk("rsm: settings updated\n");
-+      }
-+      */
-+      netif_device_attach(ndev);
-+      printk("rsm: device attached\n");
-+
-+      acx_sem_unlock(adev);
-+}
-+
-+DECLARE_WORK( fw_resume_work, fw_resumer );
-+
-+static int
-+acxmem_e_resume(struct platform_device *pdev)
-+{
-+      FN_ENTER;
-+
-+      resume_pdev = pdev;
-+      schedule_work( &fw_resume_work );
-+
-+      FN_EXIT0;
-+      return OK;
-+}
-+#endif /* CONFIG_PM */
-+
-+
-+/***********************************************************************
-+** acxmem_s_up
-+**
-+** This function is called by acxmem_e_open (when ifconfig sets the device as up)
-+**
-+** Side effects:
-+** - Enables on-card interrupt requests
-+** - calls acx_s_start
-+*/
-+
-+static void
-+enable_acx_irq(acx_device_t *adev)
-+{
-+      FN_ENTER;
-+      write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask);
-+      write_reg16(adev, IO_ACX_FEMR, 0x8000);
-+      adev->irqs_active = 1;
-+      FN_EXIT0;
-+}
-+
-+static void
-+acxmem_s_up(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+      enable_acx_irq(adev);
-+      acx_unlock(adev, flags);
-+
-+      /* acx fw < 1.9.3.e has a hardware timer, and older drivers
-+      ** used to use it. But we don't do that anymore, our OS
-+      ** has reliable software timers */
-+      init_timer(&adev->mgmt_timer);
-+      adev->mgmt_timer.function = acx_i_timer;
-+      adev->mgmt_timer.data = (unsigned long)adev;
-+
-+      /* Need to set ACX_STATE_IFACE_UP first, or else
-+      ** timer won't be started by acx_set_status() */
-+      SET_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+      case ACX_MODE_2_STA:
-+              /* actual scan cmd will happen in start() */
-+              acx_set_status(adev, ACX_STATUS_1_SCANNING); break;
-+      case ACX_MODE_3_AP:
-+      case ACX_MODE_MONITOR:
-+              acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); break;
-+      }
-+
-+      acx_s_start(adev);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_down
-+**
-+** This disables the netdevice
-+**
-+** Side effects:
-+** - disables on-card interrupt request
-+*/
-+
-+static void
-+disable_acx_irq(acx_device_t *adev)
-+{
-+      FN_ENTER;
-+
-+      /* I guess mask is not 0xffff because acx100 won't signal
-+      ** cmd completion then (needed for ifup).
-+      ** Someone with acx100 please confirm */
-+      write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask_off);
-+      write_reg16(adev, IO_ACX_FEMR, 0x0);
-+      adev->irqs_active = 0;
-+      FN_EXIT0;
-+}
-+
-+static void
-+acxmem_s_down(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      /* Disable IRQs first, so that IRQs cannot race with us */
-+      /* then wait until interrupts have finished executing on other CPUs */
-+      acx_lock(adev, flags);
-+      disable_acx_irq(adev);
-+      synchronize_irq(adev->pdev->irq);
-+      acx_unlock(adev, flags);
-+
-+      /* we really don't want to have an asynchronous tasklet disturb us
-+      ** after something vital for its job has been shut down, so
-+      ** end all remaining work now.
-+      **
-+      ** NB: carrier_off (done by set_status below) would lead to
-+      ** not yet fully understood deadlock in FLUSH_SCHEDULED_WORK().
-+      ** That's why we do FLUSH first.
-+      **
-+      ** NB2: we have a bad locking bug here: FLUSH_SCHEDULED_WORK()
-+      ** waits for acx_e_after_interrupt_task to complete if it is running
-+      ** on another CPU, but acx_e_after_interrupt_task
-+      ** will sleep on sem forever, because it is taken by us!
-+      ** Work around that by temporary sem unlock.
-+      ** This will fail miserably if we'll be hit by concurrent
-+      ** iwconfig or something in between. TODO! */
-+      acx_sem_unlock(adev);
-+      FLUSH_SCHEDULED_WORK();
-+      acx_sem_lock(adev);
-+
-+      /* This is possible:
-+      ** FLUSH_SCHEDULED_WORK -> acx_e_after_interrupt_task ->
-+      ** -> set_status(ASSOCIATED) -> wake_queue()
-+      ** That's why we stop queue _after_ FLUSH_SCHEDULED_WORK
-+      ** lock/unlock is just paranoia, maybe not needed */
-+      acx_lock(adev, flags);
-+      acx_stop_queue(ndev, "on ifdown");
-+      acx_set_status(adev, ACX_STATUS_0_STOPPED);
-+      acx_unlock(adev, flags);
-+
-+      /* kernel/timer.c says it's illegal to del_timer_sync()
-+      ** a timer which restarts itself. We guarantee this cannot
-+      ** ever happen because acx_i_timer() never does this if
-+      ** status is ACX_STATUS_0_STOPPED */
-+      del_timer_sync(&adev->mgmt_timer);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_e_open
-+**
-+** Called as a result of SIOCSIFFLAGS ioctl changing the flags bit IFF_UP
-+** from clear to set. In other words: ifconfig up.
-+**
-+** Returns:
-+**    0       success
-+**    >0      f/w reported error
-+**    <0      driver reported error
-+*/
-+static int
-+acxmem_e_open(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result = OK;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      acx_init_task_scheduler(adev);
-+
-+/* TODO: pci_set_power_state(pdev, PCI_D0); ? */
-+
-+      /* request shared IRQ handler */
-+      if (request_irq(ndev->irq, acxmem_i_interrupt, SA_INTERRUPT, ndev->name, ndev)) {
-+              printk("%s: request_irq FAILED\n", ndev->name);
-+              result = -EAGAIN;
-+              goto done;
-+      }
-+      set_irq_type (ndev->irq, IRQT_FALLING);
-+      log(L_DEBUG|L_IRQ, "request_irq %d successful\n", ndev->irq);
-+
-+      /* ifup device */
-+      acxmem_s_up(ndev);
-+
-+      /* We don't currently have to do anything else.
-+       * The setup of the MAC should be subsequently completed via
-+       * the mlme commands.
-+       * Higher layers know we're ready from dev->start==1 and
-+       * dev->tbusy==0.  Our rx path knows to pass up received/
-+       * frames because of dev->flags&IFF_UP is true.
-+       */
-+done:
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_e_close
-+**
-+** Called as a result of SIOCSIIFFLAGS ioctl changing the flags bit IFF_UP
-+** from set to clear. I.e. called by "ifconfig DEV down"
-+**
-+** Returns:
-+**    0       success
-+**    >0      f/w reported error
-+**    <0      driver reported error
-+*/
-+static int
-+acxmem_e_close(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      /* ifdown device */
-+      CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      if (netif_device_present(ndev)) {
-+              acxmem_s_down(ndev);
-+      }
-+
-+      /* disable all IRQs, release shared IRQ handler */
-+      write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff);
-+      write_reg16(adev, IO_ACX_FEMR, 0x0);
-+      free_irq(ndev->irq, ndev);
-+
-+/* TODO: pci_set_power_state(pdev, PCI_D3hot); ? */
-+
-+      /* We currently don't have to do anything else.
-+       * Higher layers know we're not ready from dev->start==0 and
-+       * dev->tbusy==1.  Our rx path knows to not pass up received
-+       * frames because of dev->flags&IFF_UP is false.
-+       */
-+      acx_sem_unlock(adev);
-+
-+      log(L_INIT, "closed device\n");
-+      FN_EXIT0;
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_i_tx_timeout
-+**
-+** Called from network core. Must not sleep!
-+*/
-+static void
-+acxmem_i_tx_timeout(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      unsigned int tx_num_cleaned;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+
-+      /* clean processed tx descs, they may have been completely full */
-+      tx_num_cleaned = acxmem_l_clean_txdesc(adev);
-+
-+      /* nothing cleaned, yet (almost) no free buffers available?
-+       * --> clean all tx descs, no matter which status!!
-+       * Note that I strongly suspect that doing emergency cleaning
-+       * may confuse the firmware. This is a last ditch effort to get
-+       * ANYTHING to work again...
-+       *
-+       * TODO: it's best to simply reset & reinit hw from scratch...
-+       */
-+      if ((adev->tx_free <= TX_EMERG_CLEAN) && (tx_num_cleaned == 0)) {
-+              printk("%s: FAILED to free any of the many full tx buffers. "
-+                      "Switching to emergency freeing. "
-+                      "Please report!\n", ndev->name);
-+              acxmem_l_clean_txdesc_emergency(adev);
-+      }
-+
-+      if (acx_queue_stopped(ndev) && (ACX_STATUS_4_ASSOCIATED == adev->status))
-+              acx_wake_queue(ndev, "after tx timeout");
-+
-+      /* stall may have happened due to radio drift, so recalib radio */
-+      acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB);
-+
-+      /* do unimportant work last */
-+      printk("%s: tx timeout!\n", ndev->name);
-+      adev->stats.tx_errors++;
-+
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_i_set_multicast_list
-+** FIXME: most likely needs refinement
-+*/
-+static void
-+acxmem_i_set_multicast_list(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+
-+      /* firmwares don't have allmulti capability,
-+       * so just use promiscuous mode instead in this case. */
-+      if (ndev->flags & (IFF_PROMISC|IFF_ALLMULTI)) {
-+              SET_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS);
-+              CLEAR_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI);
-+              SET_BIT(adev->set_mask, SET_RXCONFIG);
-+              /* let kernel know in case *we* needed to set promiscuous */
-+              ndev->flags |= (IFF_PROMISC|IFF_ALLMULTI);
-+      } else {
-+              CLEAR_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS);
-+              SET_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI);
-+              SET_BIT(adev->set_mask, SET_RXCONFIG);
-+              ndev->flags &= ~(IFF_PROMISC|IFF_ALLMULTI);
-+      }
-+
-+      /* cannot update card settings directly here, atomic context */
-+      acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG);
-+
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_l_process_rxdesc
-+**
-+** Called directly and only from the IRQ handler
-+*/
-+
-+#if !ACX_DEBUG
-+static inline void log_rxbuffer(const acx_device_t *adev) {}
-+#else
-+static void
-+log_rxbuffer(const acx_device_t *adev)
-+{
-+      register const struct rxhostdesc *rxhostdesc;
-+      int i;
-+      /* no FN_ENTER here, we don't want that */
-+
-+      rxhostdesc = adev->rxhostdesc_start;
-+      if (unlikely(!rxhostdesc)) return;
-+      for (i = 0; i < RX_CNT; i++) {
-+              if ((rxhostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN))
-+               && (rxhostdesc->Status & cpu_to_le32(DESC_STATUS_FULL)))
-+                      printk("rx: buf %d full\n", i);
-+              rxhostdesc++;
-+      }
-+}
-+#endif
-+
-+static void
-+acxmem_l_process_rxdesc(acx_device_t *adev)
-+{
-+      register rxhostdesc_t *hostdesc;
-+      register rxdesc_t *rxdesc;
-+      unsigned count, tail;
-+      u32 addr;
-+      u8 Ctl_8;
-+
-+      FN_ENTER;
-+
-+      if (unlikely(acx_debug & L_BUFR))
-+              log_rxbuffer(adev);
-+
-+      /* First, have a loop to determine the first descriptor that's
-+       * full, just in case there's a mismatch between our current
-+       * rx_tail and the full descriptor we're supposed to handle. */
-+      tail = adev->rx_tail;
-+      count = RX_CNT;
-+      while (1) {
-+              hostdesc = &adev->rxhostdesc_start[tail];
-+              rxdesc = &adev->rxdesc_start[tail];
-+              /* advance tail regardless of outcome of the below test */
-+              tail = (tail + 1) % RX_CNT;
-+
-+              /*
-+               * Unlike the PCI interface, where the ACX can write directly to
-+               * the host descriptors, on the slave memory interface we have to
-+               * pull these.  All we really need to do is check the Ctl_8 field
-+               * in the rx descriptor on the ACX, which should be 0x11000000 if
-+               * we should process it.
-+               */
-+              Ctl_8 = hostdesc->Ctl_16 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8));
-+                if ((Ctl_8 & DESC_CTL_HOSTOWN) &&
-+                  (Ctl_8 & DESC_CTL_ACXDONE))
-+                break;                /* found it! */
-+
-+              if (unlikely(!--count)) /* hmm, no luck: all descs empty, bail out */
-+                      goto end;
-+      }
-+
-+      /* now process descriptors, starting with the first we figured out */
-+      while (1) {
-+              log(L_BUFR, "rx: tail=%u Ctl_8=%02X\n", tail, Ctl_8);
-+              /*
-+               * If the ACX has CTL_RECLAIM set on this descriptor there
-+               * is no buffer associated; it just wants us to tell it to
-+               * reclaim the memory.
-+               */
-+              if (!(Ctl_8 & DESC_CTL_RECLAIM)) {
-+
-+                /*
-+               * slave interface - pull data now
-+               */
-+              hostdesc->length = read_slavemem16 (adev, (u32) &(rxdesc->total_length));
-+
-+              /*
-+               * hostdesc->data is an rxbuffer_t, which includes header information,
-+               * but the length in the data packet doesn't.  The header information
-+               * takes up an additional 12 bytes, so add that to the length we copy.
-+               */
-+              addr = read_slavemem32 (adev, (u32) &(rxdesc->ACXMemPtr));
-+                if (addr) {
-+                  /*
-+                   * How can &(rxdesc->ACXMemPtr) above ever be zero?  Looks like we
-+                   * get that now and then - try to trap it for debug.
-+                   */
-+                  if (addr & 0xffff0000) {
-+                    printk("rxdesc 0x%08x\n", (u32) rxdesc);
-+                    dump_acxmem (adev, 0, 0x10000);
-+                    panic ("Bad access!");
-+                  }
-+                chaincopy_from_slavemem (adev, (u8 *) hostdesc->data, addr,
-+                                         hostdesc->length +
-+                                         (u32) &((rxbuffer_t *)0)->hdr_a3);
-+              acx_l_process_rxbuf(adev, hostdesc->data);
-+                }
-+              }
-+              else {
-+                printk ("rx reclaim only!\n");
-+              }
-+
-+              hostdesc->Status = 0;
-+
-+              /*
-+               * Let the ACX know we're done.
-+               */
-+              CLEAR_BIT (Ctl_8, DESC_CTL_HOSTOWN);
-+                SET_BIT (Ctl_8, DESC_CTL_HOSTDONE);
-+              SET_BIT (Ctl_8, DESC_CTL_RECLAIM);
-+              write_slavemem8 (adev, (u32) &rxdesc->Ctl_8, Ctl_8);
-+
-+              /*
-+               * Now tell the ACX we've finished with the receive buffer so 
-+               * it can finish the reclaim.
-+               */
-+              write_reg16 (adev, IO_ACX_INT_TRIG, INT_TRIG_RXPRC);
-+
-+              /* ok, descriptor is handled, now check the next descriptor */
-+              hostdesc = &adev->rxhostdesc_start[tail];
-+              rxdesc = &adev->rxdesc_start[tail];
-+
-+              Ctl_8 = hostdesc->Ctl_16 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8));
-+
-+              /* if next descriptor is empty, then bail out */
-+              if (!(Ctl_8 & DESC_CTL_HOSTOWN) || !(Ctl_8 & DESC_CTL_ACXDONE))
-+                      break;
-+
-+              tail = (tail + 1) % RX_CNT;
-+      }
-+end:
-+      adev->rx_tail = tail;
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_i_interrupt
-+**
-+** IRQ handler (atomic context, must not sleep, blah, blah)
-+*/
-+
-+/* scan is complete. all frames now on the receive queue are valid */
-+#define INFO_SCAN_COMPLETE      0x0001
-+#define INFO_WEP_KEY_NOT_FOUND  0x0002
-+/* hw has been reset as the result of a watchdog timer timeout */
-+#define INFO_WATCH_DOG_RESET    0x0003
-+/* failed to send out NULL frame from PS mode notification to AP */
-+/* recommended action: try entering 802.11 PS mode again */
-+#define INFO_PS_FAIL            0x0004
-+/* encryption/decryption process on a packet failed */
-+#define INFO_IV_ICV_FAILURE     0x0005
-+
-+/* Info mailbox format:
-+2 bytes: type
-+2 bytes: status
-+more bytes may follow
-+    rumors say about status:
-+      0x0000 info available (set by hw)
-+      0x0001 information received (must be set by host)
-+      0x1000 info available, mailbox overflowed (messages lost) (set by hw)
-+    but in practice we've seen:
-+      0x9000 when we did not set status to 0x0001 on prev message
-+      0x1001 when we did set it
-+      0x0000 was never seen
-+    conclusion: this is really a bitfield:
-+    0x1000 is 'info available' bit
-+    'mailbox overflowed' bit is 0x8000, not 0x1000
-+    value of 0x0000 probably means that there are no messages at all
-+    P.S. I dunno how in hell hw is supposed to notice that messages are lost -
-+    it does NOT clear bit 0x0001, and this bit will probably stay forever set
-+    after we set it once. Let's hope this will be fixed in firmware someday
-+*/
-+
-+static void
-+handle_info_irq(acx_device_t *adev)
-+{
-+#if ACX_DEBUG
-+      static const char * const info_type_msg[] = {
-+              "(unknown)",
-+              "scan complete",
-+              "WEP key not found",
-+              "internal watchdog reset was done",
-+              "failed to send powersave (NULL frame) notification to AP",
-+              "encrypt/decrypt on a packet has failed",
-+              "TKIP tx keys disabled",
-+              "TKIP rx keys disabled",
-+              "TKIP rx: key ID not found",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "TKIP IV value exceeds thresh"
-+      };
-+#endif
-+      u32 info_type, info_status;
-+
-+      info_type = read_slavemem32 (adev, (u32) adev->info_area);
-+
-+      info_status = (info_type >> 16);
-+      info_type = (u16)info_type;
-+
-+      /* inform fw that we have read this info message */
-+      write_slavemem32(adev, (u32) adev->info_area, info_type | 0x00010000);
-+      write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_INFOACK);
-+      write_flush(adev);
-+
-+      log(L_CTL, "info_type:%04X info_status:%04X\n",
-+                      info_type, info_status);
-+
-+      log(L_IRQ, "got Info IRQ: status %04X type %04X: %s\n",
-+              info_status, info_type,
-+              info_type_msg[(info_type >= VEC_SIZE(info_type_msg)) ?
-+                              0 : info_type]
-+      );
-+}
-+
-+
-+static void
-+log_unusual_irq(u16 irqtype) {
-+      /*
-+      if (!printk_ratelimit())
-+              return;
-+      */
-+
-+      printk("acx: got");
-+      if (irqtype & HOST_INT_TX_XFER) {
-+              printk(" Tx_Xfer");
-+      }
-+      if (irqtype & HOST_INT_RX_COMPLETE) {
-+              printk(" Rx_Complete");
-+      }
-+      if (irqtype & HOST_INT_DTIM) {
-+              printk(" DTIM");
-+      }
-+      if (irqtype & HOST_INT_BEACON) {
-+              printk(" Beacon");
-+      }
-+      if (irqtype & HOST_INT_TIMER) {
-+              log(L_IRQ, " Timer");
-+      }
-+      if (irqtype & HOST_INT_KEY_NOT_FOUND) {
-+              printk(" Key_Not_Found");
-+      }
-+      if (irqtype & HOST_INT_IV_ICV_FAILURE) {
-+              printk(" IV_ICV_Failure (crypto)");
-+      }
-+              /* HOST_INT_CMD_COMPLETE  */
-+              /* HOST_INT_INFO          */
-+      if (irqtype & HOST_INT_OVERFLOW) {
-+              printk(" Overflow");
-+      }
-+      if (irqtype & HOST_INT_PROCESS_ERROR) {
-+              printk(" Process_Error");
-+      }
-+              /* HOST_INT_SCAN_COMPLETE */
-+      if (irqtype & HOST_INT_FCS_THRESHOLD) {
-+              printk(" FCS_Threshold");
-+      }
-+      if (irqtype & HOST_INT_UNKNOWN) {
-+              printk(" Unknown");
-+      }
-+      printk(" IRQ(s)\n");
-+}
-+
-+
-+static void
-+update_link_quality_led(acx_device_t *adev)
-+{
-+      int qual;
-+
-+      qual = acx_signal_determine_quality(adev->wstats.qual.level, adev->wstats.qual.noise);
-+      if (qual > adev->brange_max_quality)
-+              qual = adev->brange_max_quality;
-+
-+      if (time_after(jiffies, adev->brange_time_last_state_change +
-+                              (HZ/2 - HZ/2 * (unsigned long)qual / adev->brange_max_quality ) )) {
-+              acxmem_l_power_led(adev, (adev->brange_last_state == 0));
-+              adev->brange_last_state ^= 1; /* toggle */
-+              adev->brange_time_last_state_change = jiffies;
-+      }
-+}
-+
-+
-+#define MAX_IRQLOOPS_PER_JIFFY  (20000/HZ) /* a la orinoco.c */
-+
-+static irqreturn_t
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
-+acxmem_i_interrupt(int irq, void *dev_id)
-+#else
-+acxmwm_i_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+#endif
-+{
-+      acx_device_t *adev;
-+      unsigned long flags;
-+      unsigned int irqcount = MAX_IRQLOOPS_PER_JIFFY;
-+      register u16 irqtype;
-+      u16 unmasked;
-+
-+      adev = ndev2adev((struct net_device*)dev_id);
-+
-+      /* LOCKING: can just spin_lock() since IRQs are disabled anyway.
-+       * I am paranoid */
-+      acx_lock(adev, flags);
-+
-+      unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR);
-+      if (unlikely(0xffff == unmasked)) {
-+              /* 0xffff value hints at missing hardware,
-+               * so don't do anything.
-+               * Not very clean, but other drivers do the same... */
-+              log(L_IRQ, "IRQ type:FFFF - device removed? IRQ_NONE\n");
-+              goto none;
-+      }
-+
-+      /* We will check only "interesting" IRQ types */
-+      irqtype = unmasked & ~adev->irq_mask;
-+      if (!irqtype) {
-+              /* We are on a shared IRQ line and it wasn't our IRQ */
-+              log(L_IRQ, "IRQ type:%04X, mask:%04X - all are masked, IRQ_NONE\n",
-+                      unmasked, adev->irq_mask);
-+              goto none;
-+      }
-+
-+      /* Done here because IRQ_NONEs taking three lines of log
-+      ** drive me crazy */
-+      FN_ENTER;
-+
-+#define IRQ_ITERATE 1
-+#if IRQ_ITERATE
-+if (jiffies != adev->irq_last_jiffies) {
-+      adev->irq_loops_this_jiffy = 0;
-+      adev->irq_last_jiffies = jiffies;
-+}
-+
-+/* safety condition; we'll normally abort loop below
-+ * in case no IRQ type occurred */
-+while (likely(--irqcount)) {
-+#endif
-+      /* ACK all IRQs ASAP */
-+      write_reg16(adev, IO_ACX_IRQ_ACK, 0xffff);
-+
-+      log(L_IRQ, "IRQ type:%04X, mask:%04X, type & ~mask:%04X\n",
-+                              unmasked, adev->irq_mask, irqtype);
-+
-+      /* Handle most important IRQ types first */
-+      if (irqtype & HOST_INT_RX_DATA) {
-+              log(L_IRQ, "got Rx_Data IRQ\n");
-+              acxmem_l_process_rxdesc(adev);
-+      }
-+      if (irqtype & HOST_INT_TX_COMPLETE) {
-+              log(L_IRQ, "got Tx_Complete IRQ\n");
-+              /* don't clean up on each Tx complete, wait a bit
-+               * unless we're going towards full, in which case
-+               * we do it immediately, too (otherwise we might lockup
-+               * with a full Tx buffer if we go into
-+               * acxmem_l_clean_txdesc() at a time when we won't wakeup
-+               * the net queue in there for some reason...) */
-+              if (adev->tx_free <= TX_START_CLEAN) {
-+#if TX_CLEANUP_IN_SOFTIRQ
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_TX_CLEANUP);
-+#else
-+                      acxmem_l_clean_txdesc(adev);
-+#endif
-+              }
-+      }
-+
-+      /* Less frequent ones */
-+      if (irqtype & (0
-+              | HOST_INT_CMD_COMPLETE
-+              | HOST_INT_INFO
-+              | HOST_INT_SCAN_COMPLETE
-+      )) {
-+              if (irqtype & HOST_INT_CMD_COMPLETE) {
-+                      log(L_IRQ, "got Command_Complete IRQ\n");
-+                      /* save the state for the running issue_cmd() */
-+                      SET_BIT(adev->irq_status, HOST_INT_CMD_COMPLETE);
-+              }
-+              if (irqtype & HOST_INT_INFO) {
-+                      handle_info_irq(adev);
-+              }
-+              if (irqtype & HOST_INT_SCAN_COMPLETE) {
-+                      log(L_IRQ, "got Scan_Complete IRQ\n");
-+                      /* need to do that in process context */
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_COMPLETE_SCAN);
-+                      /* remember that fw is not scanning anymore */
-+                      SET_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE);
-+              }
-+      }
-+
-+      /* These we just log, but either they happen rarely
-+       * or we keep them masked out */
-+      if (irqtype & (0
-+              /* | HOST_INT_RX_DATA */
-+              /* | HOST_INT_TX_COMPLETE   */
-+              | HOST_INT_TX_XFER
-+              | HOST_INT_RX_COMPLETE
-+              | HOST_INT_DTIM
-+              | HOST_INT_BEACON
-+              | HOST_INT_TIMER
-+              | HOST_INT_KEY_NOT_FOUND
-+              | HOST_INT_IV_ICV_FAILURE
-+              /* | HOST_INT_CMD_COMPLETE  */
-+              /* | HOST_INT_INFO          */
-+              | HOST_INT_OVERFLOW
-+              | HOST_INT_PROCESS_ERROR
-+              /* | HOST_INT_SCAN_COMPLETE */
-+              | HOST_INT_FCS_THRESHOLD
-+              | HOST_INT_UNKNOWN
-+      )) {
-+              log_unusual_irq(irqtype);
-+      }
-+
-+#if IRQ_ITERATE
-+      unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR);
-+      irqtype = unmasked & ~adev->irq_mask;
-+      /* Bail out if no new IRQ bits or if all are masked out */
-+      if (!irqtype)
-+              break;
-+
-+      if (unlikely(++adev->irq_loops_this_jiffy > MAX_IRQLOOPS_PER_JIFFY)) {
-+              printk(KERN_ERR "acx: too many interrupts per jiffy!\n");
-+              /* Looks like card floods us with IRQs! Try to stop that */
-+              write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff);
-+              /* This will short-circuit all future attempts to handle IRQ.
-+               * We cant do much more... */
-+              adev->irq_mask = 0;
-+              break;
-+      }
-+}
-+#endif
-+      /* Routine to perform blink with range */
-+      if (unlikely(adev->led_power == 2))
-+              update_link_quality_led(adev);
-+
-+/* handled: */
-+      /* write_flush(adev); - not needed, last op was read anyway */
-+      acx_unlock(adev, flags);
-+      FN_EXIT0;
-+      return IRQ_HANDLED;
-+
-+none:
-+      acx_unlock(adev, flags);
-+      return IRQ_NONE;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_l_power_led
-+*/
-+void
-+acxmem_l_power_led(acx_device_t *adev, int enable)
-+{
-+      u16 gpio_pled = IS_ACX111(adev) ? 0x0040 : 0x0800;
-+
-+      /* A hack. Not moving message rate limiting to adev->xxx
-+       * (it's only a debug message after all) */
-+      static int rate_limit = 0;
-+
-+      if (rate_limit++ < 3)
-+              log(L_IOCTL, "Please report in case toggling the power "
-+                              "LED doesn't work for your card!\n");
-+      if (enable)
-+              write_reg16(adev, IO_ACX_GPIO_OUT,
-+                      read_reg16(adev, IO_ACX_GPIO_OUT) & ~gpio_pled);
-+      else
-+              write_reg16(adev, IO_ACX_GPIO_OUT,
-+                      read_reg16(adev, IO_ACX_GPIO_OUT) | gpio_pled);
-+}
-+
-+
-+/***********************************************************************
-+** Ioctls
-+*/
-+
-+/***********************************************************************
-+*/
-+int
-+acx111pci_ioctl_info(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra)
-+{
-+#if ACX_DEBUG > 1
-+      acx_device_t *adev = ndev2adev(ndev);
-+      rxdesc_t *rxdesc;
-+      txdesc_t *txdesc;
-+      rxhostdesc_t *rxhostdesc;
-+      txhostdesc_t *txhostdesc;
-+      struct acx111_ie_memoryconfig memconf;
-+      struct acx111_ie_queueconfig queueconf;
-+      unsigned long flags;
-+      int i;
-+      char memmap[0x34];
-+      char rxconfig[0x8];
-+      char fcserror[0x8];
-+      char ratefallback[0x5];
-+
-+      if ( !(acx_debug & (L_IOCTL|L_DEBUG)) )
-+              return OK;
-+      /* using printk() since we checked debug flag already */
-+
-+      acx_sem_lock(adev);
-+
-+      if (!IS_ACX111(adev)) {
-+              printk("acx111-specific function called "
-+                      "with non-acx111 chip, aborting\n");
-+              goto end_ok;
-+      }
-+
-+      /* get Acx111 Memory Configuration */
-+      memset(&memconf, 0, sizeof(memconf));
-+      /* BTW, fails with 12 (Write only) error code.
-+      ** Retained for easy testing of issue_cmd error handling :) */
-+      printk ("Interrogating queue config\n");
-+      acx_s_interrogate(adev, &memconf, ACX1xx_IE_QUEUE_CONFIG);
-+      printk ("done with queue config\n");
-+
-+      /* get Acx111 Queue Configuration */
-+      memset(&queueconf, 0, sizeof(queueconf));
-+      printk ("Interrogating mem config options\n");
-+      acx_s_interrogate(adev, &queueconf, ACX1xx_IE_MEMORY_CONFIG_OPTIONS);
-+      printk ("done with mem config options\n");
-+
-+      /* get Acx111 Memory Map */
-+      memset(memmap, 0, sizeof(memmap));
-+      printk ("Interrogating mem map\n");
-+      acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP);
-+      printk ("done with mem map\n");
-+
-+      /* get Acx111 Rx Config */
-+      memset(rxconfig, 0, sizeof(rxconfig));
-+      printk ("Interrogating rxconfig\n");
-+      acx_s_interrogate(adev, &rxconfig, ACX1xx_IE_RXCONFIG);
-+      printk ("done with queue rxconfig\n");
-+
-+      /* get Acx111 fcs error count */
-+      memset(fcserror, 0, sizeof(fcserror));
-+      printk ("Interrogating fcs err count\n");
-+      acx_s_interrogate(adev, &fcserror, ACX1xx_IE_FCS_ERROR_COUNT);
-+      printk ("done with err count\n");
-+
-+      /* get Acx111 rate fallback */
-+      memset(ratefallback, 0, sizeof(ratefallback));
-+      printk ("Interrogating rate fallback\n");
-+      acx_s_interrogate(adev, &ratefallback, ACX1xx_IE_RATE_FALLBACK);
-+      printk ("done with rate fallback\n");
-+
-+      /* force occurrence of a beacon interrupt */
-+      /* TODO: comment why is this necessary */
-+      write_reg16(adev, IO_ACX_HINT_TRIG, HOST_INT_BEACON);
-+
-+      /* dump Acx111 Mem Configuration */
-+      printk("dump mem config:\n"
-+              "data read: %d, struct size: %d\n"
-+              "Number of stations: %1X\n"
-+              "Memory block size: %1X\n"
-+              "tx/rx memory block allocation: %1X\n"
-+              "count rx: %X / tx: %X queues\n"
-+              "options %1X\n"
-+              "fragmentation %1X\n"
-+              "Rx Queue 1 Count Descriptors: %X\n"
-+              "Rx Queue 1 Host Memory Start: %X\n"
-+              "Tx Queue 1 Count Descriptors: %X\n"
-+              "Tx Queue 1 Attributes: %X\n",
-+              memconf.len, (int) sizeof(memconf),
-+              memconf.no_of_stations,
-+              memconf.memory_block_size,
-+              memconf.tx_rx_memory_block_allocation,
-+              memconf.count_rx_queues, memconf.count_tx_queues,
-+              memconf.options,
-+              memconf.fragmentation,
-+              memconf.rx_queue1_count_descs,
-+      acx2cpu(memconf.rx_queue1_host_rx_start),
-+              memconf.tx_queue1_count_descs,
-+              memconf.tx_queue1_attributes);
-+
-+      /* dump Acx111 Queue Configuration */
-+      printk("dump queue head:\n"
-+              "data read: %d, struct size: %d\n"
-+              "tx_memory_block_address (from card): %X\n"
-+              "rx_memory_block_address (from card): %X\n"
-+              "rx1_queue address (from card): %X\n"
-+              "tx1_queue address (from card): %X\n"
-+              "tx1_queue attributes (from card): %X\n",
-+              queueconf.len, (int) sizeof(queueconf),
-+              queueconf.tx_memory_block_address,
-+              queueconf.rx_memory_block_address,
-+              queueconf.rx1_queue_address,
-+              queueconf.tx1_queue_address,
-+              queueconf.tx1_attributes);
-+
-+      /* dump Acx111 Mem Map */
-+      printk("dump mem map:\n"
-+              "data read: %d, struct size: %d\n"
-+              "Code start: %X\n"
-+              "Code end: %X\n"
-+              "WEP default key start: %X\n"
-+              "WEP default key end: %X\n"
-+              "STA table start: %X\n"
-+              "STA table end: %X\n"
-+              "Packet template start: %X\n"
-+              "Packet template end: %X\n"
-+              "Queue memory start: %X\n"
-+              "Queue memory end: %X\n"
-+              "Packet memory pool start: %X\n"
-+              "Packet memory pool end: %X\n"
-+              "iobase: %p\n"
-+              "iobase2: %p\n",
-+              *((u16 *)&memmap[0x02]), (int) sizeof(memmap),
-+              *((u32 *)&memmap[0x04]),
-+              *((u32 *)&memmap[0x08]),
-+              *((u32 *)&memmap[0x0C]),
-+              *((u32 *)&memmap[0x10]),
-+              *((u32 *)&memmap[0x14]),
-+              *((u32 *)&memmap[0x18]),
-+              *((u32 *)&memmap[0x1C]),
-+              *((u32 *)&memmap[0x20]),
-+              *((u32 *)&memmap[0x24]),
-+              *((u32 *)&memmap[0x28]),
-+              *((u32 *)&memmap[0x2C]),
-+              *((u32 *)&memmap[0x30]),
-+              adev->iobase,
-+              adev->iobase2);
-+
-+      /* dump Acx111 Rx Config */
-+      printk("dump rx config:\n"
-+              "data read: %d, struct size: %d\n"
-+              "rx config: %X\n"
-+              "rx filter config: %X\n",
-+              *((u16 *)&rxconfig[0x02]), (int) sizeof(rxconfig),
-+              *((u16 *)&rxconfig[0x04]),
-+              *((u16 *)&rxconfig[0x06]));
-+
-+      /* dump Acx111 fcs error */
-+      printk("dump fcserror:\n"
-+              "data read: %d, struct size: %d\n"
-+              "fcserrors: %X\n",
-+              *((u16 *)&fcserror[0x02]), (int) sizeof(fcserror),
-+              *((u32 *)&fcserror[0x04]));
-+
-+      /* dump Acx111 rate fallback */
-+      printk("dump rate fallback:\n"
-+              "data read: %d, struct size: %d\n"
-+              "ratefallback: %X\n",
-+              *((u16 *)&ratefallback[0x02]), (int) sizeof(ratefallback),
-+              *((u8 *)&ratefallback[0x04]));
-+
-+      /* protect against IRQ */
-+      acx_lock(adev, flags);
-+
-+      /* dump acx111 internal rx descriptor ring buffer */
-+      rxdesc = adev->rxdesc_start;
-+
-+      /* loop over complete receive pool */
-+      if (rxdesc) for (i = 0; i < RX_CNT; i++) {
-+              printk("\ndump internal rxdesc %d:\n"
-+                      "mem pos %p\n"
-+                      "next 0x%X\n"
-+                      "acx mem pointer (dynamic) 0x%X\n"
-+                      "CTL (dynamic) 0x%X\n"
-+                      "Rate (dynamic) 0x%X\n"
-+                      "RxStatus (dynamic) 0x%X\n"
-+                      "Mod/Pre (dynamic) 0x%X\n",
-+                      i,
-+                      rxdesc,
-+                      acx2cpu(rxdesc->pNextDesc),
-+                      acx2cpu(rxdesc->ACXMemPtr),
-+                      rxdesc->Ctl_8,
-+                      rxdesc->rate,
-+                      rxdesc->error,
-+                      rxdesc->SNR);
-+              rxdesc++;
-+      }
-+
-+      /* dump host rx descriptor ring buffer */
-+
-+      rxhostdesc = adev->rxhostdesc_start;
-+
-+      /* loop over complete receive pool */
-+      if (rxhostdesc) for (i = 0; i < RX_CNT; i++) {
-+              printk("\ndump host rxdesc %d:\n"
-+                      "mem pos %p\n"
-+                      "buffer mem pos 0x%X\n"
-+                      "buffer mem offset 0x%X\n"
-+                      "CTL 0x%X\n"
-+                      "Length 0x%X\n"
-+                      "next 0x%X\n"
-+                      "Status 0x%X\n",
-+                      i,
-+                      rxhostdesc,
-+                      acx2cpu(rxhostdesc->data_phy),
-+                      rxhostdesc->data_offset,
-+                      le16_to_cpu(rxhostdesc->Ctl_16),
-+                      le16_to_cpu(rxhostdesc->length),
-+                      acx2cpu(rxhostdesc->desc_phy_next),
-+                      rxhostdesc->Status);
-+              rxhostdesc++;
-+      }
-+
-+      /* dump acx111 internal tx descriptor ring buffer */
-+      txdesc = adev->txdesc_start;
-+
-+      /* loop over complete transmit pool */
-+      if (txdesc) for (i = 0; i < TX_CNT; i++) {
-+              printk("\ndump internal txdesc %d:\n"
-+                      "size 0x%X\n"
-+                      "mem pos %p\n"
-+                      "next 0x%X\n"
-+                      "acx mem pointer (dynamic) 0x%X\n"
-+                      "host mem pointer (dynamic) 0x%X\n"
-+                      "length (dynamic) 0x%X\n"
-+                      "CTL (dynamic) 0x%X\n"
-+                      "CTL2 (dynamic) 0x%X\n"
-+                      "Status (dynamic) 0x%X\n"
-+                      "Rate (dynamic) 0x%X\n",
-+                      i,
-+                      (int) sizeof(struct txdesc),
-+                      txdesc,
-+                      acx2cpu(txdesc->pNextDesc),
-+                      acx2cpu(txdesc->AcxMemPtr),
-+                      acx2cpu(txdesc->HostMemPtr),
-+                      le16_to_cpu(txdesc->total_length),
-+                      txdesc->Ctl_8,
-+                      txdesc->Ctl2_8, txdesc->error,
-+                      txdesc->u.r1.rate);
-+              txdesc = advance_txdesc(adev, txdesc, 1);
-+      }
-+
-+      /* dump host tx descriptor ring buffer */
-+
-+      txhostdesc = adev->txhostdesc_start;
-+
-+      /* loop over complete host send pool */
-+      if (txhostdesc) for (i = 0; i < TX_CNT * 2; i++) {
-+              printk("\ndump host txdesc %d:\n"
-+                      "mem pos %p\n"
-+                      "buffer mem pos 0x%X\n"
-+                      "buffer mem offset 0x%X\n"
-+                      "CTL 0x%X\n"
-+                      "Length 0x%X\n"
-+                      "next 0x%X\n"
-+                      "Status 0x%X\n",
-+                      i,
-+                      txhostdesc,
-+                      acx2cpu(txhostdesc->data_phy),
-+                      txhostdesc->data_offset,
-+                      le16_to_cpu(txhostdesc->Ctl_16),
-+                      le16_to_cpu(txhostdesc->length),
-+                      acx2cpu(txhostdesc->desc_phy_next),
-+                      le32_to_cpu(txhostdesc->Status));
-+              txhostdesc++;
-+      }
-+
-+      /* write_reg16(adev, 0xb4, 0x4); */
-+
-+      acx_unlock(adev, flags);
-+end_ok:
-+
-+      acx_sem_unlock(adev);
-+#endif /* ACX_DEBUG */
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acx100mem_ioctl_set_phy_amp_bias(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      u16 gpio_old;
-+
-+      if (!IS_ACX100(adev)) {
-+              /* WARNING!!!
-+               * Removing this check *might* damage
-+               * hardware, since we're tweaking GPIOs here after all!!!
-+               * You've been warned...
-+               * WARNING!!! */
-+              printk("acx: sorry, setting bias level for non-acx100 "
-+                      "is not supported yet\n");
-+              return OK;
-+      }
-+
-+      if (*extra > 7) {
-+              printk("acx: invalid bias parameter, range is 0-7\n");
-+              return -EINVAL;
-+      }
-+
-+      acx_sem_lock(adev);
-+
-+      /* Need to lock accesses to [IO_ACX_GPIO_OUT]:
-+       * IRQ handler uses it to update LED */
-+      acx_lock(adev, flags);
-+      gpio_old = read_reg16(adev, IO_ACX_GPIO_OUT);
-+      write_reg16(adev, IO_ACX_GPIO_OUT, (gpio_old & 0xf8ff) | ((u16)*extra << 8));
-+      acx_unlock(adev, flags);
-+
-+      log(L_DEBUG, "gpio_old: 0x%04X\n", gpio_old);
-+      printk("%s: PHY power amplifier bias: old:%d, new:%d\n",
-+              ndev->name,
-+              (gpio_old & 0x0700) >> 8, (unsigned char)*extra);
-+
-+      acx_sem_unlock(adev);
-+
-+      return OK;
-+}
-+
-+/***************************************************************
-+** acxmem_l_alloc_tx
-+** Actually returns a txdesc_t* ptr
-+**
-+** FIXME: in case of fragments, should allocate multiple descrs
-+** after figuring out how many we need and whether we still have
-+** sufficiently many.
-+*/
-+tx_t*
-+acxmem_l_alloc_tx(acx_device_t *adev)
-+{
-+      struct txdesc *txdesc;
-+      unsigned head;
-+      u8 ctl8;
-+      static int txattempts = 0;
-+
-+      FN_ENTER;
-+
-+      if (unlikely(!adev->tx_free)) {
-+              printk("acx: BUG: no free txdesc left\n");
-+              /*
-+               * Probably the ACX ignored a transmit attempt and now there's a packet
-+               * sitting in the queue we think should be transmitting but the ACX doesn't
-+               * know about.
-+               * On the first pass, send the ACX a TxProc interrupt to try moving
-+               * things along, and if that doesn't work (ie, we get called again) completely
-+               * flush the transmit queue.
-+               */
-+              if (txattempts < 10) {
-+                txattempts++;
-+                printk ("acx: trying to wake up ACX\n");
-+                write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC);
-+                write_flush(adev);            }
-+              else  {
-+                txattempts = 0;
-+                printk ("acx: flushing transmit queue.\n");
-+                acxmem_l_clean_txdesc_emergency (adev);
-+              }
-+              txdesc = NULL;
-+              goto end;
-+      }
-+
-+      /*
-+       * Make a quick check to see if there is transmit buffer space on
-+       * the ACX.  This can't guarantee there is enough space for the packet
-+       * since we don't yet know how big it is, but it will prevent at least some
-+       * annoyances.
-+       */
-+      if (!adev->acx_txbuf_blocks_free) {
-+        txdesc = NULL;
-+        goto end;
-+      }
-+
-+      head = adev->tx_head;
-+      /*
-+       * txdesc points to ACX memory
-+       */
-+      txdesc = get_txdesc(adev, head);
-+      ctl8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+
-+      /* 
-+       * If we don't own the buffer (HOSTOWN) it is certainly not free; however,
-+       * we may have previously thought we had enough memory to send
-+       * a packet, allocated the buffer then gave up when we found not enough
-+       * transmit buffer space on the ACX. In that case, HOSTOWN and
-+       * ACXDONE will both be set.
-+       */
-+      if (unlikely(DESC_CTL_HOSTOWN != (ctl8 & DESC_CTL_HOSTOWN))) {
-+              /* whoops, descr at current index is not free, so probably
-+               * ring buffer already full */
-+                printk("acx: BUG: tx_head:%d Ctl8:0x%02X - failed to find "
-+                        "free txdesc\n", head, ctl8);
-+              txdesc = NULL;
-+              goto end;
-+      }
-+
-+      /* Needed in case txdesc won't be eventually submitted for tx */
-+      write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_ACXDONE_HOSTOWN);
-+
-+      adev->tx_free--;
-+      log(L_BUFT, "tx: got desc %u, %u remain\n",
-+                      head, adev->tx_free);
-+      /* Keep a few free descs between head and tail of tx ring.
-+      ** It is not absolutely needed, just feels safer */
-+      if (adev->tx_free < TX_STOP_QUEUE) {
-+              log(L_BUF, "stop queue (%u tx desc left)\n",
-+                              adev->tx_free);
-+              acx_stop_queue(adev->ndev, NULL);
-+      }
-+
-+      /* returning current descriptor, so advance to next free one */
-+      adev->tx_head = (head + 1) % TX_CNT;
-+end:
-+      FN_EXIT0;
-+
-+      return (tx_t*)txdesc;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_l_dealloc_tx
-+** Clears out a previously allocatedvoid acxmem_l_dealloc_tx(tx_t *tx_opaque);
-+ transmit descriptor.  The ACX
-+** can get confused if we skip transmit descriptors in the queue,
-+** so when we don't need a descriptor return it to its original
-+** state and move the queue head pointer back.
-+**
-+*/
-+void
-+acxmem_l_dealloc_tx(acx_device_t *adev, tx_t *tx_opaque)
-+{
-+  /*
-+   * txdesc is the address of the descriptor on the ACX.
-+   */
-+  txdesc_t *txdesc = (txdesc_t*)tx_opaque;
-+  txdesc_t tmptxdesc;
-+  int index;
-+
-+  memset (&tmptxdesc, 0, sizeof(tmptxdesc));
-+  tmptxdesc.Ctl_8 = DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG;
-+  tmptxdesc.u.r1.rate = 0x0a;
-+
-+  /*
-+   * Clear out all of the transmit descriptor except for the next pointer
-+   */
-+  copy_to_slavemem (adev, (u32) &(txdesc->HostMemPtr),
-+                  (u8 *) &(tmptxdesc.HostMemPtr),
-+                  sizeof (tmptxdesc) - sizeof(tmptxdesc.pNextDesc));
-+  
-+  /*
-+   * This is only called immediately after we've allocated, so we should
-+   * be able to set the head back to this descriptor.
-+   */
-+  index = ((u8*) txdesc - (u8*)adev->txdesc_start) / adev->txdesc_size;
-+  printk ("acx_dealloc: moving head from %d to %d\n", adev->tx_head, index);
-+  adev->tx_head = index;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+void*
-+acxmem_l_get_txbuf(acx_device_t *adev, tx_t* tx_opaque)
-+{
-+      return get_txhostdesc(adev, (txdesc_t*)tx_opaque)->data;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_l_tx_data
-+**
-+** Can be called from IRQ (rx -> (AP bridging or mgmt response) -> tx).
-+** Can be called from acx_i_start_xmit (data frames from net core).
-+**
-+** FIXME: in case of fragments, should loop over the number of
-+** pre-allocated tx descrs, properly setting up transfer data and
-+** CTL_xxx flags according to fragment number.
-+*/
-+void
-+acxmem_update_queue_indicator (acx_device_t *adev, int txqueue)
-+{
-+#ifdef USING_MORE_THAN_ONE_TRANSMIT_QUEUE
-+  u32 indicator;
-+  unsigned long flags;
-+  int count;
-+
-+  /*
-+   * Can't handle an interrupt while we're fiddling with the ACX's lock,
-+   * according to TI.  The ACX is supposed to hold fw_lock for at most
-+   * 500ns.
-+   */
-+  local_irq_save (flags);
-+
-+  /*
-+   * Wait for ACX to release the lock (at most 500ns).
-+   */
-+  count = 0;
-+  while (read_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->fw_lock))
-+       && (count++ < 50)) {
-+    ndelay (10);
-+  }
-+  if (count < 50) {
-+
-+    /*
-+     * Take out the host lock - anything non-zero will work, so don't worry about
-+     * be/le
-+     */
-+    write_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->host_lock), 1);
-+
-+    /*
-+     * Avoid a race condition
-+     */
-+    count = 0;
-+    while (read_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->fw_lock))
-+         && (count++ < 50)) {
-+      ndelay (10);
-+    }
-+
-+    if (count < 50) {
-+      /*
-+       * Mark the queue active
-+       */
-+      indicator = read_slavemem32 (adev, (u32) &(adev->acx_queue_indicator->indicator));
-+      indicator |= cpu_to_le32 (1 << txqueue);
-+      write_slavemem32 (adev, (u32) &(adev->acx_queue_indicator->indicator), indicator);
-+    }
-+
-+    /*
-+     * Release the host lock
-+     */
-+    write_slavemem16 (adev, (u32) &(adev->acx_queue_indicator->host_lock), 0);
-+
-+  }
-+
-+  /*
-+   * Restore interrupts
-+   */
-+  local_irq_restore (flags);
-+#endif
-+}
-+
-+void
-+acxmem_l_tx_data(acx_device_t *adev, tx_t* tx_opaque, int len)
-+{
-+  /*
-+   * txdesc is the address on the ACX
-+   */
-+      txdesc_t *txdesc = (txdesc_t*)tx_opaque;
-+      txhostdesc_t *hostdesc1, *hostdesc2;
-+      client_t *clt;
-+      u16 rate_cur;
-+      u8 Ctl_8, Ctl2_8;
-+      u32 addr;
-+
-+      FN_ENTER;
-+      /* fw doesn't tx such packets anyhow */
-+      if (unlikely(len < WLAN_HDR_A3_LEN))
-+              goto end;
-+
-+      hostdesc1 = get_txhostdesc(adev, txdesc);
-+      /* modify flag status in separate variable to be able to write it back
-+       * in one big swoop later (also in order to have less device memory
-+       * accesses) */
-+      Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+      Ctl2_8 = 0; /* really need to init it to 0, not txdesc->Ctl2_8, it seems */
-+
-+      hostdesc2 = hostdesc1 + 1;
-+
-+      /* DON'T simply set Ctl field to 0 here globally,
-+       * it needs to maintain a consistent flag status (those are state flags!!),
-+       * otherwise it may lead to severe disruption. Only set or reset particular
-+       * flags at the exact moment this is needed... */
-+
-+      /* let chip do RTS/CTS handshaking before sending
-+       * in case packet size exceeds threshold */
-+      if (len > adev->rts_threshold)
-+              SET_BIT(Ctl2_8, DESC_CTL2_RTS);
-+      else
-+              CLEAR_BIT(Ctl2_8, DESC_CTL2_RTS);
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+      case ACX_MODE_3_AP:
-+              clt = acx_l_sta_list_get(adev, ((wlan_hdr_t*)hostdesc1->data)->a1);
-+              break;
-+      case ACX_MODE_2_STA:
-+              clt = adev->ap_client;
-+              break;
-+#if 0
-+/* testing was done on acx111: */
-+      case ACX_MODE_MONITOR:
-+              SET_BIT(Ctl2_8, 0
-+/* sends CTS to self before packet */
-+                      + DESC_CTL2_SEQ         /* don't increase sequence field */
-+/* not working (looks like good fcs is still added) */
-+                      + DESC_CTL2_FCS         /* don't add the FCS */
-+/* not tested */
-+                      + DESC_CTL2_MORE_FRAG
-+/* not tested */
-+                      + DESC_CTL2_RETRY       /* don't increase retry field */
-+/* not tested */
-+                      + DESC_CTL2_POWER       /* don't increase power mgmt. field */
-+/* no effect */
-+                      + DESC_CTL2_WEP         /* encrypt this frame */
-+/* not tested */
-+                      + DESC_CTL2_DUR         /* don't increase duration field */
-+                      );
-+              /* fallthrough */
-+#endif
-+      default: /* ACX_MODE_OFF, ACX_MODE_MONITOR */
-+              clt = NULL;
-+              break;
-+      }
-+
-+      rate_cur = clt ? clt->rate_cur : adev->rate_bcast;
-+      if (unlikely(!rate_cur)) {
-+              printk("acx: driver bug! bad ratemask\n");
-+              goto end;
-+      }
-+
-+      /* used in tx cleanup routine for auto rate and accounting: */
-+      put_txcr(adev, txdesc, clt, rate_cur);
-+
-+      write_slavemem16 (adev, (u32) &(txdesc->total_length), cpu_to_le16(len));
-+      hostdesc2->length = cpu_to_le16(len - WLAN_HDR_A3_LEN);
-+      if (IS_ACX111(adev)) {
-+              /* note that if !txdesc->do_auto, txrate->cur
-+              ** has only one nonzero bit */
-+              txdesc->u.r2.rate111 = cpu_to_le16(
-+                      rate_cur
-+                      /* WARNING: I was never able to make it work with prism54 AP.
-+                      ** It was falling down to 1Mbit where shortpre is not applicable,
-+                      ** and not working at all at "5,11 basic rates only" setting.
-+                      ** I even didn't see tx packets in radio packet capture.
-+                      ** Disabled for now --vda */
-+                      /*| ((clt->shortpre && clt->cur!=RATE111_1) ? RATE111_SHORTPRE : 0) */
-+                      );
-+#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS
-+                      /* should add this to rate111 above as necessary */
-+                      | (clt->pbcc511 ? RATE111_PBCC511 : 0)
-+#endif
-+              hostdesc1->length = cpu_to_le16(len);
-+      } else { /* ACX100 */
-+              u8 rate_100 = clt ? clt->rate_100 : adev->rate_bcast100;
-+              write_slavemem8 (adev, (u32) &(txdesc->u.r1.rate), rate_100);
-+#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS
-+              if (clt->pbcc511) {
-+                      if (n == RATE100_5 || n == RATE100_11)
-+                              n |= RATE100_PBCC511;
-+              }
-+
-+              if (clt->shortpre && (clt->cur != RATE111_1))
-+                      SET_BIT(Ctl_8, DESC_CTL_SHORT_PREAMBLE); /* set Short Preamble */
-+#endif
-+              /* set autodma and reclaim and 1st mpdu */
-+              SET_BIT(Ctl_8, DESC_CTL_FIRSTFRAG);
-+
-+#if ACX_FRAGMENTATION
-+              /* SET_BIT(Ctl2_8, DESC_CTL2_MORE_FRAG); cannot set it unconditionally, needs to be set for all non-last fragments */
-+#endif
-+              hostdesc1->length = cpu_to_le16(WLAN_HDR_A3_LEN);
-+
-+              /*
-+               * Since we're not using autodma copy the packet data to the acx now.
-+               * Even host descriptors point to the packet header, and the odd indexed
-+               * descriptor following points to the packet data.
-+               *
-+               * The first step is to find free memory in the ACX transmit buffers.
-+               * They don't necessarily map one to one with the transmit queue entries,
-+               * so search through them starting just after the last one used.
-+               */
-+              addr = allocate_acx_txbuf_space (adev, len);
-+              if (addr) {
-+                chaincopy_to_slavemem (adev, addr, hostdesc1->data, len);
-+              }
-+              else {
-+                /*
-+                 * Bummer.  We thought we might have enough room in the transmit
-+                 * buffers to send this packet, but it turns out we don't.  alloc_tx
-+                 * has already marked this transmit descriptor as HOSTOWN and ACXDONE,
-+                 * which means the ACX will hang when it gets to this descriptor unless
-+                 * we do something about it.  Having a bubble in the transmit queue just
-+                 * doesn't seem to work, so we have to reset this transmit queue entry's
-+                 * state to its original value and back up our head pointer to point
-+                 * back to this entry.
-+                 */
-+                hostdesc1->length = 0;
-+                hostdesc2->length = 0;
-+                write_slavemem16 (adev, (u32) &(txdesc->total_length), 0);
-+                write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG);
-+                adev->tx_head  = ((u8*) txdesc - (u8*) adev->txdesc_start) / adev->txdesc_size;
-+                goto end;
-+              }
-+              /*
-+               * Tell the ACX where the packet is.
-+               */
-+              write_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr), addr);
-+
-+      }
-+      /* don't need to clean ack/rts statistics here, already
-+       * done on descr cleanup */
-+
-+      /* clears HOSTOWN and ACXDONE bits, thus telling that the descriptors
-+       * are now owned by the acx100; do this as LAST operation */
-+      CLEAR_BIT(Ctl_8, DESC_CTL_ACXDONE_HOSTOWN);
-+      /* flush writes before we release hostdesc to the adapter here */
-+      //wmb();
-+
-+      /* write back modified flags */
-+      /*
-+       * At this point Ctl_8 should just be FIRSTFRAG
-+       */
-+      write_slavemem8 (adev, (u32) &(txdesc->Ctl2_8),Ctl2_8);
-+      write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), Ctl_8);
-+      /* unused: txdesc->tx_time = cpu_to_le32(jiffies); */
-+
-+      /*
-+       * Update the queue indicator to say there's data on the first queue.
-+       */
-+      acxmem_update_queue_indicator (adev, 0);
-+
-+      /* flush writes before we tell the adapter that it's its turn now */
-+      mmiowb();
-+      write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC);
-+      write_flush(adev);
-+
-+      /* log the packet content AFTER sending it,
-+       * in order to not delay sending any further than absolutely needed
-+       * Do separate logs for acx100/111 to have human-readable rates */
-+      if (unlikely(acx_debug & (L_XFER|L_DATA))) {
-+              u16 fc = ((wlan_hdr_t*)hostdesc1->data)->fc;
-+              if (IS_ACX111(adev))
-+                      printk("tx: pkt (%s): len %d "
-+                              "rate %04X%s status %u\n",
-+                              acx_get_packet_type_string(le16_to_cpu(fc)), len,
-+                              le16_to_cpu(txdesc->u.r2.rate111),
-+                              (le16_to_cpu(txdesc->u.r2.rate111) & RATE111_SHORTPRE) ? "(SPr)" : "",
-+                              adev->status);
-+              else
-+                      printk("tx: pkt (%s): len %d rate %03u%s status %u\n",
-+                              acx_get_packet_type_string(fc), len,
-+                              read_slavemem8 (adev, (u32) &(txdesc->u.r1.rate)),
-+                              (Ctl_8 & DESC_CTL_SHORT_PREAMBLE) ? "(SPr)" : "",
-+                              adev->status);
-+
-+              if (acx_debug & L_DATA) {
-+                      printk("tx: 802.11 [%d]: ", len);
-+                      acx_dump_bytes(hostdesc1->data, len);
-+              }
-+      }
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_l_clean_txdesc
-+**
-+** This function resets the txdescs' status when the ACX100
-+** signals the TX done IRQ (txdescs have been processed), starting with
-+** the pool index of the descriptor which we would use next,
-+** in order to make sure that we can be as fast as possible
-+** in filling new txdescs.
-+** Everytime we get called we know where the next packet to be cleaned is.
-+*/
-+
-+#if !ACX_DEBUG
-+static inline void log_txbuffer(const acx_device_t *adev) {}
-+#else
-+static void
-+log_txbuffer(acx_device_t *adev)
-+{
-+      txdesc_t *txdesc;
-+      int i;
-+      u8 Ctl_8;
-+
-+      /* no FN_ENTER here, we don't want that */
-+      /* no locks here, since it's entirely non-critical code */
-+      txdesc = adev->txdesc_start;
-+      if (unlikely(!txdesc)) return;
-+      printk("tx: desc->Ctl8's:");
-+      for (i = 0; i < TX_CNT; i++) {
-+        Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+              printk(" %02X", Ctl_8);
-+              txdesc = advance_txdesc(adev, txdesc, 1);
-+      }
-+      printk("\n");
-+}
-+#endif
-+
-+
-+static void
-+handle_tx_error(acx_device_t *adev, u8 error, unsigned int finger)
-+{
-+      const char *err = "unknown error";
-+
-+      /* hmm, should we handle this as a mask
-+       * of *several* bits?
-+       * For now I think only caring about
-+       * individual bits is ok... */
-+      switch (error) {
-+      case 0x01:
-+              err = "no Tx due to error in other fragment";
-+              adev->wstats.discard.fragment++;
-+              break;
-+      case 0x02:
-+              err = "Tx aborted";
-+              adev->stats.tx_aborted_errors++;
-+              break;
-+      case 0x04:
-+              err = "Tx desc wrong parameters";
-+              adev->wstats.discard.misc++;
-+              break;
-+      case 0x08:
-+              err = "WEP key not found";
-+              adev->wstats.discard.misc++;
-+              break;
-+      case 0x10:
-+              err = "MSDU lifetime timeout? - try changing "
-+                              "'iwconfig retry lifetime XXX'";
-+              adev->wstats.discard.misc++;
-+              break;
-+      case 0x20:
-+              err = "excessive Tx retries due to either distance "
-+                      "too high or unable to Tx or Tx frame error - "
-+                      "try changing 'iwconfig txpower XXX' or "
-+                      "'sens'itivity or 'retry'";
-+              adev->wstats.discard.retries++;
-+              /* Tx error 0x20 also seems to occur on
-+               * overheating, so I'm not sure whether we
-+               * actually want to do aggressive radio recalibration,
-+               * since people maybe won't notice then that their hardware
-+               * is slowly getting cooked...
-+               * Or is it still a safe long distance from utter
-+               * radio non-functionality despite many radio recalibs
-+               * to final destructive overheating of the hardware?
-+               * In this case we really should do recalib here...
-+               * I guess the only way to find out is to do a
-+               * potentially fatal self-experiment :-\
-+               * Or maybe only recalib in case we're using Tx
-+               * rate auto (on errors switching to lower speed
-+               * --> less heat?) or 802.11 power save mode?
-+               *
-+               * ok, just do it. */
-+              if (++adev->retry_errors_msg_ratelimit % 4 == 0) {
-+                      if (adev->retry_errors_msg_ratelimit <= 20) {
-+                              printk("%s: several excessive Tx "
-+                                      "retry errors occurred, attempting "
-+                                      "to recalibrate radio. Radio "
-+                                      "drift might be caused by increasing "
-+                                      "card temperature, please check the card "
-+                                      "before it's too late!\n",
-+                                      adev->ndev->name);
-+                              if (adev->retry_errors_msg_ratelimit == 20)
-+                                      printk("disabling above message\n");
-+                      }
-+
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB);
-+              }
-+              break;
-+      case 0x40:
-+              err = "Tx buffer overflow";
-+              adev->stats.tx_fifo_errors++;
-+              break;
-+      case 0x80:
-+              err = "DMA error";
-+              adev->wstats.discard.misc++;
-+              break;
-+      }
-+      adev->stats.tx_errors++;
-+      if (adev->stats.tx_errors <= 20)
-+              printk("%s: tx error 0x%02X, buf %02u! (%s)\n",
-+                              adev->ndev->name, error, finger, err);
-+      else
-+              printk("%s: tx error 0x%02X, buf %02u!\n",
-+                              adev->ndev->name, error, finger);
-+}
-+
-+
-+unsigned int
-+acxmem_l_clean_txdesc(acx_device_t *adev)
-+{
-+      txdesc_t *txdesc;
-+      unsigned finger;
-+      int num_cleaned;
-+      u16 r111;
-+      u8 error, ack_failures, rts_failures, rts_ok, r100, Ctl_8;
-+      u32 acxmem;
-+      txdesc_t tmptxdesc;
-+
-+      FN_ENTER;
-+
-+      /*
-+       * Set up a template descriptor for re-initialization.  The only
-+       * things that get set are Ctl_8 and the rate, and the rate defaults
-+       * to 1Mbps.
-+       */
-+      memset (&tmptxdesc, 0, sizeof (tmptxdesc));
-+      tmptxdesc.Ctl_8 = DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG;
-+      tmptxdesc.u.r1.rate = 0x0a;
-+
-+      if (unlikely(acx_debug & L_DEBUG))
-+              log_txbuffer(adev);
-+
-+      log(L_BUFT, "tx: cleaning up bufs from %u\n", adev->tx_tail);
-+
-+      /* We know first descr which is not free yet. We advance it as far
-+      ** as we see correct bits set in following descs (if next desc
-+      ** is NOT free, we shouldn't advance at all). We know that in
-+      ** front of tx_tail may be "holes" with isolated free descs.
-+      ** We will catch up when all intermediate descs will be freed also */
-+
-+      finger = adev->tx_tail;
-+      num_cleaned = 0;
-+      while (likely(finger != adev->tx_head)) {
-+              txdesc = get_txdesc(adev, finger);
-+
-+              /* If we allocated txdesc on tx path but then decided
-+              ** to NOT use it, then it will be left as a free "bubble"
-+              ** in the "allocated for tx" part of the ring.
-+              ** We may meet it on the next ring pass here. */
-+
-+              /* stop if not marked as "tx finished" and "host owned" */
-+              Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+              if ((Ctl_8 & DESC_CTL_ACXDONE_HOSTOWN)
-+                                      != DESC_CTL_ACXDONE_HOSTOWN) {
-+                      if (unlikely(!num_cleaned)) { /* maybe remove completely */
-+                              log(L_BUFT, "clean_txdesc: tail isn't free. "
-+                                      "tail:%d head:%d\n",
-+                                      adev->tx_tail, adev->tx_head);
-+                      }
-+                      break;
-+              }
-+
-+              /* remember desc values... */
-+              error = read_slavemem8 (adev, (u32) &(txdesc->error));
-+              ack_failures = read_slavemem8 (adev, (u32) &(txdesc->ack_failures));
-+              rts_failures = read_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_failures));
-+              rts_ok = read_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_ok));
-+              r100 = read_slavemem8 (adev, (u32) &(txdesc->u.r1.rate));
-+              r111 = le16_to_cpu(read_slavemem16 (adev, (u32) &(txdesc->u.r2.rate111)));
-+
-+              /* need to check for certain error conditions before we
-+               * clean the descriptor: we still need valid descr data here */
-+              if (unlikely(0x30 & error)) {
-+                      /* only send IWEVTXDROP in case of retry or lifetime exceeded;
-+                       * all other errors mean we screwed up locally */
-+                      union iwreq_data wrqu;
-+                      wlan_hdr_t *hdr;
-+                      txhostdesc_t *hostdesc;
-+
-+                      hostdesc = get_txhostdesc(adev, txdesc);
-+                      hdr = (wlan_hdr_t *)hostdesc->data;
-+                      MAC_COPY(wrqu.addr.sa_data, hdr->a1);
-+                      wireless_send_event(adev->ndev, IWEVTXDROP, &wrqu, NULL);
-+              }
-+
-+              /*
-+               * Free up the transmit data buffers
-+               */
-+              acxmem = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr));
-+              if (acxmem) {
-+                reclaim_acx_txbuf_space (adev, acxmem);
-+              }
-+
-+              /* ...and free the desc by clearing all the fields 
-+                 except the next pointer */
-+              copy_to_slavemem (adev,
-+                                (u32) &(txdesc->HostMemPtr), 
-+                                (u8 *) &(tmptxdesc.HostMemPtr),
-+                                sizeof (tmptxdesc) - sizeof(tmptxdesc.pNextDesc)
-+                                );
-+
-+              adev->tx_free++;
-+              num_cleaned++;
-+
-+              if ((adev->tx_free >= TX_START_QUEUE)
-+               && (adev->status == ACX_STATUS_4_ASSOCIATED)
-+               && (acx_queue_stopped(adev->ndev))
-+              ) {
-+                      log(L_BUF, "tx: wake queue (avail. Tx desc %u)\n",
-+                                      adev->tx_free);
-+                      acx_wake_queue(adev->ndev, NULL);
-+              }
-+
-+              /* do error checking, rate handling and logging
-+               * AFTER having done the work, it's faster */
-+
-+              /* do rate handling */
-+              if (adev->rate_auto) {
-+                      struct client *clt = get_txc(adev, txdesc);
-+                      if (clt) {
-+                              u16 cur = get_txr(adev, txdesc);
-+                              if (clt->rate_cur == cur) {
-+                                      acx_l_handle_txrate_auto(adev, clt,
-+                                              cur, /* intended rate */
-+                                              r100, r111, /* actually used rate */
-+                                              (error & 0x30), /* was there an error? */
-+                                              TX_CNT + TX_CLEAN_BACKLOG - adev->tx_free);
-+                              }
-+                      }
-+              }
-+
-+              if (unlikely(error))
-+                      handle_tx_error(adev, error, finger);
-+
-+              if (IS_ACX111(adev))
-+                      log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u r111=%04X\n",
-+                              finger, ack_failures, rts_failures, rts_ok, r111);
-+              else
-+                      log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u rate=%u\n",
-+                              finger, ack_failures, rts_failures, rts_ok, r100);
-+
-+              /* update pointer for descr to be cleaned next */
-+              finger = (finger + 1) % TX_CNT;
-+      }
-+
-+      /* remember last position */
-+      adev->tx_tail = finger;
-+/* end: */
-+      FN_EXIT1(num_cleaned);
-+      return num_cleaned;
-+}
-+
-+/* clean *all* Tx descriptors, and regardless of their previous state.
-+ * Used for brute-force reset handling. */
-+void
-+acxmem_l_clean_txdesc_emergency(acx_device_t *adev)
-+{
-+      txdesc_t *txdesc;
-+      int i;
-+      u32 acxmem;
-+
-+      FN_ENTER;
-+
-+      for (i = 0; i < TX_CNT; i++) {
-+              txdesc = get_txdesc(adev, i);
-+
-+              /* free it */
-+              write_slavemem8 (adev, (u32) &(txdesc->ack_failures), 0);
-+              write_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_failures), 0);
-+              write_slavemem8 (adev, (u32) &(txdesc->u.rts.rts_ok), 0);
-+              write_slavemem8 (adev, (u32) &(txdesc->error), 0);
-+              write_slavemem8 (adev, (u32) &(txdesc->Ctl_8), DESC_CTL_HOSTOWN);
-+
-+              /*
-+               * Clean up the memory allocated on the ACX for this transmit descriptor.
-+               */
-+              acxmem = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr));
-+              if (acxmem) {
-+                reclaim_acx_txbuf_space (adev, acxmem);
-+              }               
-+              
-+              write_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr), 0);
-+      }
-+
-+      adev->tx_free = TX_CNT;
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_s_create_tx_host_desc_queue
-+*/
-+
-+static void*
-+allocate(acx_device_t *adev, size_t size, dma_addr_t *phy, const char *msg)
-+{
-+      void *ptr;
-+        ptr = kmalloc (size, GFP_KERNEL);
-+      /*
-+       * The ACX can't use the physical address, so we'll have to fake it
-+       * later and it might be handy to have the virtual address.
-+       */
-+      *phy = (dma_addr_t) NULL;
-+
-+      if (ptr) {
-+              log(L_DEBUG, "%s sz=%d adr=0x%p phy=0x%08llx\n",
-+                              msg, (int)size, ptr, (unsigned long long)*phy);
-+              memset(ptr, 0, size);
-+              return ptr;
-+      }
-+      printk(KERN_ERR "acx: %s allocation FAILED (%d bytes)\n",
-+                                      msg, (int)size);
-+      return NULL;
-+}
-+
-+
-+/*
-+ * In the generic slave memory access mode, most of the stuff in
-+ * the txhostdesc_t is unused.  It's only here because the rest of
-+ * the ACX driver expects it to be since the PCI version uses indirect
-+ * host memory organization with DMA.  Since we're not using DMA the
-+ * only use we have for the host descriptors is to store the packets
-+ * on the way out.
-+ */
-+static int
-+acxmem_s_create_tx_host_desc_queue(acx_device_t *adev)
-+{
-+      txhostdesc_t *hostdesc;
-+      u8 *txbuf;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* allocate TX buffer */
-+      adev->txbuf_area_size = TX_CNT * WLAN_A4FR_MAXLEN_WEP_FCS;
-+
-+      adev->txbuf_start = allocate(adev, adev->txbuf_area_size,
-+                                   &adev->txbuf_startphy, "txbuf_start");
-+      if (!adev->txbuf_start)
-+        goto fail;
-+
-+      /* allocate the TX host descriptor queue pool */
-+      adev->txhostdesc_area_size = TX_CNT * 2*sizeof(*hostdesc);
-+
-+      adev->txhostdesc_start = allocate(adev, adev->txhostdesc_area_size,
-+                                        &adev->txhostdesc_startphy, "txhostdesc_start");
-+      if (!adev->txhostdesc_start)
-+        goto fail;
-+
-+      /* check for proper alignment of TX host descriptor pool */
-+      if ((long) adev->txhostdesc_start & 3) {
-+              printk("acx: driver bug: dma alloc returns unaligned address\n");
-+              goto fail;
-+      }
-+
-+      hostdesc = adev->txhostdesc_start;
-+      txbuf = adev->txbuf_start;
-+
-+#if 0
-+/* Each tx buffer is accessed by hardware via
-+** txdesc -> txhostdesc(s) -> txbuffer(s).
-+** We use only one txhostdesc per txdesc, but it looks like
-+** acx111 is buggy: it accesses second txhostdesc
-+** (via hostdesc.desc_phy_next field) even if
-+** txdesc->length == hostdesc->length and thus
-+** entire packet was placed into first txhostdesc.
-+** Due to this bug acx111 hangs unless second txhostdesc
-+** has le16_to_cpu(hostdesc.length) = 3 (or larger)
-+** Storing NULL into hostdesc.desc_phy_next
-+** doesn't seem to help.
-+**
-+** Update: although it worked on Xterasys XN-2522g
-+** with len=3 trick, WG311v2 is even more bogus, doesn't work.
-+** Keeping this code (#ifdef'ed out) for documentational purposes.
-+*/
-+      for (i = 0; i < TX_CNT*2; i++) {
-+              hostdesc_phy += sizeof(*hostdesc);
-+              if (!(i & 1)) {
-+                      hostdesc->data_phy = cpu2acx(txbuf_phy);
-+                      /* hostdesc->data_offset = ... */
-+                      /* hostdesc->reserved = ... */
-+                      hostdesc->Ctl_16 = cpu_to_le16(DESC_CTL_HOSTOWN);
-+                      /* hostdesc->length = ... */
-+                      hostdesc->desc_phy_next = cpu2acx(hostdesc_phy);
-+                      hostdesc->pNext = ptr2acx(NULL);
-+                      /* hostdesc->Status = ... */
-+                      /* below: non-hardware fields */
-+                      hostdesc->data = txbuf;
-+
-+                      txbuf += WLAN_A4FR_MAXLEN_WEP_FCS;
-+                      txbuf_phy += WLAN_A4FR_MAXLEN_WEP_FCS;
-+              } else {
-+                      /* hostdesc->data_phy = ... */
-+                      /* hostdesc->data_offset = ... */
-+                      /* hostdesc->reserved = ... */
-+                      /* hostdesc->Ctl_16 = ... */
-+                      hostdesc->length = cpu_to_le16(3); /* bug workaround */
-+                      /* hostdesc->desc_phy_next = ... */
-+                      /* hostdesc->pNext = ... */
-+                      /* hostdesc->Status = ... */
-+                      /* below: non-hardware fields */
-+                      /* hostdesc->data = ... */
-+              }
-+              hostdesc++;
-+      }
-+#endif
-+/* We initialize two hostdescs so that they point to adjacent
-+** memory areas. Thus txbuf is really just a contiguous memory area */
-+      for (i = 0; i < TX_CNT*2; i++) {
-+              /* ->data is a non-hardware field: */
-+              hostdesc->data = txbuf;
-+
-+              if (!(i & 1)) {
-+                      txbuf += WLAN_HDR_A3_LEN;
-+              } else {
-+                      txbuf += WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN;
-+              }
-+              hostdesc++;
-+      }
-+      hostdesc--;
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+fail:
-+      printk("acx: create_tx_host_desc_queue FAILED\n");
-+      /* dealloc will be done by free function on error case */
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_s_create_rx_host_desc_queue
-+*/
-+/* the whole size of a data buffer (header plus data body)
-+ * plus 32 bytes safety offset at the end */
-+#define RX_BUFFER_SIZE (sizeof(rxbuffer_t) + 32)
-+
-+static int
-+acxmem_s_create_rx_host_desc_queue(acx_device_t *adev)
-+{
-+      rxhostdesc_t *hostdesc;
-+      rxbuffer_t *rxbuf;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* allocate the RX host descriptor queue pool */
-+      adev->rxhostdesc_area_size = RX_CNT * sizeof(*hostdesc);
-+
-+      adev->rxhostdesc_start = allocate(adev, adev->rxhostdesc_area_size,
-+                                        &adev->rxhostdesc_startphy, "rxhostdesc_start");
-+      if (!adev->rxhostdesc_start)
-+        goto fail;
-+
-+      /* check for proper alignment of RX host descriptor pool */
-+      if ((long) adev->rxhostdesc_start & 3) {
-+              printk("acx: driver bug: dma alloc returns unaligned address\n");
-+              goto fail;
-+      }
-+
-+      /* allocate Rx buffer pool which will be used by the acx
-+       * to store the whole content of the received frames in it */
-+      adev->rxbuf_area_size = RX_CNT * RX_BUFFER_SIZE;
-+
-+      adev->rxbuf_start = allocate(adev, adev->rxbuf_area_size,
-+                                   &adev->rxbuf_startphy, "rxbuf_start");
-+      if (!adev->rxbuf_start)
-+        goto fail;
-+
-+      rxbuf = adev->rxbuf_start;
-+      hostdesc = adev->rxhostdesc_start;
-+
-+      /* don't make any popular C programming pointer arithmetic mistakes
-+       * here, otherwise I'll kill you...
-+       * (and don't dare asking me why I'm warning you about that...) */
-+      for (i = 0; i < RX_CNT; i++) {
-+              hostdesc->data = rxbuf;
-+              hostdesc->length = cpu_to_le16(RX_BUFFER_SIZE);
-+              rxbuf++;
-+              hostdesc++;
-+      }
-+      hostdesc--;
-+      FN_EXIT1(OK);
-+      return OK;
-+fail:
-+      printk("acx: create_rx_host_desc_queue FAILED\n");
-+      /* dealloc will be done by free function on error case */
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_s_create_hostdesc_queues
-+*/
-+int
-+acxmem_s_create_hostdesc_queues(acx_device_t *adev)
-+{
-+      int result;
-+      result = acxmem_s_create_tx_host_desc_queue(adev);
-+      if (OK != result) return result;
-+      result = acxmem_s_create_rx_host_desc_queue(adev);
-+      return result;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_create_tx_desc_queue
-+*/
-+static void
-+acxmem_create_tx_desc_queue(acx_device_t *adev, u32 tx_queue_start)
-+{
-+      txdesc_t *txdesc;
-+      u32 clr;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      if (IS_ACX100(adev))
-+              adev->txdesc_size = sizeof(*txdesc);
-+      else
-+              /* the acx111 txdesc is 4 bytes larger */
-+              adev->txdesc_size = sizeof(*txdesc) + 4;
-+
-+      /*
-+       * This refers to an ACX address, not one of ours
-+       */
-+      adev->txdesc_start = (txdesc_t *) tx_queue_start;
-+
-+      log(L_DEBUG, "adev->txdesc_start=%p\n",
-+                      adev->txdesc_start);
-+
-+      adev->tx_free = TX_CNT;
-+      /* done by memset: adev->tx_head = 0; */
-+      /* done by memset: adev->tx_tail = 0; */
-+      txdesc = adev->txdesc_start;
-+
-+      if (IS_ACX111(adev)) {
-+              /* ACX111 has a preinitialized Tx buffer! */
-+              /* loop over whole send pool */
-+              /* FIXME: do we have to do the hostmemptr stuff here?? */
-+              for (i = 0; i < TX_CNT; i++) {
-+                      txdesc->Ctl_8 = DESC_CTL_HOSTOWN;
-+                      /* reserve two (hdr desc and payload desc) */
-+                      txdesc = advance_txdesc(adev, txdesc, 1);
-+              }
-+      } else {
-+              /* ACX100 Tx buffer needs to be initialized by us */
-+              /* clear whole send pool. sizeof is safe here (we are acx100) */
-+
-+              /*
-+               * adev->txdesc_start refers to device memory, so we can't write
-+               * directly to it.
-+               */
-+              clr = (u32) adev->txdesc_start;
-+              while (clr < (u32) adev->txdesc_start + (TX_CNT * sizeof(*txdesc))) {
-+                write_slavemem32 (adev, clr, 0);
-+                clr += 4;
-+              }
-+
-+              /* loop over whole send pool */
-+              for (i = 0; i < TX_CNT; i++) {
-+                      log(L_DEBUG, "configure card tx descriptor: 0x%p, "
-+                              "size: 0x%X\n", txdesc, adev->txdesc_size);
-+
-+                      /* initialise ctl */
-+                      /*
-+                       * No auto DMA here
-+                       */
-+                      write_slavemem8 (adev, (u32) &(txdesc->Ctl_8),
-+                                      (u8) (DESC_CTL_HOSTOWN | DESC_CTL_FIRSTFRAG));
-+                      /* done by memset(0): txdesc->Ctl2_8 = 0; */
-+
-+                      /* point to next txdesc */
-+                      write_slavemem32 (adev, (u32) &(txdesc->pNextDesc),
-+                                        (u32) cpu_to_le32 ((u8 *) txdesc + adev->txdesc_size));
-+
-+                      /* go to the next one */
-+                      /* ++ is safe here (we are acx100) */
-+                      txdesc++;
-+              }
-+              /* go back to the last one */
-+              txdesc--;
-+              /* and point to the first making it a ring buffer */
-+              write_slavemem32 (adev, (u32) &(txdesc->pNextDesc),
-+                                (u32) cpu_to_le32 (tx_queue_start));
-+      }
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_create_rx_desc_queue
-+*/
-+static void
-+acxmem_create_rx_desc_queue(acx_device_t *adev, u32 rx_queue_start)
-+{
-+      rxdesc_t *rxdesc;
-+      u32 mem_offs;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* done by memset: adev->rx_tail = 0; */
-+
-+      /* ACX111 doesn't need any further config: preconfigures itself.
-+       * Simply print ring buffer for debugging */
-+      if (IS_ACX111(adev)) {
-+              /* rxdesc_start already set here */
-+
-+              adev->rxdesc_start = (rxdesc_t *) rx_queue_start;
-+
-+              rxdesc = adev->rxdesc_start;
-+              for (i = 0; i < RX_CNT; i++) {
-+                      log(L_DEBUG, "rx descriptor %d @ 0x%p\n", i, rxdesc);
-+                      rxdesc = adev->rxdesc_start = (rxdesc_t *)
-+                        acx2cpu(rxdesc->pNextDesc);
-+              }
-+      } else {
-+              /* we didn't pre-calculate rxdesc_start in case of ACX100 */
-+              /* rxdesc_start should be right AFTER Tx pool */
-+              adev->rxdesc_start = (rxdesc_t *)
-+                      ((u8 *) adev->txdesc_start + (TX_CNT * sizeof(txdesc_t)));
-+              /* NB: sizeof(txdesc_t) above is valid because we know
-+              ** we are in if (acx100) block. Beware of cut-n-pasting elsewhere!
-+              ** acx111's txdesc is larger! */
-+
-+              mem_offs = (u32) adev->rxdesc_start;
-+              while (mem_offs < (u32) adev->rxdesc_start + (RX_CNT * sizeof (*rxdesc))) {
-+                write_slavemem32 (adev, mem_offs, 0);
-+                mem_offs += 4;
-+              }
-+
-+              /* loop over whole receive pool */
-+              rxdesc = adev->rxdesc_start;
-+              for (i = 0; i < RX_CNT; i++) {
-+                      log(L_DEBUG, "rx descriptor @ 0x%p\n", rxdesc);
-+                      /* point to next rxdesc */
-+                      write_slavemem32 (adev, (u32) &(rxdesc->pNextDesc),
-+                                        (u32) cpu_to_le32 ((u8 *) rxdesc + sizeof(*rxdesc)));
-+                      /* go to the next one */
-+                      rxdesc++;
-+              }
-+              /* go to the last one */
-+              rxdesc--;
-+
-+              /* and point to the first making it a ring buffer */
-+              write_slavemem32 (adev, (u32) &(rxdesc->pNextDesc),
-+                                (u32) cpu_to_le32 (rx_queue_start));
-+      }
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxmem_create_desc_queues
-+*/
-+void
-+acxmem_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start)
-+{
-+  u32 *p;
-+  int i;
-+
-+      acxmem_create_tx_desc_queue(adev, tx_queue_start);
-+      acxmem_create_rx_desc_queue(adev, rx_queue_start);
-+      p = (u32 *) adev->acx_queue_indicator;
-+      for (i = 0; i < 4; i++) {
-+        write_slavemem32 (adev, (u32) p, 0);
-+        p++;
-+      }
-+}
-+
-+
-+/***************************************************************
-+** acxmem_s_proc_diag_output
-+*/
-+char*
-+acxmem_s_proc_diag_output(char *p, acx_device_t *adev)
-+{
-+      const char *rtl, *thd, *ttl;
-+      txdesc_t *txdesc;
-+      u8 Ctl_8;
-+      rxdesc_t *rxdesc;
-+      int i;
-+      u32 tmp;
-+      txdesc_t txd;
-+      u8 buf[0x200];
-+      int j, k;
-+
-+      FN_ENTER;
-+
-+#if DUMP_MEM_DURING_DIAG > 0
-+      dump_acxmem (adev, 0, 0x10000);
-+      panic ("dump finished");
-+#endif
-+      
-+      p += sprintf(p, "** Rx buf **\n");
-+      rxdesc = adev->rxdesc_start;
-+      if (rxdesc) for (i = 0; i < RX_CNT; i++) {
-+              rtl = (i == adev->rx_tail) ? " [tail]" : "";
-+              Ctl_8 = read_slavemem8 (adev, (u32) &(rxdesc->Ctl_8));
-+              if (Ctl_8 & DESC_CTL_HOSTOWN)
-+                      p += sprintf(p, "%02u (%02x) FULL%s\n", i, Ctl_8, rtl);
-+              else
-+                      p += sprintf(p, "%02u (%02x) empty%s\n", i, Ctl_8, rtl);
-+              rxdesc++;
-+      }
-+      p += sprintf(p, "** Tx buf (free %d, Linux netqueue %s) **\n", adev->tx_free,
-+                              acx_queue_stopped(adev->ndev) ? "STOPPED" : "running");
-+      
-+      p += sprintf(p, "** Tx buf %d blocks total, %d available, free list head %04x\n",
-+                   adev->acx_txbuf_numblocks, adev->acx_txbuf_blocks_free, adev->acx_txbuf_free);
-+      txdesc = adev->txdesc_start;
-+      if (txdesc) {
-+        for (i = 0; i < TX_CNT; i++) {
-+          thd = (i == adev->tx_head) ? " [head]" : "";
-+          ttl = (i == adev->tx_tail) ? " [tail]" : "";
-+          copy_from_slavemem (adev, (u8 *) &txd, (u32) txdesc, sizeof (txd));
-+          Ctl_8 = read_slavemem8 (adev, (u32) &(txdesc->Ctl_8));
-+          if (Ctl_8 & DESC_CTL_ACXDONE)
-+            p += sprintf(p, "%02u ready to free (%02X)%s%s", i, Ctl_8, thd, ttl);
-+          else if (Ctl_8 & DESC_CTL_HOSTOWN)
-+            p += sprintf(p, "%02u available     (%02X)%s%s", i, Ctl_8, thd, ttl);
-+          else
-+            p += sprintf(p, "%02u busy          (%02X)%s%s", i, Ctl_8, thd, ttl);
-+          tmp = read_slavemem32 (adev, (u32) &(txdesc->AcxMemPtr));
-+          if (tmp) {
-+            p += sprintf (p, " %04x", tmp);
-+            while ((tmp = read_slavemem32 (adev, (u32) tmp)) != 0x02000000) {
-+              tmp <<= 5;
-+              p += sprintf (p, " %04x", tmp);
-+            }
-+          }
-+          p += sprintf (p, "\n");
-+          p += sprintf (p, "  %04x: %04x %04x %04x %04x %04x %04x %04x %04x %04x %04x %02x %02x %02x %02x\n"
-+                           "%02x %02x %02x %02x %04x\n",
-+                        (u32) txdesc,
-+                        txd.pNextDesc.v, txd.HostMemPtr.v, txd.AcxMemPtr.v, txd.tx_time,
-+                        txd.total_length, txd.Reserved,
-+                        txd.dummy[0], txd.dummy[1], txd.dummy[2], txd.dummy[3],
-+                        txd.Ctl_8, txd.Ctl2_8, txd.error, txd.ack_failures,
-+                        txd.u.rts.rts_failures, txd.u.rts.rts_ok, txd.u.r1.rate, txd.u.r1.queue_ctrl,
-+                        txd.queue_info
-+                        );
-+          if (txd.AcxMemPtr.v) {
-+            copy_from_slavemem (adev, buf, txd.AcxMemPtr.v, sizeof (buf));
-+            for (j = 0; (j < txd.total_length) && (j<(sizeof(buf)-4)); j+=16) {
-+              p += sprintf (p, "    ");
-+              for (k = 0; (k < 16) && (j+k < txd.total_length); k++) {
-+                p += sprintf (p, " %02x", buf[j+k+4]);
-+              }
-+              p += sprintf (p, "\n");
-+            }
-+          }
-+          txdesc = advance_txdesc(adev, txdesc, 1);
-+        }
-+      }
-+      
-+      p += sprintf(p,
-+              "\n"
-+              "** Generic slave data **\n"
-+                "irq_mask 0x%04x irq_status 0x%04x irq on acx 0x%04x\n"
-+              "txbuf_start 0x%p, txbuf_area_size %u\n"
-+              "txdesc_size %u, txdesc_start 0x%p\n"
-+              "txhostdesc_start 0x%p, txhostdesc_area_size %u\n"
-+              "txbuf start 0x%04x, txbuf size %d\n"
-+              "rxdesc_start 0x%p\n"
-+              "rxhostdesc_start 0x%p, rxhostdesc_area_size %u\n"
-+              "rxbuf_start 0x%p, rxbuf_area_size %u\n",
-+              adev->irq_mask, adev->irq_status, read_reg32(adev, IO_ACX_IRQ_STATUS_NON_DES),
-+              adev->txbuf_start, adev->txbuf_area_size,
-+              adev->txdesc_size, adev->txdesc_start,
-+              adev->txhostdesc_start, adev->txhostdesc_area_size,
-+                adev->acx_txbuf_start, adev->acx_txbuf_numblocks * adev->memblocksize,
-+              adev->rxdesc_start,
-+              adev->rxhostdesc_start, adev->rxhostdesc_area_size,
-+              adev->rxbuf_start, adev->rxbuf_area_size);
-+      FN_EXIT0;
-+      return p;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acxmem_proc_eeprom_output(char *buf, acx_device_t *adev)
-+{
-+      char *p = buf;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      for (i = 0; i < 0x400; i++) {
-+              acxmem_read_eeprom_byte(adev, i, p++);
-+      }
-+
-+      FN_EXIT1(p - buf);
-+      return p - buf;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+void
-+acxmem_set_interrupt_mask(acx_device_t *adev)
-+{
-+      if (IS_ACX111(adev)) {
-+              adev->irq_mask = (u16) ~(0
-+                              | HOST_INT_RX_DATA       
-+                              | HOST_INT_TX_COMPLETE
-+                              /* | HOST_INT_TX_XFER        */
-+                              /* | HOST_INT_RX_COMPLETE    */
-+                              /* | HOST_INT_DTIM           */
-+                              /* | HOST_INT_BEACON         */
-+                              /* | HOST_INT_TIMER          */
-+                              /* | HOST_INT_KEY_NOT_FOUND  */
-+                              | HOST_INT_IV_ICV_FAILURE
-+                              | HOST_INT_CMD_COMPLETE
-+                              | HOST_INT_INFO
-+                              | HOST_INT_OVERFLOW    
-+                              /* | HOST_INT_PROCESS_ERROR  */
-+                              | HOST_INT_SCAN_COMPLETE
-+                              | HOST_INT_FCS_THRESHOLD
-+                              | HOST_INT_UNKNOWN
-+                              );
-+              /* Or else acx100 won't signal cmd completion, right? */
-+              adev->irq_mask_off = (u16)~( HOST_INT_CMD_COMPLETE ); /* 0xfdff */
-+      } else {
-+              adev->irq_mask = (u16) ~(0
-+                              | HOST_INT_RX_DATA 
-+                              | HOST_INT_TX_COMPLETE
-+                              /* | HOST_INT_TX_XFER        */
-+                              /* | HOST_INT_RX_COMPLETE    */
-+                              /* | HOST_INT_DTIM           */
-+                              /* | HOST_INT_BEACON         */
-+                              /* | HOST_INT_TIMER          */
-+                              /* | HOST_INT_KEY_NOT_FOUND  */
-+                              /* | HOST_INT_IV_ICV_FAILURE */
-+                              | HOST_INT_CMD_COMPLETE
-+                              | HOST_INT_INFO
-+                              /* | HOST_INT_OVERFLOW       */
-+                              /* | HOST_INT_PROCESS_ERROR  */
-+                              | HOST_INT_SCAN_COMPLETE
-+                              /* | HOST_INT_FCS_THRESHOLD  */
-+                              /* | HOST_INT_BEACON_MISSED        */
-+                              );
-+              adev->irq_mask_off = (u16)~( HOST_INT_UNKNOWN ); /* 0x7fff */
-+      }
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acx100mem_s_set_tx_level(acx_device_t *adev, u8 level_dbm)
-+{
-+      struct acx111_ie_tx_level tx_level;
-+
-+      /* since it can be assumed that at least the Maxim radio has a
-+       * maximum power output of 20dBm and since it also can be
-+       * assumed that these values drive the DAC responsible for
-+       * setting the linear Tx level, I'd guess that these values
-+       * should be the corresponding linear values for a dBm value,
-+       * in other words: calculate the values from that formula:
-+       * Y [dBm] = 10 * log (X [mW])
-+       * then scale the 0..63 value range onto the 1..100mW range (0..20 dBm)
-+       * and you're done...
-+       * Hopefully that's ok, but you never know if we're actually
-+       * right... (especially since Windows XP doesn't seem to show
-+       * actual Tx dBm values :-P) */
-+
-+      /* NOTE: on Maxim, value 30 IS 30mW, and value 10 IS 10mW - so the
-+       * values are EXACTLY mW!!! Not sure about RFMD and others,
-+       * though... */
-+      static const u8 dbm2val_maxim[21] = {
-+              63, 63, 63, 62,
-+              61, 61, 60, 60,
-+              59, 58, 57, 55,
-+              53, 50, 47, 43,
-+              38, 31, 23, 13,
-+              0
-+      };
-+      static const u8 dbm2val_rfmd[21] = {
-+               0,  0,  0,  1,
-+               2,  2,  3,  3,
-+               4,  5,  6,  8,
-+              10, 13, 16, 20,
-+              25, 32, 41, 50,
-+              63
-+      };
-+      const u8 *table;
-+
-+      switch (adev->radio_type) {
-+      case RADIO_MAXIM_0D:
-+              table = &dbm2val_maxim[0];
-+              break;
-+      case RADIO_RFMD_11:
-+      case RADIO_RALINK_15:
-+              table = &dbm2val_rfmd[0];
-+              break;
-+      default:
-+              printk("%s: unknown/unsupported radio type, "
-+                      "cannot modify tx power level yet!\n",
-+                              adev->ndev->name);
-+              return NOT_OK;
-+      }
-+      /*
-+       * The hx4700 EEPROM, at least, only supports 1 power setting.  The configure
-+       * routine matches the PA bias with the gain, so just use its default value.
-+       * The values are: 0x2b for the gain and 0x03 for the PA bias.  The firmware
-+       * writes the gain level to the Tx gain control DAC and the PA bias to the Maxim
-+       * radio's PA bias register.  The firmware limits itself to 0 - 64 when writing to the
-+       * gain control DAC.
-+       *
-+       * Physically between the ACX and the radio, higher Tx gain control DAC values result
-+       * in less power output; 0 volts to the Maxim radio results in the highest output power
-+       * level, which I'm assuming matches up with 0 in the Tx Gain DAC register.
-+       *
-+       * Although there is only the 1 power setting, one of the radio firmware functions adjusts
-+       * the transmit power level up and down.  That function is called by the ACX FIQ handler
-+       * under certain conditions.
-+       */
-+      tx_level.level = 1;
-+      //return acx_s_configure(adev, &tx_level, ACX1xx_IE_DOT11_TX_POWER_LEVEL);
-+
-+      printk("%s: changing radio power level to %u dBm (%u)\n",
-+                      adev->ndev->name, level_dbm, table[level_dbm]);
-+      acxmem_s_write_phy_reg(adev, 0x11, table[level_dbm]);
-+
-+      return 0;
-+}
-+
-+
-+static struct platform_driver
-+acxmem_drv_id = {
-+      .driver      = {
-+              .name = "acx-mem",
-+      },
-+      .probe       = acxmem_e_probe,
-+      .remove      = __devexit_p(acxmem_e_remove),
-+#ifdef CONFIG_PM
-+      .suspend     = acxmem_e_suspend,
-+      .resume      = acxmem_e_resume
-+#endif /* CONFIG_PM */
-+};
-+
-+
-+/***********************************************************************
-+** acxmem_e_init_module
-+**
-+** Module initialization routine, called once at module load time
-+*/
-+int __init
-+acxmem_e_init_module(void)
-+{
-+      int res;
-+
-+      FN_ENTER;
-+
-+#if (ACX_IO_WIDTH==32)
-+      printk("acx: compiled to use 32bit I/O access. "
-+              "I/O timing issues might occur, such as "
-+              "non-working firmware upload. Report them\n");
-+#else
-+      printk("acx: compiled to use 16bit I/O access only "
-+              "(compatibility mode)\n");
-+#endif
-+
-+#ifdef __LITTLE_ENDIAN
-+#define ENDIANNESS_STRING "running on a little-endian CPU\n"
-+#else
-+#define ENDIANNESS_STRING "running on a BIG-ENDIAN CPU\n"
-+#endif
-+      log(L_INIT,
-+              ENDIANNESS_STRING
-+              "PCI module " ACX_RELEASE " initialized, "
-+              "waiting for cards to probe...\n"
-+      );
-+
-+      res = platform_driver_register (&acxmem_drv_id);
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acxmem_e_cleanup_module
-+**
-+** Called at module unload time. This is our last chance to
-+** clean up after ourselves.
-+*/
-+void __exit
-+acxmem_e_cleanup_module(void)
-+{
-+      FN_ENTER;
-+
-+      printk ("cleanup_module\n");
-+      platform_driver_unregister( &acxmem_drv_id );
-+
-+      FN_EXIT0;
-+}
-+
-+void acxmem_e_release(struct device *dev) {
-+}
-+
-+MODULE_AUTHOR( "Todd Blumer <todd@sdgsystems.com>" );
-+MODULE_DESCRIPTION( "ACX Slave Memory Driver" );
-+MODULE_LICENSE( "GPL" );
-+
-Index: linux-2.6.22/drivers/net/wireless/acx/pci.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/pci.c        2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,4234 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+#define ACX_PCI 1
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
-+#include <linux/config.h>
-+#endif
-+
-+/* Linux 2.6.18+ uses <linux/utsrelease.h> */
-+#ifndef UTS_RELEASE
-+#include <linux/utsrelease.h>
-+#endif
-+
-+#include <linux/compiler.h> /* required for Lx 2.6.8 ?? */
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/sched.h>
-+#include <linux/types.h>
-+#include <linux/skbuff.h>
-+#include <linux/slab.h>
-+#include <linux/if_arp.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/wireless.h>
-+#include <net/iw_handler.h>
-+#include <linux/netdevice.h>
-+#include <linux/ioport.h>
-+#include <linux/pci.h>
-+#include <linux/pm.h>
-+#include <linux/vmalloc.h>
-+#include <linux/dma-mapping.h>
-+
-+#include "acx.h"
-+
-+
-+/***********************************************************************
-+*/
-+#define PCI_TYPE              (PCI_USES_MEM | PCI_ADDR0 | PCI_NO_ACPI_WAKE)
-+#define PCI_ACX100_REGION1            0x01
-+#define PCI_ACX100_REGION1_SIZE               0x1000  /* Memory size - 4K bytes */
-+#define PCI_ACX100_REGION2            0x02
-+#define PCI_ACX100_REGION2_SIZE               0x10000 /* Memory size - 64K bytes */
-+
-+#define PCI_ACX111_REGION1            0x00
-+#define PCI_ACX111_REGION1_SIZE               0x2000  /* Memory size - 8K bytes */
-+#define PCI_ACX111_REGION2            0x01
-+#define PCI_ACX111_REGION2_SIZE               0x20000 /* Memory size - 128K bytes */
-+
-+/* Texas Instruments Vendor ID */
-+#define PCI_VENDOR_ID_TI              0x104c
-+
-+/* ACX100 22Mb/s WLAN controller */
-+#define PCI_DEVICE_ID_TI_TNETW1100A   0x8400
-+#define PCI_DEVICE_ID_TI_TNETW1100B   0x8401
-+
-+/* ACX111 54Mb/s WLAN controller */
-+#define PCI_DEVICE_ID_TI_TNETW1130    0x9066
-+
-+/* PCI Class & Sub-Class code, Network-'Other controller' */
-+#define PCI_CLASS_NETWORK_OTHERS      0x0280
-+
-+#define CARD_EEPROM_ID_SIZE 6
-+
-+#ifndef PCI_D0
-+/* From include/linux/pci.h */
-+#define PCI_D0                0
-+#define PCI_D1                1
-+#define PCI_D2                2
-+#define PCI_D3hot     3
-+#define PCI_D3cold    4
-+#define PCI_UNKNOWN   5
-+#define PCI_POWER_ERROR       -1
-+#endif
-+
-+
-+/***********************************************************************
-+*/
-+static void acxpci_i_tx_timeout(struct net_device *ndev);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
-+static irqreturn_t acxpci_i_interrupt(int irq, void *dev_id);
-+#else
-+static irqreturn_t acxpci_i_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-+#endif
-+static void acxpci_i_set_multicast_list(struct net_device *ndev);
-+
-+static int acxpci_e_open(struct net_device *ndev);
-+static int acxpci_e_close(struct net_device *ndev);
-+static void acxpci_s_up(struct net_device *ndev);
-+static void acxpci_s_down(struct net_device *ndev);
-+
-+
-+/***********************************************************************
-+** Register access
-+*/
-+
-+/* Pick one */
-+/* #define INLINE_IO static */
-+#define INLINE_IO static inline
-+
-+INLINE_IO u32
-+read_reg32(acx_device_t *adev, unsigned int offset)
-+{
-+#if ACX_IO_WIDTH == 32
-+      return readl((u8 *)adev->iobase + adev->io[offset]);
-+#else
-+      return readw((u8 *)adev->iobase + adev->io[offset])
-+          + (readw((u8 *)adev->iobase + adev->io[offset] + 2) << 16);
-+#endif
-+}
-+
-+INLINE_IO u16
-+read_reg16(acx_device_t *adev, unsigned int offset)
-+{
-+      return readw((u8 *)adev->iobase + adev->io[offset]);
-+}
-+
-+INLINE_IO u8
-+read_reg8(acx_device_t *adev, unsigned int offset)
-+{
-+      return readb((u8 *)adev->iobase + adev->io[offset]);
-+}
-+
-+INLINE_IO void
-+write_reg32(acx_device_t *adev, unsigned int offset, u32 val)
-+{
-+#if ACX_IO_WIDTH == 32
-+      writel(val, (u8 *)adev->iobase + adev->io[offset]);
-+#else
-+      writew(val & 0xffff, (u8 *)adev->iobase + adev->io[offset]);
-+      writew(val >> 16, (u8 *)adev->iobase + adev->io[offset] + 2);
-+#endif
-+}
-+
-+INLINE_IO void
-+write_reg16(acx_device_t *adev, unsigned int offset, u16 val)
-+{
-+      writew(val, (u8 *)adev->iobase + adev->io[offset]);
-+}
-+
-+INLINE_IO void
-+write_reg8(acx_device_t *adev, unsigned int offset, u8 val)
-+{
-+      writeb(val, (u8 *)adev->iobase + adev->io[offset]);
-+}
-+
-+/* Handle PCI posting properly:
-+ * Make sure that writes reach the adapter in case they require to be executed
-+ * *before* the next write, by reading a random (and safely accessible) register.
-+ * This call has to be made if there is no read following (which would flush the data
-+ * to the adapter), yet the written data has to reach the adapter immediately. */
-+INLINE_IO void
-+write_flush(acx_device_t *adev)
-+{
-+      /* readb(adev->iobase + adev->io[IO_ACX_INFO_MAILBOX_OFFS]); */
-+      /* faster version (accesses the first register, IO_ACX_SOFT_RESET,
-+       * which should also be safe): */
-+      readb(adev->iobase);
-+}
-+
-+INLINE_IO int
-+adev_present(acx_device_t *adev)
-+{
-+      /* fast version (accesses the first register, IO_ACX_SOFT_RESET,
-+       * which should be safe): */
-+      return readl(adev->iobase) != 0xffffffff;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static inline txdesc_t*
-+get_txdesc(acx_device_t *adev, int index)
-+{
-+      return (txdesc_t*) (((u8*)adev->txdesc_start) + index * adev->txdesc_size);
-+}
-+
-+static inline txdesc_t*
-+advance_txdesc(acx_device_t *adev, txdesc_t* txdesc, int inc)
-+{
-+      return (txdesc_t*) (((u8*)txdesc) + inc * adev->txdesc_size);
-+}
-+
-+static txhostdesc_t*
-+get_txhostdesc(acx_device_t *adev, txdesc_t* txdesc)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      index /= adev->txdesc_size;
-+      if (unlikely(ACX_DEBUG && (index >= TX_CNT))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      return &adev->txhostdesc_start[index*2];
-+}
-+
-+static inline client_t*
-+get_txc(acx_device_t *adev, txdesc_t* txdesc)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      index /= adev->txdesc_size;
-+      if (unlikely(ACX_DEBUG && (index >= TX_CNT))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return NULL;
-+      }
-+      return adev->txc[index];
-+}
-+
-+static inline u16
-+get_txr(acx_device_t *adev, txdesc_t* txdesc)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      index /= adev->txdesc_size;
-+      return adev->txr[index];
-+}
-+
-+static inline void
-+put_txcr(acx_device_t *adev, txdesc_t* txdesc, client_t* c, u16 r111)
-+{
-+      int index = (u8*)txdesc - (u8*)adev->txdesc_start;
-+      if (unlikely(ACX_DEBUG && (index % adev->txdesc_size))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return;
-+      }
-+      index /= adev->txdesc_size;
-+      if (unlikely(ACX_DEBUG && (index >= TX_CNT))) {
-+              printk("bad txdesc ptr %p\n", txdesc);
-+              return;
-+      }
-+      adev->txc[index] = c;
-+      adev->txr[index] = r111;
-+}
-+
-+
-+/***********************************************************************
-+** EEPROM and PHY read/write helpers
-+*/
-+/***********************************************************************
-+** acxpci_read_eeprom_byte
-+**
-+** Function called to read an octet in the EEPROM.
-+**
-+** This function is used by acxpci_e_probe to check if the
-+** connected card is a legal one or not.
-+**
-+** Arguments:
-+**    adev            ptr to acx_device structure
-+**    addr            address to read in the EEPROM
-+**    charbuf         ptr to a char. This is where the read octet
-+**                    will be stored
-+*/
-+int
-+acxpci_read_eeprom_byte(acx_device_t *adev, u32 addr, u8 *charbuf)
-+{
-+      int result;
-+      int count;
-+
-+      write_reg32(adev, IO_ACX_EEPROM_CFG, 0);
-+      write_reg32(adev, IO_ACX_EEPROM_ADDR, addr);
-+      write_flush(adev);
-+      write_reg32(adev, IO_ACX_EEPROM_CTL, 2);
-+
-+      count = 0xffff;
-+      while (read_reg16(adev, IO_ACX_EEPROM_CTL)) {
-+              /* scheduling away instead of CPU burning loop
-+               * doesn't seem to work here at all:
-+               * awful delay, sometimes also failure.
-+               * Doesn't matter anyway (only small delay). */
-+              if (unlikely(!--count)) {
-+                      printk("%s: timeout waiting for EEPROM read\n",
-+                                                      adev->ndev->name);
-+                      result = NOT_OK;
-+                      goto fail;
-+              }
-+              cpu_relax();
-+      }
-+
-+      *charbuf = read_reg8(adev, IO_ACX_EEPROM_DATA);
-+      log(L_DEBUG, "EEPROM at 0x%04X = 0x%02X\n", addr, *charbuf);
-+      result = OK;
-+
-+fail:
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** We don't lock hw accesses here since we never r/w eeprom in IRQ
-+** Note: this function sleeps only because of GFP_KERNEL alloc
-+*/
-+#ifdef UNUSED
-+int
-+acxpci_s_write_eeprom(acx_device_t *adev, u32 addr, u32 len, const u8 *charbuf)
-+{
-+      u8 *data_verify = NULL;
-+      unsigned long flags;
-+      int count, i;
-+      int result = NOT_OK;
-+      u16 gpio_orig;
-+
-+      printk("acx: WARNING! I would write to EEPROM now. "
-+              "Since I really DON'T want to unless you know "
-+              "what you're doing (THIS CODE WILL PROBABLY "
-+              "NOT WORK YET!), I will abort that now. And "
-+              "definitely make sure to make a "
-+              "/proc/driver/acx_wlan0_eeprom backup copy first!!! "
-+              "(the EEPROM content includes the PCI config header!! "
-+              "If you kill important stuff, then you WILL "
-+              "get in trouble and people DID get in trouble already)\n");
-+      return OK;
-+
-+      FN_ENTER;
-+
-+      data_verify = kmalloc(len, GFP_KERNEL);
-+      if (!data_verify) {
-+              goto end;
-+      }
-+
-+      /* first we need to enable the OE (EEPROM Output Enable) GPIO line
-+       * to be able to write to the EEPROM.
-+       * NOTE: an EEPROM writing success has been reported,
-+       * but you probably have to modify GPIO_OUT, too,
-+       * and you probably need to activate a different GPIO
-+       * line instead! */
-+      gpio_orig = read_reg16(adev, IO_ACX_GPIO_OE);
-+      write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig & ~1);
-+      write_flush(adev);
-+
-+      /* ok, now start writing the data out */
-+      for (i = 0; i < len; i++) {
-+              write_reg32(adev, IO_ACX_EEPROM_CFG, 0);
-+              write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i);
-+              write_reg32(adev, IO_ACX_EEPROM_DATA, *(charbuf + i));
-+              write_flush(adev);
-+              write_reg32(adev, IO_ACX_EEPROM_CTL, 1);
-+
-+              count = 0xffff;
-+              while (read_reg16(adev, IO_ACX_EEPROM_CTL)) {
-+                      if (unlikely(!--count)) {
-+                              printk("WARNING, DANGER!!! "
-+                                      "Timeout waiting for EEPROM write\n");
-+                              goto end;
-+                      }
-+                      cpu_relax();
-+              }
-+      }
-+
-+      /* disable EEPROM writing */
-+      write_reg16(adev, IO_ACX_GPIO_OE, gpio_orig);
-+      write_flush(adev);
-+
-+      /* now start a verification run */
-+      for (i = 0; i < len; i++) {
-+              write_reg32(adev, IO_ACX_EEPROM_CFG, 0);
-+              write_reg32(adev, IO_ACX_EEPROM_ADDR, addr + i);
-+              write_flush(adev);
-+              write_reg32(adev, IO_ACX_EEPROM_CTL, 2);
-+
-+              count = 0xffff;
-+              while (read_reg16(adev, IO_ACX_EEPROM_CTL)) {
-+                      if (unlikely(!--count)) {
-+                              printk("timeout waiting for EEPROM read\n");
-+                              goto end;
-+                      }
-+                      cpu_relax();
-+              }
-+
-+              data_verify[i] = read_reg16(adev, IO_ACX_EEPROM_DATA);
-+      }
-+
-+      if (0 == memcmp(charbuf, data_verify, len))
-+              result = OK; /* read data matches, success */
-+
-+end:
-+      kfree(data_verify);
-+      FN_EXIT1(result);
-+      return result;
-+}
-+#endif /* UNUSED */
-+
-+
-+/***********************************************************************
-+** acxpci_s_read_phy_reg
-+**
-+** Messing with rx/tx disabling and enabling here
-+** (write_reg32(adev, IO_ACX_ENABLE, 0b000000xx)) kills traffic
-+*/
-+int
-+acxpci_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf)
-+{
-+      int result = NOT_OK;
-+      int count;
-+
-+      FN_ENTER;
-+
-+      write_reg32(adev, IO_ACX_PHY_ADDR, reg);
-+      write_flush(adev);
-+      write_reg32(adev, IO_ACX_PHY_CTL, 2);
-+
-+      count = 0xffff;
-+      while (read_reg32(adev, IO_ACX_PHY_CTL)) {
-+              /* scheduling away instead of CPU burning loop
-+               * doesn't seem to work here at all:
-+               * awful delay, sometimes also failure.
-+               * Doesn't matter anyway (only small delay). */
-+              if (unlikely(!--count)) {
-+                      printk("%s: timeout waiting for phy read\n",
-+                                                      adev->ndev->name);
-+                      *charbuf = 0;
-+                      goto fail;
-+              }
-+              cpu_relax();
-+      }
-+
-+      log(L_DEBUG, "count was %u\n", count);
-+      *charbuf = read_reg8(adev, IO_ACX_PHY_DATA);
-+
-+      log(L_DEBUG, "radio PHY at 0x%04X = 0x%02X\n", *charbuf, reg);
-+      result = OK;
-+      goto fail; /* silence compiler warning */
-+fail:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acxpci_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value)
-+{
-+      FN_ENTER;
-+
-+      /* mprusko said that 32bit accesses result in distorted sensitivity
-+       * on his card. Unconfirmed, looks like it's not true (most likely since we
-+       * now properly flush writes). */
-+      write_reg32(adev, IO_ACX_PHY_DATA, value);
-+      write_reg32(adev, IO_ACX_PHY_ADDR, reg);
-+      write_flush(adev);
-+      write_reg32(adev, IO_ACX_PHY_CTL, 1);
-+      write_flush(adev);
-+      log(L_DEBUG, "radio PHY write 0x%02X at 0x%04X\n", value, reg);
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+#define NO_AUTO_INCREMENT     1
-+
-+/***********************************************************************
-+** acxpci_s_write_fw
-+**
-+** Write the firmware image into the card.
-+**
-+** Arguments:
-+**    adev            wlan device structure
-+**    fw_image        firmware image.
-+**
-+** Returns:
-+**    1       firmware image corrupted
-+**    0       success
-+*/
-+static int
-+acxpci_s_write_fw(acx_device_t *adev, const firmware_image_t *fw_image, u32 offset)
-+{
-+      int len, size;
-+      u32 sum, v32;
-+      /* we skip the first four bytes which contain the control sum */
-+      const u8 *p = (u8*)fw_image + 4;
-+
-+      /* start the image checksum by adding the image size value */
-+      sum = p[0]+p[1]+p[2]+p[3];
-+      p += 4;
-+
-+      write_reg32(adev, IO_ACX_SLV_END_CTL, 0);
-+
-+#if NO_AUTO_INCREMENT
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */
-+#else
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */
-+      write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */
-+      write_flush(adev);
-+#endif
-+
-+      len = 0;
-+      size = le32_to_cpu(fw_image->size) & (~3);
-+
-+      while (likely(len < size)) {
-+              v32 = be32_to_cpu(*(u32*)p);
-+              sum += p[0]+p[1]+p[2]+p[3];
-+              p += 4;
-+              len += 4;
-+
-+#if NO_AUTO_INCREMENT
-+              write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4);
-+              write_flush(adev);
-+#endif
-+              write_reg32(adev, IO_ACX_SLV_MEM_DATA, v32);
-+      }
-+
-+      log(L_DEBUG, "firmware written, size:%d sum1:%x sum2:%x\n",
-+                      size, sum, le32_to_cpu(fw_image->chksum));
-+
-+      /* compare our checksum with the stored image checksum */
-+      return (sum != le32_to_cpu(fw_image->chksum));
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_s_validate_fw
-+**
-+** Compare the firmware image given with
-+** the firmware image written into the card.
-+**
-+** Arguments:
-+**    adev            wlan device structure
-+**   fw_image  firmware image.
-+**
-+** Returns:
-+**    NOT_OK  firmware image corrupted or not correctly written
-+**    OK      success
-+*/
-+static int
-+acxpci_s_validate_fw(acx_device_t *adev, const firmware_image_t *fw_image,
-+                              u32 offset)
-+{
-+      u32 sum, v32, w32;
-+      int len, size;
-+      int result = OK;
-+      /* we skip the first four bytes which contain the control sum */
-+      const u8 *p = (u8*)fw_image + 4;
-+
-+      /* start the image checksum by adding the image size value */
-+      sum = p[0]+p[1]+p[2]+p[3];
-+      p += 4;
-+
-+      write_reg32(adev, IO_ACX_SLV_END_CTL, 0);
-+
-+#if NO_AUTO_INCREMENT
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 0); /* use basic mode */
-+#else
-+      write_reg32(adev, IO_ACX_SLV_MEM_CTL, 1); /* use autoincrement mode */
-+      write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset); /* configure start address */
-+#endif
-+
-+      len = 0;
-+      size = le32_to_cpu(fw_image->size) & (~3);
-+
-+      while (likely(len < size)) {
-+              v32 = be32_to_cpu(*(u32*)p);
-+              p += 4;
-+              len += 4;
-+
-+#if NO_AUTO_INCREMENT
-+              write_reg32(adev, IO_ACX_SLV_MEM_ADDR, offset + len - 4);
-+#endif
-+              w32 = read_reg32(adev, IO_ACX_SLV_MEM_DATA);
-+
-+              if (unlikely(w32 != v32)) {
-+                      printk("acx: FATAL: firmware upload: "
-+                      "data parts at offset %d don't match (0x%08X vs. 0x%08X)! "
-+                      "I/O timing issues or defective memory, with DWL-xx0+? "
-+                      "ACX_IO_WIDTH=16 may help. Please report\n",
-+                              len, v32, w32);
-+                      result = NOT_OK;
-+                      break;
-+              }
-+
-+              sum += (u8)w32 + (u8)(w32>>8) + (u8)(w32>>16) + (u8)(w32>>24);
-+      }
-+
-+      /* sum control verification */
-+      if (result != NOT_OK) {
-+              if (sum != le32_to_cpu(fw_image->chksum)) {
-+                      printk("acx: FATAL: firmware upload: "
-+                              "checksums don't match!\n");
-+                      result = NOT_OK;
-+              }
-+      }
-+
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_s_upload_fw
-+**
-+** Called from acx_reset_dev
-+*/
-+static int
-+acxpci_s_upload_fw(acx_device_t *adev)
-+{
-+      firmware_image_t *fw_image = NULL;
-+      int res = NOT_OK;
-+      int try;
-+      u32 file_size;
-+      char filename[sizeof("tiacx1NNcNN")];
-+
-+      FN_ENTER;
-+
-+      /* print exact chipset and radio ID to make sure people really get a clue on which files exactly they are supposed to provide,
-+       * since firmware loading is the biggest enduser PITA with these chipsets.
-+       * Not printing radio ID in 0xHEX in order to not confuse them into wrong file naming */
-+      printk( "acx: need to load firmware for acx1%02d chipset with radio ID %02x, please provide via firmware hotplug:\n"
-+              "acx: either one file only (<c>ombined firmware image file, radio-specific) or two files (radio-less base image file *plus* separate <r>adio-specific extension file)\n",
-+              IS_ACX111(adev)*11, adev->radio_type);
-+
-+      /* Try combined, then main image */
-+      adev->need_radio_fw = 0;
-+      snprintf(filename, sizeof(filename), "tiacx1%02dc%02X",
-+              IS_ACX111(adev)*11, adev->radio_type);
-+
-+      fw_image = acx_s_read_fw(&adev->pdev->dev, filename, &file_size);
-+      if (!fw_image) {
-+              adev->need_radio_fw = 1;
-+              filename[sizeof("tiacx1NN")-1] = '\0';
-+              fw_image = acx_s_read_fw(&adev->pdev->dev, filename, &file_size);
-+              if (!fw_image) {
-+                      FN_EXIT1(NOT_OK);
-+                      return NOT_OK;
-+              }
-+      }
-+
-+      for (try = 1; try <= 5; try++) {
-+              res = acxpci_s_write_fw(adev, fw_image, 0);
-+              log(L_DEBUG|L_INIT, "acx_write_fw (main/combined): %d\n", res);
-+              if (OK == res) {
-+                      res = acxpci_s_validate_fw(adev, fw_image, 0);
-+                      log(L_DEBUG|L_INIT, "acx_validate_fw "
-+                                      "(main/combined): %d\n", res);
-+              }
-+
-+              if (OK == res) {
-+                      SET_BIT(adev->dev_state_mask, ACX_STATE_FW_LOADED);
-+                      break;
-+              }
-+              printk("acx: firmware upload attempt #%d FAILED, "
-+                      "retrying...\n", try);
-+              acx_s_msleep(1000); /* better wait for a while... */
-+      }
-+
-+      vfree(fw_image);
-+
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_s_upload_radio
-+**
-+** Uploads the appropriate radio module firmware into the card.
-+*/
-+int
-+acxpci_s_upload_radio(acx_device_t *adev)
-+{
-+      acx_ie_memmap_t mm;
-+      firmware_image_t *radio_image;
-+      acx_cmd_radioinit_t radioinit;
-+      int res = NOT_OK;
-+      int try;
-+      u32 offset;
-+      u32 size;
-+      char filename[sizeof("tiacx1NNrNN")];
-+
-+      if (!adev->need_radio_fw) return OK;
-+
-+      FN_ENTER;
-+
-+      acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP);
-+      offset = le32_to_cpu(mm.CodeEnd);
-+
-+      snprintf(filename, sizeof(filename), "tiacx1%02dr%02X",
-+              IS_ACX111(adev)*11,
-+              adev->radio_type);
-+      radio_image = acx_s_read_fw(&adev->pdev->dev, filename, &size);
-+      if (!radio_image) {
-+              printk("acx: can't load radio module '%s'\n", filename);
-+              goto fail;
-+      }
-+
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_SLEEP, NULL, 0);
-+
-+      for (try = 1; try <= 5; try++) {
-+              res = acxpci_s_write_fw(adev, radio_image, offset);
-+              log(L_DEBUG|L_INIT, "acx_write_fw (radio): %d\n", res);
-+              if (OK == res) {
-+                      res = acxpci_s_validate_fw(adev, radio_image, offset);
-+                      log(L_DEBUG|L_INIT, "acx_validate_fw (radio): %d\n", res);
-+              }
-+
-+              if (OK == res)
-+                      break;
-+              printk("acx: radio firmware upload attempt #%d FAILED, "
-+                      "retrying...\n", try);
-+              acx_s_msleep(1000); /* better wait for a while... */
-+      }
-+
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0);
-+      radioinit.offset = cpu_to_le32(offset);
-+      /* no endian conversion needed, remains in card CPU area: */
-+      radioinit.len = radio_image->size;
-+
-+      vfree(radio_image);
-+
-+      if (OK != res)
-+              goto fail;
-+
-+      /* will take a moment so let's have a big timeout */
-+      acx_s_issue_cmd_timeo(adev, ACX1xx_CMD_RADIOINIT,
-+              &radioinit, sizeof(radioinit), CMD_TIMEOUT_MS(1000));
-+
-+      res = acx_s_interrogate(adev, &mm, ACX1xx_IE_MEMORY_MAP);
-+fail:
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_l_reset_mac
-+**
-+** MAC will be reset
-+** Call context: reset_dev
-+*/
-+static void
-+acxpci_l_reset_mac(acx_device_t *adev)
-+{
-+      u16 temp;
-+
-+      FN_ENTER;
-+
-+      /* halt eCPU */
-+      temp = read_reg16(adev, IO_ACX_ECPU_CTRL) | 0x1;
-+      write_reg16(adev, IO_ACX_ECPU_CTRL, temp);
-+
-+      /* now do soft reset of eCPU, set bit */
-+      temp = read_reg16(adev, IO_ACX_SOFT_RESET) | 0x1;
-+      log(L_DEBUG, "%s: enable soft reset...\n", __func__);
-+      write_reg16(adev, IO_ACX_SOFT_RESET, temp);
-+      write_flush(adev);
-+
-+      /* now clear bit again: deassert eCPU reset */
-+      log(L_DEBUG, "%s: disable soft reset and go to init mode...\n", __func__);
-+      write_reg16(adev, IO_ACX_SOFT_RESET, temp & ~0x1);
-+
-+      /* now start a burst read from initial EEPROM */
-+      temp = read_reg16(adev, IO_ACX_EE_START) | 0x1;
-+      write_reg16(adev, IO_ACX_EE_START, temp);
-+      write_flush(adev);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_s_verify_init
-+*/
-+static int
-+acxpci_s_verify_init(acx_device_t *adev)
-+{
-+      int result = NOT_OK;
-+      unsigned long timeout;
-+
-+      FN_ENTER;
-+
-+      timeout = jiffies + 2*HZ;
-+      for (;;) {
-+              u16 irqstat = read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES);
-+              if (irqstat & HOST_INT_FCS_THRESHOLD) {
-+                      result = OK;
-+                      write_reg16(adev, IO_ACX_IRQ_ACK, HOST_INT_FCS_THRESHOLD);
-+                      break;
-+              }
-+              if (time_after(jiffies, timeout))
-+                      break;
-+              /* Init may take up to ~0.5 sec total */
-+              acx_s_msleep(50);
-+      }
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** A few low-level helpers
-+**
-+** Note: these functions are not protected by lock
-+** and thus are never allowed to be called from IRQ.
-+** Also they must not race with fw upload which uses same hw regs
-+*/
-+
-+/***********************************************************************
-+** acxpci_write_cmd_type_status
-+*/
-+
-+static inline void
-+acxpci_write_cmd_type_status(acx_device_t *adev, u16 type, u16 status)
-+{
-+      writel(type | (status << 16), adev->cmd_area);
-+      write_flush(adev);
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_read_cmd_type_status
-+*/
-+static u32
-+acxpci_read_cmd_type_status(acx_device_t *adev)
-+{
-+      u32 cmd_type, cmd_status;
-+
-+      cmd_type = readl(adev->cmd_area);
-+      cmd_status = (cmd_type >> 16);
-+      cmd_type = (u16)cmd_type;
-+
-+      log(L_CTL, "cmd_type:%04X cmd_status:%04X [%s]\n",
-+              cmd_type, cmd_status,
-+              acx_cmd_status_str(cmd_status));
-+
-+      return cmd_status;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_s_reset_dev
-+**
-+** Arguments:
-+**    netdevice that contains the adev variable
-+** Returns:
-+**    NOT_OK on fail
-+**    OK on success
-+** Side effects:
-+**    device is hard reset
-+** Call context:
-+**    acxpci_e_probe
-+** Comment:
-+**    This resets the device using low level hardware calls
-+**    as well as uploads and verifies the firmware to the card
-+*/
-+
-+static inline void
-+init_mboxes(acx_device_t *adev)
-+{
-+      u32 cmd_offs, info_offs;
-+
-+      cmd_offs = read_reg32(adev, IO_ACX_CMD_MAILBOX_OFFS);
-+      info_offs = read_reg32(adev, IO_ACX_INFO_MAILBOX_OFFS);
-+      adev->cmd_area = (u8 *)adev->iobase2 + cmd_offs;
-+      adev->info_area = (u8 *)adev->iobase2 + info_offs;
-+      log(L_DEBUG, "iobase2=%p\n"
-+              "cmd_mbox_offset=%X cmd_area=%p\n"
-+              "info_mbox_offset=%X info_area=%p\n",
-+              adev->iobase2,
-+              cmd_offs, adev->cmd_area,
-+              info_offs, adev->info_area);
-+}
-+
-+
-+static inline void
-+read_eeprom_area(acx_device_t *adev)
-+{
-+#if ACX_DEBUG > 1
-+      int offs;
-+      u8 tmp;
-+
-+      for (offs = 0x8c; offs < 0xb9; offs++)
-+              acxpci_read_eeprom_byte(adev, offs, &tmp);
-+#endif
-+}
-+
-+
-+static int
-+acxpci_s_reset_dev(acx_device_t *adev)
-+{
-+      const char* msg = "";
-+      unsigned long flags;
-+      int result = NOT_OK;
-+      u16 hardware_info;
-+      u16 ecpu_ctrl;
-+      int count;
-+
-+      FN_ENTER;
-+
-+      /* reset the device to make sure the eCPU is stopped
-+       * to upload the firmware correctly */
-+
-+      acx_lock(adev, flags);
-+
-+      acxpci_l_reset_mac(adev);
-+
-+      ecpu_ctrl = read_reg16(adev, IO_ACX_ECPU_CTRL) & 1;
-+      if (!ecpu_ctrl) {
-+              msg = "eCPU is already running. ";
-+              goto end_unlock;
-+      }
-+
-+#ifdef WE_DONT_NEED_THAT_DO_WE
-+      if (read_reg16(adev, IO_ACX_SOR_CFG) & 2) {
-+              /* eCPU most likely means "embedded CPU" */
-+              msg = "eCPU did not start after boot from flash. ";
-+              goto end_unlock;
-+      }
-+
-+      /* check sense on reset flags */
-+      if (read_reg16(adev, IO_ACX_SOR_CFG) & 0x10) {
-+              printk("%s: eCPU did not start after boot (SOR), "
-+                      "is this fatal?\n", adev->ndev->name);
-+      }
-+#endif
-+      /* scan, if any, is stopped now, setting corresponding IRQ bit */
-+      adev->irq_status |= HOST_INT_SCAN_COMPLETE;
-+
-+      acx_unlock(adev, flags);
-+
-+      /* need to know radio type before fw load */
-+      /* Need to wait for arrival of this information in a loop,
-+       * most probably since eCPU runs some init code from EEPROM
-+       * (started burst read in reset_mac()) which also
-+       * sets the radio type ID */
-+
-+      count = 0xffff;
-+      do {
-+              hardware_info = read_reg16(adev, IO_ACX_EEPROM_INFORMATION);
-+              if (!--count) {
-+                      msg = "eCPU didn't indicate radio type";
-+                      goto end_fail;
-+              }
-+              cpu_relax();
-+      } while (!(hardware_info & 0xff00)); /* radio type still zero? */
-+
-+      /* printk("DEBUG: count %d\n", count); */
-+      adev->form_factor = hardware_info & 0xff;
-+      adev->radio_type = hardware_info >> 8;
-+
-+      /* load the firmware */
-+      if (OK != acxpci_s_upload_fw(adev))
-+              goto end_fail;
-+
-+      /* acx_s_msleep(10);    this one really shouldn't be required */
-+
-+      /* now start eCPU by clearing bit */
-+      write_reg16(adev, IO_ACX_ECPU_CTRL, ecpu_ctrl & ~0x1);
-+      log(L_DEBUG, "booted eCPU up and waiting for completion...\n");
-+
-+      /* wait for eCPU bootup */
-+      if (OK != acxpci_s_verify_init(adev)) {
-+              msg = "timeout waiting for eCPU. ";
-+              goto end_fail;
-+      }
-+      log(L_DEBUG, "eCPU has woken up, card is ready to be configured\n");
-+
-+      init_mboxes(adev);
-+      acxpci_write_cmd_type_status(adev, 0, 0);
-+
-+      /* test that EEPROM is readable */
-+      read_eeprom_area(adev);
-+
-+      result = OK;
-+      goto end;
-+
-+/* Finish error message. Indicate which function failed */
-+end_unlock:
-+      acx_unlock(adev, flags);
-+end_fail:
-+      printk("acx: %sreset_dev() FAILED\n", msg);
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_s_issue_cmd_timeo
-+**
-+** Sends command to fw, extract result
-+**
-+** NB: we do _not_ take lock inside, so be sure to not touch anything
-+** which may interfere with IRQ handler operation
-+**
-+** TODO: busy wait is a bit silly, so:
-+** 1) stop doing many iters - go to sleep after first
-+** 2) go to waitqueue based approach: wait, not poll!
-+*/
-+#undef FUNC
-+#define FUNC "issue_cmd"
-+
-+#if !ACX_DEBUG
-+int
-+acxpci_s_issue_cmd_timeo(
-+      acx_device_t *adev,
-+      unsigned int cmd,
-+      void *buffer,
-+      unsigned buflen,
-+      unsigned cmd_timeout)
-+{
-+#else
-+int
-+acxpci_s_issue_cmd_timeo_debug(
-+      acx_device_t *adev,
-+      unsigned cmd,
-+      void *buffer,
-+      unsigned buflen,
-+      unsigned cmd_timeout,
-+      const char* cmdstr)
-+{
-+      unsigned long start = jiffies;
-+#endif
-+      const char *devname;
-+      unsigned counter;
-+      u16 irqtype;
-+      u16 cmd_status;
-+      unsigned long timeout;
-+
-+      FN_ENTER;
-+
-+      devname = adev->ndev->name;
-+      if (!devname || !devname[0] || devname[4]=='%')
-+              devname = "acx";
-+
-+      log(L_CTL, FUNC"(cmd:%s,buflen:%u,timeout:%ums,type:0x%04X)\n",
-+              cmdstr, buflen, cmd_timeout,
-+              buffer ? le16_to_cpu(((acx_ie_generic_t *)buffer)->type) : -1);
-+
-+      if (!(adev->dev_state_mask & ACX_STATE_FW_LOADED)) {
-+              printk("%s: "FUNC"(): firmware is not loaded yet, "
-+                      "cannot execute commands!\n", devname);
-+              goto bad;
-+      }
-+
-+      if ((acx_debug & L_DEBUG) && (cmd != ACX1xx_CMD_INTERROGATE)) {
-+              printk("input buffer (len=%u):\n", buflen);
-+              acx_dump_bytes(buffer, buflen);
-+      }
-+
-+      /* wait for firmware to become idle for our command submission */
-+      timeout = HZ/5;
-+      counter = (timeout * 1000 / HZ) - 1; /* in ms */
-+      timeout += jiffies;
-+      do {
-+              cmd_status = acxpci_read_cmd_type_status(adev);
-+              /* Test for IDLE state */
-+              if (!cmd_status)
-+                      break;
-+              if (counter % 8 == 0) {
-+                      if (time_after(jiffies, timeout)) {
-+                              counter = 0;
-+                              break;
-+                      }
-+                      /* we waited 8 iterations, no luck. Sleep 8 ms */
-+                      acx_s_msleep(8);
-+              }
-+      } while (likely(--counter));
-+
-+      if (!counter) {
-+              /* the card doesn't get idle, we're in trouble */
-+              printk("%s: "FUNC"(): cmd_status is not IDLE: 0x%04X!=0\n",
-+                      devname, cmd_status);
-+              goto bad;
-+      } else if (counter < 190) { /* if waited >10ms... */
-+              log(L_CTL|L_DEBUG, FUNC"(): waited for IDLE %dms. "
-+                      "Please report\n", 199 - counter);
-+      }
-+
-+      /* now write the parameters of the command if needed */
-+      if (buffer && buflen) {
-+              /* if it's an INTERROGATE command, just pass the length
-+               * of parameters to read, as data */
-+#if CMD_DISCOVERY
-+              if (cmd == ACX1xx_CMD_INTERROGATE)
-+                      memset_io(adev->cmd_area + 4, 0xAA, buflen);
-+#endif
-+              /* adev->cmd_area points to PCI device's memory, not to RAM! */
-+              memcpy_toio(adev->cmd_area + 4, buffer,
-+                      (cmd == ACX1xx_CMD_INTERROGATE) ? 4 : buflen);
-+      }
-+      /* now write the actual command type */
-+      acxpci_write_cmd_type_status(adev, cmd, 0);
-+      /* execute command */
-+      write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_CMD);
-+      write_flush(adev);
-+
-+      /* wait for firmware to process command */
-+
-+      /* Ensure nonzero and not too large timeout.
-+      ** Also converts e.g. 100->99, 200->199
-+      ** which is nice but not essential */
-+      cmd_timeout = (cmd_timeout-1) | 1;
-+      if (unlikely(cmd_timeout > 1199))
-+              cmd_timeout = 1199;
-+      /* clear CMD_COMPLETE bit. can be set only by IRQ handler: */
-+      adev->irq_status &= ~HOST_INT_CMD_COMPLETE;
-+
-+      /* we schedule away sometimes (timeout can be large) */
-+      counter = cmd_timeout;
-+      timeout = jiffies + cmd_timeout * HZ / 1000;
-+      do {
-+              if (!adev->irqs_active) { /* IRQ disabled: poll */
-+                      irqtype = read_reg16(adev, IO_ACX_IRQ_STATUS_NON_DES);
-+                      if (irqtype & HOST_INT_CMD_COMPLETE) {
-+                              write_reg16(adev, IO_ACX_IRQ_ACK,
-+                                              HOST_INT_CMD_COMPLETE);
-+                              break;
-+                      }
-+              } else { /* Wait when IRQ will set the bit */
-+                      irqtype = adev->irq_status;
-+                      if (irqtype & HOST_INT_CMD_COMPLETE)
-+                              break;
-+              }
-+
-+              if (counter % 8 == 0) {
-+                      if (time_after(jiffies, timeout)) {
-+                              counter = 0;
-+                              break;
-+                      }
-+                      /* we waited 8 iterations, no luck. Sleep 8 ms */
-+                      acx_s_msleep(8);
-+              }
-+      } while (likely(--counter));
-+
-+      /* save state for debugging */
-+      cmd_status = acxpci_read_cmd_type_status(adev);
-+
-+      /* put the card in IDLE state */
-+      acxpci_write_cmd_type_status(adev, 0, 0);
-+
-+      if (!counter) { /* timed out! */
-+              printk("%s: "FUNC"(): timed out %s for CMD_COMPLETE. "
-+                      "irq bits:0x%04X irq_status:0x%04X timeout:%dms "
-+                      "cmd_status:%d (%s)\n",
-+                      devname, (adev->irqs_active) ? "waiting" : "polling",
-+                      irqtype, adev->irq_status, cmd_timeout,
-+                      cmd_status, acx_cmd_status_str(cmd_status));
-+              goto bad;
-+      } else if (cmd_timeout - counter > 30) { /* if waited >30ms... */
-+              log(L_CTL|L_DEBUG, FUNC"(): %s for CMD_COMPLETE %dms. "
-+                      "count:%d. Please report\n",
-+                      (adev->irqs_active) ? "waited" : "polled",
-+                      cmd_timeout - counter, counter);
-+      }
-+
-+      if (1 != cmd_status) { /* it is not a 'Success' */
-+              printk("%s: "FUNC"(): cmd_status is not SUCCESS: %d (%s). "
-+                      "Took %dms of %d\n",
-+                      devname, cmd_status, acx_cmd_status_str(cmd_status),
-+                      cmd_timeout - counter, cmd_timeout);
-+              /* zero out result buffer
-+               * WARNING: this will trash stack in case of illegally large input
-+               * length! */
-+              if (buffer && buflen)
-+                      memset(buffer, 0, buflen);
-+              goto bad;
-+      }
-+
-+      /* read in result parameters if needed */
-+      if (buffer && buflen && (cmd == ACX1xx_CMD_INTERROGATE)) {
-+              /* adev->cmd_area points to PCI device's memory, not to RAM! */
-+              memcpy_fromio(buffer, adev->cmd_area + 4, buflen);
-+              if (acx_debug & L_DEBUG) {
-+                      printk("output buffer (len=%u): ", buflen);
-+                      acx_dump_bytes(buffer, buflen);
-+              }
-+      }
-+/* ok: */
-+      log(L_CTL, FUNC"(%s): took %ld jiffies to complete\n",
-+                       cmdstr, jiffies - start);
-+      FN_EXIT1(OK);
-+      return OK;
-+
-+bad:
-+      /* Give enough info so that callers can avoid
-+      ** printing their own diagnostic messages */
-+#if ACX_DEBUG
-+      printk("%s: "FUNC"(cmd:%s) FAILED\n", devname, cmdstr);
-+#else
-+      printk("%s: "FUNC"(cmd:0x%04X) FAILED\n", devname, cmd);
-+#endif
-+      dump_stack();
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+#ifdef NONESSENTIAL_FEATURES
-+typedef struct device_id {
-+      unsigned char id[6];
-+      char *descr;
-+      char *type;
-+} device_id_t;
-+
-+static const device_id_t
-+device_ids[] =
-+{
-+      {
-+              {'G', 'l', 'o', 'b', 'a', 'l'},
-+              NULL,
-+              NULL,
-+      },
-+      {
-+              {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
-+              "uninitialized",
-+              "SpeedStream SS1021 or Gigafast WF721-AEX"
-+      },
-+      {
-+              {0x80, 0x81, 0x82, 0x83, 0x84, 0x85},
-+              "non-standard",
-+              "DrayTek Vigor 520"
-+      },
-+      {
-+              {'?', '?', '?', '?', '?', '?'},
-+              "non-standard",
-+              "Level One WPC-0200"
-+      },
-+      {
-+              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-+              "empty",
-+              "DWL-650+ variant"
-+      }
-+};
-+
-+static void
-+acx_show_card_eeprom_id(acx_device_t *adev)
-+{
-+      unsigned char buffer[CARD_EEPROM_ID_SIZE];
-+      int i;
-+
-+      memset(&buffer, 0, CARD_EEPROM_ID_SIZE);
-+      /* use direct EEPROM access */
-+      for (i = 0; i < CARD_EEPROM_ID_SIZE; i++) {
-+              if (OK != acxpci_read_eeprom_byte(adev,
-+                                       ACX100_EEPROM_ID_OFFSET + i,
-+                                       &buffer[i])) {
-+                      printk("acx: reading EEPROM FAILED\n");
-+                      break;
-+              }
-+      }
-+
-+      for (i = 0; i < VEC_SIZE(device_ids); i++) {
-+              if (!memcmp(&buffer, device_ids[i].id, CARD_EEPROM_ID_SIZE)) {
-+                      if (device_ids[i].descr) {
-+                              printk("acx: EEPROM card ID string check "
-+                                      "found %s card ID: is this %s?\n",
-+                                      device_ids[i].descr, device_ids[i].type);
-+                      }
-+                      break;
-+              }
-+      }
-+      if (i == VEC_SIZE(device_ids)) {
-+              printk("acx: EEPROM card ID string check found "
-+                      "unknown card: expected 'Global', got '%.*s\'. "
-+                      "Please report\n", CARD_EEPROM_ID_SIZE, buffer);
-+      }
-+}
-+#endif /* NONESSENTIAL_FEATURES */
-+
-+
-+/***********************************************************************
-+** acxpci_free_desc_queues
-+**
-+** Releases the queues that have been allocated, the
-+** others have been initialised to NULL so this
-+** function can be used if only part of the queues were allocated.
-+*/
-+
-+static inline void
-+free_coherent(struct pci_dev *hwdev, size_t size,
-+                      void *vaddr, dma_addr_t dma_handle)
-+{
-+      dma_free_coherent(hwdev == NULL ? NULL : &hwdev->dev,
-+                      size, vaddr, dma_handle);
-+}
-+
-+void
-+acxpci_free_desc_queues(acx_device_t *adev)
-+{
-+#define ACX_FREE_QUEUE(size, ptr, phyaddr) \
-+      if (ptr) { \
-+              free_coherent(0, size, ptr, phyaddr); \
-+              ptr = NULL; \
-+              size = 0; \
-+      }
-+
-+      FN_ENTER;
-+
-+      ACX_FREE_QUEUE(adev->txhostdesc_area_size, adev->txhostdesc_start, adev->txhostdesc_startphy);
-+      ACX_FREE_QUEUE(adev->txbuf_area_size, adev->txbuf_start, adev->txbuf_startphy);
-+
-+      adev->txdesc_start = NULL;
-+
-+      ACX_FREE_QUEUE(adev->rxhostdesc_area_size, adev->rxhostdesc_start, adev->rxhostdesc_startphy);
-+      ACX_FREE_QUEUE(adev->rxbuf_area_size, adev->rxbuf_start, adev->rxbuf_startphy);
-+
-+      adev->rxdesc_start = NULL;
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_s_delete_dma_regions
-+*/
-+static void
-+acxpci_s_delete_dma_regions(acx_device_t *adev)
-+{
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+      /* disable radio Tx/Rx. Shouldn't we use the firmware commands
-+       * here instead? Or are we that much down the road that it's no
-+       * longer possible here? */
-+      write_reg16(adev, IO_ACX_ENABLE, 0);
-+
-+      acx_s_msleep(100);
-+
-+      acx_lock(adev, flags);
-+      acxpci_free_desc_queues(adev);
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_e_probe
-+**
-+** Probe routine called when a PCI device w/ matching ID is found.
-+** Here's the sequence:
-+**   - Allocate the PCI resources.
-+**   - Read the PCMCIA attribute memory to make sure we have a WLAN card
-+**   - Reset the MAC
-+**   - Initialize the dev and wlan data
-+**   - Initialize the MAC
-+**
-+** pdev       - ptr to pci device structure containing info about pci configuration
-+** id - ptr to the device id entry that matched this device
-+*/
-+static const u16
-+IO_ACX100[] =
-+{
-+      0x0000, /* IO_ACX_SOFT_RESET */
-+
-+      0x0014, /* IO_ACX_SLV_MEM_ADDR */
-+      0x0018, /* IO_ACX_SLV_MEM_DATA */
-+      0x001c, /* IO_ACX_SLV_MEM_CTL */
-+      0x0020, /* IO_ACX_SLV_END_CTL */
-+
-+      0x0034, /* IO_ACX_FEMR */
-+
-+      0x007c, /* IO_ACX_INT_TRIG */
-+      0x0098, /* IO_ACX_IRQ_MASK */
-+      0x00a4, /* IO_ACX_IRQ_STATUS_NON_DES */
-+      0x00a8, /* IO_ACX_IRQ_STATUS_CLEAR */
-+      0x00ac, /* IO_ACX_IRQ_ACK */
-+      0x00b0, /* IO_ACX_HINT_TRIG */
-+
-+      0x0104, /* IO_ACX_ENABLE */
-+
-+      0x0250, /* IO_ACX_EEPROM_CTL */
-+      0x0254, /* IO_ACX_EEPROM_ADDR */
-+      0x0258, /* IO_ACX_EEPROM_DATA */
-+      0x025c, /* IO_ACX_EEPROM_CFG */
-+
-+      0x0268, /* IO_ACX_PHY_ADDR */
-+      0x026c, /* IO_ACX_PHY_DATA */
-+      0x0270, /* IO_ACX_PHY_CTL */
-+
-+      0x0290, /* IO_ACX_GPIO_OE */
-+
-+      0x0298, /* IO_ACX_GPIO_OUT */
-+
-+      0x02a4, /* IO_ACX_CMD_MAILBOX_OFFS */
-+      0x02a8, /* IO_ACX_INFO_MAILBOX_OFFS */
-+      0x02ac, /* IO_ACX_EEPROM_INFORMATION */
-+
-+      0x02d0, /* IO_ACX_EE_START */
-+      0x02d4, /* IO_ACX_SOR_CFG */
-+      0x02d8 /* IO_ACX_ECPU_CTRL */
-+};
-+
-+static const u16
-+IO_ACX111[] =
-+{
-+      0x0000, /* IO_ACX_SOFT_RESET */
-+
-+      0x0014, /* IO_ACX_SLV_MEM_ADDR */
-+      0x0018, /* IO_ACX_SLV_MEM_DATA */
-+      0x001c, /* IO_ACX_SLV_MEM_CTL */
-+      0x0020, /* IO_ACX_SLV_END_CTL */
-+
-+      0x0034, /* IO_ACX_FEMR */
-+
-+      0x00b4, /* IO_ACX_INT_TRIG */
-+      0x00d4, /* IO_ACX_IRQ_MASK */
-+      /* we do mean NON_DES (0xf0), not NON_DES_MASK which is at 0xe0: */
-+      0x00f0, /* IO_ACX_IRQ_STATUS_NON_DES */
-+      0x00e4, /* IO_ACX_IRQ_STATUS_CLEAR */
-+      0x00e8, /* IO_ACX_IRQ_ACK */
-+      0x00ec, /* IO_ACX_HINT_TRIG */
-+
-+      0x01d0, /* IO_ACX_ENABLE */
-+
-+      0x0338, /* IO_ACX_EEPROM_CTL */
-+      0x033c, /* IO_ACX_EEPROM_ADDR */
-+      0x0340, /* IO_ACX_EEPROM_DATA */
-+      0x0344, /* IO_ACX_EEPROM_CFG */
-+
-+      0x0350, /* IO_ACX_PHY_ADDR */
-+      0x0354, /* IO_ACX_PHY_DATA */
-+      0x0358, /* IO_ACX_PHY_CTL */
-+
-+      0x0374, /* IO_ACX_GPIO_OE */
-+
-+      0x037c, /* IO_ACX_GPIO_OUT */
-+
-+      0x0388, /* IO_ACX_CMD_MAILBOX_OFFS */
-+      0x038c, /* IO_ACX_INFO_MAILBOX_OFFS */
-+      0x0390, /* IO_ACX_EEPROM_INFORMATION */
-+
-+      0x0100, /* IO_ACX_EE_START */
-+      0x0104, /* IO_ACX_SOR_CFG */
-+      0x0108, /* IO_ACX_ECPU_CTRL */
-+};
-+
-+static void
-+dummy_netdev_init(struct net_device *ndev) {}
-+
-+static int __devinit
-+acxpci_e_probe(struct pci_dev *pdev, const struct pci_device_id *id)
-+{
-+      acx111_ie_configoption_t co;
-+      unsigned long mem_region1 = 0;
-+      unsigned long mem_region2 = 0;
-+      unsigned long mem_region1_size;
-+      unsigned long mem_region2_size;
-+      unsigned long phymem1;
-+      unsigned long phymem2;
-+      void *mem1 = NULL;
-+      void *mem2 = NULL;
-+      acx_device_t *adev = NULL;
-+      struct net_device *ndev = NULL;
-+      const char *chip_name;
-+      int result = -EIO;
-+      int err;
-+      u8 chip_type;
-+
-+      FN_ENTER;
-+
-+      /* Enable the PCI device */
-+      if (pci_enable_device(pdev)) {
-+              printk("acx: pci_enable_device() FAILED\n");
-+              result = -ENODEV;
-+              goto fail_pci_enable_device;
-+      }
-+
-+      /* enable busmastering (required for CardBus) */
-+      pci_set_master(pdev);
-+
-+      /* FIXME: prism54 calls pci_set_mwi() here,
-+       * should we do/support the same? */
-+
-+      /* chiptype is u8 but id->driver_data is ulong
-+      ** Works for now (possible values are 1 and 2) */
-+      chip_type = (u8)id->driver_data;
-+      /* acx100 and acx111 have different PCI memory regions */
-+      if (chip_type == CHIPTYPE_ACX100) {
-+              chip_name = "ACX100";
-+              mem_region1 = PCI_ACX100_REGION1;
-+              mem_region1_size  = PCI_ACX100_REGION1_SIZE;
-+
-+              mem_region2 = PCI_ACX100_REGION2;
-+              mem_region2_size  = PCI_ACX100_REGION2_SIZE;
-+      } else if (chip_type == CHIPTYPE_ACX111) {
-+              chip_name = "ACX111";
-+              mem_region1 = PCI_ACX111_REGION1;
-+              mem_region1_size  = PCI_ACX111_REGION1_SIZE;
-+
-+              mem_region2 = PCI_ACX111_REGION2;
-+              mem_region2_size  = PCI_ACX111_REGION2_SIZE;
-+      } else {
-+              printk("acx: unknown chip type 0x%04X\n", chip_type);
-+              goto fail_unknown_chiptype;
-+      }
-+
-+      /* Figure out our resources */
-+      phymem1 = pci_resource_start(pdev, mem_region1);
-+      phymem2 = pci_resource_start(pdev, mem_region2);
-+      if (!request_mem_region(phymem1, pci_resource_len(pdev, mem_region1), "acx_1")) {
-+              printk("acx: cannot reserve PCI memory region 1 (are you sure "
-+                      "you have CardBus support in kernel?)\n");
-+              goto fail_request_mem_region1;
-+      }
-+      if (!request_mem_region(phymem2, pci_resource_len(pdev, mem_region2), "acx_2")) {
-+              printk("acx: cannot reserve PCI memory region 2\n");
-+              goto fail_request_mem_region2;
-+      }
-+      
-+      /* this used to be ioremap(), but ioremap_nocache()
-+       * is much less risky, right? (and slower?)
-+       * FIXME: we may want to go back to cached variant if it's
-+       * certain that our code really properly handles
-+       * cached operation (memory barriers, volatile?, ...)
-+       * (but always keep this comment here regardless!)
-+       * Possibly make this a driver config setting? */
-+      
-+      mem1 = ioremap_nocache(phymem1, mem_region1_size);
-+      if (!mem1) {
-+              printk("acx: ioremap() FAILED\n");
-+              goto fail_ioremap1;
-+      }
-+      mem2 = ioremap_nocache(phymem2, mem_region2_size);
-+      if (!mem2) {
-+              printk("acx: ioremap() #2 FAILED\n");
-+              goto fail_ioremap2;
-+      }
-+
-+      printk("acx: found %s-based wireless network card at %s, irq:%d, "
-+              "phymem1:0x%lX, phymem2:0x%lX, mem1:0x%p, mem1_size:%ld, "
-+              "mem2:0x%p, mem2_size:%ld\n",
-+              chip_name, pci_name(pdev), pdev->irq, phymem1, phymem2,
-+              mem1, mem_region1_size,
-+              mem2, mem_region2_size);
-+      log(L_ANY, "initial debug setting is 0x%04X\n", acx_debug);
-+
-+      if (0 == pdev->irq) {
-+              printk("acx: can't use IRQ 0\n");
-+              goto fail_irq;
-+      }
-+
-+      ndev = alloc_netdev(sizeof(*adev), "wlan%d", dummy_netdev_init);
-+      /* (NB: memsets to 0 entire area) */
-+      if (!ndev) {
-+              printk("acx: no memory for netdevice struct\n");
-+              goto fail_alloc_netdev;
-+      }
-+
-+      ether_setup(ndev);
-+      ndev->open = &acxpci_e_open;
-+      ndev->stop = &acxpci_e_close;
-+      ndev->hard_start_xmit = &acx_i_start_xmit;
-+      ndev->get_stats = &acx_e_get_stats;
-+#if IW_HANDLER_VERSION <= 5
-+      ndev->get_wireless_stats = &acx_e_get_wireless_stats;
-+#endif
-+      ndev->wireless_handlers = (struct iw_handler_def *)&acx_ioctl_handler_def;
-+      ndev->set_multicast_list = &acxpci_i_set_multicast_list;
-+      ndev->tx_timeout = &acxpci_i_tx_timeout;
-+      ndev->change_mtu = &acx_e_change_mtu;
-+      ndev->watchdog_timeo = 4 * HZ;
-+      ndev->irq = pdev->irq;
-+      ndev->base_addr = pci_resource_start(pdev, 0);
-+
-+      adev = ndev2adev(ndev);
-+      spin_lock_init(&adev->lock);    /* initial state: unlocked */
-+      /* We do not start with downed sem: we want PARANOID_LOCKING to work */
-+      sema_init(&adev->sem, 1);       /* initial state: 1 (upped) */
-+      /* since nobody can see new netdev yet, we can as well
-+      ** just _presume_ that we're under sem (instead of actually taking it): */
-+      /* acx_sem_lock(adev); */
-+      adev->pdev = pdev;
-+      adev->ndev = ndev;
-+      adev->dev_type = DEVTYPE_PCI;
-+      adev->chip_type = chip_type;
-+      adev->chip_name = chip_name;
-+      adev->io = (CHIPTYPE_ACX100 == chip_type) ? IO_ACX100 : IO_ACX111;
-+      adev->membase = phymem1;
-+      adev->iobase = mem1;
-+      adev->membase2 = phymem2;
-+      adev->iobase2 = mem2;
-+      /* to find crashes due to weird driver access
-+       * to unconfigured interface (ifup) */
-+      adev->mgmt_timer.function = (void (*)(unsigned long))0x0000dead;
-+
-+#ifdef NONESSENTIAL_FEATURES
-+      acx_show_card_eeprom_id(adev);
-+#endif /* NONESSENTIAL_FEATURES */
-+
-+#ifdef SET_MODULE_OWNER
-+      SET_MODULE_OWNER(ndev);
-+#endif
-+      SET_NETDEV_DEV(ndev, &pdev->dev);
-+
-+      log(L_IRQ|L_INIT, "using IRQ %d\n", pdev->irq);
-+
-+      /* need to be able to restore PCI state after a suspend */
-+      pci_save_state(pdev);
-+      pci_set_drvdata(pdev, ndev);
-+
-+      /* ok, pci setup is finished, now start initializing the card */
-+
-+      /* NB: read_reg() reads may return bogus data before reset_dev(),
-+       * since the firmware which directly controls large parts of the I/O
-+       * registers isn't initialized yet.
-+       * acx100 seems to be more affected than acx111 */
-+      if (OK != acxpci_s_reset_dev(adev))
-+              goto fail_reset;
-+
-+      if (IS_ACX100(adev)) {
-+              /* ACX100: configopt struct in cmd mailbox - directly after reset */
-+              memcpy_fromio(&co, adev->cmd_area, sizeof(co));
-+      }
-+
-+      if (OK != acx_s_init_mac(adev))
-+              goto fail_init_mac;
-+
-+      if (IS_ACX111(adev)) {
-+              /* ACX111: configopt struct needs to be queried after full init */
-+              acx_s_interrogate(adev, &co, ACX111_IE_CONFIG_OPTIONS);
-+      }
-+
-+/* TODO: merge them into one function, they are called just once and are the same for pci & usb */
-+      if (OK != acxpci_read_eeprom_byte(adev, 0x05, &adev->eeprom_version))
-+              goto fail_read_eeprom_version;
-+
-+      acx_s_parse_configoption(adev, &co);
-+      acx_s_set_defaults(adev);
-+      acx_s_get_firmware_version(adev); /* needs to be after acx_s_init_mac() */
-+      acx_display_hardware_details(adev);
-+
-+      /* Register the card, AFTER everything else has been set up,
-+       * since otherwise an ioctl could step on our feet due to
-+       * firmware operations happening in parallel or uninitialized data */
-+      err = register_netdev(ndev);
-+      if (OK != err) {
-+              printk("acx: register_netdev() FAILED: %d\n", err);
-+              goto fail_register_netdev;
-+      }
-+
-+      acx_proc_register_entries(ndev);
-+
-+      /* Now we have our device, so make sure the kernel doesn't try
-+       * to send packets even though we're not associated to a network yet */
-+      acx_stop_queue(ndev, "on probe");
-+      acx_carrier_off(ndev, "on probe");
-+
-+      /* after register_netdev() userspace may start working with dev
-+       * (in particular, on other CPUs), we only need to up the sem */
-+      /* acx_sem_unlock(adev); */
-+
-+      printk("acx "ACX_RELEASE": net device %s, driver compiled "
-+              "against wireless extensions %d and Linux %s\n",
-+              ndev->name, WIRELESS_EXT, UTS_RELEASE);
-+
-+#if CMD_DISCOVERY
-+      great_inquisitor(adev);
-+#endif
-+
-+      result = OK;
-+      goto done;
-+
-+      /* error paths: undo everything in reverse order... */
-+
-+fail_register_netdev:
-+
-+      acxpci_s_delete_dma_regions(adev);
-+      pci_set_drvdata(pdev, NULL);
-+
-+fail_init_mac:
-+fail_read_eeprom_version:
-+fail_reset:
-+
-+      free_netdev(ndev);
-+fail_alloc_netdev:
-+fail_irq:
-+
-+      iounmap(mem2);
-+fail_ioremap2:
-+
-+      iounmap(mem1);
-+fail_ioremap1:
-+
-+      release_mem_region(pci_resource_start(pdev, mem_region2),
-+                         pci_resource_len(pdev, mem_region2));
-+fail_request_mem_region2:
-+
-+      release_mem_region(pci_resource_start(pdev, mem_region1),
-+                         pci_resource_len(pdev, mem_region1));
-+fail_request_mem_region1:
-+fail_unknown_chiptype:
-+
-+      pci_disable_device(pdev);
-+fail_pci_enable_device:
-+
-+      pci_set_power_state(pdev, PCI_D3hot);
-+
-+done:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_e_remove
-+**
-+** Shut device down (if not hot unplugged)
-+** and deallocate PCI resources for the acx chip.
-+**
-+** pdev - ptr to PCI device structure containing info about pci configuration
-+*/
-+static void __devexit
-+acxpci_e_remove(struct pci_dev *pdev)
-+{
-+      struct net_device *ndev;
-+      acx_device_t *adev;
-+      unsigned long mem_region1, mem_region2;
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      ndev = (struct net_device*) pci_get_drvdata(pdev);
-+      if (!ndev) {
-+              log(L_DEBUG, "%s: card is unused. Skipping any release code\n",
-+                      __func__);
-+              goto end;
-+      }
-+
-+      adev = ndev2adev(ndev);
-+
-+      /* If device wasn't hot unplugged... */
-+      if (adev_present(adev)) {
-+
-+              acx_sem_lock(adev);
-+
-+              /* disable both Tx and Rx to shut radio down properly */
-+              acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0);
-+              acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0);
-+
-+#ifdef REDUNDANT
-+              /* put the eCPU to sleep to save power
-+               * Halting is not possible currently,
-+               * since not supported by all firmware versions */
-+              acx_s_issue_cmd(adev, ACX100_CMD_SLEEP, NULL, 0);
-+#endif
-+              acx_lock(adev, flags);
-+              /* disable power LED to save power :-) */
-+              log(L_INIT, "switching off power LED to save power\n");
-+              acxpci_l_power_led(adev, 0);
-+              /* stop our eCPU */
-+              if (IS_ACX111(adev)) {
-+                      /* FIXME: does this actually keep halting the eCPU?
-+                       * I don't think so...
-+                       */
-+                      acxpci_l_reset_mac(adev);
-+              } else {
-+                      u16 temp;
-+                      /* halt eCPU */
-+                      temp = read_reg16(adev, IO_ACX_ECPU_CTRL) | 0x1;
-+                      write_reg16(adev, IO_ACX_ECPU_CTRL, temp);
-+                      write_flush(adev);
-+              }
-+              acx_unlock(adev, flags);
-+
-+              acx_sem_unlock(adev);
-+      }
-+
-+      /* unregister the device to not let the kernel
-+       * (e.g. ioctls) access a half-deconfigured device
-+       * NB: this will cause acxpci_e_close() to be called,
-+       * thus we shouldn't call it under sem! */
-+      log(L_INIT, "removing device %s\n", ndev->name);
-+      unregister_netdev(ndev);
-+
-+      /* unregister_netdev ensures that no references to us left.
-+       * For paranoid reasons we continue to follow the rules */
-+      acx_sem_lock(adev);
-+
-+      if (adev->dev_state_mask & ACX_STATE_IFACE_UP) {
-+              acxpci_s_down(ndev);
-+              CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      }
-+
-+      acx_proc_unregister_entries(ndev);
-+
-+      if (IS_ACX100(adev)) {
-+              mem_region1 = PCI_ACX100_REGION1;
-+              mem_region2 = PCI_ACX100_REGION2;
-+      } else {
-+              mem_region1 = PCI_ACX111_REGION1;
-+              mem_region2 = PCI_ACX111_REGION2;
-+      }
-+
-+      /* finally, clean up PCI bus state */
-+      acxpci_s_delete_dma_regions(adev);
-+      if (adev->iobase) iounmap(adev->iobase);
-+      if (adev->iobase2) iounmap(adev->iobase2);
-+      release_mem_region(pci_resource_start(pdev, mem_region1),
-+                         pci_resource_len(pdev, mem_region1));
-+      release_mem_region(pci_resource_start(pdev, mem_region2),
-+                         pci_resource_len(pdev, mem_region2));
-+      pci_disable_device(pdev);
-+
-+      /* remove dev registration */
-+      pci_set_drvdata(pdev, NULL);
-+
-+      acx_sem_unlock(adev);
-+
-+      /* Free netdev (quite late,
-+       * since otherwise we might get caught off-guard
-+       * by a netdev timeout handler execution
-+       * expecting to see a working dev...) */
-+      free_netdev(ndev);
-+
-+      /* put device into ACPI D3 mode (shutdown) */
-+      pci_set_power_state(pdev, PCI_D3hot);
-+
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** TODO: PM code needs to be fixed / debugged / tested.
-+*/
-+#ifdef CONFIG_PM
-+static int
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+acxpci_e_suspend(struct pci_dev *pdev, pm_message_t state)
-+#else
-+acxpci_e_suspend(struct pci_dev *pdev, u32 state)
-+#endif
-+{
-+      struct net_device *ndev = pci_get_drvdata(pdev);
-+      acx_device_t *adev;
-+
-+      FN_ENTER;
-+      printk("acx: suspend handler is experimental!\n");
-+      printk("sus: dev %p\n", ndev);
-+
-+      if (!netif_running(ndev))
-+              goto end;
-+
-+      adev = ndev2adev(ndev);
-+      printk("sus: adev %p\n", adev);
-+
-+      acx_sem_lock(adev);
-+
-+      netif_device_detach(ndev);      /* this one cannot sleep */
-+      acxpci_s_down(ndev);
-+      /* down() does not set it to 0xffff, but here we really want that */
-+      write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff);
-+      write_reg16(adev, IO_ACX_FEMR, 0x0);
-+      acxpci_s_delete_dma_regions(adev);
-+      pci_save_state(pdev);
-+      pci_set_power_state(pdev, PCI_D3hot);
-+
-+      acx_sem_unlock(adev);
-+end:
-+      FN_EXIT0;
-+      return OK;
-+}
-+
-+
-+static int
-+acxpci_e_resume(struct pci_dev *pdev)
-+{
-+      struct net_device *ndev = pci_get_drvdata(pdev);
-+      acx_device_t *adev;
-+
-+      FN_ENTER;
-+
-+      printk("acx: resume handler is experimental!\n");
-+      printk("rsm: got dev %p\n", ndev);
-+
-+      if (!netif_running(ndev))
-+              goto end;
-+
-+      adev = ndev2adev(ndev);
-+      printk("rsm: got adev %p\n", adev);
-+
-+      acx_sem_lock(adev);
-+
-+      pci_set_power_state(pdev, PCI_D0);
-+      printk("rsm: power state PCI_D0 set\n");
-+      pci_restore_state(pdev);
-+      printk("rsm: PCI state restored\n");
-+
-+      if (OK != acxpci_s_reset_dev(adev))
-+              goto end_unlock;
-+      printk("rsm: device reset done\n");
-+      if (OK != acx_s_init_mac(adev))
-+              goto end_unlock;
-+      printk("rsm: init MAC done\n");
-+
-+      acxpci_s_up(ndev);
-+      printk("rsm: acx up done\n");
-+
-+      /* now even reload all card parameters as they were before suspend,
-+       * and possibly be back in the network again already :-) */
-+      if (ACX_STATE_IFACE_UP & adev->dev_state_mask) {
-+              adev->set_mask = GETSET_ALL;
-+              acx_s_update_card_settings(adev);
-+              printk("rsm: settings updated\n");
-+      }
-+      netif_device_attach(ndev);
-+      printk("rsm: device attached\n");
-+
-+end_unlock:
-+      acx_sem_unlock(adev);
-+end:
-+      /* we need to return OK here anyway, right? */
-+      FN_EXIT0;
-+      return OK;
-+}
-+#endif /* CONFIG_PM */
-+
-+
-+/***********************************************************************
-+** acxpci_s_up
-+**
-+** This function is called by acxpci_e_open (when ifconfig sets the device as up)
-+**
-+** Side effects:
-+** - Enables on-card interrupt requests
-+** - calls acx_s_start
-+*/
-+
-+static void
-+enable_acx_irq(acx_device_t *adev)
-+{
-+      FN_ENTER;
-+      write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask);
-+      write_reg16(adev, IO_ACX_FEMR, 0x8000);
-+      adev->irqs_active = 1;
-+      FN_EXIT0;
-+}
-+
-+static void
-+acxpci_s_up(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+      enable_acx_irq(adev);
-+      acx_unlock(adev, flags);
-+
-+      /* acx fw < 1.9.3.e has a hardware timer, and older drivers
-+      ** used to use it. But we don't do that anymore, our OS
-+      ** has reliable software timers */
-+      init_timer(&adev->mgmt_timer);
-+      adev->mgmt_timer.function = acx_i_timer;
-+      adev->mgmt_timer.data = (unsigned long)adev;
-+
-+      /* Need to set ACX_STATE_IFACE_UP first, or else
-+      ** timer won't be started by acx_set_status() */
-+      SET_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+      case ACX_MODE_2_STA:
-+              /* actual scan cmd will happen in start() */
-+              acx_set_status(adev, ACX_STATUS_1_SCANNING); break;
-+      case ACX_MODE_3_AP:
-+      case ACX_MODE_MONITOR:
-+              acx_set_status(adev, ACX_STATUS_4_ASSOCIATED); break;
-+      }
-+
-+      acx_s_start(adev);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_s_down
-+**
-+** NB: device may be already hot unplugged if called from acxpci_e_remove()
-+**
-+** Disables on-card interrupt request, stops softirq and timer, stops queue,
-+** sets status == STOPPED
-+*/
-+
-+static void
-+disable_acx_irq(acx_device_t *adev)
-+{
-+      FN_ENTER;
-+
-+      /* I guess mask is not 0xffff because acx100 won't signal
-+      ** cmd completion then (needed for ifup).
-+      ** Someone with acx100 please confirm */
-+      write_reg16(adev, IO_ACX_IRQ_MASK, adev->irq_mask_off);
-+      write_reg16(adev, IO_ACX_FEMR, 0x0);
-+      adev->irqs_active = 0;
-+      FN_EXIT0;
-+}
-+
-+static void
-+acxpci_s_down(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      /* Disable IRQs first, so that IRQs cannot race with us */
-+      /* then wait until interrupts have finished executing on other CPUs */
-+      acx_lock(adev, flags);
-+      disable_acx_irq(adev);
-+      synchronize_irq(adev->pdev->irq);
-+      acx_unlock(adev, flags);
-+
-+      /* we really don't want to have an asynchronous tasklet disturb us
-+      ** after something vital for its job has been shut down, so
-+      ** end all remaining work now.
-+      **
-+      ** NB: carrier_off (done by set_status below) would lead to
-+      ** not yet fully understood deadlock in FLUSH_SCHEDULED_WORK().
-+      ** That's why we do FLUSH first.
-+      **
-+      ** NB2: we have a bad locking bug here: FLUSH_SCHEDULED_WORK()
-+      ** waits for acx_e_after_interrupt_task to complete if it is running
-+      ** on another CPU, but acx_e_after_interrupt_task
-+      ** will sleep on sem forever, because it is taken by us!
-+      ** Work around that by temporary sem unlock.
-+      ** This will fail miserably if we'll be hit by concurrent
-+      ** iwconfig or something in between. TODO! */
-+      acx_sem_unlock(adev);
-+      FLUSH_SCHEDULED_WORK();
-+      acx_sem_lock(adev);
-+
-+      /* This is possible:
-+      ** FLUSH_SCHEDULED_WORK -> acx_e_after_interrupt_task ->
-+      ** -> set_status(ASSOCIATED) -> wake_queue()
-+      ** That's why we stop queue _after_ FLUSH_SCHEDULED_WORK
-+      ** lock/unlock is just paranoia, maybe not needed */
-+      acx_lock(adev, flags);
-+      acx_stop_queue(ndev, "on ifdown");
-+      acx_set_status(adev, ACX_STATUS_0_STOPPED);
-+      acx_unlock(adev, flags);
-+
-+      /* kernel/timer.c says it's illegal to del_timer_sync()
-+      ** a timer which restarts itself. We guarantee this cannot
-+      ** ever happen because acx_i_timer() never does this if
-+      ** status is ACX_STATUS_0_STOPPED */
-+      del_timer_sync(&adev->mgmt_timer);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_e_open
-+**
-+** Called as a result of SIOCSIFFLAGS ioctl changing the flags bit IFF_UP
-+** from clear to set. In other words: ifconfig up.
-+**
-+** Returns:
-+**    0       success
-+**    >0      f/w reported error
-+**    <0      driver reported error
-+*/
-+static int
-+acxpci_e_open(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      int result = OK;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      acx_init_task_scheduler(adev);
-+
-+/* TODO: pci_set_power_state(pdev, PCI_D0); ? */
-+
-+      /* request shared IRQ handler */
-+      if (request_irq(ndev->irq, acxpci_i_interrupt, SA_SHIRQ, ndev->name, ndev)) {
-+              printk("%s: request_irq FAILED\n", ndev->name);
-+              result = -EAGAIN;
-+              goto done;
-+      }
-+      log(L_DEBUG|L_IRQ, "request_irq %d successful\n", ndev->irq);
-+
-+      /* ifup device */
-+      acxpci_s_up(ndev);
-+
-+      /* We don't currently have to do anything else.
-+       * The setup of the MAC should be subsequently completed via
-+       * the mlme commands.
-+       * Higher layers know we're ready from dev->start==1 and
-+       * dev->tbusy==0.  Our rx path knows to pass up received/
-+       * frames because of dev->flags&IFF_UP is true.
-+       */
-+done:
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_e_close
-+**
-+** Called as a result of SIOCSIIFFLAGS ioctl changing the flags bit IFF_UP
-+** from set to clear. I.e. called by "ifconfig DEV down"
-+**
-+** Returns:
-+**    0       success
-+**    >0      f/w reported error
-+**    <0      driver reported error
-+*/
-+static int
-+acxpci_e_close(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      /* ifdown device */
-+      CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      if (netif_device_present(ndev)) {
-+              acxpci_s_down(ndev);
-+      }
-+
-+      /* disable all IRQs, release shared IRQ handler */
-+      write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff);
-+      write_reg16(adev, IO_ACX_FEMR, 0x0);
-+      free_irq(ndev->irq, ndev);
-+
-+/* TODO: pci_set_power_state(pdev, PCI_D3hot); ? */
-+
-+      /* We currently don't have to do anything else.
-+       * Higher layers know we're not ready from dev->start==0 and
-+       * dev->tbusy==1.  Our rx path knows to not pass up received
-+       * frames because of dev->flags&IFF_UP is false.
-+       */
-+      acx_sem_unlock(adev);
-+
-+      log(L_INIT, "closed device\n");
-+      FN_EXIT0;
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_i_tx_timeout
-+**
-+** Called from network core. Must not sleep!
-+*/
-+static void
-+acxpci_i_tx_timeout(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      unsigned int tx_num_cleaned;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+
-+      /* clean processed tx descs, they may have been completely full */
-+      tx_num_cleaned = acxpci_l_clean_txdesc(adev);
-+
-+      /* nothing cleaned, yet (almost) no free buffers available?
-+       * --> clean all tx descs, no matter which status!!
-+       * Note that I strongly suspect that doing emergency cleaning
-+       * may confuse the firmware. This is a last ditch effort to get
-+       * ANYTHING to work again...
-+       *
-+       * TODO: it's best to simply reset & reinit hw from scratch...
-+       */
-+      if ((adev->tx_free <= TX_EMERG_CLEAN) && (tx_num_cleaned == 0)) {
-+              printk("%s: FAILED to free any of the many full tx buffers. "
-+                      "Switching to emergency freeing. "
-+                      "Please report!\n", ndev->name);
-+              acxpci_l_clean_txdesc_emergency(adev);
-+      }
-+
-+      if (acx_queue_stopped(ndev) && (ACX_STATUS_4_ASSOCIATED == adev->status))
-+              acx_wake_queue(ndev, "after tx timeout");
-+
-+      /* stall may have happened due to radio drift, so recalib radio */
-+      acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB);
-+
-+      /* do unimportant work last */
-+      printk("%s: tx timeout!\n", ndev->name);
-+      adev->stats.tx_errors++;
-+
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_i_set_multicast_list
-+** FIXME: most likely needs refinement
-+*/
-+static void
-+acxpci_i_set_multicast_list(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+
-+      /* firmwares don't have allmulti capability,
-+       * so just use promiscuous mode instead in this case. */
-+      if (ndev->flags & (IFF_PROMISC|IFF_ALLMULTI)) {
-+              SET_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS);
-+              CLEAR_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI);
-+              SET_BIT(adev->set_mask, SET_RXCONFIG);
-+              /* let kernel know in case *we* needed to set promiscuous */
-+              ndev->flags |= (IFF_PROMISC|IFF_ALLMULTI);
-+      } else {
-+              CLEAR_BIT(adev->rx_config_1, RX_CFG1_RCV_PROMISCUOUS);
-+              SET_BIT(adev->rx_config_1, RX_CFG1_FILTER_ALL_MULTI);
-+              SET_BIT(adev->set_mask, SET_RXCONFIG);
-+              ndev->flags &= ~(IFF_PROMISC|IFF_ALLMULTI);
-+      }
-+
-+      /* cannot update card settings directly here, atomic context */
-+      acx_schedule_task(adev, ACX_AFTER_IRQ_UPDATE_CARD_CFG);
-+
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxpci_l_process_rxdesc
-+**
-+** Called directly and only from the IRQ handler
-+*/
-+
-+#if !ACX_DEBUG
-+static inline void log_rxbuffer(const acx_device_t *adev) {}
-+#else
-+static void
-+log_rxbuffer(const acx_device_t *adev)
-+{
-+      register const struct rxhostdesc *rxhostdesc;
-+      int i;
-+      /* no FN_ENTER here, we don't want that */
-+
-+      rxhostdesc = adev->rxhostdesc_start;
-+      if (unlikely(!rxhostdesc)) return;
-+      for (i = 0; i < RX_CNT; i++) {
-+              if ((rxhostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN))
-+               && (rxhostdesc->Status & cpu_to_le32(DESC_STATUS_FULL)))
-+                      printk("rx: buf %d full\n", i);
-+              rxhostdesc++;
-+      }
-+}
-+#endif
-+
-+static void
-+acxpci_l_process_rxdesc(acx_device_t *adev)
-+{
-+      register rxhostdesc_t *hostdesc;
-+      unsigned count, tail;
-+
-+      FN_ENTER;
-+
-+      if (unlikely(acx_debug & L_BUFR))
-+              log_rxbuffer(adev);
-+
-+      /* First, have a loop to determine the first descriptor that's
-+       * full, just in case there's a mismatch between our current
-+       * rx_tail and the full descriptor we're supposed to handle. */
-+      tail = adev->rx_tail;
-+      count = RX_CNT;
-+      while (1) {
-+              hostdesc = &adev->rxhostdesc_start[tail];
-+              /* advance tail regardless of outcome of the below test */
-+              tail = (tail + 1) % RX_CNT;
-+
-+              if ((hostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN))
-+               && (hostdesc->Status & cpu_to_le32(DESC_STATUS_FULL)))
-+                      break;          /* found it! */
-+
-+              if (unlikely(!--count)) /* hmm, no luck: all descs empty, bail out */
-+                      goto end;
-+      }
-+
-+      /* now process descriptors, starting with the first we figured out */
-+      while (1) {
-+              log(L_BUFR, "rx: tail=%u Ctl_16=%04X Status=%08X\n",
-+                      tail, hostdesc->Ctl_16, hostdesc->Status);
-+
-+              acx_l_process_rxbuf(adev, hostdesc->data);
-+
-+              hostdesc->Status = 0;
-+              /* flush all writes before adapter sees CTL_HOSTOWN change */
-+              wmb();
-+              /* Host no longer owns this, needs to be LAST */
-+              CLEAR_BIT(hostdesc->Ctl_16, cpu_to_le16(DESC_CTL_HOSTOWN));
-+
-+              /* ok, descriptor is handled, now check the next descriptor */
-+              hostdesc = &adev->rxhostdesc_start[tail];
-+
-+              /* if next descriptor is empty, then bail out */
-+              if (!(hostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN))
-+               || !(hostdesc->Status & cpu_to_le32(DESC_STATUS_FULL)))
-+                      break;
-+
-+              tail = (tail + 1) % RX_CNT;
-+      }
-+end:
-+      adev->rx_tail = tail;
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_i_interrupt
-+**
-+** IRQ handler (atomic context, must not sleep, blah, blah)
-+*/
-+
-+/* scan is complete. all frames now on the receive queue are valid */
-+#define INFO_SCAN_COMPLETE      0x0001
-+#define INFO_WEP_KEY_NOT_FOUND  0x0002
-+/* hw has been reset as the result of a watchdog timer timeout */
-+#define INFO_WATCH_DOG_RESET    0x0003
-+/* failed to send out NULL frame from PS mode notification to AP */
-+/* recommended action: try entering 802.11 PS mode again */
-+#define INFO_PS_FAIL            0x0004
-+/* encryption/decryption process on a packet failed */
-+#define INFO_IV_ICV_FAILURE     0x0005
-+
-+/* Info mailbox format:
-+2 bytes: type
-+2 bytes: status
-+more bytes may follow
-+    rumors say about status:
-+      0x0000 info available (set by hw)
-+      0x0001 information received (must be set by host)
-+      0x1000 info available, mailbox overflowed (messages lost) (set by hw)
-+    but in practice we've seen:
-+      0x9000 when we did not set status to 0x0001 on prev message
-+      0x1001 when we did set it
-+      0x0000 was never seen
-+    conclusion: this is really a bitfield:
-+    0x1000 is 'info available' bit
-+    'mailbox overflowed' bit is 0x8000, not 0x1000
-+    value of 0x0000 probably means that there are no messages at all
-+    P.S. I dunno how in hell hw is supposed to notice that messages are lost -
-+    it does NOT clear bit 0x0001, and this bit will probably stay forever set
-+    after we set it once. Let's hope this will be fixed in firmware someday
-+*/
-+
-+static void
-+handle_info_irq(acx_device_t *adev)
-+{
-+#if ACX_DEBUG
-+      static const char * const info_type_msg[] = {
-+              "(unknown)",
-+              "scan complete",
-+              "WEP key not found",
-+              "internal watchdog reset was done",
-+              "failed to send powersave (NULL frame) notification to AP",
-+              "encrypt/decrypt on a packet has failed",
-+              "TKIP tx keys disabled",
-+              "TKIP rx keys disabled",
-+              "TKIP rx: key ID not found",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "???",
-+              "TKIP IV value exceeds thresh"
-+      };
-+#endif
-+      u32 info_type, info_status;
-+
-+      info_type = readl(adev->info_area);
-+      info_status = (info_type >> 16);
-+      info_type = (u16)info_type;
-+
-+      /* inform fw that we have read this info message */
-+      writel(info_type | 0x00010000, adev->info_area);
-+      write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_INFOACK);
-+      write_flush(adev);
-+
-+      log(L_CTL, "info_type:%04X info_status:%04X\n",
-+                      info_type, info_status);
-+
-+      log(L_IRQ, "got Info IRQ: status %04X type %04X: %s\n",
-+              info_status, info_type,
-+              info_type_msg[(info_type >= VEC_SIZE(info_type_msg)) ?
-+                              0 : info_type]
-+      );
-+}
-+
-+
-+static void
-+log_unusual_irq(u16 irqtype) {
-+      /*
-+      if (!printk_ratelimit())
-+              return;
-+      */
-+
-+      printk("acx: got");
-+      if (irqtype & HOST_INT_RX_DATA) {
-+              printk(" Rx_Data");
-+      }
-+              /* HOST_INT_TX_COMPLETE   */
-+      if (irqtype & HOST_INT_TX_XFER) {
-+              printk(" Tx_Xfer");
-+      }
-+              /* HOST_INT_RX_COMPLETE   */
-+      if (irqtype & HOST_INT_DTIM) {
-+              printk(" DTIM");
-+      }
-+      if (irqtype & HOST_INT_BEACON) {
-+              printk(" Beacon");
-+      }
-+      if (irqtype & HOST_INT_TIMER) {
-+              log(L_IRQ, " Timer");
-+      }
-+      if (irqtype & HOST_INT_KEY_NOT_FOUND) {
-+              printk(" Key_Not_Found");
-+      }
-+      if (irqtype & HOST_INT_IV_ICV_FAILURE) {
-+              printk(" IV_ICV_Failure (crypto)");
-+      }
-+              /* HOST_INT_CMD_COMPLETE  */
-+              /* HOST_INT_INFO          */
-+      if (irqtype & HOST_INT_OVERFLOW) {
-+              printk(" Overflow");
-+      }
-+      if (irqtype & HOST_INT_PROCESS_ERROR) {
-+              printk(" Process_Error");
-+      }
-+              /* HOST_INT_SCAN_COMPLETE */
-+      if (irqtype & HOST_INT_FCS_THRESHOLD) {
-+              printk(" FCS_Threshold");
-+      }
-+      if (irqtype & HOST_INT_UNKNOWN) {
-+              printk(" Unknown");
-+      }
-+      printk(" IRQ(s)\n");
-+}
-+
-+
-+static void
-+update_link_quality_led(acx_device_t *adev)
-+{
-+      int qual;
-+
-+      qual = acx_signal_determine_quality(adev->wstats.qual.level, adev->wstats.qual.noise);
-+      if (qual > adev->brange_max_quality)
-+              qual = adev->brange_max_quality;
-+
-+      if (time_after(jiffies, adev->brange_time_last_state_change +
-+                              (HZ/2 - HZ/2 * (unsigned long)qual / adev->brange_max_quality ) )) {
-+              acxpci_l_power_led(adev, (adev->brange_last_state == 0));
-+              adev->brange_last_state ^= 1; /* toggle */
-+              adev->brange_time_last_state_change = jiffies;
-+      }
-+}
-+
-+
-+#define MAX_IRQLOOPS_PER_JIFFY  (20000/HZ) /* a la orinoco.c */
-+
-+static irqreturn_t
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
-+acxpci_i_interrupt(int irq, void *dev_id)
-+#else
-+acxpci_i_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+#endif
-+{
-+      acx_device_t *adev;
-+      unsigned long flags;
-+      unsigned int irqcount = MAX_IRQLOOPS_PER_JIFFY;
-+      register u16 irqtype;
-+      u16 unmasked;
-+
-+      adev = ndev2adev((struct net_device*)dev_id);
-+
-+      /* LOCKING: can just spin_lock() since IRQs are disabled anyway.
-+       * I am paranoid */
-+      acx_lock(adev, flags);
-+
-+      unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR);
-+      if (unlikely(0xffff == unmasked)) {
-+              /* 0xffff value hints at missing hardware,
-+               * so don't do anything.
-+               * Not very clean, but other drivers do the same... */
-+              log(L_IRQ, "IRQ type:FFFF - device removed? IRQ_NONE\n");
-+              goto none;
-+      }
-+
-+      /* We will check only "interesting" IRQ types */
-+      irqtype = unmasked & ~adev->irq_mask;
-+      if (!irqtype) {
-+              /* We are on a shared IRQ line and it wasn't our IRQ */
-+              log(L_IRQ, "IRQ type:%04X, mask:%04X - all are masked, IRQ_NONE\n",
-+                      unmasked, adev->irq_mask);
-+              goto none;
-+      }
-+
-+      /* Done here because IRQ_NONEs taking three lines of log
-+      ** drive me crazy */
-+      FN_ENTER;
-+
-+#define IRQ_ITERATE 1
-+#if IRQ_ITERATE
-+if (jiffies != adev->irq_last_jiffies) {
-+      adev->irq_loops_this_jiffy = 0;
-+      adev->irq_last_jiffies = jiffies;
-+}
-+
-+/* safety condition; we'll normally abort loop below
-+ * in case no IRQ type occurred */
-+while (likely(--irqcount)) {
-+#endif
-+      /* ACK all IRQs ASAP */
-+      write_reg16(adev, IO_ACX_IRQ_ACK, 0xffff);
-+
-+      log(L_IRQ, "IRQ type:%04X, mask:%04X, type & ~mask:%04X\n",
-+                              unmasked, adev->irq_mask, irqtype);
-+
-+      /* Handle most important IRQ types first */
-+      if (irqtype & HOST_INT_RX_COMPLETE) {
-+              log(L_IRQ, "got Rx_Complete IRQ\n");
-+              acxpci_l_process_rxdesc(adev);
-+      }
-+      if (irqtype & HOST_INT_TX_COMPLETE) {
-+              log(L_IRQ, "got Tx_Complete IRQ\n");
-+              /* don't clean up on each Tx complete, wait a bit
-+               * unless we're going towards full, in which case
-+               * we do it immediately, too (otherwise we might lockup
-+               * with a full Tx buffer if we go into
-+               * acxpci_l_clean_txdesc() at a time when we won't wakeup
-+               * the net queue in there for some reason...) */
-+              if (adev->tx_free <= TX_START_CLEAN) {
-+#if TX_CLEANUP_IN_SOFTIRQ
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_TX_CLEANUP);
-+#else
-+                      acxpci_l_clean_txdesc(adev);
-+#endif
-+              }
-+      }
-+
-+      /* Less frequent ones */
-+      if (irqtype & (0
-+              | HOST_INT_CMD_COMPLETE
-+              | HOST_INT_INFO
-+              | HOST_INT_SCAN_COMPLETE
-+      )) {
-+              if (irqtype & HOST_INT_CMD_COMPLETE) {
-+                      log(L_IRQ, "got Command_Complete IRQ\n");
-+                      /* save the state for the running issue_cmd() */
-+                      SET_BIT(adev->irq_status, HOST_INT_CMD_COMPLETE);
-+              }
-+              if (irqtype & HOST_INT_INFO) {
-+                      handle_info_irq(adev);
-+              }
-+              if (irqtype & HOST_INT_SCAN_COMPLETE) {
-+                      log(L_IRQ, "got Scan_Complete IRQ\n");
-+                      /* need to do that in process context */
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_COMPLETE_SCAN);
-+                      /* remember that fw is not scanning anymore */
-+                      SET_BIT(adev->irq_status, HOST_INT_SCAN_COMPLETE);
-+              }
-+      }
-+
-+      /* These we just log, but either they happen rarely
-+       * or we keep them masked out */
-+      if (irqtype & (0
-+              | HOST_INT_RX_DATA
-+              /* | HOST_INT_TX_COMPLETE   */
-+              | HOST_INT_TX_XFER
-+              /* | HOST_INT_RX_COMPLETE   */
-+              | HOST_INT_DTIM
-+              | HOST_INT_BEACON
-+              | HOST_INT_TIMER
-+              | HOST_INT_KEY_NOT_FOUND
-+              | HOST_INT_IV_ICV_FAILURE
-+              /* | HOST_INT_CMD_COMPLETE  */
-+              /* | HOST_INT_INFO          */
-+              | HOST_INT_OVERFLOW
-+              | HOST_INT_PROCESS_ERROR
-+              /* | HOST_INT_SCAN_COMPLETE */
-+              | HOST_INT_FCS_THRESHOLD
-+              | HOST_INT_UNKNOWN
-+      )) {
-+              log_unusual_irq(irqtype);
-+      }
-+
-+#if IRQ_ITERATE
-+      unmasked = read_reg16(adev, IO_ACX_IRQ_STATUS_CLEAR);
-+      irqtype = unmasked & ~adev->irq_mask;
-+      /* Bail out if no new IRQ bits or if all are masked out */
-+      if (!irqtype)
-+              break;
-+
-+      if (unlikely(++adev->irq_loops_this_jiffy > MAX_IRQLOOPS_PER_JIFFY)) {
-+              printk(KERN_ERR "acx: too many interrupts per jiffy!\n");
-+              /* Looks like card floods us with IRQs! Try to stop that */
-+              write_reg16(adev, IO_ACX_IRQ_MASK, 0xffff);
-+              /* This will short-circuit all future attempts to handle IRQ.
-+               * We cant do much more... */
-+              adev->irq_mask = 0;
-+              break;
-+      }
-+}
-+#endif
-+      /* Routine to perform blink with range */
-+      if (unlikely(adev->led_power == 2))
-+              update_link_quality_led(adev);
-+
-+/* handled: */
-+      /* write_flush(adev); - not needed, last op was read anyway */
-+      acx_unlock(adev, flags);
-+      FN_EXIT0;
-+      return IRQ_HANDLED;
-+
-+none:
-+      acx_unlock(adev, flags);
-+      return IRQ_NONE;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_l_power_led
-+*/
-+void
-+acxpci_l_power_led(acx_device_t *adev, int enable)
-+{
-+      u16 gpio_pled = IS_ACX111(adev) ? 0x0040 : 0x0800;
-+
-+      /* A hack. Not moving message rate limiting to adev->xxx
-+       * (it's only a debug message after all) */
-+      static int rate_limit = 0;
-+
-+      if (rate_limit++ < 3)
-+              log(L_IOCTL, "Please report in case toggling the power "
-+                              "LED doesn't work for your card!\n");
-+      if (enable)
-+              write_reg16(adev, IO_ACX_GPIO_OUT,
-+                      read_reg16(adev, IO_ACX_GPIO_OUT) & ~gpio_pled);
-+      else
-+              write_reg16(adev, IO_ACX_GPIO_OUT,
-+                      read_reg16(adev, IO_ACX_GPIO_OUT) | gpio_pled);
-+}
-+
-+
-+/***********************************************************************
-+** Ioctls
-+*/
-+
-+/***********************************************************************
-+*/
-+int
-+acx111pci_ioctl_info(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra)
-+{
-+#if ACX_DEBUG > 1
-+      acx_device_t *adev = ndev2adev(ndev);
-+      rxdesc_t *rxdesc;
-+      txdesc_t *txdesc;
-+      rxhostdesc_t *rxhostdesc;
-+      txhostdesc_t *txhostdesc;
-+      struct acx111_ie_memoryconfig memconf;
-+      struct acx111_ie_queueconfig queueconf;
-+      unsigned long flags;
-+      int i;
-+      char memmap[0x34];
-+      char rxconfig[0x8];
-+      char fcserror[0x8];
-+      char ratefallback[0x5];
-+
-+      if ( !(acx_debug & (L_IOCTL|L_DEBUG)) )
-+              return OK;
-+      /* using printk() since we checked debug flag already */
-+
-+      acx_sem_lock(adev);
-+
-+      if (!IS_ACX111(adev)) {
-+              printk("acx111-specific function called "
-+                      "with non-acx111 chip, aborting\n");
-+              goto end_ok;
-+      }
-+
-+      /* get Acx111 Memory Configuration */
-+      memset(&memconf, 0, sizeof(memconf));
-+      /* BTW, fails with 12 (Write only) error code.
-+      ** Retained for easy testing of issue_cmd error handling :) */
-+      acx_s_interrogate(adev, &memconf, ACX1xx_IE_QUEUE_CONFIG);
-+
-+      /* get Acx111 Queue Configuration */
-+      memset(&queueconf, 0, sizeof(queueconf));
-+      acx_s_interrogate(adev, &queueconf, ACX1xx_IE_MEMORY_CONFIG_OPTIONS);
-+
-+      /* get Acx111 Memory Map */
-+      memset(memmap, 0, sizeof(memmap));
-+      acx_s_interrogate(adev, &memmap, ACX1xx_IE_MEMORY_MAP);
-+
-+      /* get Acx111 Rx Config */
-+      memset(rxconfig, 0, sizeof(rxconfig));
-+      acx_s_interrogate(adev, &rxconfig, ACX1xx_IE_RXCONFIG);
-+
-+      /* get Acx111 fcs error count */
-+      memset(fcserror, 0, sizeof(fcserror));
-+      acx_s_interrogate(adev, &fcserror, ACX1xx_IE_FCS_ERROR_COUNT);
-+
-+      /* get Acx111 rate fallback */
-+      memset(ratefallback, 0, sizeof(ratefallback));
-+      acx_s_interrogate(adev, &ratefallback, ACX1xx_IE_RATE_FALLBACK);
-+
-+      /* force occurrence of a beacon interrupt */
-+      /* TODO: comment why is this necessary */
-+      write_reg16(adev, IO_ACX_HINT_TRIG, HOST_INT_BEACON);
-+
-+      /* dump Acx111 Mem Configuration */
-+      printk("dump mem config:\n"
-+              "data read: %d, struct size: %d\n"
-+              "Number of stations: %1X\n"
-+              "Memory block size: %1X\n"
-+              "tx/rx memory block allocation: %1X\n"
-+              "count rx: %X / tx: %X queues\n"
-+              "options %1X\n"
-+              "fragmentation %1X\n"
-+              "Rx Queue 1 Count Descriptors: %X\n"
-+              "Rx Queue 1 Host Memory Start: %X\n"
-+              "Tx Queue 1 Count Descriptors: %X\n"
-+              "Tx Queue 1 Attributes: %X\n",
-+              memconf.len, (int) sizeof(memconf),
-+              memconf.no_of_stations,
-+              memconf.memory_block_size,
-+              memconf.tx_rx_memory_block_allocation,
-+              memconf.count_rx_queues, memconf.count_tx_queues,
-+              memconf.options,
-+              memconf.fragmentation,
-+              memconf.rx_queue1_count_descs,
-+      acx2cpu(memconf.rx_queue1_host_rx_start),
-+              memconf.tx_queue1_count_descs,
-+              memconf.tx_queue1_attributes);
-+
-+      /* dump Acx111 Queue Configuration */
-+      printk("dump queue head:\n"
-+              "data read: %d, struct size: %d\n"
-+              "tx_memory_block_address (from card): %X\n"
-+              "rx_memory_block_address (from card): %X\n"
-+              "rx1_queue address (from card): %X\n"
-+              "tx1_queue address (from card): %X\n"
-+              "tx1_queue attributes (from card): %X\n",
-+              queueconf.len, (int) sizeof(queueconf),
-+              queueconf.tx_memory_block_address,
-+              queueconf.rx_memory_block_address,
-+              queueconf.rx1_queue_address,
-+              queueconf.tx1_queue_address,
-+              queueconf.tx1_attributes);
-+
-+      /* dump Acx111 Mem Map */
-+      printk("dump mem map:\n"
-+              "data read: %d, struct size: %d\n"
-+              "Code start: %X\n"
-+              "Code end: %X\n"
-+              "WEP default key start: %X\n"
-+              "WEP default key end: %X\n"
-+              "STA table start: %X\n"
-+              "STA table end: %X\n"
-+              "Packet template start: %X\n"
-+              "Packet template end: %X\n"
-+              "Queue memory start: %X\n"
-+              "Queue memory end: %X\n"
-+              "Packet memory pool start: %X\n"
-+              "Packet memory pool end: %X\n"
-+              "iobase: %p\n"
-+              "iobase2: %p\n",
-+              *((u16 *)&memmap[0x02]), (int) sizeof(memmap),
-+              *((u32 *)&memmap[0x04]),
-+              *((u32 *)&memmap[0x08]),
-+              *((u32 *)&memmap[0x0C]),
-+              *((u32 *)&memmap[0x10]),
-+              *((u32 *)&memmap[0x14]),
-+              *((u32 *)&memmap[0x18]),
-+              *((u32 *)&memmap[0x1C]),
-+              *((u32 *)&memmap[0x20]),
-+              *((u32 *)&memmap[0x24]),
-+              *((u32 *)&memmap[0x28]),
-+              *((u32 *)&memmap[0x2C]),
-+              *((u32 *)&memmap[0x30]),
-+              adev->iobase,
-+              adev->iobase2);
-+
-+      /* dump Acx111 Rx Config */
-+      printk("dump rx config:\n"
-+              "data read: %d, struct size: %d\n"
-+              "rx config: %X\n"
-+              "rx filter config: %X\n",
-+              *((u16 *)&rxconfig[0x02]), (int) sizeof(rxconfig),
-+              *((u16 *)&rxconfig[0x04]),
-+              *((u16 *)&rxconfig[0x06]));
-+
-+      /* dump Acx111 fcs error */
-+      printk("dump fcserror:\n"
-+              "data read: %d, struct size: %d\n"
-+              "fcserrors: %X\n",
-+              *((u16 *)&fcserror[0x02]), (int) sizeof(fcserror),
-+              *((u32 *)&fcserror[0x04]));
-+
-+      /* dump Acx111 rate fallback */
-+      printk("dump rate fallback:\n"
-+              "data read: %d, struct size: %d\n"
-+              "ratefallback: %X\n",
-+              *((u16 *)&ratefallback[0x02]), (int) sizeof(ratefallback),
-+              *((u8 *)&ratefallback[0x04]));
-+
-+      /* protect against IRQ */
-+      acx_lock(adev, flags);
-+
-+      /* dump acx111 internal rx descriptor ring buffer */
-+      rxdesc = adev->rxdesc_start;
-+
-+      /* loop over complete receive pool */
-+      if (rxdesc) for (i = 0; i < RX_CNT; i++) {
-+              printk("\ndump internal rxdesc %d:\n"
-+                      "mem pos %p\n"
-+                      "next 0x%X\n"
-+                      "acx mem pointer (dynamic) 0x%X\n"
-+                      "CTL (dynamic) 0x%X\n"
-+                      "Rate (dynamic) 0x%X\n"
-+                      "RxStatus (dynamic) 0x%X\n"
-+                      "Mod/Pre (dynamic) 0x%X\n",
-+                      i,
-+                      rxdesc,
-+                      acx2cpu(rxdesc->pNextDesc),
-+                      acx2cpu(rxdesc->ACXMemPtr),
-+                      rxdesc->Ctl_8,
-+                      rxdesc->rate,
-+                      rxdesc->error,
-+                      rxdesc->SNR);
-+              rxdesc++;
-+      }
-+
-+      /* dump host rx descriptor ring buffer */
-+
-+      rxhostdesc = adev->rxhostdesc_start;
-+
-+      /* loop over complete receive pool */
-+      if (rxhostdesc) for (i = 0; i < RX_CNT; i++) {
-+              printk("\ndump host rxdesc %d:\n"
-+                      "mem pos %p\n"
-+                      "buffer mem pos 0x%X\n"
-+                      "buffer mem offset 0x%X\n"
-+                      "CTL 0x%X\n"
-+                      "Length 0x%X\n"
-+                      "next 0x%X\n"
-+                      "Status 0x%X\n",
-+                      i,
-+                      rxhostdesc,
-+                      acx2cpu(rxhostdesc->data_phy),
-+                      rxhostdesc->data_offset,
-+                      le16_to_cpu(rxhostdesc->Ctl_16),
-+                      le16_to_cpu(rxhostdesc->length),
-+                      acx2cpu(rxhostdesc->desc_phy_next),
-+                      rxhostdesc->Status);
-+              rxhostdesc++;
-+      }
-+
-+      /* dump acx111 internal tx descriptor ring buffer */
-+      txdesc = adev->txdesc_start;
-+
-+      /* loop over complete transmit pool */
-+      if (txdesc) for (i = 0; i < TX_CNT; i++) {
-+              printk("\ndump internal txdesc %d:\n"
-+                      "size 0x%X\n"
-+                      "mem pos %p\n"
-+                      "next 0x%X\n"
-+                      "acx mem pointer (dynamic) 0x%X\n"
-+                      "host mem pointer (dynamic) 0x%X\n"
-+                      "length (dynamic) 0x%X\n"
-+                      "CTL (dynamic) 0x%X\n"
-+                      "CTL2 (dynamic) 0x%X\n"
-+                      "Status (dynamic) 0x%X\n"
-+                      "Rate (dynamic) 0x%X\n",
-+                      i,
-+                      (int) sizeof(struct txdesc),
-+                      txdesc,
-+                      acx2cpu(txdesc->pNextDesc),
-+                      acx2cpu(txdesc->AcxMemPtr),
-+                      acx2cpu(txdesc->HostMemPtr),
-+                      le16_to_cpu(txdesc->total_length),
-+                      txdesc->Ctl_8,
-+                      txdesc->Ctl2_8, txdesc->error,
-+                      txdesc->u.r1.rate);
-+              txdesc = advance_txdesc(adev, txdesc, 1);
-+      }
-+
-+      /* dump host tx descriptor ring buffer */
-+
-+      txhostdesc = adev->txhostdesc_start;
-+
-+      /* loop over complete host send pool */
-+      if (txhostdesc) for (i = 0; i < TX_CNT * 2; i++) {
-+              printk("\ndump host txdesc %d:\n"
-+                      "mem pos %p\n"
-+                      "buffer mem pos 0x%X\n"
-+                      "buffer mem offset 0x%X\n"
-+                      "CTL 0x%X\n"
-+                      "Length 0x%X\n"
-+                      "next 0x%X\n"
-+                      "Status 0x%X\n",
-+                      i,
-+                      txhostdesc,
-+                      acx2cpu(txhostdesc->data_phy),
-+                      txhostdesc->data_offset,
-+                      le16_to_cpu(txhostdesc->Ctl_16),
-+                      le16_to_cpu(txhostdesc->length),
-+                      acx2cpu(txhostdesc->desc_phy_next),
-+                      le32_to_cpu(txhostdesc->Status));
-+              txhostdesc++;
-+      }
-+
-+      /* write_reg16(adev, 0xb4, 0x4); */
-+
-+      acx_unlock(adev, flags);
-+end_ok:
-+
-+      acx_sem_unlock(adev);
-+#endif /* ACX_DEBUG */
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acx100pci_ioctl_set_phy_amp_bias(
-+      struct net_device *ndev,
-+      struct iw_request_info *info,
-+      struct iw_param *vwrq,
-+      char *extra)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      u16 gpio_old;
-+
-+      if (!IS_ACX100(adev)) {
-+              /* WARNING!!!
-+               * Removing this check *might* damage
-+               * hardware, since we're tweaking GPIOs here after all!!!
-+               * You've been warned...
-+               * WARNING!!! */
-+              printk("acx: sorry, setting bias level for non-acx100 "
-+                      "is not supported yet\n");
-+              return OK;
-+      }
-+
-+      if (*extra > 7) {
-+              printk("acx: invalid bias parameter, range is 0-7\n");
-+              return -EINVAL;
-+      }
-+
-+      acx_sem_lock(adev);
-+
-+      /* Need to lock accesses to [IO_ACX_GPIO_OUT]:
-+       * IRQ handler uses it to update LED */
-+      acx_lock(adev, flags);
-+      gpio_old = read_reg16(adev, IO_ACX_GPIO_OUT);
-+      write_reg16(adev, IO_ACX_GPIO_OUT, (gpio_old & 0xf8ff) | ((u16)*extra << 8));
-+      acx_unlock(adev, flags);
-+
-+      log(L_DEBUG, "gpio_old: 0x%04X\n", gpio_old);
-+      printk("%s: PHY power amplifier bias: old:%d, new:%d\n",
-+              ndev->name,
-+              (gpio_old & 0x0700) >> 8, (unsigned char)*extra);
-+
-+      acx_sem_unlock(adev);
-+
-+      return OK;
-+}
-+
-+
-+/***************************************************************
-+** acxpci_l_alloc_tx
-+** Actually returns a txdesc_t* ptr
-+**
-+** FIXME: in case of fragments, should allocate multiple descrs
-+** after figuring out how many we need and whether we still have
-+** sufficiently many.
-+*/
-+tx_t*
-+acxpci_l_alloc_tx(acx_device_t *adev)
-+{
-+      struct txdesc *txdesc;
-+      unsigned head;
-+      u8 ctl8;
-+
-+      FN_ENTER;
-+
-+      if (unlikely(!adev->tx_free)) {
-+              printk("acx: BUG: no free txdesc left\n");
-+              txdesc = NULL;
-+              goto end;
-+      }
-+
-+      head = adev->tx_head;
-+      txdesc = get_txdesc(adev, head);
-+      ctl8 = txdesc->Ctl_8;
-+
-+      /* 2005-10-11: there were several bug reports on this happening
-+      ** but now cause seems to be understood & fixed */
-+      if (unlikely(DESC_CTL_HOSTOWN != (ctl8 & DESC_CTL_ACXDONE_HOSTOWN))) {
-+              /* whoops, descr at current index is not free, so probably
-+               * ring buffer already full */
-+              printk("acx: BUG: tx_head:%d Ctl8:0x%02X - failed to find "
-+                      "free txdesc\n", head, ctl8);
-+              txdesc = NULL;
-+              goto end;
-+      }
-+
-+      /* Needed in case txdesc won't be eventually submitted for tx */
-+      txdesc->Ctl_8 = DESC_CTL_ACXDONE_HOSTOWN;
-+
-+      adev->tx_free--;
-+      log(L_BUFT, "tx: got desc %u, %u remain\n",
-+                      head, adev->tx_free);
-+      /* Keep a few free descs between head and tail of tx ring.
-+      ** It is not absolutely needed, just feels safer */
-+      if (adev->tx_free < TX_STOP_QUEUE) {
-+              log(L_BUF, "stop queue (%u tx desc left)\n",
-+                              adev->tx_free);
-+              acx_stop_queue(adev->ndev, NULL);
-+      }
-+
-+      /* returning current descriptor, so advance to next free one */
-+      adev->tx_head = (head + 1) % TX_CNT;
-+end:
-+      FN_EXIT0;
-+
-+      return (tx_t*)txdesc;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+void*
-+acxpci_l_get_txbuf(acx_device_t *adev, tx_t* tx_opaque)
-+{
-+      return get_txhostdesc(adev, (txdesc_t*)tx_opaque)->data;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_l_tx_data
-+**
-+** Can be called from IRQ (rx -> (AP bridging or mgmt response) -> tx).
-+** Can be called from acx_i_start_xmit (data frames from net core).
-+**
-+** FIXME: in case of fragments, should loop over the number of
-+** pre-allocated tx descrs, properly setting up transfer data and
-+** CTL_xxx flags according to fragment number.
-+*/
-+void
-+acxpci_l_tx_data(acx_device_t *adev, tx_t* tx_opaque, int len)
-+{
-+      txdesc_t *txdesc = (txdesc_t*)tx_opaque;
-+      txhostdesc_t *hostdesc1, *hostdesc2;
-+      client_t *clt;
-+      u16 rate_cur;
-+      u8 Ctl_8, Ctl2_8;
-+
-+      FN_ENTER;
-+
-+      /* fw doesn't tx such packets anyhow */
-+      if (unlikely(len < WLAN_HDR_A3_LEN))
-+              goto end;
-+
-+      hostdesc1 = get_txhostdesc(adev, txdesc);
-+      /* modify flag status in separate variable to be able to write it back
-+       * in one big swoop later (also in order to have less device memory
-+       * accesses) */
-+      Ctl_8 = txdesc->Ctl_8;
-+      Ctl2_8 = 0; /* really need to init it to 0, not txdesc->Ctl2_8, it seems */
-+
-+      hostdesc2 = hostdesc1 + 1;
-+
-+      /* DON'T simply set Ctl field to 0 here globally,
-+       * it needs to maintain a consistent flag status (those are state flags!!),
-+       * otherwise it may lead to severe disruption. Only set or reset particular
-+       * flags at the exact moment this is needed... */
-+
-+      /* let chip do RTS/CTS handshaking before sending
-+       * in case packet size exceeds threshold */
-+      if (len > adev->rts_threshold)
-+              SET_BIT(Ctl2_8, DESC_CTL2_RTS);
-+      else
-+              CLEAR_BIT(Ctl2_8, DESC_CTL2_RTS);
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+      case ACX_MODE_3_AP:
-+              clt = acx_l_sta_list_get(adev, ((wlan_hdr_t*)hostdesc1->data)->a1);
-+              break;
-+      case ACX_MODE_2_STA:
-+              clt = adev->ap_client;
-+              break;
-+#if 0
-+/* testing was done on acx111: */
-+      case ACX_MODE_MONITOR:
-+              SET_BIT(Ctl2_8, 0
-+/* sends CTS to self before packet */
-+                      + DESC_CTL2_SEQ         /* don't increase sequence field */
-+/* not working (looks like good fcs is still added) */
-+                      + DESC_CTL2_FCS         /* don't add the FCS */
-+/* not tested */
-+                      + DESC_CTL2_MORE_FRAG
-+/* not tested */
-+                      + DESC_CTL2_RETRY       /* don't increase retry field */
-+/* not tested */
-+                      + DESC_CTL2_POWER       /* don't increase power mgmt. field */
-+/* no effect */
-+                      + DESC_CTL2_WEP         /* encrypt this frame */
-+/* not tested */
-+                      + DESC_CTL2_DUR         /* don't increase duration field */
-+                      );
-+              /* fallthrough */
-+#endif
-+      default: /* ACX_MODE_OFF, ACX_MODE_MONITOR */
-+              clt = NULL;
-+              break;
-+      }
-+
-+      rate_cur = clt ? clt->rate_cur : adev->rate_bcast;
-+      if (unlikely(!rate_cur)) {
-+              printk("acx: driver bug! bad ratemask\n");
-+              goto end;
-+      }
-+
-+      /* used in tx cleanup routine for auto rate and accounting: */
-+      put_txcr(adev, txdesc, clt, rate_cur);
-+
-+      txdesc->total_length = cpu_to_le16(len);
-+      hostdesc2->length = cpu_to_le16(len - WLAN_HDR_A3_LEN);
-+      if (IS_ACX111(adev)) {
-+              /* note that if !txdesc->do_auto, txrate->cur
-+              ** has only one nonzero bit */
-+              txdesc->u.r2.rate111 = cpu_to_le16(
-+                      rate_cur
-+                      /* WARNING: I was never able to make it work with prism54 AP.
-+                      ** It was falling down to 1Mbit where shortpre is not applicable,
-+                      ** and not working at all at "5,11 basic rates only" setting.
-+                      ** I even didn't see tx packets in radio packet capture.
-+                      ** Disabled for now --vda */
-+                      /*| ((clt->shortpre && clt->cur!=RATE111_1) ? RATE111_SHORTPRE : 0) */
-+                      );
-+#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS
-+                      /* should add this to rate111 above as necessary */
-+                      | (clt->pbcc511 ? RATE111_PBCC511 : 0)
-+#endif
-+              hostdesc1->length = cpu_to_le16(len);
-+      } else { /* ACX100 */
-+              u8 rate_100 = clt ? clt->rate_100 : adev->rate_bcast100;
-+              txdesc->u.r1.rate = rate_100;
-+#ifdef TODO_FIGURE_OUT_WHEN_TO_SET_THIS
-+              if (clt->pbcc511) {
-+                      if (n == RATE100_5 || n == RATE100_11)
-+                              n |= RATE100_PBCC511;
-+              }
-+
-+              if (clt->shortpre && (clt->cur != RATE111_1))
-+                      SET_BIT(Ctl_8, DESC_CTL_SHORT_PREAMBLE); /* set Short Preamble */
-+#endif
-+              /* set autodma and reclaim and 1st mpdu */
-+              SET_BIT(Ctl_8, DESC_CTL_AUTODMA | DESC_CTL_RECLAIM | DESC_CTL_FIRSTFRAG);
-+#if ACX_FRAGMENTATION
-+              /* SET_BIT(Ctl2_8, DESC_CTL2_MORE_FRAG); cannot set it unconditionally, needs to be set for all non-last fragments */
-+#endif
-+              hostdesc1->length = cpu_to_le16(WLAN_HDR_A3_LEN);
-+      }
-+      /* don't need to clean ack/rts statistics here, already
-+       * done on descr cleanup */
-+
-+      /* clears HOSTOWN and ACXDONE bits, thus telling that the descriptors
-+       * are now owned by the acx100; do this as LAST operation */
-+      CLEAR_BIT(Ctl_8, DESC_CTL_ACXDONE_HOSTOWN);
-+      /* flush writes before we release hostdesc to the adapter here */
-+      wmb();
-+      CLEAR_BIT(hostdesc1->Ctl_16, cpu_to_le16(DESC_CTL_HOSTOWN));
-+      CLEAR_BIT(hostdesc2->Ctl_16, cpu_to_le16(DESC_CTL_HOSTOWN));
-+
-+      /* write back modified flags */
-+      txdesc->Ctl2_8 = Ctl2_8;
-+      txdesc->Ctl_8 = Ctl_8;
-+      /* unused: txdesc->tx_time = cpu_to_le32(jiffies); */
-+
-+      /* flush writes before we tell the adapter that it's its turn now */
-+      mmiowb();
-+      write_reg16(adev, IO_ACX_INT_TRIG, INT_TRIG_TXPRC);
-+      write_flush(adev);
-+
-+      /* log the packet content AFTER sending it,
-+       * in order to not delay sending any further than absolutely needed
-+       * Do separate logs for acx100/111 to have human-readable rates */
-+      if (unlikely(acx_debug & (L_XFER|L_DATA))) {
-+              u16 fc = ((wlan_hdr_t*)hostdesc1->data)->fc;
-+              if (IS_ACX111(adev))
-+                      printk("tx: pkt (%s): len %d "
-+                              "rate %04X%s status %u\n",
-+                              acx_get_packet_type_string(le16_to_cpu(fc)), len,
-+                              le16_to_cpu(txdesc->u.r2.rate111),
-+                              (le16_to_cpu(txdesc->u.r2.rate111) & RATE111_SHORTPRE) ? "(SPr)" : "",
-+                              adev->status);
-+              else
-+                      printk("tx: pkt (%s): len %d rate %03u%s status %u\n",
-+                              acx_get_packet_type_string(fc), len,
-+                              txdesc->u.r1.rate,
-+                              (Ctl_8 & DESC_CTL_SHORT_PREAMBLE) ? "(SPr)" : "",
-+                              adev->status);
-+
-+              if (acx_debug & L_DATA) {
-+                      printk("tx: 802.11 [%d]: ", len);
-+                      acx_dump_bytes(hostdesc1->data, len);
-+              }
-+      }
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_l_clean_txdesc
-+**
-+** This function resets the txdescs' status when the ACX100
-+** signals the TX done IRQ (txdescs have been processed), starting with
-+** the pool index of the descriptor which we would use next,
-+** in order to make sure that we can be as fast as possible
-+** in filling new txdescs.
-+** Everytime we get called we know where the next packet to be cleaned is.
-+*/
-+
-+#if !ACX_DEBUG
-+static inline void log_txbuffer(const acx_device_t *adev) {}
-+#else
-+static void
-+log_txbuffer(acx_device_t *adev)
-+{
-+      txdesc_t *txdesc;
-+      int i;
-+
-+      /* no FN_ENTER here, we don't want that */
-+      /* no locks here, since it's entirely non-critical code */
-+      txdesc = adev->txdesc_start;
-+      if (unlikely(!txdesc)) return;
-+      printk("tx: desc->Ctl8's:");
-+      for (i = 0; i < TX_CNT; i++) {
-+              printk(" %02X", txdesc->Ctl_8);
-+              txdesc = advance_txdesc(adev, txdesc, 1);
-+      }
-+      printk("\n");
-+}
-+#endif
-+
-+
-+static void
-+handle_tx_error(acx_device_t *adev, u8 error, unsigned int finger)
-+{
-+      const char *err = "unknown error";
-+
-+      /* hmm, should we handle this as a mask
-+       * of *several* bits?
-+       * For now I think only caring about
-+       * individual bits is ok... */
-+      switch (error) {
-+      case 0x01:
-+              err = "no Tx due to error in other fragment";
-+              adev->wstats.discard.fragment++;
-+              break;
-+      case 0x02:
-+              err = "Tx aborted";
-+              adev->stats.tx_aborted_errors++;
-+              break;
-+      case 0x04:
-+              err = "Tx desc wrong parameters";
-+              adev->wstats.discard.misc++;
-+              break;
-+      case 0x08:
-+              err = "WEP key not found";
-+              adev->wstats.discard.misc++;
-+              break;
-+      case 0x10:
-+              err = "MSDU lifetime timeout? - try changing "
-+                              "'iwconfig retry lifetime XXX'";
-+              adev->wstats.discard.misc++;
-+              break;
-+      case 0x20:
-+              err = "excessive Tx retries due to either distance "
-+                      "too high or unable to Tx or Tx frame error - "
-+                      "try changing 'iwconfig txpower XXX' or "
-+                      "'sens'itivity or 'retry'";
-+              adev->wstats.discard.retries++;
-+              /* Tx error 0x20 also seems to occur on
-+               * overheating, so I'm not sure whether we
-+               * actually want to do aggressive radio recalibration,
-+               * since people maybe won't notice then that their hardware
-+               * is slowly getting cooked...
-+               * Or is it still a safe long distance from utter
-+               * radio non-functionality despite many radio recalibs
-+               * to final destructive overheating of the hardware?
-+               * In this case we really should do recalib here...
-+               * I guess the only way to find out is to do a
-+               * potentially fatal self-experiment :-\
-+               * Or maybe only recalib in case we're using Tx
-+               * rate auto (on errors switching to lower speed
-+               * --> less heat?) or 802.11 power save mode?
-+               *
-+               * ok, just do it. */
-+              if (++adev->retry_errors_msg_ratelimit % 4 == 0) {
-+                      if (adev->retry_errors_msg_ratelimit <= 20) {
-+                              printk("%s: several excessive Tx "
-+                                      "retry errors occurred, attempting "
-+                                      "to recalibrate radio. Radio "
-+                                      "drift might be caused by increasing "
-+                                      "card temperature, please check the card "
-+                                      "before it's too late!\n",
-+                                      adev->ndev->name);
-+                              if (adev->retry_errors_msg_ratelimit == 20)
-+                                      printk("disabling above message\n");
-+                      }
-+
-+                      acx_schedule_task(adev, ACX_AFTER_IRQ_CMD_RADIO_RECALIB);
-+              }
-+              break;
-+      case 0x40:
-+              err = "Tx buffer overflow";
-+              adev->stats.tx_fifo_errors++;
-+              break;
-+      case 0x80:
-+              /* possibly ACPI C-state powersaving related!!!
-+               * (DMA timeout due to excessively high wakeup
-+               * latency after C-state activation!?)
-+               * Disable C-State powersaving and try again,
-+               * then PLEASE REPORT, I'm VERY interested in
-+               * whether my theory is correct that this is
-+               * actually the problem here.
-+               * In that case, use new Linux idle wakeup latency
-+               * requirements kernel API to prevent this issue. */
-+              err = "DMA error";
-+              adev->wstats.discard.misc++;
-+              break;
-+      }
-+      adev->stats.tx_errors++;
-+      if (adev->stats.tx_errors <= 20)
-+              printk("%s: tx error 0x%02X, buf %02u! (%s)\n",
-+                              adev->ndev->name, error, finger, err);
-+      else
-+              printk("%s: tx error 0x%02X, buf %02u!\n",
-+                              adev->ndev->name, error, finger);
-+}
-+
-+
-+unsigned int
-+acxpci_l_clean_txdesc(acx_device_t *adev)
-+{
-+      txdesc_t *txdesc;
-+      unsigned finger;
-+      int num_cleaned;
-+      u16 r111;
-+      u8 error, ack_failures, rts_failures, rts_ok, r100;
-+
-+      FN_ENTER;
-+
-+      if (unlikely(acx_debug & L_DEBUG))
-+              log_txbuffer(adev);
-+
-+      log(L_BUFT, "tx: cleaning up bufs from %u\n", adev->tx_tail);
-+
-+      /* We know first descr which is not free yet. We advance it as far
-+      ** as we see correct bits set in following descs (if next desc
-+      ** is NOT free, we shouldn't advance at all). We know that in
-+      ** front of tx_tail may be "holes" with isolated free descs.
-+      ** We will catch up when all intermediate descs will be freed also */
-+
-+      finger = adev->tx_tail;
-+      num_cleaned = 0;
-+      while (likely(finger != adev->tx_head)) {
-+              txdesc = get_txdesc(adev, finger);
-+
-+              /* If we allocated txdesc on tx path but then decided
-+              ** to NOT use it, then it will be left as a free "bubble"
-+              ** in the "allocated for tx" part of the ring.
-+              ** We may meet it on the next ring pass here. */
-+
-+              /* stop if not marked as "tx finished" and "host owned" */
-+              if ((txdesc->Ctl_8 & DESC_CTL_ACXDONE_HOSTOWN)
-+                                      != DESC_CTL_ACXDONE_HOSTOWN) {
-+                      if (unlikely(!num_cleaned)) { /* maybe remove completely */
-+                              log(L_BUFT, "clean_txdesc: tail isn't free. "
-+                                      "tail:%d head:%d\n",
-+                                      adev->tx_tail, adev->tx_head);
-+                      }
-+                      break;
-+              }
-+
-+              /* remember desc values... */
-+              error = txdesc->error;
-+              ack_failures = txdesc->ack_failures;
-+              rts_failures = txdesc->rts_failures;
-+              rts_ok = txdesc->rts_ok;
-+              r100 = txdesc->u.r1.rate;
-+              r111 = le16_to_cpu(txdesc->u.r2.rate111);
-+
-+              /* need to check for certain error conditions before we
-+               * clean the descriptor: we still need valid descr data here */
-+              if (unlikely(0x30 & error)) {
-+                      /* only send IWEVTXDROP in case of retry or lifetime exceeded;
-+                       * all other errors mean we screwed up locally */
-+                      union iwreq_data wrqu;
-+                      wlan_hdr_t *hdr;
-+                      txhostdesc_t *hostdesc;
-+
-+                      hostdesc = get_txhostdesc(adev, txdesc);
-+                      hdr = (wlan_hdr_t *)hostdesc->data;
-+                      MAC_COPY(wrqu.addr.sa_data, hdr->a1);
-+                      wireless_send_event(adev->ndev, IWEVTXDROP, &wrqu, NULL);
-+              }
-+
-+              /* ...and free the desc */
-+              txdesc->error = 0;
-+              txdesc->ack_failures = 0;
-+              txdesc->rts_failures = 0;
-+              txdesc->rts_ok = 0;
-+              /* signal host owning it LAST, since ACX already knows that this
-+              ** descriptor is finished since it set Ctl_8 accordingly. */
-+              txdesc->Ctl_8 = DESC_CTL_HOSTOWN;
-+
-+              adev->tx_free++;
-+              num_cleaned++;
-+
-+              if ((adev->tx_free >= TX_START_QUEUE)
-+               && (adev->status == ACX_STATUS_4_ASSOCIATED)
-+               && (acx_queue_stopped(adev->ndev))
-+              ) {
-+                      log(L_BUF, "tx: wake queue (avail. Tx desc %u)\n",
-+                                      adev->tx_free);
-+                      acx_wake_queue(adev->ndev, NULL);
-+              }
-+
-+              /* do error checking, rate handling and logging
-+               * AFTER having done the work, it's faster */
-+
-+              /* do rate handling */
-+              if (adev->rate_auto) {
-+                      struct client *clt = get_txc(adev, txdesc);
-+                      if (clt) {
-+                              u16 cur = get_txr(adev, txdesc);
-+                              if (clt->rate_cur == cur) {
-+                                      acx_l_handle_txrate_auto(adev, clt,
-+                                              cur, /* intended rate */
-+                                              r100, r111, /* actually used rate */
-+                                              (error & 0x30), /* was there an error? */
-+                                              TX_CNT + TX_CLEAN_BACKLOG - adev->tx_free);
-+                              }
-+                      }
-+              }
-+
-+              if (unlikely(error))
-+                      handle_tx_error(adev, error, finger);
-+
-+              if (IS_ACX111(adev))
-+                      log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u r111=%04X\n",
-+                              finger, ack_failures, rts_failures, rts_ok, r111);
-+              else
-+                      log(L_BUFT, "tx: cleaned %u: !ACK=%u !RTS=%u RTS=%u rate=%u\n",
-+                              finger, ack_failures, rts_failures, rts_ok, r100);
-+
-+              /* update pointer for descr to be cleaned next */
-+              finger = (finger + 1) % TX_CNT;
-+      }
-+
-+      /* remember last position */
-+      adev->tx_tail = finger;
-+/* end: */
-+      FN_EXIT1(num_cleaned);
-+      return num_cleaned;
-+}
-+
-+/* clean *all* Tx descriptors, and regardless of their previous state.
-+ * Used for brute-force reset handling. */
-+void
-+acxpci_l_clean_txdesc_emergency(acx_device_t *adev)
-+{
-+      txdesc_t *txdesc;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      for (i = 0; i < TX_CNT; i++) {
-+              txdesc = get_txdesc(adev, i);
-+
-+              /* free it */
-+              txdesc->ack_failures = 0;
-+              txdesc->rts_failures = 0;
-+              txdesc->rts_ok = 0;
-+              txdesc->error = 0;
-+              txdesc->Ctl_8 = DESC_CTL_HOSTOWN;
-+      }
-+
-+      adev->tx_free = TX_CNT;
-+
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_s_create_tx_host_desc_queue
-+*/
-+
-+static void*
-+allocate(acx_device_t *adev, size_t size, dma_addr_t *phy, const char *msg)
-+{
-+      void *ptr;
-+
-+      ptr = dma_alloc_coherent(adev->pdev ? &adev->pdev->dev : NULL,
-+                      size, phy, GFP_KERNEL);
-+
-+      if (ptr) {
-+              log(L_DEBUG, "%s sz=%d adr=0x%p phy=0x%08llx\n",
-+                              msg, (int)size, ptr, (unsigned long long)*phy);
-+              memset(ptr, 0, size);
-+              return ptr;
-+      }
-+      printk(KERN_ERR "acx: %s allocation FAILED (%d bytes)\n",
-+                                      msg, (int)size);
-+      return NULL;
-+}
-+
-+
-+static int
-+acxpci_s_create_tx_host_desc_queue(acx_device_t *adev)
-+{
-+      txhostdesc_t *hostdesc;
-+      u8 *txbuf;
-+      dma_addr_t hostdesc_phy;
-+      dma_addr_t txbuf_phy;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* allocate TX buffer */
-+      adev->txbuf_area_size = TX_CNT * WLAN_A4FR_MAXLEN_WEP_FCS;
-+      adev->txbuf_start = allocate(adev, adev->txbuf_area_size,
-+                      &adev->txbuf_startphy, "txbuf_start");
-+      if (!adev->txbuf_start)
-+              goto fail;
-+
-+      /* allocate the TX host descriptor queue pool */
-+      adev->txhostdesc_area_size = TX_CNT * 2*sizeof(*hostdesc);
-+      adev->txhostdesc_start = allocate(adev, adev->txhostdesc_area_size,
-+                      &adev->txhostdesc_startphy, "txhostdesc_start");
-+      if (!adev->txhostdesc_start)
-+              goto fail;
-+      /* check for proper alignment of TX host descriptor pool */
-+      if ((long) adev->txhostdesc_start & 3) {
-+              printk("acx: driver bug: dma alloc returns unaligned address\n");
-+              goto fail;
-+      }
-+
-+      hostdesc = adev->txhostdesc_start;
-+      hostdesc_phy = adev->txhostdesc_startphy;
-+      txbuf = adev->txbuf_start;
-+      txbuf_phy = adev->txbuf_startphy;
-+
-+#if 0
-+/* Each tx buffer is accessed by hardware via
-+** txdesc -> txhostdesc(s) -> txbuffer(s).
-+** We use only one txhostdesc per txdesc, but it looks like
-+** acx111 is buggy: it accesses second txhostdesc
-+** (via hostdesc.desc_phy_next field) even if
-+** txdesc->length == hostdesc->length and thus
-+** entire packet was placed into first txhostdesc.
-+** Due to this bug acx111 hangs unless second txhostdesc
-+** has le16_to_cpu(hostdesc.length) = 3 (or larger)
-+** Storing NULL into hostdesc.desc_phy_next
-+** doesn't seem to help.
-+**
-+** Update: although it worked on Xterasys XN-2522g
-+** with len=3 trick, WG311v2 is even more bogus, doesn't work.
-+** Keeping this code (#ifdef'ed out) for documentational purposes.
-+*/
-+      for (i = 0; i < TX_CNT*2; i++) {
-+              hostdesc_phy += sizeof(*hostdesc);
-+              if (!(i & 1)) {
-+                      hostdesc->data_phy = cpu2acx(txbuf_phy);
-+                      /* hostdesc->data_offset = ... */
-+                      /* hostdesc->reserved = ... */
-+                      hostdesc->Ctl_16 = cpu_to_le16(DESC_CTL_HOSTOWN);
-+                      /* hostdesc->length = ... */
-+                      hostdesc->desc_phy_next = cpu2acx(hostdesc_phy);
-+                      hostdesc->pNext = ptr2acx(NULL);
-+                      /* hostdesc->Status = ... */
-+                      /* below: non-hardware fields */
-+                      hostdesc->data = txbuf;
-+
-+                      txbuf += WLAN_A4FR_MAXLEN_WEP_FCS;
-+                      txbuf_phy += WLAN_A4FR_MAXLEN_WEP_FCS;
-+              } else {
-+                      /* hostdesc->data_phy = ... */
-+                      /* hostdesc->data_offset = ... */
-+                      /* hostdesc->reserved = ... */
-+                      /* hostdesc->Ctl_16 = ... */
-+                      hostdesc->length = cpu_to_le16(3); /* bug workaround */
-+                      /* hostdesc->desc_phy_next = ... */
-+                      /* hostdesc->pNext = ... */
-+                      /* hostdesc->Status = ... */
-+                      /* below: non-hardware fields */
-+                      /* hostdesc->data = ... */
-+              }
-+              hostdesc++;
-+      }
-+#endif
-+/* We initialize two hostdescs so that they point to adjacent
-+** memory areas. Thus txbuf is really just a contiguous memory area */
-+      for (i = 0; i < TX_CNT*2; i++) {
-+              hostdesc_phy += sizeof(*hostdesc);
-+
-+              hostdesc->data_phy = cpu2acx(txbuf_phy);
-+              /* done by memset(0): hostdesc->data_offset = 0; */
-+              /* hostdesc->reserved = ... */
-+              hostdesc->Ctl_16 = cpu_to_le16(DESC_CTL_HOSTOWN);
-+              /* hostdesc->length = ... */
-+              hostdesc->desc_phy_next = cpu2acx(hostdesc_phy);
-+              /* done by memset(0): hostdesc->pNext = ptr2acx(NULL); */
-+              /* hostdesc->Status = ... */
-+              /* ->data is a non-hardware field: */
-+              hostdesc->data = txbuf;
-+
-+              if (!(i & 1)) {
-+                      txbuf += WLAN_HDR_A3_LEN;
-+                      txbuf_phy += WLAN_HDR_A3_LEN;
-+              } else {
-+                      txbuf += WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN;
-+                      txbuf_phy += WLAN_A4FR_MAXLEN_WEP_FCS - WLAN_HDR_A3_LEN;
-+              }
-+              hostdesc++;
-+      }
-+      hostdesc--;
-+      hostdesc->desc_phy_next = cpu2acx(adev->txhostdesc_startphy);
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+fail:
-+      printk("acx: create_tx_host_desc_queue FAILED\n");
-+      /* dealloc will be done by free function on error case */
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***************************************************************
-+** acxpci_s_create_rx_host_desc_queue
-+*/
-+/* the whole size of a data buffer (header plus data body)
-+ * plus 32 bytes safety offset at the end */
-+#define RX_BUFFER_SIZE (sizeof(rxbuffer_t) + 32)
-+
-+static int
-+acxpci_s_create_rx_host_desc_queue(acx_device_t *adev)
-+{
-+      rxhostdesc_t *hostdesc;
-+      rxbuffer_t *rxbuf;
-+      dma_addr_t hostdesc_phy;
-+      dma_addr_t rxbuf_phy;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* allocate the RX host descriptor queue pool */
-+      adev->rxhostdesc_area_size = RX_CNT * sizeof(*hostdesc);
-+      adev->rxhostdesc_start = allocate(adev, adev->rxhostdesc_area_size,
-+                      &adev->rxhostdesc_startphy, "rxhostdesc_start");
-+      if (!adev->rxhostdesc_start)
-+              goto fail;
-+      /* check for proper alignment of RX host descriptor pool */
-+      if ((long) adev->rxhostdesc_start & 3) {
-+              printk("acx: driver bug: dma alloc returns unaligned address\n");
-+              goto fail;
-+      }
-+
-+      /* allocate Rx buffer pool which will be used by the acx
-+       * to store the whole content of the received frames in it */
-+      adev->rxbuf_area_size = RX_CNT * RX_BUFFER_SIZE;
-+      adev->rxbuf_start = allocate(adev, adev->rxbuf_area_size,
-+                      &adev->rxbuf_startphy, "rxbuf_start");
-+      if (!adev->rxbuf_start)
-+              goto fail;
-+
-+      rxbuf = adev->rxbuf_start;
-+      rxbuf_phy = adev->rxbuf_startphy;
-+      hostdesc = adev->rxhostdesc_start;
-+      hostdesc_phy = adev->rxhostdesc_startphy;
-+
-+      /* don't make any popular C programming pointer arithmetic mistakes
-+       * here, otherwise I'll kill you...
-+       * (and don't dare asking me why I'm warning you about that...) */
-+      for (i = 0; i < RX_CNT; i++) {
-+              hostdesc->data = rxbuf;
-+              hostdesc->data_phy = cpu2acx(rxbuf_phy);
-+              hostdesc->length = cpu_to_le16(RX_BUFFER_SIZE);
-+              CLEAR_BIT(hostdesc->Ctl_16, cpu_to_le16(DESC_CTL_HOSTOWN));
-+              rxbuf++;
-+              rxbuf_phy += sizeof(*rxbuf);
-+              hostdesc_phy += sizeof(*hostdesc);
-+              hostdesc->desc_phy_next = cpu2acx(hostdesc_phy);
-+              hostdesc++;
-+      }
-+      hostdesc--;
-+      hostdesc->desc_phy_next = cpu2acx(adev->rxhostdesc_startphy);
-+      FN_EXIT1(OK);
-+      return OK;
-+fail:
-+      printk("acx: create_rx_host_desc_queue FAILED\n");
-+      /* dealloc will be done by free function on error case */
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***************************************************************
-+** acxpci_s_create_hostdesc_queues
-+*/
-+int
-+acxpci_s_create_hostdesc_queues(acx_device_t *adev)
-+{
-+      int result;
-+      result = acxpci_s_create_tx_host_desc_queue(adev);
-+      if (OK != result) return result;
-+      result = acxpci_s_create_rx_host_desc_queue(adev);
-+      return result;
-+}
-+
-+
-+/***************************************************************
-+** acxpci_create_tx_desc_queue
-+*/
-+static void
-+acxpci_create_tx_desc_queue(acx_device_t *adev, u32 tx_queue_start)
-+{
-+      txdesc_t *txdesc;
-+      txhostdesc_t *hostdesc;
-+      dma_addr_t hostmemptr;
-+      u32 mem_offs;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      if (IS_ACX100(adev))
-+              adev->txdesc_size = sizeof(*txdesc);
-+      else
-+              /* the acx111 txdesc is 4 bytes larger */
-+              adev->txdesc_size = sizeof(*txdesc) + 4;
-+
-+      adev->txdesc_start = (txdesc_t *) (adev->iobase2 + tx_queue_start);
-+
-+      log(L_DEBUG, "adev->iobase2=%p\n"
-+                      "tx_queue_start=%08X\n"
-+                      "adev->txdesc_start=%p\n",
-+                      adev->iobase2,
-+                      tx_queue_start,
-+                      adev->txdesc_start);
-+
-+      adev->tx_free = TX_CNT;
-+      /* done by memset: adev->tx_head = 0; */
-+      /* done by memset: adev->tx_tail = 0; */
-+      txdesc = adev->txdesc_start;
-+      mem_offs = tx_queue_start;
-+      hostmemptr = adev->txhostdesc_startphy;
-+      hostdesc = adev->txhostdesc_start;
-+
-+      if (IS_ACX111(adev)) {
-+              /* ACX111 has a preinitialized Tx buffer! */
-+              /* loop over whole send pool */
-+              /* FIXME: do we have to do the hostmemptr stuff here?? */
-+              for (i = 0; i < TX_CNT; i++) {
-+                      txdesc->HostMemPtr = ptr2acx(hostmemptr);
-+                      txdesc->Ctl_8 = DESC_CTL_HOSTOWN;
-+                      /* reserve two (hdr desc and payload desc) */
-+                      hostdesc += 2;
-+                      hostmemptr += 2 * sizeof(*hostdesc);
-+                      txdesc = advance_txdesc(adev, txdesc, 1);
-+              }
-+      } else {
-+              /* ACX100 Tx buffer needs to be initialized by us */
-+              /* clear whole send pool. sizeof is safe here (we are acx100) */
-+              memset(adev->txdesc_start, 0, TX_CNT * sizeof(*txdesc));
-+
-+              /* loop over whole send pool */
-+              for (i = 0; i < TX_CNT; i++) {
-+                      log(L_DEBUG, "configure card tx descriptor: 0x%p, "
-+                              "size: 0x%X\n", txdesc, adev->txdesc_size);
-+
-+                      /* pointer to hostdesc memory */
-+                      txdesc->HostMemPtr = ptr2acx(hostmemptr);
-+                      /* initialise ctl */
-+                      txdesc->Ctl_8 = ( DESC_CTL_HOSTOWN | DESC_CTL_RECLAIM
-+                                      | DESC_CTL_AUTODMA | DESC_CTL_FIRSTFRAG);
-+                      /* done by memset(0): txdesc->Ctl2_8 = 0; */
-+                      /* point to next txdesc */
-+                      txdesc->pNextDesc = cpu2acx(mem_offs + adev->txdesc_size);
-+                      /* reserve two (hdr desc and payload desc) */
-+                      hostdesc += 2;
-+                      hostmemptr += 2 * sizeof(*hostdesc);
-+                      /* go to the next one */
-+                      mem_offs += adev->txdesc_size;
-+                      /* ++ is safe here (we are acx100) */
-+                      txdesc++;
-+              }
-+              /* go back to the last one */
-+              txdesc--;
-+              /* and point to the first making it a ring buffer */
-+              txdesc->pNextDesc = cpu2acx(tx_queue_start);
-+      }
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxpci_create_rx_desc_queue
-+*/
-+static void
-+acxpci_create_rx_desc_queue(acx_device_t *adev, u32 rx_queue_start)
-+{
-+      rxdesc_t *rxdesc;
-+      u32 mem_offs;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* done by memset: adev->rx_tail = 0; */
-+
-+      /* ACX111 doesn't need any further config: preconfigures itself.
-+       * Simply print ring buffer for debugging */
-+      if (IS_ACX111(adev)) {
-+              /* rxdesc_start already set here */
-+
-+              adev->rxdesc_start = (rxdesc_t *) ((u8 *)adev->iobase2 + rx_queue_start);
-+
-+              rxdesc = adev->rxdesc_start;
-+              for (i = 0; i < RX_CNT; i++) {
-+                      log(L_DEBUG, "rx descriptor %d @ 0x%p\n", i, rxdesc);
-+                      rxdesc = adev->rxdesc_start = (rxdesc_t *)
-+                              (adev->iobase2 + acx2cpu(rxdesc->pNextDesc));
-+              }
-+      } else {
-+              /* we didn't pre-calculate rxdesc_start in case of ACX100 */
-+              /* rxdesc_start should be right AFTER Tx pool */
-+              adev->rxdesc_start = (rxdesc_t *)
-+                      ((u8 *) adev->txdesc_start + (TX_CNT * sizeof(txdesc_t)));
-+              /* NB: sizeof(txdesc_t) above is valid because we know
-+              ** we are in if (acx100) block. Beware of cut-n-pasting elsewhere!
-+              ** acx111's txdesc is larger! */
-+
-+              memset(adev->rxdesc_start, 0, RX_CNT * sizeof(*rxdesc));
-+
-+              /* loop over whole receive pool */
-+              rxdesc = adev->rxdesc_start;
-+              mem_offs = rx_queue_start;
-+              for (i = 0; i < RX_CNT; i++) {
-+                      log(L_DEBUG, "rx descriptor @ 0x%p\n", rxdesc);
-+                      rxdesc->Ctl_8 = DESC_CTL_RECLAIM | DESC_CTL_AUTODMA;
-+                      /* point to next rxdesc */
-+                      rxdesc->pNextDesc = cpu2acx(mem_offs + sizeof(*rxdesc));
-+                      /* go to the next one */
-+                      mem_offs += sizeof(*rxdesc);
-+                      rxdesc++;
-+              }
-+              /* go to the last one */
-+              rxdesc--;
-+
-+              /* and point to the first making it a ring buffer */
-+              rxdesc->pNextDesc = cpu2acx(rx_queue_start);
-+      }
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxpci_create_desc_queues
-+*/
-+void
-+acxpci_create_desc_queues(acx_device_t *adev, u32 tx_queue_start, u32 rx_queue_start)
-+{
-+      acxpci_create_tx_desc_queue(adev, tx_queue_start);
-+      acxpci_create_rx_desc_queue(adev, rx_queue_start);
-+}
-+
-+
-+/***************************************************************
-+** acxpci_s_proc_diag_output
-+*/
-+char*
-+acxpci_s_proc_diag_output(char *p, acx_device_t *adev)
-+{
-+      const char *rtl, *thd, *ttl;
-+      rxhostdesc_t *rxhostdesc;
-+      txdesc_t *txdesc;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      p += sprintf(p, "** Rx buf **\n");
-+      rxhostdesc = adev->rxhostdesc_start;
-+      if (rxhostdesc) for (i = 0; i < RX_CNT; i++) {
-+              rtl = (i == adev->rx_tail) ? " [tail]" : "";
-+              if ((rxhostdesc->Ctl_16 & cpu_to_le16(DESC_CTL_HOSTOWN))
-+               && (rxhostdesc->Status & cpu_to_le32(DESC_STATUS_FULL)) )
-+                      p += sprintf(p, "%02u FULL%s\n", i, rtl);
-+              else
-+                      p += sprintf(p, "%02u empty%s\n", i, rtl);
-+              rxhostdesc++;
-+      }
-+      p += sprintf(p, "** Tx buf (free %d, Linux netqueue %s) **\n", adev->tx_free,
-+                              acx_queue_stopped(adev->ndev) ? "STOPPED" : "running");
-+      txdesc = adev->txdesc_start;
-+      if (txdesc) for (i = 0; i < TX_CNT; i++) {
-+              thd = (i == adev->tx_head) ? " [head]" : "";
-+              ttl = (i == adev->tx_tail) ? " [tail]" : "";
-+              if (txdesc->Ctl_8 & DESC_CTL_ACXDONE)
-+                      p += sprintf(p, "%02u free (%02X)%s%s\n", i, txdesc->Ctl_8, thd, ttl);
-+              else
-+                      p += sprintf(p, "%02u tx   (%02X)%s%s\n", i, txdesc->Ctl_8, thd, ttl);
-+              txdesc = advance_txdesc(adev, txdesc, 1);
-+      }
-+      p += sprintf(p,
-+              "\n"
-+              "** PCI data **\n"
-+              "txbuf_start %p, txbuf_area_size %u, txbuf_startphy %08llx\n"
-+              "txdesc_size %u, txdesc_start %p\n"
-+              "txhostdesc_start %p, txhostdesc_area_size %u, txhostdesc_startphy %08llx\n"
-+              "rxdesc_start %p\n"
-+              "rxhostdesc_start %p, rxhostdesc_area_size %u, rxhostdesc_startphy %08llx\n"
-+              "rxbuf_start %p, rxbuf_area_size %u, rxbuf_startphy %08llx\n",
-+              adev->txbuf_start, adev->txbuf_area_size,
-+                              (unsigned long long)adev->txbuf_startphy,
-+              adev->txdesc_size, adev->txdesc_start,
-+              adev->txhostdesc_start, adev->txhostdesc_area_size,
-+                              (unsigned long long)adev->txhostdesc_startphy,
-+              adev->rxdesc_start,
-+              adev->rxhostdesc_start, adev->rxhostdesc_area_size,
-+                              (unsigned long long)adev->rxhostdesc_startphy,
-+              adev->rxbuf_start, adev->rxbuf_area_size,
-+                              (unsigned long long)adev->rxbuf_startphy);
-+
-+      FN_EXIT0;
-+      return p;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acxpci_proc_eeprom_output(char *buf, acx_device_t *adev)
-+{
-+      char *p = buf;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      for (i = 0; i < 0x400; i++) {
-+              acxpci_read_eeprom_byte(adev, i, p++);
-+      }
-+
-+      FN_EXIT1(p - buf);
-+      return p - buf;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+void
-+acxpci_set_interrupt_mask(acx_device_t *adev)
-+{
-+      if (IS_ACX111(adev)) {
-+              adev->irq_mask = (u16) ~(0
-+                              /* | HOST_INT_RX_DATA        */
-+                              | HOST_INT_TX_COMPLETE
-+                              /* | HOST_INT_TX_XFER        */
-+                              | HOST_INT_RX_COMPLETE
-+                              /* | HOST_INT_DTIM           */
-+                              /* | HOST_INT_BEACON         */
-+                              /* | HOST_INT_TIMER          */
-+                              /* | HOST_INT_KEY_NOT_FOUND  */
-+                              | HOST_INT_IV_ICV_FAILURE
-+                              | HOST_INT_CMD_COMPLETE
-+                              | HOST_INT_INFO
-+                              /* | HOST_INT_OVERFLOW       */
-+                              /* | HOST_INT_PROCESS_ERROR  */
-+                              | HOST_INT_SCAN_COMPLETE
-+                              | HOST_INT_FCS_THRESHOLD
-+                              /* | HOST_INT_UNKNOWN        */
-+                              );
-+              /* Or else acx100 won't signal cmd completion, right? */
-+              adev->irq_mask_off = (u16)~( HOST_INT_CMD_COMPLETE ); /* 0xfdff */
-+      } else {
-+              adev->irq_mask = (u16) ~(0
-+                              /* | HOST_INT_RX_DATA        */
-+                              | HOST_INT_TX_COMPLETE
-+                              /* | HOST_INT_TX_XFER        */
-+                              | HOST_INT_RX_COMPLETE
-+                              /* | HOST_INT_DTIM           */
-+                              /* | HOST_INT_BEACON         */
-+                              /* | HOST_INT_TIMER          */
-+                              /* | HOST_INT_KEY_NOT_FOUND  */
-+                              /* | HOST_INT_IV_ICV_FAILURE */
-+                              | HOST_INT_CMD_COMPLETE
-+                              | HOST_INT_INFO
-+                              /* | HOST_INT_OVERFLOW       */
-+                              /* | HOST_INT_PROCESS_ERROR  */
-+                              | HOST_INT_SCAN_COMPLETE
-+                              /* | HOST_INT_FCS_THRESHOLD  */
-+                              /* | HOST_INT_UNKNOWN        */
-+                              );
-+              adev->irq_mask_off = (u16)~( HOST_INT_UNKNOWN ); /* 0x7fff */
-+      }
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acx100pci_s_set_tx_level(acx_device_t *adev, u8 level_dbm)
-+{
-+      /* since it can be assumed that at least the Maxim radio has a
-+       * maximum power output of 20dBm and since it also can be
-+       * assumed that these values drive the DAC responsible for
-+       * setting the linear Tx level, I'd guess that these values
-+       * should be the corresponding linear values for a dBm value,
-+       * in other words: calculate the values from that formula:
-+       * Y [dBm] = 10 * log (X [mW])
-+       * then scale the 0..63 value range onto the 1..100mW range (0..20 dBm)
-+       * and you're done...
-+       * Hopefully that's ok, but you never know if we're actually
-+       * right... (especially since Windows XP doesn't seem to show
-+       * actual Tx dBm values :-P) */
-+
-+      /* NOTE: on Maxim, value 30 IS 30mW, and value 10 IS 10mW - so the
-+       * values are EXACTLY mW!!! Not sure about RFMD and others,
-+       * though... */
-+      static const u8 dbm2val_maxim[21] = {
-+              63, 63, 63, 62,
-+              61, 61, 60, 60,
-+              59, 58, 57, 55,
-+              53, 50, 47, 43,
-+              38, 31, 23, 13,
-+              0
-+      };
-+      static const u8 dbm2val_rfmd[21] = {
-+               0,  0,  0,  1,
-+               2,  2,  3,  3,
-+               4,  5,  6,  8,
-+              10, 13, 16, 20,
-+              25, 32, 41, 50,
-+              63
-+      };
-+      const u8 *table;
-+
-+      switch (adev->radio_type) {
-+      case RADIO_MAXIM_0D:
-+              table = &dbm2val_maxim[0];
-+              break;
-+      case RADIO_RFMD_11:
-+      case RADIO_RALINK_15:
-+              table = &dbm2val_rfmd[0];
-+              break;
-+      default:
-+              printk("%s: unknown/unsupported radio type, "
-+                      "cannot modify tx power level yet!\n",
-+                              adev->ndev->name);
-+              return NOT_OK;
-+      }
-+      printk("%s: changing radio power level to %u dBm (%u)\n",
-+                      adev->ndev->name, level_dbm, table[level_dbm]);
-+      acxpci_s_write_phy_reg(adev, 0x11, table[level_dbm]);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** Data for init_module/cleanup_module
-+*/
-+static const struct pci_device_id
-+acxpci_id_tbl[] __devinitdata = {
-+      {
-+              .vendor = PCI_VENDOR_ID_TI,
-+              .device = PCI_DEVICE_ID_TI_TNETW1100A,
-+              .subvendor = PCI_ANY_ID,
-+              .subdevice = PCI_ANY_ID,
-+              .driver_data = CHIPTYPE_ACX100,
-+      },
-+      {
-+              .vendor = PCI_VENDOR_ID_TI,
-+              .device = PCI_DEVICE_ID_TI_TNETW1100B,
-+              .subvendor = PCI_ANY_ID,
-+              .subdevice = PCI_ANY_ID,
-+              .driver_data = CHIPTYPE_ACX100,
-+      },
-+      {
-+              .vendor = PCI_VENDOR_ID_TI,
-+              .device = PCI_DEVICE_ID_TI_TNETW1130,
-+              .subvendor = PCI_ANY_ID,
-+              .subdevice = PCI_ANY_ID,
-+              .driver_data = CHIPTYPE_ACX111,
-+      },
-+      {
-+              .vendor = 0,
-+              .device = 0,
-+              .subvendor = 0,
-+              .subdevice = 0,
-+              .driver_data = 0,
-+      }
-+};
-+
-+MODULE_DEVICE_TABLE(pci, acxpci_id_tbl);
-+
-+/* FIXME: checks should be removed once driver is included in the kernel */
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 11)
-+/* pci_name() got introduced at start of 2.6.x,
-+ * got mandatory (slot_name member removed) in 2.6.11-bk1 */
-+#define pci_name(x) x->slot_name
-+#endif
-+
-+static struct pci_driver
-+acxpci_drv_id = {
-+      .name        = "acx_pci",
-+      .id_table    = acxpci_id_tbl,
-+      .probe       = acxpci_e_probe,
-+      .remove      = __devexit_p(acxpci_e_remove),
-+#ifdef CONFIG_PM
-+      .suspend     = acxpci_e_suspend,
-+      .resume      = acxpci_e_resume
-+#endif /* CONFIG_PM */
-+};
-+
-+
-+/***********************************************************************
-+** acxpci_e_init_module
-+**
-+** Module initialization routine, called once at module load time
-+*/
-+int __init
-+acxpci_e_init_module(void)
-+{
-+      int res;
-+
-+      FN_ENTER;
-+
-+#if (ACX_IO_WIDTH==32)
-+      printk("acx: compiled to use 32bit I/O access. "
-+              "I/O timing issues might occur, such as "
-+              "non-working firmware upload. Report them\n");
-+#else
-+      printk("acx: compiled to use 16bit I/O access only "
-+              "(compatibility mode)\n");
-+#endif
-+
-+#ifdef __LITTLE_ENDIAN
-+#define ENDIANNESS_STRING "running on a little-endian CPU\n"
-+#else
-+#define ENDIANNESS_STRING "running on a BIG-ENDIAN CPU\n"
-+#endif
-+      log(L_INIT,
-+              ENDIANNESS_STRING
-+              "PCI module " ACX_RELEASE " initialized, "
-+              "waiting for cards to probe...\n"
-+      );
-+
-+      res = pci_register_driver(&acxpci_drv_id);
-+      FN_EXIT1(res);
-+      return res;
-+}
-+
-+
-+/***********************************************************************
-+** acxpci_e_cleanup_module
-+**
-+** Called at module unload time. This is our last chance to
-+** clean up after ourselves.
-+*/
-+void __exit
-+acxpci_e_cleanup_module(void)
-+{
-+      FN_ENTER;
-+
-+      pci_unregister_driver(&acxpci_drv_id);
-+
-+      FN_EXIT0;
-+}
-Index: linux-2.6.22/drivers/net/wireless/acx/rx3000_acx.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/rx3000_acx.c 2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,110 @@
-+/*
-+ * WLAN (TI TNETW1100B) support in the HP iPAQ RX3000
-+ *
-+ * Copyright (c) 2006 SDG Systems, LLC
-+ * Copyright (c) 2006 Roman Moravcik
-+ *
-+ * 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.
-+ *
-+ * Based on hx4700_acx.c
-+ */
-+
-+
-+#include <linux/kernel.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+#include <linux/dpm.h>
-+#include <linux/leds.h>
-+
-+#include <asm/hardware.h>
-+
-+#include <asm/arch/regs-gpio.h>
-+#include <linux/mfd/asic3_base.h>
-+#include <asm/arch/rx3000.h>
-+#include <asm/arch/rx3000-asic3.h>
-+#include <asm/io.h>
-+
-+#include "acx_hw.h"
-+
-+extern struct platform_device s3c_device_asic3;
-+
-+static int rx3000_wlan_start(void)
-+{
-+      DPM_DEBUG("rx3000_acx: Turning on\n");
-+      asic3_set_gpio_out_b(&s3c_device_asic3.dev, ASIC3_GPB3, ASIC3_GPB3);
-+      mdelay(20);
-+      asic3_set_gpio_out_c(&s3c_device_asic3.dev, ASIC3_GPC13, ASIC3_GPC13);
-+      mdelay(20);
-+      asic3_set_gpio_out_c(&s3c_device_asic3.dev, ASIC3_GPC11, ASIC3_GPC11);
-+      mdelay(100);
-+      asic3_set_gpio_out_b(&s3c_device_asic3.dev, ASIC3_GPB3, ASIC3_GPB3);
-+      mdelay(20);
-+      s3c2410_gpio_cfgpin(S3C2410_GPA15, S3C2410_GPA15_nGCS4);        
-+      mdelay(100);
-+      s3c2410_gpio_setpin(S3C2410_GPA11, 0);
-+      mdelay(50);
-+      s3c2410_gpio_setpin(S3C2410_GPA11, 1);
-+      led_trigger_event_shared(rx3000_radio_trig, LED_FULL);
-+      return 0;
-+}
-+
-+static int rx3000_wlan_stop(void)
-+{
-+      DPM_DEBUG("rx3000_acx: Turning off\n");
-+      s3c2410_gpio_setpin(S3C2410_GPA15, 1);
-+      s3c2410_gpio_cfgpin(S3C2410_GPA15, S3C2410_GPA15_OUT);
-+      asic3_set_gpio_out_b(&s3c_device_asic3.dev, ASIC3_GPB3, 0);
-+      asic3_set_gpio_out_c(&s3c_device_asic3.dev, ASIC3_GPC13, 0);
-+      asic3_set_gpio_out_c(&s3c_device_asic3.dev, ASIC3_GPC11, 0);
-+      led_trigger_event_shared(rx3000_radio_trig, LED_OFF);
-+      return 0;
-+}
-+
-+static struct resource acx_resources[] = {
-+      [0] = {
-+              .start  = RX3000_PA_WLAN,
-+              .end    = RX3000_PA_WLAN + 0x20,
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start  = IRQ_EINT16,
-+              .end    = IRQ_EINT16,
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct acx_hardware_data acx_data = {
-+      .start_hw       = rx3000_wlan_start,
-+      .stop_hw        = rx3000_wlan_stop,
-+};
-+
-+static struct platform_device acx_device = {
-+      .name   = "acx-mem",
-+      .dev    = {
-+              .platform_data = &acx_data,
-+      },
-+      .num_resources  = ARRAY_SIZE(acx_resources),
-+      .resource       = acx_resources,
-+};
-+
-+static int __init rx3000_wlan_init(void)
-+{
-+      printk("rx3000_wlan_init: acx-mem platform_device_register\n");
-+      return platform_device_register(&acx_device);
-+}
-+
-+
-+static void __exit rx3000_wlan_exit(void)
-+{
-+      platform_device_unregister(&acx_device);
-+}
-+
-+module_init(rx3000_wlan_init);
-+module_exit(rx3000_wlan_exit);
-+
-+MODULE_AUTHOR("Todd Blumer <todd@sdgsystems.com>, Roman Moravcik <roman.moravcik@gmail.com>");
-+MODULE_DESCRIPTION("WLAN driver for HP iPAQ RX3000");
-+MODULE_LICENSE("GPL");
-+
-Index: linux-2.6.22/drivers/net/wireless/acx/setrate.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/setrate.c    2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,213 @@
-+/* TODO: stop #including, move into wireless.c
-+ * until then, keep in sync copies in prism54/ and acx/ dirs
-+ * code+data size: less than 1k */
-+
-+enum {
-+      DOT11_RATE_1,
-+      DOT11_RATE_2,
-+      DOT11_RATE_5,
-+      DOT11_RATE_11,
-+      DOT11_RATE_22,
-+      DOT11_RATE_33,
-+      DOT11_RATE_6,
-+      DOT11_RATE_9,
-+      DOT11_RATE_12,
-+      DOT11_RATE_18,
-+      DOT11_RATE_24,
-+      DOT11_RATE_36,
-+      DOT11_RATE_48,
-+      DOT11_RATE_54
-+};
-+enum {
-+      DOT11_MOD_DBPSK,
-+      DOT11_MOD_DQPSK,
-+      DOT11_MOD_CCK,
-+      DOT11_MOD_OFDM,
-+      DOT11_MOD_CCKOFDM,
-+      DOT11_MOD_PBCC
-+};
-+static const u8 ratelist[] = { 1,2,5,11,22,33,6,9,12,18,24,36,48,54 };
-+static const u8 dot11ratebyte[] = { 1*2,2*2,11,11*2,22*2,33*2,6*2,9*2,12*2,18*2,24*2,36*2,48*2,54*2 };
-+static const u8 default_modulation[] = {
-+      DOT11_MOD_DBPSK,
-+      DOT11_MOD_DQPSK,
-+      DOT11_MOD_CCK,
-+      DOT11_MOD_CCK,
-+      DOT11_MOD_PBCC,
-+      DOT11_MOD_PBCC,
-+      DOT11_MOD_OFDM,
-+      DOT11_MOD_OFDM,
-+      DOT11_MOD_OFDM,
-+      DOT11_MOD_OFDM,
-+      DOT11_MOD_OFDM,
-+      DOT11_MOD_OFDM,
-+      DOT11_MOD_OFDM,
-+      DOT11_MOD_OFDM
-+};
-+
-+static /* TODO: remove 'static' when moved to wireless.c */
-+int
-+rate_mbit2enum(int n) {
-+      int i=0;
-+      while(i<sizeof(ratelist)) {
-+              if(n==ratelist[i]) return i;
-+              i++;
-+      }
-+      return -EINVAL;
-+}
-+
-+static int
-+get_modulation(int r_enum, char suffix) {
-+      if(suffix==',' || suffix==' ' || suffix=='\0') {
-+              /* could shorten default_mod by 8 bytes:
-+              if(r_enum>=DOT11_RATE_6) return DOT11_MOD_OFDM; */
-+              return default_modulation[r_enum];
-+      }
-+      if(suffix=='c') {
-+              if(r_enum<DOT11_RATE_5 || r_enum>DOT11_RATE_11) return -EINVAL;
-+              return DOT11_MOD_CCK;
-+      }
-+      if(suffix=='p') {
-+              if(r_enum<DOT11_RATE_5 || r_enum>DOT11_RATE_33) return -EINVAL;
-+              return DOT11_MOD_PBCC;
-+      }
-+      if(suffix=='o') {
-+              if(r_enum<DOT11_RATE_6) return -EINVAL;
-+              return DOT11_MOD_OFDM;
-+      }
-+      if(suffix=='d') {
-+              if(r_enum<DOT11_RATE_6) return -EINVAL;
-+              return DOT11_MOD_CCKOFDM;
-+      }
-+      return -EINVAL;
-+}
-+
-+#ifdef UNUSED
-+static int
-+fill_ratevector(const char **pstr, u8 *vector, int size,
-+              int (*supported)(int mbit, int mod, void *opaque), void *opaque, int or_mask)
-+{
-+      unsigned long rate_mbit;
-+      int rate_enum,mod;
-+      const char *str = *pstr;
-+      char c;
-+
-+      do {
-+              rate_mbit = simple_strtoul(str, (char**)&str, 10);
-+              if(rate_mbit>INT_MAX) return -EINVAL;
-+
-+              rate_enum = rate_mbit2enum(rate_mbit);
-+              if(rate_enum<0) return rate_enum;
-+
-+              c = *str;
-+              mod = get_modulation(rate_enum, c);
-+              if(mod<0) return mod;
-+
-+              if(c>='a' && c<='z') c = *++str;
-+              if(c!=',' && c!=' ' && c!='\0') return -EINVAL;
-+
-+              if(supported) {
-+                      int r = supported(rate_mbit, mod, opaque);
-+                      if(r) return r;
-+              }
-+
-+              *vector++ = dot11ratebyte[rate_enum] | or_mask;
-+
-+              size--;
-+              str++;
-+      } while(size>0 && c==',');
-+
-+      if(size<1) return -E2BIG;
-+      *vector=0; /* TODO: sort, remove dups? */
-+
-+      *pstr = str-1;
-+      return 0;
-+}
-+
-+static /* TODO: remove 'static' when moved to wireless.c */
-+int
-+fill_ratevectors(const char *str, u8 *brate, u8 *orate, int size,
-+              int (*supported)(int mbit, int mod, void *opaque), void *opaque)
-+{
-+      int r;
-+
-+      r = fill_ratevector(&str, brate, size, supported, opaque, 0x80);
-+      if(r) return r;
-+
-+      orate[0] = 0;
-+      if(*str==' ') {
-+              str++;
-+              r = fill_ratevector(&str, orate, size, supported, opaque, 0);
-+              if(r) return r;
-+              /* TODO: sanitize, e.g. remove/error on rates already in basic rate set? */
-+      }
-+      if(*str)
-+              return -EINVAL;
-+
-+      return 0;
-+}
-+#endif
-+
-+/* TODO: use u64 masks? */
-+
-+static int
-+fill_ratemask(const char **pstr, u32* mask,
-+              int (*supported)(int mbit, int mod,void *opaque),
-+              u32 (*gen_mask)(int mbit, int mod,void *opaque),
-+              void *opaque)
-+{
-+      unsigned long rate_mbit;
-+      int rate_enum,mod;
-+      u32 m = 0;
-+      const char *str = *pstr;
-+      char c;
-+
-+      do {
-+              rate_mbit = simple_strtoul(str, (char**)&str, 10);
-+              if(rate_mbit>INT_MAX) return -EINVAL;
-+
-+              rate_enum = rate_mbit2enum(rate_mbit);
-+              if(rate_enum<0) return rate_enum;
-+
-+              c = *str;
-+              mod = get_modulation(rate_enum, c);
-+              if(mod<0) return mod;
-+
-+              if(c>='a' && c<='z') c = *++str;
-+              if(c!=',' && c!=' ' && c!='\0') return -EINVAL;
-+
-+              if(supported) {
-+                      int r = supported(rate_mbit, mod, opaque);
-+                      if(r) return r;
-+              }
-+
-+              m |= gen_mask(rate_mbit, mod, opaque);
-+              str++;
-+      } while(c==',');
-+
-+      *pstr = str-1;
-+      *mask |= m;
-+      return 0;
-+}
-+
-+static /* TODO: remove 'static' when moved to wireless.c */
-+int
-+fill_ratemasks(const char *str, u32 *bmask, u32 *omask,
-+              int (*supported)(int mbit, int mod,void *opaque),
-+              u32 (*gen_mask)(int mbit, int mod,void *opaque),
-+              void *opaque)
-+{
-+      int r;
-+
-+      r = fill_ratemask(&str, bmask, supported, gen_mask, opaque);
-+      if(r) return r;
-+
-+      if(*str==' ') {
-+              str++;
-+              r = fill_ratemask(&str, omask, supported, gen_mask, opaque);
-+              if(r) return r;
-+      }
-+      if(*str)
-+              return -EINVAL;
-+      return 0;
-+}
-Index: linux-2.6.22/drivers/net/wireless/acx/usb.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/usb.c        2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,1922 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+/***********************************************************************
-+** USB support for TI ACX100 based devices. Many parts are taken from
-+** the PCI driver.
-+**
-+** Authors:
-+**  Martin Wawro <martin.wawro AT uni-dortmund.de>
-+**  Andreas Mohr <andi AT lisas.de>
-+**
-+** LOCKING
-+** callback functions called by USB core are running in interrupt context
-+** and thus have names with _i_.
-+*/
-+#define ACX_USB 1
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
-+#include <linux/config.h>
-+#endif
-+#include <linux/types.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/kernel.h>
-+#include <linux/usb.h>
-+#include <linux/netdevice.h>
-+#include <linux/rtnetlink.h>
-+#include <linux/etherdevice.h>
-+#include <linux/wireless.h>
-+#include <net/iw_handler.h>
-+#include <linux/vmalloc.h>
-+
-+#include "acx.h"
-+
-+
-+/***********************************************************************
-+*/
-+/* number of endpoints of an interface */
-+#define NUM_EP(intf) (intf)->altsetting[0].desc.bNumEndpoints
-+#define EP(intf, nr) (intf)->altsetting[0].endpoint[(nr)].desc
-+#define GET_DEV(udev) usb_get_dev((udev))
-+#define PUT_DEV(udev) usb_put_dev((udev))
-+#define SET_NETDEV_OWNER(ndev, owner) /* not needed anymore ??? */
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14)
-+/* removed in 2.6.14. We will use fake value for now */
-+#define URB_ASYNC_UNLINK 0
-+#endif
-+
-+
-+/***********************************************************************
-+*/
-+/* ACX100 (TNETW1100) USB device: D-Link DWL-120+ */
-+#define ACX100_VENDOR_ID 0x2001
-+#define ACX100_PRODUCT_ID_UNBOOTED 0x3B01
-+#define ACX100_PRODUCT_ID_BOOTED 0x3B00
-+
-+/* TNETW1450 USB devices */
-+#define VENDOR_ID_DLINK               0x07b8 /* D-Link Corp. */
-+#define PRODUCT_ID_WUG2400    0xb21a /* AboCom WUG2400 or SafeCom SWLUT-54125 */
-+#define VENDOR_ID_AVM_GMBH    0x057c
-+#define PRODUCT_ID_AVM_WLAN_USB       0x5601
-+#define PRODUCT_ID_AVM_WLAN_USB_si    0x6201 /* "self install" named Version: driver kills kernel on inbound scans from fritz box ???  */
-+#define VENDOR_ID_ZCOM                0x0cde
-+#define PRODUCT_ID_ZCOM_XG750 0x0017 /* not tested yet */
-+#define VENDOR_ID_TI          0x0451
-+#define PRODUCT_ID_TI_UNKNOWN 0x60c5 /* not tested yet */
-+
-+#define ACX_USB_CTRL_TIMEOUT  5500   /* steps in ms */
-+
-+/* Buffer size for fw upload, same for both ACX100 USB and TNETW1450 */
-+#define USB_RWMEM_MAXLEN      2048
-+
-+/* The number of bulk URBs to use */
-+#define ACX_TX_URB_CNT                8
-+#define ACX_RX_URB_CNT                2
-+
-+/* Should be sent to the bulkout endpoint */
-+#define ACX_USB_REQ_UPLOAD_FW 0x10
-+#define ACX_USB_REQ_ACK_CS    0x11
-+#define ACX_USB_REQ_CMD               0x12
-+
-+/***********************************************************************
-+** Prototypes
-+*/
-+static int acxusb_e_probe(struct usb_interface *, const struct usb_device_id *);
-+static void acxusb_e_disconnect(struct usb_interface *);
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
-+static void acxusb_i_complete_tx(struct urb *);
-+static void acxusb_i_complete_rx(struct urb *);
-+#else
-+static void acxusb_i_complete_tx(struct urb *, struct pt_regs *);
-+static void acxusb_i_complete_rx(struct urb *, struct pt_regs *);
-+#endif
-+static int acxusb_e_open(struct net_device *);
-+static int acxusb_e_close(struct net_device *);
-+static void acxusb_i_set_rx_mode(struct net_device *);
-+static int acxusb_boot(struct usb_device *, int is_tnetw1450, int *radio_type);
-+
-+static void acxusb_l_poll_rx(acx_device_t *adev, usb_rx_t* rx);
-+
-+static void acxusb_i_tx_timeout(struct net_device *);
-+
-+/* static void dump_device(struct usb_device *); */
-+/* static void dump_device_descriptor(struct usb_device_descriptor *); */
-+/* static void dump_config_descriptor(struct usb_config_descriptor *); */
-+
-+/***********************************************************************
-+** Module Data
-+*/
-+#define TXBUFSIZE sizeof(usb_txbuffer_t)
-+/*
-+ * Now, this is just plain lying, but the device insists in giving us
-+ * huge packets. We supply extra space after rxbuffer. Need to understand
-+ * it better...
-+ */
-+#define RXBUFSIZE (sizeof(rxbuffer_t) + \
-+                 (sizeof(usb_rx_t) - sizeof(struct usb_rx_plain)))
-+
-+static const struct usb_device_id
-+acxusb_ids[] = {
-+      { USB_DEVICE(ACX100_VENDOR_ID, ACX100_PRODUCT_ID_BOOTED) },
-+      { USB_DEVICE(ACX100_VENDOR_ID, ACX100_PRODUCT_ID_UNBOOTED) },
-+      { USB_DEVICE(VENDOR_ID_DLINK, PRODUCT_ID_WUG2400) },
-+      { USB_DEVICE(VENDOR_ID_AVM_GMBH, PRODUCT_ID_AVM_WLAN_USB) },
-+      { USB_DEVICE(VENDOR_ID_AVM_GMBH, PRODUCT_ID_AVM_WLAN_USB_si) },
-+      { USB_DEVICE(VENDOR_ID_ZCOM, PRODUCT_ID_ZCOM_XG750) },
-+      { USB_DEVICE(VENDOR_ID_TI, PRODUCT_ID_TI_UNKNOWN) },
-+      {}
-+};
-+
-+MODULE_DEVICE_TABLE(usb, acxusb_ids);
-+
-+/* USB driver data structure as required by the kernel's USB core */
-+static struct usb_driver
-+acxusb_driver = {
-+      .name = "acx_usb",
-+      .probe = acxusb_e_probe,
-+      .disconnect = acxusb_e_disconnect,
-+      .id_table = acxusb_ids
-+};
-+
-+
-+/***********************************************************************
-+** USB helper
-+**
-+** ldd3 ch13 says:
-+** When the function is usb_kill_urb, the urb lifecycle is stopped. This
-+** function is usually used when the device is disconnected from the system,
-+** in the disconnect callback. For some drivers, the usb_unlink_urb function
-+** should be used to tell the USB core to stop an urb. This function does not
-+** wait for the urb to be fully stopped before returning to the caller.
-+** This is useful for stoppingthe urb while in an interrupt handler or when
-+** a spinlock is held, as waiting for a urb to fully stop requires the ability
-+** for the USB core to put the calling process to sleep. This function requires
-+** that the URB_ASYNC_UNLINK flag value be set in the urb that is being asked
-+** to be stopped in order to work properly.
-+**
-+** (URB_ASYNC_UNLINK is obsolete, usb_unlink_urb will always be
-+** asynchronous while usb_kill_urb is synchronous and should be called
-+** directly (drivers/usb/core/urb.c))
-+**
-+** In light of this, timeout is just for paranoid reasons...
-+*
-+* Actually, it's useful for debugging. If we reach timeout, we're doing
-+* something wrong with the urbs.
-+*/
-+static void
-+acxusb_unlink_urb(struct urb* urb)
-+{
-+      if (!urb)
-+              return;
-+
-+      if (urb->status == -EINPROGRESS) {
-+              int timeout = 10;
-+
-+              usb_unlink_urb(urb);
-+              while (--timeout && urb->status == -EINPROGRESS) {
-+                      mdelay(1);
-+              }
-+              if (!timeout) {
-+                      printk("acx_usb: urb unlink timeout!\n");
-+              }
-+      }
-+}
-+
-+
-+/***********************************************************************
-+** EEPROM and PHY read/write helpers
-+*/
-+/***********************************************************************
-+** acxusb_s_read_phy_reg
-+*/
-+int
-+acxusb_s_read_phy_reg(acx_device_t *adev, u32 reg, u8 *charbuf)
-+{
-+      /* mem_read_write_t mem; */
-+
-+      FN_ENTER;
-+
-+      printk("%s doesn't seem to work yet, disabled.\n", __func__);
-+
-+      /*
-+      mem.addr = cpu_to_le16(reg);
-+      mem.type = cpu_to_le16(0x82);
-+      mem.len = cpu_to_le32(4);
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_MEM_READ, &mem, sizeof(mem));
-+      *charbuf = mem.data;
-+      log(L_DEBUG, "read radio PHY[0x%04X]=0x%02X\n", reg, *charbuf);
-+      */
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+int
-+acxusb_s_write_phy_reg(acx_device_t *adev, u32 reg, u8 value)
-+{
-+      mem_read_write_t mem;
-+
-+      FN_ENTER;
-+
-+      mem.addr = cpu_to_le16(reg);
-+      mem.type = cpu_to_le16(0x82);
-+      mem.len = cpu_to_le32(4);
-+      mem.data = value;
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_MEM_WRITE, &mem, sizeof(mem));
-+      log(L_DEBUG, "write radio PHY[0x%04X]=0x%02X\n", reg, value);
-+
-+      FN_EXIT1(OK);
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acxusb_s_issue_cmd_timeo
-+** Excecutes a command in the command mailbox
-+**
-+** buffer = a pointer to the data.
-+** The data must not include 4 byte command header
-+*/
-+
-+/* TODO: ideally we shall always know how much we need
-+** and this shall be 0 */
-+#define BOGUS_SAFETY_PADDING 0x40
-+
-+#undef FUNC
-+#define FUNC "issue_cmd"
-+
-+#if !ACX_DEBUG
-+int
-+acxusb_s_issue_cmd_timeo(
-+      acx_device_t *adev,
-+      unsigned cmd,
-+      void *buffer,
-+      unsigned buflen,
-+      unsigned timeout)
-+{
-+#else
-+int
-+acxusb_s_issue_cmd_timeo_debug(
-+      acx_device_t *adev,
-+      unsigned cmd,
-+      void *buffer,
-+      unsigned buflen,
-+      unsigned timeout,
-+      const char* cmdstr)
-+{
-+#endif
-+      /* USB ignores timeout param */
-+
-+      struct usb_device *usbdev;
-+      struct {
-+              u16     cmd;
-+              u16     status;
-+              u8      data[1];
-+      } ACX_PACKED *loc;
-+      const char *devname;
-+      int acklen, blocklen, inpipe, outpipe;
-+      int cmd_status;
-+      int result;
-+
-+      FN_ENTER;
-+
-+      devname = adev->ndev->name;
-+      /* no "wlan%%d: ..." please */
-+      if (!devname || !devname[0] || devname[4]=='%')
-+              devname = "acx";
-+
-+      log(L_CTL, FUNC"(cmd:%s,buflen:%u,type:0x%04X)\n",
-+              cmdstr, buflen,
-+              buffer ? le16_to_cpu(((acx_ie_generic_t *)buffer)->type) : -1);
-+
-+      loc = kmalloc(buflen + 4 + BOGUS_SAFETY_PADDING, GFP_KERNEL);
-+      if (!loc) {
-+              printk("%s: "FUNC"(): no memory for data buffer\n", devname);
-+              goto bad;
-+      }
-+
-+      /* get context from acx_device */
-+      usbdev = adev->usbdev;
-+
-+      /* check which kind of command was issued */
-+      loc->cmd = cpu_to_le16(cmd);
-+      loc->status = 0;
-+
-+/* NB: buflen == frmlen + 4
-+**
-+** Interrogate: write 8 bytes: (cmd,status,rid,frmlen), then
-+**            read (cmd,status,rid,frmlen,data[frmlen]) back
-+**
-+** Configure: write (cmd,status,rid,frmlen,data[frmlen])
-+**
-+** Possibly bogus special handling of ACX1xx_IE_SCAN_STATUS removed
-+*/
-+
-+      /* now write the parameters of the command if needed */
-+      acklen = buflen + 4 + BOGUS_SAFETY_PADDING;
-+      blocklen = buflen;
-+      if (buffer && buflen) {
-+              /* if it's an INTERROGATE command, just pass the length
-+               * of parameters to read, as data */
-+              if (cmd == ACX1xx_CMD_INTERROGATE) {
-+                      blocklen = 4;
-+                      acklen = buflen + 4;
-+              }
-+              memcpy(loc->data, buffer, blocklen);
-+      }
-+      blocklen += 4; /* account for cmd,status */
-+
-+      /* obtain the I/O pipes */
-+      outpipe = usb_sndctrlpipe(usbdev, 0);
-+      inpipe = usb_rcvctrlpipe(usbdev, 0);
-+      log(L_CTL, "ctrl inpipe=0x%X outpipe=0x%X\n", inpipe, outpipe);
-+      log(L_CTL, "sending USB control msg (out) (blocklen=%d)\n", blocklen);
-+      if (acx_debug & L_DATA)
-+              acx_dump_bytes(loc, blocklen);
-+
-+      result = usb_control_msg(usbdev, outpipe,
-+              ACX_USB_REQ_CMD, /* request */
-+              USB_TYPE_VENDOR|USB_DIR_OUT, /* requesttype */
-+              0, /* value */
-+              0, /* index */
-+              loc, /* dataptr */
-+              blocklen, /* size */
-+              ACX_USB_CTRL_TIMEOUT /* timeout in ms */
-+      );
-+
-+      if (result == -ENODEV) {
-+              log(L_CTL, "no device present (unplug?)\n");
-+              goto good;
-+      }
-+
-+      log(L_CTL, "wrote %d bytes\n", result);
-+      if (result < 0) {
-+              goto bad;
-+      }
-+
-+      /* check for device acknowledge */
-+      log(L_CTL, "sending USB control msg (in) (acklen=%d)\n", acklen);
-+      loc->status = 0; /* delete old status flag -> set to IDLE */
-+      /* shall we zero out the rest? */
-+      result = usb_control_msg(usbdev, inpipe,
-+              ACX_USB_REQ_CMD, /* request */
-+              USB_TYPE_VENDOR|USB_DIR_IN, /* requesttype */
-+              0, /* value */
-+              0, /* index */
-+              loc, /* dataptr */
-+              acklen, /* size */
-+              ACX_USB_CTRL_TIMEOUT /* timeout in ms */
-+      );
-+      if (result < 0) {
-+              printk("%s: "FUNC"(): USB read error %d\n", devname, result);
-+              goto bad;
-+      }
-+      if (acx_debug & L_CTL) {
-+              printk("read %d bytes: ", result);
-+              acx_dump_bytes(loc, result);
-+      }
-+
-+/*
-+   check for result==buflen+4? Was seen:
-+
-+interrogate(type:ACX100_IE_DOT11_ED_THRESHOLD,len:4)
-+issue_cmd(cmd:ACX1xx_CMD_INTERROGATE,buflen:8,type:4111)
-+ctrl inpipe=0x80000280 outpipe=0x80000200
-+sending USB control msg (out) (blocklen=8)
-+01 00 00 00 0F 10 04 00
-+wrote 8 bytes
-+sending USB control msg (in) (acklen=12) sizeof(loc->data
-+read 4 bytes <==== MUST BE 12!!
-+*/
-+
-+      cmd_status = le16_to_cpu(loc->status);
-+      if (cmd_status != 1) {
-+              printk("%s: "FUNC"(): cmd_status is not SUCCESS: %d (%s)\n",
-+                      devname, cmd_status, acx_cmd_status_str(cmd_status));
-+              /* TODO: goto bad; ? */
-+      }
-+      if ((cmd == ACX1xx_CMD_INTERROGATE) && buffer && buflen) {
-+              memcpy(buffer, loc->data, buflen);
-+              log(L_CTL, "response frame: cmd=0x%04X status=%d\n",
-+                      le16_to_cpu(loc->cmd),
-+                      cmd_status);
-+      }
-+good:
-+      kfree(loc);
-+      FN_EXIT1(OK);
-+      return OK;
-+bad:
-+      /* Give enough info so that callers can avoid
-+      ** printing their own diagnostic messages */
-+#if ACX_DEBUG
-+      printk("%s: "FUNC"(cmd:%s) FAILED\n", devname, cmdstr);
-+#else
-+      printk("%s: "FUNC"(cmd:0x%04X) FAILED\n", devname, cmd);
-+#endif
-+      dump_stack();
-+      kfree(loc);
-+      FN_EXIT1(NOT_OK);
-+      return NOT_OK;
-+}
-+
-+
-+/***********************************************************************
-+** acxusb_boot()
-+** Inputs:
-+**    usbdev -> Pointer to kernel's usb_device structure
-+**
-+** Returns:
-+**  (int) Errorcode or 0 on success
-+**
-+** This function triggers the loading of the firmware image from harddisk
-+** and then uploads the firmware to the USB device. After uploading the
-+** firmware and transmitting the checksum, the device resets and appears
-+** as a new device on the USB bus (the device we can finally deal with)
-+*/
-+static inline int
-+acxusb_fw_needs_padding(firmware_image_t *fw_image, unsigned int usb_maxlen)
-+{
-+      unsigned int num_xfers = ((fw_image->size - 1) / usb_maxlen) + 1;
-+
-+      return ((num_xfers % 2) == 0);
-+}
-+
-+static int
-+acxusb_boot(struct usb_device *usbdev, int is_tnetw1450, int *radio_type)
-+{
-+      char filename[sizeof("tiacx1NNusbcRR")];
-+
-+      firmware_image_t *fw_image = NULL;
-+      char *usbbuf;
-+      unsigned int offset;
-+      unsigned int blk_len, inpipe, outpipe;
-+      u32 num_processed;
-+      u32 img_checksum, sum;
-+      u32 file_size;
-+      int result = -EIO;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* dump_device(usbdev); */
-+
-+      usbbuf = kmalloc(USB_RWMEM_MAXLEN, GFP_KERNEL);
-+      if (!usbbuf) {
-+              printk(KERN_ERR "acx: no memory for USB transfer buffer (%d bytes)\n", USB_RWMEM_MAXLEN);
-+              result = -ENOMEM;
-+              goto end;
-+      }
-+      if (is_tnetw1450) {
-+              /* Obtain the I/O pipes */
-+              outpipe = usb_sndbulkpipe(usbdev, 1);
-+              inpipe = usb_rcvbulkpipe(usbdev, 2);
-+
-+              printk(KERN_DEBUG "wait for device ready\n");
-+              for (i = 0; i <= 2; i++) {
-+                      result = usb_bulk_msg(usbdev, inpipe,
-+                              usbbuf,
-+                              USB_RWMEM_MAXLEN,
-+                              &num_processed,
-+                              2000
-+                              );
-+
-+                      if ((*(u32 *)&usbbuf[4] == 0x40000001)
-+                      && (*(u16 *)&usbbuf[2] == 0x1)
-+                      && ((*(u16 *)usbbuf & 0x3fff) == 0)
-+                      && ((*(u16 *)usbbuf & 0xc000) == 0xc000))
-+                              break;
-+                      msleep(10);
-+              }
-+              if (i == 2)
-+                      goto fw_end;
-+
-+              *radio_type = usbbuf[8];
-+      } else {
-+              /* Obtain the I/O pipes */
-+              outpipe = usb_sndctrlpipe(usbdev, 0);
-+              inpipe = usb_rcvctrlpipe(usbdev, 0);
-+
-+              /* FIXME: shouldn't be hardcoded */
-+              *radio_type = RADIO_MAXIM_0D;
-+      }
-+
-+      snprintf(filename, sizeof(filename), "tiacx1%02dusbc%02X",
-+                              is_tnetw1450 * 11, *radio_type);
-+
-+      fw_image = acx_s_read_fw(&usbdev->dev, filename, &file_size);
-+      if (!fw_image) {
-+              result = -EIO;
-+              goto end;
-+      }
-+      log(L_INIT, "firmware size: %d bytes\n", file_size);
-+
-+      img_checksum = le32_to_cpu(fw_image->chksum);
-+
-+      if (is_tnetw1450) {
-+              u8 cmdbuf[20];
-+              const u8 *p;
-+              u8 need_padding;
-+              u32 tmplen, val;
-+
-+              memset(cmdbuf, 0, 16);
-+
-+              need_padding = acxusb_fw_needs_padding(fw_image, USB_RWMEM_MAXLEN);
-+              tmplen = need_padding ? file_size-4 : file_size-8;
-+              *(u16 *)&cmdbuf[0] = 0xc000;
-+              *(u16 *)&cmdbuf[2] = 0x000b;
-+              *(u32 *)&cmdbuf[4] = tmplen;
-+              *(u32 *)&cmdbuf[8] = file_size-8;
-+              *(u32 *)&cmdbuf[12] = img_checksum;
-+
-+              result = usb_bulk_msg(usbdev, outpipe, cmdbuf, 16, &num_processed, HZ);
-+              if (result < 0)
-+                      goto fw_end;
-+
-+              p = (const u8 *)&fw_image->size;
-+
-+              /* first calculate checksum for image size part */
-+              sum = p[0]+p[1]+p[2]+p[3];
-+              p += 4;
-+
-+              /* now continue checksum for firmware data part */
-+              tmplen = le32_to_cpu(fw_image->size);
-+              for (i = 0; i < tmplen /* image size */; i++) {
-+                      sum += *p++;
-+              }
-+
-+              if (sum != le32_to_cpu(fw_image->chksum)) {
-+                      printk("acx: FATAL: firmware upload: "
-+                              "checksums don't match! "
-+                              "(0x%08x vs. 0x%08x)\n",
-+                                      sum, fw_image->chksum);
-+                      goto fw_end;
-+              }
-+
-+              offset = 8;
-+              while (offset < file_size) {
-+                      blk_len = file_size - offset;
-+                      if (blk_len > USB_RWMEM_MAXLEN) {
-+                              blk_len = USB_RWMEM_MAXLEN;
-+                      }
-+
-+                      log(L_INIT, "uploading firmware (%d bytes, offset=%d)\n",
-+                                                      blk_len, offset);
-+                      memcpy(usbbuf, ((u8 *)fw_image) + offset, blk_len);
-+
-+                      p = usbbuf;
-+                      for (i = 0; i < blk_len; i += 4) {
-+                              *(u32 *)p = be32_to_cpu(*(u32 *)p);
-+                              p += 4;
-+                      }
-+
-+                      result = usb_bulk_msg(usbdev, outpipe, usbbuf, blk_len, &num_processed, HZ);
-+                      if ((result < 0) || (num_processed != blk_len))
-+                              goto fw_end;
-+                      offset += blk_len;
-+              }
-+              if (need_padding) {
-+                      printk(KERN_DEBUG "send padding\n");
-+                      memset(usbbuf, 0, 4);
-+                      result = usb_bulk_msg(usbdev, outpipe, usbbuf, 4, &num_processed, HZ);
-+                      if ((result < 0) || (num_processed != 4))
-+                              goto fw_end;
-+              }
-+              printk(KERN_DEBUG "read firmware upload result\n");
-+              memset(cmdbuf, 0, 20); /* additional memset */
-+              result = usb_bulk_msg(usbdev, inpipe, cmdbuf, 20, &num_processed, 2000);
-+              if (result < 0)
-+                      goto fw_end;
-+              if (*(u32 *)&cmdbuf[4] == 0x40000003)
-+                      goto fw_end;
-+              if (*(u32 *)&cmdbuf[4])
-+                      goto fw_end;
-+              if (*(u16 *)&cmdbuf[16] != 1)
-+                      goto fw_end;
-+
-+              val = *(u32 *)&cmdbuf[0];
-+              if ((val & 0x3fff)
-+              ||  ((val & 0xc000) != 0xc000))
-+                      goto fw_end;
-+
-+              val = *(u32 *)&cmdbuf[8];
-+              if (val & 2) {
-+                      result = usb_bulk_msg(usbdev, inpipe, cmdbuf, 20, &num_processed, 2000);
-+                      if (result < 0)
-+                              goto fw_end;
-+                      val = *(u32 *)&cmdbuf[8];
-+              }
-+              /* yup, no "else" here! */
-+              if (val & 1) {
-+                      memset(usbbuf, 0, 4);
-+                      result = usb_bulk_msg(usbdev, outpipe, usbbuf, 4, &num_processed, HZ);
-+                      if ((result < 0) || (!num_processed))
-+                              goto fw_end;
-+              }
-+
-+              printk("TNETW1450 firmware upload successful!\n");
-+              result = 0;
-+              goto end;
-+fw_end:
-+              result = -EIO;
-+              goto end;
-+      } else {
-+              /* ACX100 USB */
-+
-+              /* now upload the firmware, slice the data into blocks */
-+              offset = 8;
-+              while (offset < file_size) {
-+                      blk_len = file_size - offset;
-+                      if (blk_len > USB_RWMEM_MAXLEN) {
-+                              blk_len = USB_RWMEM_MAXLEN;
-+                      }
-+                      log(L_INIT, "uploading firmware (%d bytes, offset=%d)\n",
-+                                                      blk_len, offset);
-+                      memcpy(usbbuf, ((u8 *)fw_image) + offset, blk_len);
-+                      result = usb_control_msg(usbdev, outpipe,
-+                              ACX_USB_REQ_UPLOAD_FW,
-+                              USB_TYPE_VENDOR|USB_DIR_OUT,
-+                              (file_size - 8) & 0xffff, /* value */
-+                              (file_size - 8) >> 16, /* index */
-+                              usbbuf, /* dataptr */
-+                              blk_len, /* size */
-+                              3000 /* timeout in ms */
-+                      );
-+                      offset += blk_len;
-+                      if (result < 0) {
-+                              printk(KERN_ERR "acx: error %d during upload "
-+                                      "of firmware, aborting\n", result);
-+                              goto end;
-+                      }
-+              }
-+
-+              /* finally, send the checksum and reboot the device */
-+              /* does this trigger the reboot? */
-+              result = usb_control_msg(usbdev, outpipe,
-+                      ACX_USB_REQ_UPLOAD_FW,
-+                      USB_TYPE_VENDOR|USB_DIR_OUT,
-+                      img_checksum & 0xffff, /* value */
-+                      img_checksum >> 16, /* index */
-+                      NULL, /* dataptr */
-+                      0, /* size */
-+                      3000 /* timeout in ms */
-+              );
-+              if (result < 0) {
-+                      printk(KERN_ERR "acx: error %d during tx of checksum, "
-+                                      "aborting\n", result);
-+                      goto end;
-+              }
-+              result = usb_control_msg(usbdev, inpipe,
-+                      ACX_USB_REQ_ACK_CS,
-+                      USB_TYPE_VENDOR|USB_DIR_IN,
-+                      img_checksum & 0xffff, /* value */
-+                      img_checksum >> 16, /* index */
-+                      usbbuf, /* dataptr */
-+                      8, /* size */
-+                      3000 /* timeout in ms */
-+              );
-+              if (result < 0) {
-+                      printk(KERN_ERR "acx: error %d during ACK of checksum, "
-+                                      "aborting\n", result);
-+                      goto end;
-+              }
-+              if (*usbbuf != 0x10) {
-+                      printk(KERN_ERR "acx: invalid checksum?\n");
-+                      result = -EINVAL;
-+                      goto end;
-+              }
-+              result = 0;
-+      }
-+
-+end:
-+      vfree(fw_image);
-+      kfree(usbbuf);
-+
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/* FIXME: maybe merge it with usual eeprom reading, into common code? */
-+static void
-+acxusb_s_read_eeprom_version(acx_device_t *adev)
-+{
-+      u8 eeprom_ver[0x8];
-+
-+      memset(eeprom_ver, 0, sizeof(eeprom_ver));
-+      acx_s_interrogate(adev, &eeprom_ver, ACX1FF_IE_EEPROM_VER);
-+
-+      /* FIXME: which one of those values to take? */
-+      adev->eeprom_version = eeprom_ver[5];
-+}
-+
-+
-+/*
-+ * temporary helper function to at least fill important cfgopt members with
-+ * useful replacement values until we figure out how one manages to fetch
-+ * the configoption struct in the USB device case...
-+ */
-+static int
-+acxusb_s_fill_configoption(acx_device_t *adev)
-+{
-+      adev->cfgopt_probe_delay = 200;
-+      adev->cfgopt_dot11CCAModes = 4;
-+      adev->cfgopt_dot11Diversity = 1;
-+      adev->cfgopt_dot11ShortPreambleOption = 1;
-+      adev->cfgopt_dot11PBCCOption = 1;
-+      adev->cfgopt_dot11ChannelAgility = 0;
-+      adev->cfgopt_dot11PhyType = 5;
-+      adev->cfgopt_dot11TempType = 1;
-+      return OK;
-+}
-+
-+
-+/***********************************************************************
-+** acxusb_e_probe()
-+**
-+** This function is invoked by the kernel's USB core whenever a new device is
-+** attached to the system or the module is loaded. It is presented a usb_device
-+** structure from which information regarding the device is obtained and evaluated.
-+** In case this driver is able to handle one of the offered devices, it returns
-+** a non-null pointer to a driver context and thereby claims the device.
-+*/
-+
-+static void
-+dummy_netdev_init(struct net_device *ndev) {}
-+
-+static int
-+acxusb_e_probe(struct usb_interface *intf, const struct usb_device_id *devID)
-+{
-+      struct usb_device *usbdev = interface_to_usbdev(intf);
-+      acx_device_t *adev = NULL;
-+      struct net_device *ndev = NULL;
-+      struct usb_config_descriptor *config;
-+      struct usb_endpoint_descriptor *epdesc;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+      struct usb_host_endpoint *ep;
-+#endif
-+      struct usb_interface_descriptor *ifdesc;
-+      const char* msg;
-+      int numconfigs, numfaces, numep;
-+      int result = OK;
-+      int i;
-+      int radio_type;
-+      /* this one needs to be more precise in case there appears a TNETW1450 from the same vendor */
-+      int is_tnetw1450 = (usbdev->descriptor.idVendor != ACX100_VENDOR_ID);
-+
-+      FN_ENTER;
-+
-+      if (is_tnetw1450) {
-+              /* Boot the device (i.e. upload the firmware) */
-+              acxusb_boot(usbdev, is_tnetw1450, &radio_type);
-+
-+              /* TNETW1450-based cards will continue right away with
-+               * the same USB ID after booting */
-+      } else {
-+              /* First check if this is the "unbooted" hardware */
-+              if (usbdev->descriptor.idProduct == ACX100_PRODUCT_ID_UNBOOTED) {
-+
-+                      /* Boot the device (i.e. upload the firmware) */
-+                      acxusb_boot(usbdev, is_tnetw1450, &radio_type);
-+
-+                      /* DWL-120+ will first boot the firmware,
-+                       * then later have a *separate* probe() run
-+                       * since its USB ID will have changed after
-+                       * firmware boot!
-+                       * Since the first probe() run has no
-+                       * other purpose than booting the firmware,
-+                       * simply return immediately.
-+                      */
-+                      log(L_INIT, "finished booting, returning from probe()\n");
-+                      result = OK; /* success */
-+                      goto end;
-+              }
-+              else
-+              /* device not unbooted, but invalid USB ID!? */
-+              if (usbdev->descriptor.idProduct != ACX100_PRODUCT_ID_BOOTED)
-+                      goto end_nodev;
-+      }
-+
-+/* Ok, so it's our device and it has already booted */
-+
-+      /* Allocate memory for a network device */
-+
-+      ndev = alloc_netdev(sizeof(*adev), "wlan%d", dummy_netdev_init);
-+      /* (NB: memsets to 0 entire area) */
-+      if (!ndev) {
-+              msg = "acx: no memory for netdev\n";
-+              goto end_nomem;
-+      }
-+
-+      /* Register the callbacks for the network device functions */
-+
-+      ether_setup(ndev);
-+      ndev->open = &acxusb_e_open;
-+      ndev->stop = &acxusb_e_close;
-+      ndev->hard_start_xmit = (void *)&acx_i_start_xmit;
-+      ndev->get_stats = (void *)&acx_e_get_stats;
-+#if IW_HANDLER_VERSION <= 5
-+      ndev->get_wireless_stats = (void *)&acx_e_get_wireless_stats;
-+#endif
-+      ndev->wireless_handlers = (struct iw_handler_def *)&acx_ioctl_handler_def;
-+      ndev->set_multicast_list = (void *)&acxusb_i_set_rx_mode;
-+#ifdef HAVE_TX_TIMEOUT
-+      ndev->tx_timeout = &acxusb_i_tx_timeout;
-+      ndev->watchdog_timeo = 4 * HZ;
-+#endif
-+      ndev->change_mtu = &acx_e_change_mtu;
-+      SET_MODULE_OWNER(ndev);
-+
-+      /* Setup private driver context */
-+
-+      adev = ndev2adev(ndev);
-+      adev->ndev = ndev;
-+
-+      adev->dev_type = DEVTYPE_USB;
-+      adev->radio_type = radio_type;
-+      if (is_tnetw1450) {
-+              /* well, actually it's a TNETW1450, but since it
-+               * seems to be sufficiently similar to TNETW1130,
-+               * I don't want to change large amounts of code now */
-+              adev->chip_type = CHIPTYPE_ACX111;
-+      } else {
-+              adev->chip_type = CHIPTYPE_ACX100;
-+      }
-+
-+      adev->usbdev = usbdev;
-+      spin_lock_init(&adev->lock);    /* initial state: unlocked */
-+      sema_init(&adev->sem, 1);       /* initial state: 1 (upped) */
-+
-+      /* Check that this is really the hardware we know about.
-+      ** If not sure, at least notify the user that he
-+      ** may be in trouble...
-+      */
-+      numconfigs = (int)usbdev->descriptor.bNumConfigurations;
-+      if (numconfigs != 1)
-+              printk("acx: number of configurations is %d, "
-+                      "this driver only knows how to handle 1, "
-+                      "be prepared for surprises\n", numconfigs);
-+
-+      config = &usbdev->config->desc;
-+      numfaces = config->bNumInterfaces;
-+      if (numfaces != 1)
-+              printk("acx: number of interfaces is %d, "
-+                      "this driver only knows how to handle 1, "
-+                      "be prepared for surprises\n", numfaces);
-+
-+      ifdesc = &intf->altsetting->desc;
-+      numep = ifdesc->bNumEndpoints;
-+      log(L_DEBUG, "# of endpoints: %d\n", numep);
-+
-+      if (is_tnetw1450) {
-+              adev->bulkoutep = 1;
-+              adev->bulkinep = 2;
-+      } else {
-+              /* obtain information about the endpoint
-+              ** addresses, begin with some default values
-+              */
-+              adev->bulkoutep = 1;
-+              adev->bulkinep = 1;
-+              for (i = 0; i < numep; i++) {
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+                      ep = usbdev->ep_in[i];
-+                      if (!ep)
-+                              continue;
-+                      epdesc = &ep->desc;
-+#else
-+                      epdesc = usb_epnum_to_ep_desc(usbdev, i);
-+                      if (!epdesc)
-+                              continue;
-+#endif
-+                      if (epdesc->bmAttributes & USB_ENDPOINT_XFER_BULK) {
-+                              if (epdesc->bEndpointAddress & 0x80)
-+                                      adev->bulkinep = epdesc->bEndpointAddress & 0xF;
-+                              else
-+                                      adev->bulkoutep = epdesc->bEndpointAddress & 0xF;
-+                      }
-+              }
-+      }
-+      log(L_DEBUG, "bulkout ep: 0x%X\n", adev->bulkoutep);
-+      log(L_DEBUG, "bulkin ep: 0x%X\n", adev->bulkinep);
-+
-+      /* already done by memset: adev->rxtruncsize = 0; */
-+      log(L_DEBUG, "TXBUFSIZE=%d RXBUFSIZE=%d\n",
-+                              (int) TXBUFSIZE, (int) RXBUFSIZE);
-+
-+      /* Allocate the RX/TX containers. */
-+      adev->usb_tx = kmalloc(sizeof(usb_tx_t) * ACX_TX_URB_CNT, GFP_KERNEL);
-+      if (!adev->usb_tx) {
-+              msg = "acx: no memory for tx container";
-+              goto end_nomem;
-+      }
-+      adev->usb_rx = kmalloc(sizeof(usb_rx_t) * ACX_RX_URB_CNT, GFP_KERNEL);
-+      if (!adev->usb_rx) {
-+              msg = "acx: no memory for rx container";
-+              goto end_nomem;
-+      }
-+
-+      /* Setup URBs for bulk-in/out messages */
-+      for (i = 0; i < ACX_RX_URB_CNT; i++) {
-+              adev->usb_rx[i].urb = usb_alloc_urb(0, GFP_KERNEL);
-+              if (!adev->usb_rx[i].urb) {
-+                      msg = "acx: no memory for input URB\n";
-+                      goto end_nomem;
-+              }
-+              adev->usb_rx[i].urb->status = 0;
-+              adev->usb_rx[i].adev = adev;
-+              adev->usb_rx[i].busy = 0;
-+      }
-+
-+      for (i = 0; i< ACX_TX_URB_CNT; i++) {
-+              adev->usb_tx[i].urb = usb_alloc_urb(0, GFP_KERNEL);
-+              if (!adev->usb_tx[i].urb) {
-+                      msg = "acx: no memory for output URB\n";
-+                      goto end_nomem;
-+              }
-+              adev->usb_tx[i].urb->status = 0;
-+              adev->usb_tx[i].adev = adev;
-+              adev->usb_tx[i].busy = 0;
-+      }
-+      adev->tx_free = ACX_TX_URB_CNT;
-+
-+      usb_set_intfdata(intf, adev);
-+      SET_NETDEV_DEV(ndev, &intf->dev);
-+
-+      /* TODO: move all of fw cmds to open()? But then we won't know our MAC addr
-+         until ifup (it's available via reading ACX1xx_IE_DOT11_STATION_ID)... */
-+
-+      /* put acx out of sleep mode and initialize it */
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0);
-+
-+      result = acx_s_init_mac(adev);
-+      if (result)
-+              goto end;
-+
-+      /* TODO: see similar code in pci.c */
-+      acxusb_s_read_eeprom_version(adev);
-+      acxusb_s_fill_configoption(adev);
-+      acx_s_set_defaults(adev);
-+      acx_s_get_firmware_version(adev);
-+      acx_display_hardware_details(adev);
-+
-+      /* Register the network device */
-+      log(L_INIT, "registering network device\n");
-+      result = register_netdev(ndev);
-+      if (result) {
-+              msg = "acx: failed to register USB network device "
-+                      "(error %d)\n";
-+              goto end_nomem;
-+      }
-+
-+      acx_proc_register_entries(ndev);
-+
-+      acx_stop_queue(ndev, "on probe");
-+      acx_carrier_off(ndev, "on probe");
-+
-+      printk("acx: USB module " ACX_RELEASE " loaded successfully\n");
-+
-+#if CMD_DISCOVERY
-+      great_inquisitor(adev);
-+#endif
-+
-+      /* Everything went OK, we are happy now */
-+      result = OK;
-+      goto end;
-+
-+end_nomem:
-+      printk(msg, result);
-+
-+      if (ndev) {
-+              if (adev->usb_rx) {
-+                      for (i = 0; i < ACX_RX_URB_CNT; i++)
-+                              usb_free_urb(adev->usb_rx[i].urb);
-+                      kfree(adev->usb_rx);
-+              }
-+              if (adev->usb_tx) {
-+                      for (i = 0; i < ACX_TX_URB_CNT; i++)
-+                              usb_free_urb(adev->usb_tx[i].urb);
-+                      kfree(adev->usb_tx);
-+              }
-+              free_netdev(ndev);
-+      }
-+
-+      result = -ENOMEM;
-+      goto end;
-+
-+end_nodev:
-+      /* no device we could handle, return error. */
-+      result = -EIO;
-+
-+end:
-+      FN_EXIT1(result);
-+      return result;
-+}
-+
-+
-+/***********************************************************************
-+** acxusb_e_disconnect()
-+**
-+** This function is invoked whenever the user pulls the plug from the USB
-+** device or the module is removed from the kernel. In these cases, the
-+** network devices have to be taken down and all allocated memory has
-+** to be freed.
-+*/
-+static void
-+acxusb_e_disconnect(struct usb_interface *intf)
-+{
-+      acx_device_t *adev = usb_get_intfdata(intf);
-+      unsigned long flags;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      /* No WLAN device... no sense */
-+      if (!adev)
-+              goto end;
-+
-+      /* Unregister network device
-+       *
-+       * If the interface is up, unregister_netdev() will take
-+       * care of calling our close() function, which takes
-+       * care of unlinking the urbs, sending the device to
-+       * sleep, etc...
-+       * This can't be called with sem or lock held because
-+       * _close() will try to grab it as well if it's called,
-+       * deadlocking the machine.
-+       */
-+      unregister_netdev(adev->ndev);
-+
-+      acx_sem_lock(adev);
-+      acx_lock(adev, flags);
-+      /* This device exists no more */
-+      usb_set_intfdata(intf, NULL);
-+      acx_proc_unregister_entries(adev->ndev);
-+
-+      /*
-+       * Here we only free them. _close() took care of
-+       * unlinking them.
-+       */
-+      for (i = 0; i < ACX_RX_URB_CNT; ++i) {
-+              usb_free_urb(adev->usb_rx[i].urb);
-+      }
-+      for (i = 0; i< ACX_TX_URB_CNT; ++i) {
-+              usb_free_urb(adev->usb_tx[i].urb);
-+      }
-+
-+      /* Freeing containers */
-+      kfree(adev->usb_rx);
-+      kfree(adev->usb_tx);
-+
-+      acx_unlock(adev, flags);
-+      acx_sem_unlock(adev);
-+
-+      free_netdev(adev->ndev);
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxusb_e_open()
-+** This function is called when the user sets up the network interface.
-+** It initializes a management timer, sets up the USB card and starts
-+** the network tx queue and USB receive.
-+*/
-+static int
-+acxusb_e_open(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      acx_sem_lock(adev);
-+
-+      /* put the ACX100 out of sleep mode */
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_WAKE, NULL, 0);
-+
-+      acx_init_task_scheduler(adev);
-+
-+      init_timer(&adev->mgmt_timer);
-+      adev->mgmt_timer.function = acx_i_timer;
-+      adev->mgmt_timer.data = (unsigned long)adev;
-+
-+      /* acx_s_start needs it */
-+      SET_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+      acx_s_start(adev);
-+
-+      /* don't acx_start_queue() here, we need to associate first */
-+
-+      acx_lock(adev, flags);
-+      for (i = 0; i < ACX_RX_URB_CNT; i++) {
-+              adev->usb_rx[i].urb->status = 0;
-+      }
-+
-+      acxusb_l_poll_rx(adev, &adev->usb_rx[0]);
-+
-+      acx_unlock(adev, flags);
-+
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT0;
-+      return 0;
-+}
-+
-+
-+/***********************************************************************
-+** acxusb_e_close()
-+**
-+** This function stops the network functionality of the interface (invoked
-+** when the user calls ifconfig <wlan> down). The tx queue is halted and
-+** the device is marked as down. In case there were any pending USB bulk
-+** transfers, these are unlinked (asynchronously). The module in-use count
-+** is also decreased in this function.
-+*/
-+static int
-+acxusb_e_close(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      int i;
-+
-+      FN_ENTER;
-+
-+#ifdef WE_STILL_DONT_CARE_ABOUT_IT
-+      /* Transmit a disassociate frame */
-+      lock
-+      acx_l_transmit_disassoc(adev, &client);
-+      unlock
-+#endif
-+
-+      acx_sem_lock(adev);
-+
-+      CLEAR_BIT(adev->dev_state_mask, ACX_STATE_IFACE_UP);
-+
-+/* Code below is remarkably similar to acxpci_s_down(). Maybe we can merge them? */
-+
-+      /* Make sure we don't get any more rx requests */
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_RX, NULL, 0);
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_DISABLE_TX, NULL, 0);
-+
-+      /*
-+       * We must do FLUSH *without* holding sem to avoid a deadlock.
-+       * See pci.c:acxpci_s_down() for deails.
-+       */
-+      acx_sem_unlock(adev);
-+      FLUSH_SCHEDULED_WORK();
-+      acx_sem_lock(adev);
-+
-+      /* Power down the device */
-+      acx_s_issue_cmd(adev, ACX1xx_CMD_SLEEP, NULL, 0);
-+
-+      /* Stop the transmit queue, mark the device as DOWN */
-+      acx_lock(adev, flags);
-+      acx_stop_queue(ndev, "on ifdown");
-+      acx_set_status(adev, ACX_STATUS_0_STOPPED);
-+      /* stop pending rx/tx urb transfers */
-+      for (i = 0; i < ACX_TX_URB_CNT; i++) {
-+              acxusb_unlink_urb(adev->usb_tx[i].urb);
-+              adev->usb_tx[i].busy = 0;
-+      }
-+      for (i = 0; i < ACX_RX_URB_CNT; i++) {
-+              acxusb_unlink_urb(adev->usb_rx[i].urb);
-+              adev->usb_rx[i].busy = 0;
-+      }
-+      adev->tx_free = ACX_TX_URB_CNT;
-+      acx_unlock(adev, flags);
-+
-+      /* Must do this outside of lock */
-+      del_timer_sync(&adev->mgmt_timer);
-+
-+      acx_sem_unlock(adev);
-+
-+      FN_EXIT0;
-+      return 0;
-+}
-+
-+
-+/***********************************************************************
-+** acxusb_l_poll_rx
-+** This function (re)initiates a bulk-in USB transfer on a given urb
-+*/
-+static void
-+acxusb_l_poll_rx(acx_device_t *adev, usb_rx_t* rx)
-+{
-+      struct usb_device *usbdev;
-+      struct urb *rxurb;
-+      int errcode, rxnum;
-+      unsigned int inpipe;
-+
-+      FN_ENTER;
-+
-+      rxurb = rx->urb;
-+      usbdev = adev->usbdev;
-+
-+      rxnum = rx - adev->usb_rx;
-+
-+      inpipe = usb_rcvbulkpipe(usbdev, adev->bulkinep);
-+      if (unlikely(rxurb->status == -EINPROGRESS)) {
-+              printk(KERN_ERR "acx: error, rx triggered while rx urb in progress\n");
-+              /* FIXME: this is nasty, receive is being cancelled by this code
-+               * on the other hand, this should not happen anyway...
-+               */
-+              usb_unlink_urb(rxurb);
-+      } else
-+      if (unlikely(rxurb->status == -ECONNRESET)) {
-+              log(L_USBRXTX, "acx_usb: _poll_rx: connection reset\n");
-+              goto end;
-+      }
-+      rxurb->actual_length = 0;
-+      usb_fill_bulk_urb(rxurb, usbdev, inpipe,
-+              &rx->bulkin, /* dataptr */
-+              RXBUFSIZE, /* size */
-+              acxusb_i_complete_rx, /* handler */
-+              rx /* handler param */
-+      );
-+      rxurb->transfer_flags = URB_ASYNC_UNLINK;
-+
-+      /* ATOMIC: we may be called from complete_rx() usb callback */
-+      errcode = usb_submit_urb(rxurb, GFP_ATOMIC);
-+      /* FIXME: evaluate the error code! */
-+      log(L_USBRXTX, "SUBMIT RX (%d) inpipe=0x%X size=%d errcode=%d\n",
-+                      rxnum, inpipe, (int) RXBUFSIZE, errcode);
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxusb_i_complete_rx()
-+** Inputs:
-+**     urb -> pointer to USB request block
-+**    regs -> pointer to register-buffer for syscalls (see asm/ptrace.h)
-+**
-+** This function is invoked by USB subsystem whenever a bulk receive
-+** request returns.
-+** The received data is then committed to the network stack and the next
-+** USB receive is triggered.
-+*/
-+static void
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
-+acxusb_i_complete_rx(struct urb *urb)
-+#else
-+acxusb_i_complete_rx(struct urb *urb, struct pt_regs *regs)
-+#endif
-+{
-+      acx_device_t *adev;
-+      rxbuffer_t *ptr;
-+      rxbuffer_t *inbuf;
-+      usb_rx_t *rx;
-+      unsigned long flags;
-+      int size, remsize, packetsize, rxnum;
-+
-+      FN_ENTER;
-+
-+      BUG_ON(!urb->context);
-+
-+      rx = (usb_rx_t *)urb->context;
-+      adev = rx->adev;
-+
-+      acx_lock(adev, flags);
-+
-+      /*
-+       * Happens on disconnect or close. Don't play with the urb.
-+       * Don't resubmit it. It will get unlinked by close()
-+       */
-+      if (unlikely(!(adev->dev_state_mask & ACX_STATE_IFACE_UP))) {
-+              log(L_USBRXTX, "rx: device is down, not doing anything\n");
-+              goto end_unlock;
-+      }
-+
-+      inbuf = &rx->bulkin;
-+      size = urb->actual_length;
-+      remsize = size;
-+      rxnum = rx - adev->usb_rx;
-+
-+      log(L_USBRXTX, "RETURN RX (%d) status=%d size=%d\n",
-+                              rxnum, urb->status, size);
-+
-+      /* Send the URB that's waiting. */
-+      log(L_USBRXTX, "rxnum=%d, sending=%d\n", rxnum, rxnum^1);
-+      acxusb_l_poll_rx(adev, &adev->usb_rx[rxnum^1]);
-+
-+      if (unlikely(size > sizeof(rxbuffer_t)))
-+              printk("acx_usb: rx too large: %d, please report\n", size);
-+
-+      /* check if the transfer was aborted */
-+      switch (urb->status) {
-+      case 0: /* No error */
-+              break;
-+      case -EOVERFLOW:
-+              printk(KERN_ERR "acx: rx data overrun\n");
-+              adev->rxtruncsize = 0; /* Not valid anymore. */
-+              goto end_unlock;
-+      case -ECONNRESET:
-+              adev->rxtruncsize = 0;
-+              goto end_unlock;
-+      case -ESHUTDOWN: /* rmmod */
-+              adev->rxtruncsize = 0;
-+              goto end_unlock;
-+      default:
-+              adev->rxtruncsize = 0;
-+              adev->stats.rx_errors++;
-+              printk("acx: rx error (urb status=%d)\n", urb->status);
-+              goto end_unlock;
-+      }
-+
-+      if (unlikely(!size))
-+              printk("acx: warning, encountered zerolength rx packet\n");
-+
-+      if (urb->transfer_buffer != inbuf)
-+              goto end_unlock;
-+
-+      /* check if previous frame was truncated
-+      ** FIXME: this code can only handle truncation
-+      ** of consecutive packets!
-+      */
-+      ptr = inbuf;
-+      if (adev->rxtruncsize) {
-+              int tail_size;
-+
-+              ptr = &adev->rxtruncbuf;
-+              packetsize = RXBUF_BYTES_USED(ptr);
-+              if (acx_debug & L_USBRXTX) {
-+                      printk("handling truncated frame (truncsize=%d size=%d "
-+                                      "packetsize(from trunc)=%d)\n",
-+                                      adev->rxtruncsize, size, packetsize);
-+                      acx_dump_bytes(ptr, RXBUF_HDRSIZE);
-+                      acx_dump_bytes(inbuf, RXBUF_HDRSIZE);
-+              }
-+
-+              /* bytes needed for rxtruncbuf completion: */
-+              tail_size = packetsize - adev->rxtruncsize;
-+
-+              if (size < tail_size) {
-+                      /* there is not enough data to complete this packet,
-+                      ** simply append the stuff to the truncation buffer
-+                      */
-+                      memcpy(((char *)ptr) + adev->rxtruncsize, inbuf, size);
-+                      adev->rxtruncsize += size;
-+                      remsize = 0;
-+              } else {
-+                      /* ok, this data completes the previously
-+                      ** truncated packet. copy it into a descriptor
-+                      ** and give it to the rest of the stack */
-+
-+                      /* append tail to previously truncated part
-+                      ** NB: adev->rxtruncbuf (pointed to by ptr) can't
-+                      ** overflow because this is already checked before
-+                      ** truncation buffer was filled. See below,
-+                      ** "if (packetsize > sizeof(rxbuffer_t))..." code */
-+                      memcpy(((char *)ptr) + adev->rxtruncsize, inbuf, tail_size);
-+
-+                      if (acx_debug & L_USBRXTX) {
-+                              printk("full trailing packet + 12 bytes:\n");
-+                              acx_dump_bytes(inbuf, tail_size + RXBUF_HDRSIZE);
-+                      }
-+                      acx_l_process_rxbuf(adev, ptr);
-+                      adev->rxtruncsize = 0;
-+                      ptr = (rxbuffer_t *) (((char *)inbuf) + tail_size);
-+                      remsize -= tail_size;
-+              }
-+              log(L_USBRXTX, "post-merge size=%d remsize=%d\n",
-+                                              size, remsize);
-+      }
-+
-+      /* size = USB data block size
-+      ** remsize = unprocessed USB bytes left
-+      ** ptr = current pos in USB data block
-+      */
-+      while (remsize) {
-+              if (remsize < RXBUF_HDRSIZE) {
-+                      printk("acx: truncated rx header (%d bytes)!\n",
-+                              remsize);
-+                      if (ACX_DEBUG)
-+                              acx_dump_bytes(ptr, remsize);
-+                      break;
-+              }
-+
-+              packetsize = RXBUF_BYTES_USED(ptr);
-+              log(L_USBRXTX, "packet with packetsize=%d\n", packetsize);
-+
-+              if (RXBUF_IS_TXSTAT(ptr)) {
-+                      /* do rate handling */
-+                      usb_txstatus_t *stat = (void*)ptr;
-+                      u16 client_no = (u16)stat->hostdata;
-+
-+                      log(L_USBRXTX, "tx: stat: mac_cnt_rcvd:%04X "
-+                      "queue_index:%02X mac_status:%02X hostdata:%08X "
-+                      "rate:%u ack_failures:%02X rts_failures:%02X "
-+                      "rts_ok:%02X\n",
-+                      stat->mac_cnt_rcvd,
-+                      stat->queue_index, stat->mac_status, stat->hostdata,
-+                      stat->rate, stat->ack_failures, stat->rts_failures,
-+                      stat->rts_ok);
-+
-+                      if (adev->rate_auto && client_no < VEC_SIZE(adev->sta_list)) {
-+                              client_t *clt = &adev->sta_list[client_no];
-+                              u16 cur = stat->hostdata >> 16;
-+
-+                              if (clt && clt->rate_cur == cur) {
-+                                      acx_l_handle_txrate_auto(adev, clt,
-+                                              cur, /* intended rate */
-+                                              stat->rate, 0, /* actually used rate */
-+                                              stat->mac_status, /* error? */
-+                                              ACX_TX_URB_CNT - adev->tx_free);
-+                              }
-+                      }
-+                      goto next;
-+              }
-+
-+              if (packetsize > sizeof(rxbuffer_t)) {
-+                      printk("acx: packet exceeds max wlan "
-+                              "frame size (%d > %d). size=%d\n",
-+                              packetsize, (int) sizeof(rxbuffer_t), size);
-+                      if (ACX_DEBUG)
-+                              acx_dump_bytes(ptr, 16);
-+                      /* FIXME: put some real error-handling in here! */
-+                      break;
-+              }
-+
-+              if (packetsize > remsize) {
-+                      /* frame truncation handling */
-+                      if (acx_debug & L_USBRXTX) {
-+                              printk("need to truncate packet, "
-+                                      "packetsize=%d remsize=%d "
-+                                      "size=%d bytes:",
-+                                      packetsize, remsize, size);
-+                              acx_dump_bytes(ptr, RXBUF_HDRSIZE);
-+                      }
-+                      memcpy(&adev->rxtruncbuf, ptr, remsize);
-+                      adev->rxtruncsize = remsize;
-+                      break;
-+              }
-+
-+              /* packetsize <= remsize */
-+              /* now handle the received data */
-+              acx_l_process_rxbuf(adev, ptr);
-+next:
-+              ptr = (rxbuffer_t *)(((char *)ptr) + packetsize);
-+              remsize -= packetsize;
-+              if ((acx_debug & L_USBRXTX) && remsize) {
-+                      printk("more than one packet in buffer, "
-+                                              "second packet hdr:");
-+                      acx_dump_bytes(ptr, RXBUF_HDRSIZE);
-+              }
-+      }
-+
-+end_unlock:
-+      acx_unlock(adev, flags);
-+/* end: */
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+** acxusb_i_complete_tx()
-+** Inputs:
-+**     urb -> pointer to USB request block
-+**    regs -> pointer to register-buffer for syscalls (see asm/ptrace.h)
-+**
-+** This function is invoked upon termination of a USB transfer.
-+*/
-+static void
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19)
-+acxusb_i_complete_tx(struct urb *urb)
-+#else
-+acxusb_i_complete_tx(struct urb *urb, struct pt_regs *regs)
-+#endif
-+{
-+      acx_device_t *adev;
-+      usb_tx_t *tx;
-+      unsigned long flags;
-+      int txnum;
-+
-+      FN_ENTER;
-+
-+      BUG_ON(!urb->context);
-+
-+      tx = (usb_tx_t *)urb->context;
-+      adev = tx->adev;
-+
-+      txnum = tx - adev->usb_tx;
-+
-+      acx_lock(adev, flags);
-+
-+      /*
-+       * If the iface isn't up, we don't have any right
-+       * to play with them. The urb may get unlinked.
-+       */
-+      if (unlikely(!(adev->dev_state_mask & ACX_STATE_IFACE_UP))) {
-+              log(L_USBRXTX, "tx: device is down, not doing anything\n");
-+              goto end_unlock;
-+      }
-+
-+      log(L_USBRXTX, "RETURN TX (%d): status=%d size=%d\n",
-+                              txnum, urb->status, urb->actual_length);
-+
-+      /* handle USB transfer errors */
-+      switch (urb->status) {
-+      case 0: /* No error */
-+              break;
-+      case -ESHUTDOWN:
-+              goto end_unlock;
-+              break;
-+      case -ECONNRESET:
-+              goto end_unlock;
-+              break;
-+              /* FIXME: real error-handling code here please */
-+      default:
-+              printk(KERN_ERR "acx: tx error, urb status=%d\n", urb->status);
-+              /* FIXME: real error-handling code here please */
-+      }
-+
-+      /* free the URB and check for more data */
-+      tx->busy = 0;
-+      adev->tx_free++;
-+      if ((adev->tx_free >= TX_START_QUEUE)
-+       && (adev->status == ACX_STATUS_4_ASSOCIATED)
-+       && (acx_queue_stopped(adev->ndev))
-+      ) {
-+              log(L_BUF, "tx: wake queue (%u free txbufs)\n",
-+                              adev->tx_free);
-+              acx_wake_queue(adev->ndev, NULL);
-+      }
-+
-+end_unlock:
-+      acx_unlock(adev, flags);
-+/* end: */
-+      FN_EXIT0;
-+}
-+
-+
-+/***************************************************************
-+** acxusb_l_alloc_tx
-+** Actually returns a usb_tx_t* ptr
-+*/
-+tx_t*
-+acxusb_l_alloc_tx(acx_device_t *adev)
-+{
-+      usb_tx_t *tx;
-+      unsigned head;
-+
-+      FN_ENTER;
-+
-+      head = adev->tx_head;
-+      do {
-+              head = (head + 1) % ACX_TX_URB_CNT;
-+              if (!adev->usb_tx[head].busy) {
-+                      log(L_USBRXTX, "allocated tx %d\n", head);
-+                      tx = &adev->usb_tx[head];
-+                      tx->busy = 1;
-+                      adev->tx_free--;
-+                      /* Keep a few free descs between head and tail of tx ring.
-+                      ** It is not absolutely needed, just feels safer */
-+                      if (adev->tx_free < TX_STOP_QUEUE) {
-+                              log(L_BUF, "tx: stop queue "
-+                                      "(%u free txbufs)\n", adev->tx_free);
-+                              acx_stop_queue(adev->ndev, NULL);
-+                      }
-+                      goto end;
-+              }
-+      } while (likely(head!=adev->tx_head));
-+      tx = NULL;
-+      printk_ratelimited("acx: tx buffers full\n");
-+end:
-+      adev->tx_head = head;
-+      FN_EXIT0;
-+      return (tx_t*)tx;
-+}
-+
-+
-+/***************************************************************
-+** Used if alloc_tx()'ed buffer needs to be cancelled without doing tx
-+*/
-+void
-+acxusb_l_dealloc_tx(tx_t *tx_opaque)
-+{
-+      usb_tx_t* tx = (usb_tx_t*)tx_opaque;
-+      tx->busy = 0;
-+}
-+
-+
-+/***************************************************************
-+*/
-+void*
-+acxusb_l_get_txbuf(acx_device_t *adev, tx_t* tx_opaque)
-+{
-+      usb_tx_t* tx = (usb_tx_t*)tx_opaque;
-+      return &tx->bulkout.data;
-+}
-+
-+
-+/***************************************************************
-+** acxusb_l_tx_data
-+**
-+** Can be called from IRQ (rx -> (AP bridging or mgmt response) -> tx).
-+** Can be called from acx_i_start_xmit (data frames from net core).
-+*/
-+void
-+acxusb_l_tx_data(acx_device_t *adev, tx_t* tx_opaque, int wlanpkt_len)
-+{
-+      struct usb_device *usbdev;
-+      struct urb* txurb;
-+      usb_tx_t* tx;
-+      usb_txbuffer_t* txbuf;
-+      client_t *clt;
-+      wlan_hdr_t* whdr;
-+      unsigned int outpipe;
-+      int ucode, txnum;
-+
-+      FN_ENTER;
-+
-+      tx = ((usb_tx_t *)tx_opaque);
-+      txurb = tx->urb;
-+      txbuf = &tx->bulkout;
-+      whdr = (wlan_hdr_t *)txbuf->data;
-+      txnum = tx - adev->usb_tx;
-+
-+      log(L_DEBUG, "using buf#%d free=%d len=%d\n",
-+                      txnum, adev->tx_free, wlanpkt_len);
-+
-+      switch (adev->mode) {
-+      case ACX_MODE_0_ADHOC:
-+      case ACX_MODE_3_AP:
-+              clt = acx_l_sta_list_get(adev, whdr->a1);
-+              break;
-+      case ACX_MODE_2_STA:
-+              clt = adev->ap_client;
-+              break;
-+      default: /* ACX_MODE_OFF, ACX_MODE_MONITOR */
-+              clt = NULL;
-+              break;
-+      }
-+
-+      if (unlikely(clt && !clt->rate_cur)) {
-+              printk("acx: driver bug! bad ratemask\n");
-+              goto end;
-+      }
-+
-+      /* fill the USB transfer header */
-+      txbuf->desc = cpu_to_le16(USB_TXBUF_TXDESC);
-+      txbuf->mpdu_len = cpu_to_le16(wlanpkt_len);
-+      txbuf->queue_index = 1;
-+      if (clt) {
-+              txbuf->rate = clt->rate_100;
-+              txbuf->hostdata = (clt - adev->sta_list) | (clt->rate_cur << 16);
-+      } else {
-+              txbuf->rate = adev->rate_bcast100;
-+              txbuf->hostdata = ((u16)-1) | (adev->rate_bcast << 16);
-+      }
-+      txbuf->ctrl1 = DESC_CTL_FIRSTFRAG;
-+      if (1 == adev->preamble_cur)
-+              SET_BIT(txbuf->ctrl1, DESC_CTL_SHORT_PREAMBLE);
-+      txbuf->ctrl2 = 0;
-+      txbuf->data_len = cpu_to_le16(wlanpkt_len);
-+
-+      if (unlikely(acx_debug & L_DATA)) {
-+              printk("dump of bulk out urb:\n");
-+              acx_dump_bytes(txbuf, wlanpkt_len + USB_TXBUF_HDRSIZE);
-+      }
-+
-+      if (unlikely(txurb->status == -EINPROGRESS)) {
-+              printk("acx: trying to submit tx urb while already in progress\n");
-+      }
-+
-+      /* now schedule the USB transfer */
-+      usbdev = adev->usbdev;
-+      outpipe = usb_sndbulkpipe(usbdev, adev->bulkoutep);
-+
-+      usb_fill_bulk_urb(txurb, usbdev, outpipe,
-+              txbuf, /* dataptr */
-+              wlanpkt_len + USB_TXBUF_HDRSIZE, /* size */
-+              acxusb_i_complete_tx, /* handler */
-+              tx /* handler param */
-+      );
-+
-+      txurb->transfer_flags = URB_ASYNC_UNLINK|URB_ZERO_PACKET;
-+      ucode = usb_submit_urb(txurb, GFP_ATOMIC);
-+      log(L_USBRXTX, "SUBMIT TX (%d): outpipe=0x%X buf=%p txsize=%d "
-+              "rate=%u errcode=%d\n", txnum, outpipe, txbuf,
-+              wlanpkt_len + USB_TXBUF_HDRSIZE, txbuf->rate, ucode);
-+
-+      if (unlikely(ucode)) {
-+              printk(KERN_ERR "acx: submit_urb() error=%d txsize=%d\n",
-+                      ucode, wlanpkt_len + USB_TXBUF_HDRSIZE);
-+
-+              /* on error, just mark the frame as done and update
-+              ** the statistics
-+              */
-+              adev->stats.tx_errors++;
-+              tx->busy = 0;
-+              adev->tx_free++;
-+              /* needed? if (adev->tx_free > TX_START_QUEUE) acx_wake_queue(...) */
-+      }
-+end:
-+      FN_EXIT0;
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static void
-+acxusb_i_set_rx_mode(struct net_device *ndev)
-+{
-+}
-+
-+
-+/***********************************************************************
-+*/
-+#ifdef HAVE_TX_TIMEOUT
-+static void
-+acxusb_i_tx_timeout(struct net_device *ndev)
-+{
-+      acx_device_t *adev = ndev2adev(ndev);
-+      unsigned long flags;
-+      int i;
-+
-+      FN_ENTER;
-+
-+      acx_lock(adev, flags);
-+      /* unlink the URBs */
-+      for (i = 0; i < ACX_TX_URB_CNT; i++) {
-+              acxusb_unlink_urb(adev->usb_tx[i].urb);
-+              adev->usb_tx[i].busy = 0;
-+      }
-+      adev->tx_free = ACX_TX_URB_CNT;
-+      /* TODO: stats update */
-+      acx_unlock(adev, flags);
-+
-+      FN_EXIT0;
-+}
-+#endif
-+
-+
-+/***********************************************************************
-+** init_module()
-+**
-+** This function is invoked upon loading of the kernel module.
-+** It registers itself at the kernel's USB subsystem.
-+**
-+** Returns: Errorcode on failure, 0 on success
-+*/
-+int __init
-+acxusb_e_init_module(void)
-+{
-+      log(L_INIT, "USB module " ACX_RELEASE " initialized, "
-+              "probing for devices...\n");
-+      return usb_register(&acxusb_driver);
-+}
-+
-+
-+
-+/***********************************************************************
-+** cleanup_module()
-+**
-+** This function is invoked as last step of the module unloading. It simply
-+** deregisters this module at the kernel's USB subsystem.
-+*/
-+void __exit
-+acxusb_e_cleanup_module()
-+{
-+      usb_deregister(&acxusb_driver);
-+}
-+
-+
-+/***********************************************************************
-+** DEBUG STUFF
-+*/
-+#if ACX_DEBUG
-+
-+#ifdef UNUSED
-+static void
-+dump_device(struct usb_device *usbdev)
-+{
-+      int i;
-+      struct usb_config_descriptor *cd;
-+
-+      printk("acx device dump:\n");
-+      printk("  devnum: %d\n", usbdev->devnum);
-+      printk("  speed: %d\n", usbdev->speed);
-+      printk("  tt: 0x%X\n", (unsigned int)(usbdev->tt));
-+      printk("  ttport: %d\n", (unsigned int)(usbdev->ttport));
-+      printk("  toggle[0]: 0x%X  toggle[1]: 0x%X\n", (unsigned int)(usbdev->toggle[0]), (unsigned int)(usbdev->toggle[1]));
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11)
-+      /* This saw a change after 2.6.10 */
-+      printk("  ep_in wMaxPacketSize: ");
-+      for (i = 0; i < 16; ++i)
-+              if (usbdev->ep_in[i] != NULL)
-+                      printk("%d:%d ", i, usbdev->ep_in[i]->desc.wMaxPacketSize);
-+      printk("\n");
-+      printk("  ep_out wMaxPacketSize: ");
-+      for (i = 0; i < VEC_SIZE(usbdev->ep_out); ++i)
-+              if (usbdev->ep_out[i] != NULL)
-+                      printk("%d:%d ", i, usbdev->ep_out[i]->desc.wMaxPacketSize);
-+      printk("\n");
-+#else
-+      printk("  epmaxpacketin: ");
-+      for (i = 0; i < 16; i++)
-+              printk("%d ", usbdev->epmaxpacketin[i]);
-+      printk("\n");
-+      printk("  epmaxpacketout: ");
-+      for (i = 0; i < 16; i++)
-+              printk("%d ", usbdev->epmaxpacketout[i]);
-+      printk("\n");
-+#endif
-+      printk("  parent: 0x%X\n", (unsigned int)usbdev->parent);
-+      printk("  bus: 0x%X\n", (unsigned int)usbdev->bus);
-+#ifdef NO_DATATYPE
-+      printk("  configs: ");
-+      for (i = 0; i < usbdev->descriptor.bNumConfigurations; i++)
-+              printk("0x%X ", usbdev->config[i]);
-+      printk("\n");
-+#endif
-+      printk("  actconfig: %p\n", usbdev->actconfig);
-+      dump_device_descriptor(&usbdev->descriptor);
-+
-+      cd = &usbdev->config->desc;
-+      dump_config_descriptor(cd);
-+}
-+
-+
-+/***********************************************************************
-+*/
-+static void
-+dump_config_descriptor(struct usb_config_descriptor *cd)
-+{
-+      printk("Configuration Descriptor:\n");
-+      if (!cd) {
-+              printk("NULL\n");
-+              return;
-+      }
-+      printk("  bLength: %d (0x%X)\n", cd->bLength, cd->bLength);
-+      printk("  bDescriptorType: %d (0x%X)\n", cd->bDescriptorType, cd->bDescriptorType);
-+      printk("  bNumInterfaces: %d (0x%X)\n", cd->bNumInterfaces, cd->bNumInterfaces);
-+      printk("  bConfigurationValue: %d (0x%X)\n", cd->bConfigurationValue, cd->bConfigurationValue);
-+      printk("  iConfiguration: %d (0x%X)\n", cd->iConfiguration, cd->iConfiguration);
-+      printk("  bmAttributes: %d (0x%X)\n", cd->bmAttributes, cd->bmAttributes);
-+      /* printk("  MaxPower: %d (0x%X)\n", cd->bMaxPower, cd->bMaxPower); */
-+}
-+
-+
-+static void
-+dump_device_descriptor(struct usb_device_descriptor *dd)
-+{
-+      printk("Device Descriptor:\n");
-+      if (!dd) {
-+              printk("NULL\n");
-+              return;
-+      }
-+      printk("  bLength: %d (0x%X)\n", dd->bLength, dd->bLength);
-+      printk("  bDescriptortype: %d (0x%X)\n", dd->bDescriptorType, dd->bDescriptorType);
-+      printk("  bcdUSB: %d (0x%X)\n", dd->bcdUSB, dd->bcdUSB);
-+      printk("  bDeviceClass: %d (0x%X)\n", dd->bDeviceClass, dd->bDeviceClass);
-+      printk("  bDeviceSubClass: %d (0x%X)\n", dd->bDeviceSubClass, dd->bDeviceSubClass);
-+      printk("  bDeviceProtocol: %d (0x%X)\n", dd->bDeviceProtocol, dd->bDeviceProtocol);
-+      printk("  bMaxPacketSize0: %d (0x%X)\n", dd->bMaxPacketSize0, dd->bMaxPacketSize0);
-+      printk("  idVendor: %d (0x%X)\n", dd->idVendor, dd->idVendor);
-+      printk("  idProduct: %d (0x%X)\n", dd->idProduct, dd->idProduct);
-+      printk("  bcdDevice: %d (0x%X)\n", dd->bcdDevice, dd->bcdDevice);
-+      printk("  iManufacturer: %d (0x%X)\n", dd->iManufacturer, dd->iManufacturer);
-+      printk("  iProduct: %d (0x%X)\n", dd->iProduct, dd->iProduct);
-+      printk("  iSerialNumber: %d (0x%X)\n", dd->iSerialNumber, dd->iSerialNumber);
-+      printk("  bNumConfigurations: %d (0x%X)\n", dd->bNumConfigurations, dd->bNumConfigurations);
-+}
-+#endif /* UNUSED */
-+
-+#endif /* ACX_DEBUG */
-Index: linux-2.6.22/drivers/net/wireless/acx/wlan.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/wlan.c       2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,424 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+/***********************************************************************
-+** This code is based on elements which are
-+** Copyright (C) 1999 AbsoluteValue Systems, Inc.  All Rights Reserved.
-+** info@linux-wlan.com
-+** http://www.linux-wlan.com
-+*/
-+
-+#include <linux/version.h>
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18)
-+#include <linux/config.h>
-+#endif
-+#include <linux/types.h>
-+#include <linux/if_arp.h>
-+#include <linux/wireless.h>
-+#include <net/iw_handler.h>
-+
-+#include "acx.h"
-+
-+
-+/***********************************************************************
-+*/
-+#define LOG_BAD_EID(hdr,len,ie_ptr) acx_log_bad_eid(hdr, len, ((wlan_ie_t*)ie_ptr))
-+
-+#define IE_EID(ie_ptr) (((wlan_ie_t*)(ie_ptr))->eid)
-+#define IE_LEN(ie_ptr) (((wlan_ie_t*)(ie_ptr))->len)
-+#define OFFSET(hdr,off) (WLAN_HDR_A3_DATAP(hdr) + (off))
-+
-+
-+/***********************************************************************
-+** wlan_mgmt_decode_XXX
-+**
-+** Given a complete frame in f->hdr, sets the pointers in f to
-+** the areas that correspond to the parts of the frame.
-+**
-+** Assumptions:
-+**    1) f->len and f->hdr are already set
-+**    2) f->len is the length of the MAC header + data, the FCS
-+**       is NOT included
-+**    3) all members except len and hdr are zero
-+** Arguments:
-+**    f       frame structure
-+**
-+** Returns:
-+**    nothing
-+**
-+** Side effects:
-+**    frame structure members are pointing at their
-+**    respective portions of the frame buffer.
-+*/
-+void
-+wlan_mgmt_decode_beacon(wlan_fr_beacon_t * f)
-+{
-+      u8 *ie_ptr;
-+      u8 *end = (u8*)f->hdr + f->len;
-+
-+      f->type = WLAN_FSTYPE_BEACON;
-+
-+      /*-- Fixed Fields ----*/
-+      f->ts = (u64 *) OFFSET(f->hdr, WLAN_BEACON_OFF_TS);
-+      f->bcn_int = (u16 *) OFFSET(f->hdr, WLAN_BEACON_OFF_BCN_INT);
-+      f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_BEACON_OFF_CAPINFO);
-+
-+      /*-- Information elements */
-+      ie_ptr = OFFSET(f->hdr, WLAN_BEACON_OFF_SSID);
-+      while (ie_ptr < end) {
-+              switch (IE_EID(ie_ptr)) {
-+              case WLAN_EID_SSID:
-+                      f->ssid = (wlan_ie_ssid_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_SUPP_RATES:
-+                      f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_EXT_RATES:
-+                      f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_FH_PARMS:
-+                      f->fh_parms = (wlan_ie_fh_parms_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_DS_PARMS:
-+                      f->ds_parms = (wlan_ie_ds_parms_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_CF_PARMS:
-+                      f->cf_parms = (wlan_ie_cf_parms_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_IBSS_PARMS:
-+                      f->ibss_parms = (wlan_ie_ibss_parms_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_TIM:
-+                      f->tim = (wlan_ie_tim_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_ERP_INFO:
-+                      f->erp = (wlan_ie_erp_t *) ie_ptr;
-+                      break;
-+
-+              case WLAN_EID_COUNTRY:
-+              /* was seen: 07 06 47 42 20 01 0D 14 */
-+              case WLAN_EID_PWR_CONSTRAINT:
-+              /* was seen by Ashwin Mansinghka <ashwin_man@yahoo.com> from
-+              Atheros-based PCI card in AP mode using madwifi drivers: */
-+              /* 20 01 00 */
-+              case WLAN_EID_NONERP:
-+              /* was seen from WRT54GS with OpenWrt: 2F 01 07 */
-+              case WLAN_EID_UNKNOWN128:
-+              /* was seen by Jacek Jablonski <conexion2000@gmail.com> from Orinoco AP */
-+              /* 80 06 00 60 1D 2C 3B 00 */
-+              case WLAN_EID_UNKNOWN133:
-+              /* was seen by David Bronaugh <dbronaugh@linuxboxen.org> from ???? */
-+              /* 85 1E 00 00 84 12 07 00 FF 00 11 00 61 70 63 31 */
-+              /* 63 73 72 30 34 32 00 00 00 00 00 00 00 00 00 25 */
-+              case WLAN_EID_UNKNOWN223:
-+              /* was seen by Carlos Martin <carlosmn@gmail.com> from ???? */
-+              /* DF 20 01 1E 04 00 00 00 06 63 09 02 FF 0F 30 30 */
-+              /* 30 42 36 42 33 34 30 39 46 31 00 00 00 00 00 00 00 00 */
-+              case WLAN_EID_GENERIC:
-+              /* WPA: hostap code:
-+                      if (pos[1] >= 4 &&
-+                              pos[2] == 0x00 && pos[3] == 0x50 &&
-+                              pos[4] == 0xf2 && pos[5] == 1) {
-+                              wpa = pos;
-+                              wpa_len = pos[1] + 2;
-+                      }
-+              TI x4 mode: seen DD 04 08 00 28 00
-+              (08 00 28 is TI's OUI)
-+              last byte is probably 0/1 - disabled/enabled
-+              */
-+              case WLAN_EID_RSN:
-+              /* hostap does something with it:
-+                      rsn = pos;
-+                      rsn_len = pos[1] + 2;
-+              */
-+                      break;
-+
-+              default:
-+                      LOG_BAD_EID(f->hdr, f->len, ie_ptr);
-+                      break;
-+              }
-+              ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr);
-+      }
-+}
-+
-+
-+#ifdef UNUSED
-+void wlan_mgmt_decode_ibssatim(wlan_fr_ibssatim_t * f)
-+{
-+      f->type = WLAN_FSTYPE_ATIM;
-+      /*-- Fixed Fields ----*/
-+      /*-- Information elements */
-+}
-+#endif /* UNUSED */
-+
-+void
-+wlan_mgmt_decode_disassoc(wlan_fr_disassoc_t * f)
-+{
-+      f->type = WLAN_FSTYPE_DISASSOC;
-+
-+      /*-- Fixed Fields ----*/
-+      f->reason = (u16 *) OFFSET(f->hdr, WLAN_DISASSOC_OFF_REASON);
-+
-+      /*-- Information elements */
-+}
-+
-+
-+void
-+wlan_mgmt_decode_assocreq(wlan_fr_assocreq_t * f)
-+{
-+      u8 *ie_ptr;
-+      u8 *end = (u8*)f->hdr + f->len;
-+
-+
-+      f->type = WLAN_FSTYPE_ASSOCREQ;
-+
-+      /*-- Fixed Fields ----*/
-+      f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_ASSOCREQ_OFF_CAP_INFO);
-+      f->listen_int = (u16 *) OFFSET(f->hdr, WLAN_ASSOCREQ_OFF_LISTEN_INT);
-+
-+      /*-- Information elements */
-+      ie_ptr = OFFSET(f->hdr, WLAN_ASSOCREQ_OFF_SSID);
-+      while (ie_ptr < end) {
-+              switch (IE_EID(ie_ptr)) {
-+              case WLAN_EID_SSID:
-+                      f->ssid = (wlan_ie_ssid_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_SUPP_RATES:
-+                      f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_EXT_RATES:
-+                      f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              default:
-+                      LOG_BAD_EID(f->hdr, f->len, ie_ptr);
-+                      break;
-+              }
-+              ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr);
-+      }
-+}
-+
-+
-+void
-+wlan_mgmt_decode_assocresp(wlan_fr_assocresp_t * f)
-+{
-+      f->type = WLAN_FSTYPE_ASSOCRESP;
-+
-+      /*-- Fixed Fields ----*/
-+      f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_ASSOCRESP_OFF_CAP_INFO);
-+      f->status = (u16 *) OFFSET(f->hdr, WLAN_ASSOCRESP_OFF_STATUS);
-+      f->aid = (u16 *) OFFSET(f->hdr, WLAN_ASSOCRESP_OFF_AID);
-+
-+      /*-- Information elements */
-+      f->supp_rates = (wlan_ie_supp_rates_t *)
-+                      OFFSET(f->hdr, WLAN_ASSOCRESP_OFF_SUPP_RATES);
-+}
-+
-+
-+#ifdef UNUSED
-+void
-+wlan_mgmt_decode_reassocreq(wlan_fr_reassocreq_t * f)
-+{
-+      u8 *ie_ptr;
-+      u8 *end = (u8*)f->hdr + f->len;
-+
-+      f->type = WLAN_FSTYPE_REASSOCREQ;
-+
-+      /*-- Fixed Fields ----*/
-+      f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_REASSOCREQ_OFF_CAP_INFO);
-+      f->listen_int = (u16 *) OFFSET(f->hdr, WLAN_REASSOCREQ_OFF_LISTEN_INT);
-+      f->curr_ap = (u8 *) OFFSET(f->hdr, WLAN_REASSOCREQ_OFF_CURR_AP);
-+
-+      /*-- Information elements */
-+      ie_ptr = OFFSET(f->hdr, WLAN_REASSOCREQ_OFF_SSID);
-+      while (ie_ptr < end) {
-+              switch (IE_EID(ie_ptr)) {
-+              case WLAN_EID_SSID:
-+                      f->ssid = (wlan_ie_ssid_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_SUPP_RATES:
-+                      f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_EXT_RATES:
-+                      f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              default:
-+                      LOG_BAD_EID(f->hdr, f->len, ie_ptr);
-+                      break;
-+              }
-+              ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr);
-+      }
-+}
-+
-+
-+void
-+wlan_mgmt_decode_reassocresp(wlan_fr_reassocresp_t * f)
-+{
-+      f->type = WLAN_FSTYPE_REASSOCRESP;
-+
-+      /*-- Fixed Fields ----*/
-+      f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_REASSOCRESP_OFF_CAP_INFO);
-+      f->status = (u16 *) OFFSET(f->hdr, WLAN_REASSOCRESP_OFF_STATUS);
-+      f->aid = (u16 *) OFFSET(f->hdr, WLAN_REASSOCRESP_OFF_AID);
-+
-+      /*-- Information elements */
-+      f->supp_rates = (wlan_ie_supp_rates_t *)
-+                      OFFSET(f->hdr, WLAN_REASSOCRESP_OFF_SUPP_RATES);
-+}
-+
-+
-+void
-+wlan_mgmt_decode_probereq(wlan_fr_probereq_t * f)
-+{
-+      u8 *ie_ptr;
-+      u8 *end = (u8*)f->hdr + f->len;
-+
-+      f->type = WLAN_FSTYPE_PROBEREQ;
-+
-+      /*-- Fixed Fields ----*/
-+
-+      /*-- Information elements */
-+      ie_ptr = OFFSET(f->hdr, WLAN_PROBEREQ_OFF_SSID);
-+      while (ie_ptr < end) {
-+              switch (IE_EID(ie_ptr)) {
-+              case WLAN_EID_SSID:
-+                      f->ssid = (wlan_ie_ssid_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_SUPP_RATES:
-+                      f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_EXT_RATES:
-+                      f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              default:
-+                      LOG_BAD_EID(f->hdr, f->len, ie_ptr);
-+                      break;
-+              }
-+              ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr);
-+      }
-+}
-+#endif /* UNUSED */
-+
-+
-+/* TODO: decoding of beacon and proberesp can be merged (similar structure) */
-+void
-+wlan_mgmt_decode_proberesp(wlan_fr_proberesp_t * f)
-+{
-+      u8 *ie_ptr;
-+      u8 *end = (u8*)f->hdr + f->len;
-+
-+      f->type = WLAN_FSTYPE_PROBERESP;
-+
-+      /*-- Fixed Fields ----*/
-+      f->ts = (u64 *) OFFSET(f->hdr, WLAN_PROBERESP_OFF_TS);
-+      f->bcn_int = (u16 *) OFFSET(f->hdr, WLAN_PROBERESP_OFF_BCN_INT);
-+      f->cap_info = (u16 *) OFFSET(f->hdr, WLAN_PROBERESP_OFF_CAP_INFO);
-+
-+      /*-- Information elements */
-+      ie_ptr = OFFSET(f->hdr, WLAN_PROBERESP_OFF_SSID);
-+      while (ie_ptr < end) {
-+              switch (IE_EID(ie_ptr)) {
-+              case WLAN_EID_SSID:
-+                      f->ssid = (wlan_ie_ssid_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_SUPP_RATES:
-+                      f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_EXT_RATES:
-+                      f->ext_rates = (wlan_ie_supp_rates_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_FH_PARMS:
-+                      f->fh_parms = (wlan_ie_fh_parms_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_DS_PARMS:
-+                      f->ds_parms = (wlan_ie_ds_parms_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_CF_PARMS:
-+                      f->cf_parms = (wlan_ie_cf_parms_t *) ie_ptr;
-+                      break;
-+              case WLAN_EID_IBSS_PARMS:
-+                      f->ibss_parms = (wlan_ie_ibss_parms_t *) ie_ptr;
-+                      break;
-+#ifdef DONT_DO_IT_ADD_REAL_HANDLING_INSTEAD
-+              case WLAN_EID_COUNTRY:
-+                      break;
-+              ...
-+#endif
-+#ifdef SENT_HERE_BY_OPENWRT
-+              /* should those be trapped or handled?? */
-+              case WLAN_EID_ERP_INFO:
-+                      break;
-+              case WLAN_EID_NONERP:
-+                      break;
-+              case WLAN_EID_GENERIC:
-+                      break;
-+#endif
-+              default:
-+                      LOG_BAD_EID(f->hdr, f->len, ie_ptr);
-+                      break;
-+              }
-+
-+              ie_ptr = ie_ptr + 2 + IE_LEN(ie_ptr);
-+      }
-+}
-+
-+
-+void
-+wlan_mgmt_decode_authen(wlan_fr_authen_t * f)
-+{
-+      u8 *ie_ptr;
-+      u8 *end = (u8*)f->hdr + f->len;
-+
-+      f->type = WLAN_FSTYPE_AUTHEN;
-+
-+      /*-- Fixed Fields ----*/
-+      f->auth_alg = (u16 *) OFFSET(f->hdr, WLAN_AUTHEN_OFF_AUTH_ALG);
-+      f->auth_seq = (u16 *) OFFSET(f->hdr, WLAN_AUTHEN_OFF_AUTH_SEQ);
-+      f->status = (u16 *) OFFSET(f->hdr, WLAN_AUTHEN_OFF_STATUS);
-+
-+      /*-- Information elements */
-+      ie_ptr = OFFSET(f->hdr, WLAN_AUTHEN_OFF_CHALLENGE);
-+      if ((ie_ptr < end) && (IE_EID(ie_ptr) == WLAN_EID_CHALLENGE)) {
-+              f->challenge = (wlan_ie_challenge_t *) ie_ptr;
-+      }
-+}
-+
-+
-+void
-+wlan_mgmt_decode_deauthen(wlan_fr_deauthen_t * f)
-+{
-+      f->type = WLAN_FSTYPE_DEAUTHEN;
-+
-+      /*-- Fixed Fields ----*/
-+      f->reason = (u16 *) OFFSET(f->hdr, WLAN_DEAUTHEN_OFF_REASON);
-+
-+      /*-- Information elements */
-+}
-Index: linux-2.6.22/drivers/net/wireless/acx/wlan_compat.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/wlan_compat.h        2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,260 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+/***********************************************************************
-+** This code is based on elements which are
-+** Copyright (C) 1999 AbsoluteValue Systems, Inc.  All Rights Reserved.
-+** info@linux-wlan.com
-+** http://www.linux-wlan.com
-+*/
-+
-+/*=============================================================*/
-+/*------ Establish Platform Identity --------------------------*/
-+/*=============================================================*/
-+/* Key macros: */
-+/* WLAN_CPU_FAMILY */
-+#define WLAN_Ix86                     1
-+#define WLAN_PPC                      2
-+#define WLAN_Ix96                     3
-+#define WLAN_ARM                      4
-+#define WLAN_ALPHA                    5
-+#define WLAN_MIPS                     6
-+#define WLAN_HPPA                     7
-+#define WLAN_SPARC                    8
-+#define WLAN_SH                               9
-+#define WLAN_x86_64                   10
-+/* WLAN_CPU_CORE */
-+#define WLAN_I386CORE                 1
-+#define WLAN_PPCCORE                  2
-+#define WLAN_I296                     3
-+#define WLAN_ARMCORE                  4
-+#define WLAN_ALPHACORE                        5
-+#define WLAN_MIPSCORE                 6
-+#define WLAN_HPPACORE                 7
-+/* WLAN_CPU_PART */
-+#define WLAN_I386PART                 1
-+#define WLAN_MPC860                   2
-+#define WLAN_MPC823                   3
-+#define WLAN_I296SA                   4
-+#define WLAN_PPCPART                  5
-+#define WLAN_ARMPART                  6
-+#define WLAN_ALPHAPART                        7
-+#define WLAN_MIPSPART                 8
-+#define WLAN_HPPAPART                 9
-+/* WLAN_SYSARCH */
-+#define WLAN_PCAT                     1
-+#define WLAN_MBX                      2
-+#define WLAN_RPX                      3
-+#define WLAN_LWARCH                   4
-+#define WLAN_PMAC                     5
-+#define WLAN_SKIFF                    6
-+#define WLAN_BITSY                    7
-+#define WLAN_ALPHAARCH                        7
-+#define WLAN_MIPSARCH                 9
-+#define WLAN_HPPAARCH                 10
-+/* WLAN_HOSTIF (generally set on the command line, not detected) */
-+#define WLAN_PCMCIA                   1
-+#define WLAN_ISA                      2
-+#define WLAN_PCI                      3
-+#define WLAN_USB                      4
-+#define WLAN_PLX                      5
-+
-+/* Note: the PLX HOSTIF above refers to some vendors implementations for */
-+/*       PCI.  It's a PLX chip that is a PCI to PCMCIA adapter, but it   */
-+/*       isn't a real PCMCIA host interface adapter providing all the    */
-+/*       card&socket services.                                           */
-+
-+#ifdef __powerpc__
-+#ifndef __ppc__
-+#define __ppc__
-+#endif
-+#endif
-+
-+#if (defined(CONFIG_PPC) || defined(CONFIG_8xx))
-+#ifndef __ppc__
-+#define __ppc__
-+#endif
-+#endif
-+
-+#if defined(__x86_64__)
-+ #define WLAN_CPU_FAMILY      WLAN_x86_64
-+ #define WLAN_SYSARCH         WLAN_PCAT
-+#elif defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__)
-+ #define WLAN_CPU_FAMILY      WLAN_Ix86
-+ #define WLAN_CPU_CORE                WLAN_I386CORE
-+ #define WLAN_CPU_PART                WLAN_I386PART
-+ #define WLAN_SYSARCH         WLAN_PCAT
-+#elif defined(__ppc__)
-+ #define WLAN_CPU_FAMILY      WLAN_PPC
-+ #define WLAN_CPU_CORE                WLAN_PPCCORE
-+ #if defined(CONFIG_MBX)
-+  #define WLAN_CPU_PART               WLAN_MPC860
-+  #define WLAN_SYSARCH                WLAN_MBX
-+ #elif defined(CONFIG_RPXLITE)
-+  #define WLAN_CPU_PART               WLAN_MPC823
-+  #define WLAN_SYSARCH                WLAN_RPX
-+ #elif defined(CONFIG_RPXCLASSIC)
-+  #define WLAN_CPU_PART               WLAN_MPC860
-+  #define WLAN_SYSARCH                WLAN_RPX
-+ #else
-+  #define WLAN_CPU_PART               WLAN_PPCPART
-+  #define WLAN_SYSARCH                WLAN_PMAC
-+ #endif
-+#elif defined(__arm__)
-+ #define WLAN_CPU_FAMILY      WLAN_ARM
-+ #define WLAN_CPU_CORE                WLAN_ARMCORE
-+ #define WLAN_CPU_PART                WLAN_ARM_PART
-+ #define WLAN_SYSARCH         WLAN_SKIFF
-+#elif defined(__alpha__)
-+ #define WLAN_CPU_FAMILY      WLAN_ALPHA
-+ #define WLAN_CPU_CORE                WLAN_ALPHACORE
-+ #define WLAN_CPU_PART                WLAN_ALPHAPART
-+ #define WLAN_SYSARCH         WLAN_ALPHAARCH
-+#elif defined(__mips__)
-+ #define WLAN_CPU_FAMILY      WLAN_MIPS
-+ #define WLAN_CPU_CORE                WLAN_MIPSCORE
-+ #define WLAN_CPU_PART                WLAN_MIPSPART
-+ #define WLAN_SYSARCH         WLAN_MIPSARCH
-+#elif defined(__hppa__)
-+ #define WLAN_CPU_FAMILY      WLAN_HPPA
-+ #define WLAN_CPU_CORE                WLAN_HPPACORE
-+ #define WLAN_CPU_PART                WLAN_HPPAPART
-+ #define WLAN_SYSARCH         WLAN_HPPAARCH
-+#elif defined(__sparc__)
-+ #define WLAN_CPU_FAMILY      WLAN_SPARC
-+ #define WLAN_SYSARCH         WLAN_SPARC
-+#elif defined(__sh__)
-+ #define WLAN_CPU_FAMILY      WLAN_SH
-+ #define WLAN_SYSARCH         WLAN_SHARCH
-+ #ifndef __LITTLE_ENDIAN__
-+  #define __LITTLE_ENDIAN__
-+ #endif
-+#else
-+ #error "No CPU identified!"
-+#endif
-+
-+/*
-+   Some big endian machines implicitly do all I/O in little endian mode.
-+
-+   In particular:
-+        Linux/PPC on PowerMacs (PCI)
-+        Arm/Intel Xscale (PCI)
-+
-+   This may also affect PLX boards and other BE &| PPC platforms;
-+   as new ones are discovered, add them below.
-+*/
-+
-+#if ((WLAN_SYSARCH == WLAN_SKIFF) || (WLAN_SYSARCH == WLAN_PMAC))
-+#define REVERSE_ENDIAN
-+#endif
-+
-+/*=============================================================*/
-+/*------ Hardware Portability Macros --------------------------*/
-+/*=============================================================*/
-+#if (WLAN_CPU_FAMILY == WLAN_PPC)
-+#define wlan_inw(a)                     in_be16((unsigned short *)((a)+_IO_BASE))
-+#define wlan_inw_le16_to_cpu(a)         inw((a))
-+#define wlan_outw(v,a)                  out_be16((unsigned short *)((a)+_IO_BASE), (v))
-+#define wlan_outw_cpu_to_le16(v,a)      outw((v),(a))
-+#else
-+#define wlan_inw(a)                     inw((a))
-+#define wlan_inw_le16_to_cpu(a)         __cpu_to_le16(inw((a)))
-+#define wlan_outw(v,a)                  outw((v),(a))
-+#define wlan_outw_cpu_to_le16(v,a)      outw(__cpu_to_le16((v)),(a))
-+#endif
-+
-+/*=============================================================*/
-+/*------ Bit settings -----------------------------------------*/
-+/*=============================================================*/
-+#define ieee2host16(n)        __le16_to_cpu(n)
-+#define ieee2host32(n)        __le32_to_cpu(n)
-+#define host2ieee16(n)        __cpu_to_le16(n)
-+#define host2ieee32(n)        __cpu_to_le32(n)
-+
-+/* for constants */
-+#ifdef __LITTLE_ENDIAN
-+ #define IEEE16(a,n)     a = n, a##i = n,
-+#else
-+ #ifdef __BIG_ENDIAN
-+  /* shifts would produce gcc warnings. Oh well... */
-+  #define IEEE16(a,n)     a = n, a##i = ((n&0xff)*256 + ((n&0xff00)/256)),
-+ #else
-+  #error give me endianness or give me death
-+ #endif
-+#endif
-+
-+/*=============================================================*/
-+/*------ Compiler Portability Macros --------------------------*/
-+/*=============================================================*/
-+#define WLAN_PACKED   __attribute__ ((packed))
-+
-+/* Interrupt handler backwards compatibility stuff */
-+#ifndef IRQ_NONE
-+#define IRQ_NONE
-+#define IRQ_HANDLED
-+typedef void irqreturn_t;
-+#endif
-+
-+#ifndef ARPHRD_IEEE80211_PRISM
-+#define ARPHRD_IEEE80211_PRISM 802
-+#endif
-+
-+#define ETH_P_80211_RAW               (ETH_P_ECONET + 1)
-+
-+/*============================================================================*
-+ * Constants                                                                  *
-+ *============================================================================*/
-+#define WLAN_IEEE_OUI_LEN     3
-+
-+/*============================================================================*
-+ * Types                                                                      *
-+ *============================================================================*/
-+
-+/* local ether header type */
-+typedef struct wlan_ethhdr {
-+      u8      daddr[ETH_ALEN];
-+      u8      saddr[ETH_ALEN];
-+      u16     type;
-+} WLAN_PACKED wlan_ethhdr_t;
-+
-+/* local llc header type */
-+typedef struct wlan_llc {
-+      u8      dsap;
-+      u8      ssap;
-+      u8      ctl;
-+} WLAN_PACKED wlan_llc_t;
-+
-+/* local snap header type */
-+typedef struct wlan_snap {
-+      u8      oui[WLAN_IEEE_OUI_LEN];
-+      u16     type;
-+} WLAN_PACKED wlan_snap_t;
-Index: linux-2.6.22/drivers/net/wireless/acx/wlan_hdr.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/wlan_hdr.h   2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,497 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+/***********************************************************************
-+** This code is based on elements which are
-+** Copyright (C) 1999 AbsoluteValue Systems, Inc.  All Rights Reserved.
-+** info@linux-wlan.com
-+** http://www.linux-wlan.com
-+*/
-+
-+/* mini-doc
-+
-+Here are all 11b/11g/11a rates and modulations:
-+
-+     11b 11g 11a
-+     --- --- ---
-+ 1  |B  |B  |
-+ 2  |Q  |Q  |
-+ 5.5|Cp |C p|
-+ 6  |   |Od |O
-+ 9  |   |od |o
-+11  |Cp |C p|
-+12  |   |Od |O
-+18  |   |od |o
-+22  |   |  p|
-+24  |   |Od |O
-+33  |   |  p|
-+36  |   |od |o
-+48  |   |od |o
-+54  |   |od |o
-+
-+Mandatory:
-+ B - DBPSK (Differential Binary Phase Shift Keying)
-+ Q - DQPSK (Differential Quaternary Phase Shift Keying)
-+ C - CCK (Complementary Code Keying, a form of DSSS
-+              (Direct Sequence Spread Spectrum) modulation)
-+ O - OFDM (Orthogonal Frequency Division Multiplexing)
-+Optional:
-+ o - OFDM
-+ d - CCK-OFDM (also known as DSSS-OFDM)
-+ p - PBCC (Packet Binary Convolutional Coding)
-+
-+The term CCK-OFDM may be used interchangeably with DSSS-OFDM
-+(the IEEE 802.11g-2003 standard uses the latter terminology).
-+In the CCK-OFDM, the PLCP header of the frame uses the CCK form of DSSS,
-+while the PLCP payload (the MAC frame) is modulated using OFDM.
-+
-+Basically, you must use CCK-OFDM if you have mixed 11b/11g environment,
-+or else (pure OFDM) 11b equipment may not realize that AP
-+is sending a packet and start sending its own one.
-+Sadly, looks like acx111 does not support CCK-OFDM, only pure OFDM.
-+
-+Re PBCC: avoid using it. It makes sense only if you have
-+TI "11b+" hardware. You _must_ use PBCC in order to reach 22Mbps on it.
-+
-+Preambles:
-+
-+Long preamble (at 1Mbit rate, takes 144 us):
-+    16 bytes  ones
-+     2 bytes  0xF3A0 (lsb sent first)
-+PLCP header follows (at 1Mbit also):
-+     1 byte   Signal: speed, in 0.1Mbit units, except for:
-+              33Mbit: 33 (instead of 330 - doesn't fit in octet)
-+              all CCK-OFDM rates: 30
-+     1 byte   Service
-+      0,1,4:  reserved
-+      2:      1=locked clock
-+      3:      1=PBCC
-+      5:      Length Extension (PBCC 22,33Mbit (11g only))  <-
-+      6:      Length Extension (PBCC 22,33Mbit (11g only))  <- BLACK MAGIC HERE
-+      7:      Length Extension                              <-
-+     2 bytes  Length (time needed to tx this frame)
-+              a) 5.5 Mbit/s CCK
-+                 Length = octets*8/5.5, rounded up to integer
-+              b) 11 Mbit/s CCK
-+                 Length = octets*8/11, rounded up to integer
-+                 Service bit 7:
-+                      0 = rounding took less than 8/11
-+                      1 = rounding took more than or equal to 8/11
-+              c) 5.5 Mbit/s PBCC
-+                 Length = (octets+1)*8/5.5, rounded up to integer
-+              d) 11 Mbit/s PBCC
-+                 Length = (octets+1)*8/11, rounded up to integer
-+                 Service bit 7:
-+                      0 = rounding took less than 8/11
-+                      1 = rounding took more than or equal to 8/11
-+              e) 22 Mbit/s PBCC
-+                 Length = (octets+1)*8/22, rounded up to integer
-+                 Service bits 6,7:
-+                      00 = rounding took less than 8/22ths
-+                      01 = rounding took 8/22...15/22ths
-+                      10 = rounding took 16/22ths or more.
-+              f) 33 Mbit/s PBCC
-+                 Length = (octets+1)*8/33, rounded up to integer
-+                 Service bits 5,6,7:
-+                      000 rounding took less than 8/33
-+                      001 rounding took 8/33...15/33
-+                      010 rounding took 16/33...23/33
-+                      011 rounding took 24/33...31/33
-+                      100 rounding took 32/33 or more
-+     2 bytes  CRC
-+
-+PSDU follows (up to 2346 bytes at selected rate)
-+
-+While Signal value alone is not enough to determine rate and modulation,
-+Signal+Service is always sufficient.
-+
-+Short preamble (at 1Mbit rate, takes 72 us):
-+     7 bytes  zeroes
-+     2 bytes  0x05CF (lsb sent first)
-+PLCP header follows *at 2Mbit/s*. Format is the same as in long preamble.
-+PSDU follows (up to 2346 bytes at selected rate)
-+
-+OFDM preamble is completely different, uses OFDM
-+modulation from the start and thus easily identifiable.
-+Not shown here.
-+*/
-+
-+
-+/***********************************************************************
-+** Constants
-+*/
-+
-+#define WLAN_HDR_A3_LEN                       24
-+#define WLAN_HDR_A4_LEN                       30
-+/* IV structure:
-+** 3 bytes: Initialization Vector (24 bits)
-+** 1 byte: 0..5: padding, must be 0; 6..7: key selector (0-3)
-+*/
-+#define WLAN_WEP_IV_LEN                       4
-+/* 802.11 says 2312 but looks like 2312 is a max size of _WEPed data_ */
-+#define WLAN_DATA_MAXLEN              2304
-+#define WLAN_WEP_ICV_LEN              4
-+#define WLAN_FCS_LEN                  4
-+#define WLAN_A3FR_MAXLEN              (WLAN_HDR_A3_LEN + WLAN_DATA_MAXLEN)
-+#define WLAN_A4FR_MAXLEN              (WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN)
-+#define WLAN_A3FR_MAXLEN_FCS          (WLAN_HDR_A3_LEN + WLAN_DATA_MAXLEN + 4)
-+#define WLAN_A4FR_MAXLEN_FCS          (WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN + 4)
-+#define WLAN_A3FR_MAXLEN_WEP          (WLAN_A3FR_MAXLEN + 8)
-+#define WLAN_A4FR_MAXLEN_WEP          (WLAN_A4FR_MAXLEN + 8)
-+#define WLAN_A3FR_MAXLEN_WEP_FCS      (WLAN_A3FR_MAXLEN_FCS + 8)
-+#define WLAN_A4FR_MAXLEN_WEP_FCS      (WLAN_A4FR_MAXLEN_FCS + 8)
-+
-+#define WLAN_BSS_TS_LEN                       8
-+#define WLAN_SSID_MAXLEN              32
-+#define WLAN_BEACON_FR_MAXLEN         (WLAN_HDR_A3_LEN + 334)
-+#define WLAN_ATIM_FR_MAXLEN           (WLAN_HDR_A3_LEN + 0)
-+#define WLAN_DISASSOC_FR_MAXLEN               (WLAN_HDR_A3_LEN + 2)
-+#define WLAN_ASSOCREQ_FR_MAXLEN               (WLAN_HDR_A3_LEN + 48)
-+#define WLAN_ASSOCRESP_FR_MAXLEN      (WLAN_HDR_A3_LEN + 16)
-+#define WLAN_REASSOCREQ_FR_MAXLEN     (WLAN_HDR_A3_LEN + 54)
-+#define WLAN_REASSOCRESP_FR_MAXLEN    (WLAN_HDR_A3_LEN + 16)
-+#define WLAN_PROBEREQ_FR_MAXLEN               (WLAN_HDR_A3_LEN + 44)
-+#define WLAN_PROBERESP_FR_MAXLEN      (WLAN_HDR_A3_LEN + 78)
-+#define WLAN_AUTHEN_FR_MAXLEN         (WLAN_HDR_A3_LEN + 261)
-+#define WLAN_DEAUTHEN_FR_MAXLEN               (WLAN_HDR_A3_LEN + 2)
-+#define WLAN_CHALLENGE_IE_LEN         130
-+#define WLAN_CHALLENGE_LEN            128
-+#define WLAN_WEP_MAXKEYLEN            13
-+#define WLAN_WEP_NKEYS                        4
-+
-+/*--- Frame Control Field -------------------------------------*/
-+/* Frame Types */
-+#define WLAN_FTYPE_MGMT                       0x00
-+#define WLAN_FTYPE_CTL                        0x01
-+#define WLAN_FTYPE_DATA                       0x02
-+
-+/* Frame subtypes */
-+/* Management */
-+#define WLAN_FSTYPE_ASSOCREQ          0x00
-+#define WLAN_FSTYPE_ASSOCRESP         0x01
-+#define WLAN_FSTYPE_REASSOCREQ                0x02
-+#define WLAN_FSTYPE_REASSOCRESP               0x03
-+#define WLAN_FSTYPE_PROBEREQ          0x04
-+#define WLAN_FSTYPE_PROBERESP         0x05
-+#define WLAN_FSTYPE_BEACON            0x08
-+#define WLAN_FSTYPE_ATIM              0x09
-+#define WLAN_FSTYPE_DISASSOC          0x0a
-+#define WLAN_FSTYPE_AUTHEN            0x0b
-+#define WLAN_FSTYPE_DEAUTHEN          0x0c
-+
-+/* Control */
-+#define WLAN_FSTYPE_PSPOLL            0x0a
-+#define WLAN_FSTYPE_RTS                       0x0b
-+#define WLAN_FSTYPE_CTS                       0x0c
-+#define WLAN_FSTYPE_ACK                       0x0d
-+#define WLAN_FSTYPE_CFEND             0x0e
-+#define WLAN_FSTYPE_CFENDCFACK                0x0f
-+
-+/* Data */
-+#define WLAN_FSTYPE_DATAONLY          0x00
-+#define WLAN_FSTYPE_DATA_CFACK                0x01
-+#define WLAN_FSTYPE_DATA_CFPOLL               0x02
-+#define WLAN_FSTYPE_DATA_CFACK_CFPOLL 0x03
-+#define WLAN_FSTYPE_NULL              0x04
-+#define WLAN_FSTYPE_CFACK             0x05
-+#define WLAN_FSTYPE_CFPOLL            0x06
-+#define WLAN_FSTYPE_CFACK_CFPOLL      0x07
-+
-+/*--- FC Constants v. 2.0 ------------------------------------*/
-+/* Each constant is defined twice: WF_CONST is in host        */
-+/* byteorder, WF_CONSTi is in ieee byteorder.                 */
-+/* Usage:                                                     */
-+/* printf("the frame subtype is %X", WF_FC_FTYPEi & rx.fc);   */
-+/* tx.fc = WF_FTYPE_CTLi | WF_FSTYPE_RTSi;                    */
-+/*------------------------------------------------------------*/
-+
-+enum {
-+/*--- Frame Control Field -------------------------------------*/
-+/* Protocol version: always 0 for current 802.11 standards */
-+IEEE16(WF_FC_PVER,                    0x0003)
-+IEEE16(WF_FC_FTYPE,                   0x000c)
-+IEEE16(WF_FC_FSTYPE,                  0x00f0)
-+IEEE16(WF_FC_TODS,                    0x0100)
-+IEEE16(WF_FC_FROMDS,                  0x0200)
-+IEEE16(WF_FC_FROMTODS,                        0x0300)
-+IEEE16(WF_FC_MOREFRAG,                        0x0400)
-+IEEE16(WF_FC_RETRY,                   0x0800)
-+/* Indicates PS mode in which STA will be after successful completion
-+** of current frame exchange sequence. Always 0 for AP frames */
-+IEEE16(WF_FC_PWRMGT,                  0x1000)
-+/* What MoreData=1 means:
-+** From AP to STA in PS mode: don't sleep yet, I have more frames for you
-+** From Contention-Free (CF) Pollable STA in response to a CF-Poll:
-+**   STA has buffered frames for transmission in response to next CF-Poll
-+** Bcast/mcast frames transmitted from AP:
-+**   when additional bcast/mcast frames remain to be transmitted by AP
-+**   during this beacon interval
-+** In all other cases MoreData=0 */
-+IEEE16(WF_FC_MOREDATA,                        0x2000)
-+IEEE16(WF_FC_ISWEP,                   0x4000)
-+IEEE16(WF_FC_ORDER,                   0x8000)
-+
-+/* Frame Types */
-+IEEE16(WF_FTYPE_MGMT,                 0x00)
-+IEEE16(WF_FTYPE_CTL,                  0x04)
-+IEEE16(WF_FTYPE_DATA,                 0x08)
-+
-+/* Frame subtypes */
-+/* Management */
-+IEEE16(WF_FSTYPE_ASSOCREQ,            0x00)
-+IEEE16(WF_FSTYPE_ASSOCRESP,           0x10)
-+IEEE16(WF_FSTYPE_REASSOCREQ,          0x20)
-+IEEE16(WF_FSTYPE_REASSOCRESP,         0x30)
-+IEEE16(WF_FSTYPE_PROBEREQ,            0x40)
-+IEEE16(WF_FSTYPE_PROBERESP,           0x50)
-+IEEE16(WF_FSTYPE_BEACON,              0x80)
-+IEEE16(WF_FSTYPE_ATIM,                        0x90)
-+IEEE16(WF_FSTYPE_DISASSOC,            0xa0)
-+IEEE16(WF_FSTYPE_AUTHEN,              0xb0)
-+IEEE16(WF_FSTYPE_DEAUTHEN,            0xc0)
-+
-+/* Control */
-+IEEE16(WF_FSTYPE_PSPOLL,              0xa0)
-+IEEE16(WF_FSTYPE_RTS,                 0xb0)
-+IEEE16(WF_FSTYPE_CTS,                 0xc0)
-+IEEE16(WF_FSTYPE_ACK,                 0xd0)
-+IEEE16(WF_FSTYPE_CFEND,                       0xe0)
-+IEEE16(WF_FSTYPE_CFENDCFACK,          0xf0)
-+
-+/* Data */
-+IEEE16(WF_FSTYPE_DATAONLY,            0x00)
-+IEEE16(WF_FSTYPE_DATA_CFACK,          0x10)
-+IEEE16(WF_FSTYPE_DATA_CFPOLL,         0x20)
-+IEEE16(WF_FSTYPE_DATA_CFACK_CFPOLL,   0x30)
-+IEEE16(WF_FSTYPE_NULL,                        0x40)
-+IEEE16(WF_FSTYPE_CFACK,                       0x50)
-+IEEE16(WF_FSTYPE_CFPOLL,              0x60)
-+IEEE16(WF_FSTYPE_CFACK_CFPOLL,                0x70)
-+};
-+
-+
-+/***********************************************************************
-+** Macros
-+*/
-+
-+/*--- Duration Macros ----------------------------------------*/
-+/* Macros to get/set the bitfields of the Duration Field      */
-+/*  - the duration value is only valid when bit15 is zero     */
-+/*  - the firmware handles these values, so I'm not going     */
-+/*    to use these macros right now.                          */
-+/*------------------------------------------------------------*/
-+
-+/*--- Sequence Control  Macros -------------------------------*/
-+/* Macros to get/set the bitfields of the Sequence Control    */
-+/* Field.                                                     */
-+/*------------------------------------------------------------*/
-+#define WLAN_GET_SEQ_FRGNUM(n) ((u16)(n) & 0x000f)
-+#define WLAN_GET_SEQ_SEQNUM(n) (((u16)(n) & 0xfff0) >> 4)
-+
-+/*--- Data ptr macro -----------------------------------------*/
-+/* Creates a u8* to the data portion of a frame               */
-+/* Assumes you're passing in a ptr to the beginning of the hdr*/
-+/*------------------------------------------------------------*/
-+#define WLAN_HDR_A3_DATAP(p) (((u8*)(p)) + WLAN_HDR_A3_LEN)
-+#define WLAN_HDR_A4_DATAP(p) (((u8*)(p)) + WLAN_HDR_A4_LEN)
-+
-+
-+/***********************************************************************
-+** Types
-+*/
-+
-+/* 802.11 header type
-+**
-+** Note the following:
-+** a1 *always* is receiver's mac or bcast/mcast
-+** a2 *always* is transmitter's mac, if a2 exists
-+** seq: [0:3] frag#, [4:15] seq# - used for dup detection
-+** (dups from retries have same seq#) */
-+typedef struct wlan_hdr {
-+      u16     fc;
-+      u16     dur;
-+      u8      a1[ETH_ALEN];
-+      u8      a2[ETH_ALEN];
-+      u8      a3[ETH_ALEN];
-+      u16     seq;
-+      u8      a4[ETH_ALEN];
-+} WLAN_PACKED wlan_hdr_t;
-+
-+/* Separate structs for use if frame type is known */
-+typedef struct wlan_hdr_a3 {
-+      u16     fc;
-+      u16     dur;
-+      u8      a1[ETH_ALEN];
-+      u8      a2[ETH_ALEN];
-+      u8      a3[ETH_ALEN];
-+      u16     seq;
-+} WLAN_PACKED wlan_hdr_a3_t;
-+
-+typedef struct wlan_hdr_mgmt {
-+      u16     fc;
-+      u16     dur;
-+      u8      da[ETH_ALEN];
-+      u8      sa[ETH_ALEN];
-+      u8      bssid[ETH_ALEN];
-+      u16     seq;
-+} WLAN_PACKED wlan_hdr_mgmt_t;
-+
-+#ifdef NOT_NEEDED_YET
-+typedef struct { /* ad-hoc peer->peer (to/from DS = 0/0) */
-+      u16     fc;
-+      u16     dur;
-+      u8      da[ETH_ALEN];
-+      u8      sa[ETH_ALEN];
-+      u8      bssid[ETH_ALEN];
-+      u16     seq;
-+} WLAN_PACKED ibss;
-+typedef struct { /* ap->sta (to/from DS = 0/1) */
-+      u16     fc;
-+      u16     dur;
-+      u8      da[ETH_ALEN];
-+      u8      bssid[ETH_ALEN];
-+      u8      sa[ETH_ALEN];
-+      u16     seq;
-+} WLAN_PACKED fromap;
-+typedef struct { /* sta->ap (to/from DS = 1/0) */
-+      u16     fc;
-+      u16     dur;
-+      u8      bssid[ETH_ALEN];
-+      u8      sa[ETH_ALEN];
-+      u8      da[ETH_ALEN];
-+      u16     seq;
-+} WLAN_PACKED toap;
-+typedef struct { /* wds->wds (to/from DS = 1/1), the only 4addr pkt */
-+      u16     fc;
-+      u16     dur;
-+      u8      ra[ETH_ALEN];
-+      u8      ta[ETH_ALEN];
-+      u8      da[ETH_ALEN];
-+      u16     seq;
-+      u8      sa[ETH_ALEN];
-+} WLAN_PACKED wds;
-+typedef struct { /* all management packets */
-+      u16     fc;
-+      u16     dur;
-+      u8      da[ETH_ALEN];
-+      u8      sa[ETH_ALEN];
-+      u8      bssid[ETH_ALEN];
-+      u16     seq;
-+} WLAN_PACKED mgmt;
-+typedef struct { /* has no body, just a FCS */
-+      u16     fc;
-+      u16     dur;
-+      u8      ra[ETH_ALEN];
-+      u8      ta[ETH_ALEN];
-+} WLAN_PACKED rts;
-+typedef struct { /* has no body, just a FCS */
-+      u16     fc;
-+      u16     dur;
-+      u8      ra[ETH_ALEN];
-+} WLAN_PACKED cts;
-+typedef struct { /* has no body, just a FCS */
-+      u16     fc;
-+      u16     dur;
-+      u8      ra[ETH_ALEN];
-+} WLAN_PACKED ack;
-+typedef struct { /* has no body, just a FCS */
-+      u16     fc;
-+      /* NB: this one holds Assoc ID in dur field: */
-+      u16     aid;
-+      u8      bssid[ETH_ALEN];
-+      u8      ta[ETH_ALEN];
-+} WLAN_PACKED pspoll;
-+typedef struct { /* has no body, just a FCS */
-+      u16     fc;
-+      u16     dur;
-+      u8      ra[ETH_ALEN];
-+      u8      bssid[ETH_ALEN];
-+} WLAN_PACKED cfend;
-+typedef struct { /* has no body, just a FCS */
-+      u16     fc;
-+      u16     dur;
-+      u8      ra[ETH_ALEN];
-+      u8      bssid[ETH_ALEN];
-+} WLAN_PACKED cfendcfack;
-+#endif
-+
-+/* Prism header emulation (monitor mode) */
-+typedef struct wlanitem_u32 {
-+      u32     did;
-+      u16     status;
-+      u16     len;
-+      u32     data;
-+} WLAN_PACKED wlanitem_u32_t;
-+#define WLANITEM_STATUS_data_ok                       0
-+#define WLANITEM_STATUS_no_value              1
-+#define WLANITEM_STATUS_invalid_itemname      2
-+#define WLANITEM_STATUS_invalid_itemdata      3
-+#define WLANITEM_STATUS_missing_itemdata      4
-+#define WLANITEM_STATUS_incomplete_itemdata   5
-+#define WLANITEM_STATUS_invalid_msg_did               6
-+#define WLANITEM_STATUS_invalid_mib_did               7
-+#define WLANITEM_STATUS_missing_conv_func     8
-+#define WLANITEM_STATUS_string_too_long               9
-+#define WLANITEM_STATUS_data_out_of_range     10
-+#define WLANITEM_STATUS_string_too_short      11
-+#define WLANITEM_STATUS_missing_valid_func    12
-+#define WLANITEM_STATUS_unknown                       13
-+#define WLANITEM_STATUS_invalid_did           14
-+#define WLANITEM_STATUS_missing_print_func    15
-+
-+#define WLAN_DEVNAMELEN_MAX   16
-+typedef struct wlansniffrm {
-+      u32             msgcode;
-+      u32             msglen;
-+      u8              devname[WLAN_DEVNAMELEN_MAX];
-+      wlanitem_u32_t  hosttime;
-+      wlanitem_u32_t  mactime;
-+      wlanitem_u32_t  channel;
-+      wlanitem_u32_t  rssi;
-+      wlanitem_u32_t  sq;
-+      wlanitem_u32_t  signal;
-+      wlanitem_u32_t  noise;
-+      wlanitem_u32_t  rate;
-+      wlanitem_u32_t  istx;   /* tx? 0:no 1:yes */
-+      wlanitem_u32_t  frmlen;
-+} WLAN_PACKED wlansniffrm_t;
-+#define WLANSNIFFFRM          0x0041
-+#define WLANSNIFFFRM_hosttime 0x1041
-+#define WLANSNIFFFRM_mactime  0x2041
-+#define WLANSNIFFFRM_channel  0x3041
-+#define WLANSNIFFFRM_rssi     0x4041
-+#define WLANSNIFFFRM_sq               0x5041
-+#define WLANSNIFFFRM_signal   0x6041
-+#define WLANSNIFFFRM_noise    0x7041
-+#define WLANSNIFFFRM_rate     0x8041
-+#define WLANSNIFFFRM_istx     0x9041
-+#define WLANSNIFFFRM_frmlen   0xA041
-Index: linux-2.6.22/drivers/net/wireless/acx/wlan_mgmt.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/net/wireless/acx/wlan_mgmt.h  2007-08-23 18:34:19.000000000 +0200
-@@ -0,0 +1,582 @@
-+/***********************************************************************
-+** Copyright (C) 2003  ACX100 Open Source Project
-+**
-+** The contents of this file are subject to the Mozilla Public
-+** License Version 1.1 (the "License"); you may not use this file
-+** except in compliance with the License. You may obtain a copy of
-+** the License at http://www.mozilla.org/MPL/
-+**
-+** 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.
-+**
-+** Alternatively, the contents of this file may be used under the
-+** terms of the GNU Public License version 2 (the "GPL"), in which
-+** case the provisions of the GPL are applicable instead of the
-+** above.  If you wish to allow the use of your version of this file
-+** only under the terms of the GPL and not to allow others to use
-+** your version of this file under the MPL, indicate your decision
-+** by deleting the provisions above and replace them with the notice
-+** and other provisions required by the GPL.  If you do not delete
-+** the provisions above, a recipient may use your version of this
-+** file under either the MPL or the GPL.
-+** ---------------------------------------------------------------------
-+** Inquiries regarding the ACX100 Open Source Project can be
-+** made directly to:
-+**
-+** acx100-users@lists.sf.net
-+** http://acx100.sf.net
-+** ---------------------------------------------------------------------
-+*/
-+
-+/***********************************************************************
-+** This code is based on elements which are
-+** Copyright (C) 1999 AbsoluteValue Systems, Inc.  All Rights Reserved.
-+** info@linux-wlan.com
-+** http://www.linux-wlan.com
-+*/
-+
-+/***********************************************************************
-+** Constants
-+*/
-+
-+/*-- Information Element IDs --------------------*/
-+#define WLAN_EID_SSID         0
-+#define WLAN_EID_SUPP_RATES   1
-+#define WLAN_EID_FH_PARMS     2
-+#define WLAN_EID_DS_PARMS     3
-+#define WLAN_EID_CF_PARMS     4
-+#define WLAN_EID_TIM          5
-+#define WLAN_EID_IBSS_PARMS   6
-+#define WLAN_EID_COUNTRY      7 /* 802.11d */
-+#define WLAN_EID_FH_HOP_PARMS 8 /* 802.11d */
-+#define WLAN_EID_FH_TABLE     9 /* 802.11d */
-+#define WLAN_EID_REQUEST      10 /* 802.11d */
-+/*-- values 11-15 reserved --*/
-+#define WLAN_EID_CHALLENGE    16
-+/*-- values 17-31 reserved for challenge text extension --*/
-+#define WLAN_EID_PWR_CONSTRAINT       32      /* 11h PowerConstraint */
-+#define WLAN_EID_ERP_INFO     42      /* was seen from WRT54GS with OpenWrt */
-+#define WLAN_EID_NONERP               47      /* was seen from WRT54GS with OpenWrt */
-+#define WLAN_EID_RSN          48
-+#define WLAN_EID_EXT_RATES    50
-+#define WLAN_EID_UNKNOWN128   128
-+#define WLAN_EID_UNKNOWN133   133
-+#define WLAN_EID_GENERIC      221     /* was seen from WRT54GS with OpenWrt */
-+#define WLAN_EID_UNKNOWN223   223
-+
-+#if 0
-+#define WLAN_EID_PWR_CAP              33      /* 11h PowerCapability */
-+#define WLAN_EID_TPC_REQUEST          34      /* 11h TPC Request */
-+#define WLAN_EID_TPC_REPORT           35      /* 11h TPC Report */
-+#define WLAN_EID_SUPP_CHANNELS                36      /* 11h Supported Channels */
-+#define WLAN_EID_CHANNEL_SWITCH               37      /* 11h ChannelSwitch */
-+#define WLAN_EID_MEASURE_REQUEST      38      /* 11h MeasurementRequest */
-+#define WLAN_EID_MEASURE_REPORT               39      /* 11h MeasurementReport */
-+#define WLAN_EID_QUIET_ID             40      /* 11h Quiet */
-+#define WLAN_EID_IBSS_DFS_ID          41      /* 11h IBSS_DFS */
-+#endif
-+
-+/*-- Reason Codes -------------------------------*/
-+#define WLAN_MGMT_REASON_RSVD                 0
-+#define WLAN_MGMT_REASON_UNSPEC                       1
-+#define WLAN_MGMT_REASON_PRIOR_AUTH_INVALID   2
-+#define WLAN_MGMT_REASON_DEAUTH_LEAVING               3
-+#define WLAN_MGMT_REASON_DISASSOC_INACTIVE    4
-+#define WLAN_MGMT_REASON_DISASSOC_AP_BUSY     5
-+#define WLAN_MGMT_REASON_CLASS2_NONAUTH               6
-+#define WLAN_MGMT_REASON_CLASS3_NONASSOC      7
-+#define WLAN_MGMT_REASON_DISASSOC_STA_HASLEFT 8
-+#define WLAN_MGMT_REASON_CANT_ASSOC_NONAUTH   9
-+
-+/*-- Status Codes -------------------------------*/
-+#define WLAN_MGMT_STATUS_SUCCESS              0
-+#define WLAN_MGMT_STATUS_UNSPEC_FAILURE               1
-+#define WLAN_MGMT_STATUS_CAPS_UNSUPPORTED     10
-+#define WLAN_MGMT_STATUS_REASSOC_NO_ASSOC     11
-+#define WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC  12
-+#define WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG  13
-+#define WLAN_MGMT_STATUS_RX_AUTH_NOSEQ                14
-+#define WLAN_MGMT_STATUS_CHALLENGE_FAIL               15
-+#define WLAN_MGMT_STATUS_AUTH_TIMEOUT         16
-+#define WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY    17
-+#define WLAN_MGMT_STATUS_ASSOC_DENIED_RATES   18
-+/* p80211b additions */
-+#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOSHORT 19
-+#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOPBCC  20
-+#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOAGILITY       21
-+
-+/*-- Auth Algorithm Field ---------------------------*/
-+#define WLAN_AUTH_ALG_OPENSYSTEM              0
-+#define WLAN_AUTH_ALG_SHAREDKEY                       1
-+
-+/*-- Management Frame Field Offsets -------------*/
-+/* Note: Not all fields are listed because of variable lengths */
-+/* Note: These offsets are from the start of the frame data */
-+
-+#define WLAN_BEACON_OFF_TS                    0
-+#define WLAN_BEACON_OFF_BCN_INT                       8
-+#define WLAN_BEACON_OFF_CAPINFO                       10
-+#define WLAN_BEACON_OFF_SSID                  12
-+
-+#define WLAN_DISASSOC_OFF_REASON              0
-+
-+#define WLAN_ASSOCREQ_OFF_CAP_INFO            0
-+#define WLAN_ASSOCREQ_OFF_LISTEN_INT          2
-+#define WLAN_ASSOCREQ_OFF_SSID                        4
-+
-+#define WLAN_ASSOCRESP_OFF_CAP_INFO           0
-+#define WLAN_ASSOCRESP_OFF_STATUS             2
-+#define WLAN_ASSOCRESP_OFF_AID                        4
-+#define WLAN_ASSOCRESP_OFF_SUPP_RATES         6
-+
-+#define WLAN_REASSOCREQ_OFF_CAP_INFO          0
-+#define WLAN_REASSOCREQ_OFF_LISTEN_INT                2
-+#define WLAN_REASSOCREQ_OFF_CURR_AP           4
-+#define WLAN_REASSOCREQ_OFF_SSID              10
-+
-+#define WLAN_REASSOCRESP_OFF_CAP_INFO         0
-+#define WLAN_REASSOCRESP_OFF_STATUS           2
-+#define WLAN_REASSOCRESP_OFF_AID              4
-+#define WLAN_REASSOCRESP_OFF_SUPP_RATES               6
-+
-+#define WLAN_PROBEREQ_OFF_SSID                        0
-+
-+#define WLAN_PROBERESP_OFF_TS                 0
-+#define WLAN_PROBERESP_OFF_BCN_INT            8
-+#define WLAN_PROBERESP_OFF_CAP_INFO           10
-+#define WLAN_PROBERESP_OFF_SSID                       12
-+
-+#define WLAN_AUTHEN_OFF_AUTH_ALG              0
-+#define WLAN_AUTHEN_OFF_AUTH_SEQ              2
-+#define WLAN_AUTHEN_OFF_STATUS                        4
-+#define WLAN_AUTHEN_OFF_CHALLENGE             6
-+
-+#define WLAN_DEAUTHEN_OFF_REASON              0
-+
-+enum {
-+IEEE16(WF_MGMT_CAP_ESS,               0x0001)
-+IEEE16(WF_MGMT_CAP_IBSS,      0x0002)
-+/* In (re)assoc request frames by STA:
-+** Pollable=0, PollReq=0: STA is not CF-Pollable
-+** 0 1: STA is CF-Pollable, not requesting to be placed on the CF-Polling list
-+** 1 0: STA is CF-Pollable, requesting to be placed on the CF-Polling list
-+** 1 1: STA is CF-Pollable, requesting never to be polled
-+** In beacon, proberesp, (re)assoc resp frames by AP:
-+** 0 0: No point coordinator at AP
-+** 0 1: Point coordinator at AP for delivery only (no polling)
-+** 1 0: Point coordinator at AP for delivery and polling
-+** 1 1: Reserved  */
-+IEEE16(WF_MGMT_CAP_CFPOLLABLE,        0x0004)
-+IEEE16(WF_MGMT_CAP_CFPOLLREQ, 0x0008)
-+/* 1=non-WEP data frames are disallowed */
-+IEEE16(WF_MGMT_CAP_PRIVACY,   0x0010)
-+/* In beacon,  proberesp, (re)assocresp by AP/AdHoc:
-+** 1=use of shortpre is allowed ("I can receive shortpre") */
-+IEEE16(WF_MGMT_CAP_SHORT,     0x0020)
-+IEEE16(WF_MGMT_CAP_PBCC,      0x0040)
-+IEEE16(WF_MGMT_CAP_AGILITY,   0x0080)
-+/* In (re)assoc request frames by STA:
-+** 1=short slot time implemented and enabled
-+**   NB: AP shall use long slot time beginning at the next Beacon after assoc
-+**   of STA with this bit set to 0
-+** In beacon, proberesp, (re)assoc resp frames by AP:
-+** currently used slot time value: 0/1 - long/short */
-+IEEE16(WF_MGMT_CAP_SHORTSLOT, 0x0400)
-+/* In (re)assoc request frames by STA: 1=CCK-OFDM is implemented and enabled
-+** In beacon, proberesp, (re)assoc resp frames by AP/AdHoc:
-+** 1=CCK-OFDM is allowed */
-+IEEE16(WF_MGMT_CAP_CCKOFDM,   0x2000)
-+};
-+
-+
-+/***********************************************************************
-+** Types
-+*/
-+
-+/* Information Element types */
-+
-+/* prototype structure, all IEs start with these members */
-+typedef struct wlan_ie {
-+      u8 eid;
-+      u8 len;
-+} WLAN_PACKED wlan_ie_t;
-+
-+/*-- Service Set Identity (SSID)  -----------------*/
-+typedef struct wlan_ie_ssid {
-+      u8 eid;
-+      u8 len;
-+      u8 ssid[1];     /* may be zero */
-+} WLAN_PACKED wlan_ie_ssid_t;
-+
-+/*-- Supported Rates  -----------------------------*/
-+typedef struct wlan_ie_supp_rates {
-+      u8 eid;
-+      u8 len;
-+      u8 rates[1];    /* had better be at LEAST one! */
-+} WLAN_PACKED wlan_ie_supp_rates_t;
-+
-+/*-- FH Parameter Set  ----------------------------*/
-+typedef struct wlan_ie_fh_parms {
-+      u8 eid;
-+      u8 len;
-+      u16 dwell;
-+      u8 hopset;
-+      u8 hoppattern;
-+      u8 hopindex;
-+} WLAN_PACKED wlan_ie_fh_parms_t;
-+
-+/*-- DS Parameter Set  ----------------------------*/
-+typedef struct wlan_ie_ds_parms {
-+      u8 eid;
-+      u8 len;
-+      u8 curr_ch;
-+} WLAN_PACKED wlan_ie_ds_parms_t;
-+
-+/*-- CF Parameter Set  ----------------------------*/
-+typedef struct wlan_ie_cf_parms {
-+      u8 eid;
-+      u8 len;
-+      u8 cfp_cnt;
-+      u8 cfp_period;
-+      u16 cfp_maxdur;
-+      u16 cfp_durremaining;
-+} WLAN_PACKED wlan_ie_cf_parms_t;
-+
-+/*-- TIM ------------------------------------------*/
-+typedef struct wlan_ie_tim {
-+      u8 eid;
-+      u8 len;
-+      u8 dtim_cnt;
-+      u8 dtim_period;
-+      u8 bitmap_ctl;
-+      u8 virt_bm[1];
-+} WLAN_PACKED wlan_ie_tim_t;
-+
-+/*-- IBSS Parameter Set ---------------------------*/
-+typedef struct wlan_ie_ibss_parms {
-+      u8 eid;
-+      u8 len;
-+      u16 atim_win;
-+} WLAN_PACKED wlan_ie_ibss_parms_t;
-+
-+/*-- Challenge Text  ------------------------------*/
-+typedef struct wlan_ie_challenge {
-+      u8 eid;
-+      u8 len;
-+      u8 challenge[1];
-+} WLAN_PACKED wlan_ie_challenge_t;
-+
-+/*-- ERP (42) -------------------------------------*/
-+typedef struct wlan_ie_erp {
-+      u8 eid;
-+      u8 len;
-+      /* bit 0:Non ERP present
-+      **     1:Use Protection
-+      **     2:Barker Preamble mode
-+      **     3-7:reserved */
-+      u8 erp;
-+} WLAN_PACKED wlan_ie_erp_t;
-+
-+/* Types for parsing mgmt frames */
-+
-+/* prototype structure, all mgmt frame types will start with these members */
-+typedef struct wlan_fr_mgmt {
-+      u16 type;
-+      u16 len;                /* DOES NOT include FCS */
-+      wlan_hdr_t *hdr;
-+      /* used for target specific data, skb in Linux */
-+      /*-- fixed fields -----------*/
-+      /*-- info elements ----------*/
-+} WLAN_PACKED wlan_fr_mgmt_t;
-+
-+/*-- Beacon ---------------------------------------*/
-+typedef struct wlan_fr_beacon {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      u64 *ts;
-+      u16 *bcn_int;
-+      u16 *cap_info;
-+      /*-- info elements ----------*/
-+      wlan_ie_ssid_t *ssid;
-+      wlan_ie_supp_rates_t *supp_rates;
-+      wlan_ie_supp_rates_t *ext_rates;
-+      wlan_ie_fh_parms_t *fh_parms;
-+      wlan_ie_ds_parms_t *ds_parms;
-+      wlan_ie_cf_parms_t *cf_parms;
-+      wlan_ie_ibss_parms_t *ibss_parms;
-+      wlan_ie_tim_t *tim;     /* in beacon only, not proberesp */
-+      wlan_ie_erp_t *erp;     /* in beacon only, not proberesp */
-+} wlan_fr_beacon_t;
-+#define wlan_fr_proberesp wlan_fr_beacon
-+#define wlan_fr_proberesp_t wlan_fr_beacon_t
-+
-+/*-- IBSS ATIM ------------------------------------*/
-+typedef struct wlan_fr_ibssatim {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      /*-- info elements ----------*/
-+      /* this frame type has a null body */
-+} wlan_fr_ibssatim_t;
-+
-+/*-- Disassociation -------------------------------*/
-+typedef struct wlan_fr_disassoc {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      u16 *reason;
-+      /*-- info elements ----------*/
-+} wlan_fr_disassoc_t;
-+
-+/*-- Association Request --------------------------*/
-+typedef struct wlan_fr_assocreq {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      u16 *cap_info;
-+      u16 *listen_int;
-+      /*-- info elements ----------*/
-+      wlan_ie_ssid_t *ssid;
-+      wlan_ie_supp_rates_t *supp_rates;
-+      wlan_ie_supp_rates_t *ext_rates;
-+} wlan_fr_assocreq_t;
-+
-+/*-- Association Response -------------------------*/
-+typedef struct wlan_fr_assocresp {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      u16 *cap_info;
-+      u16 *status;
-+      u16 *aid;
-+      /*-- info elements ----------*/
-+      wlan_ie_supp_rates_t *supp_rates;
-+      wlan_ie_supp_rates_t *ext_rates;
-+} wlan_fr_assocresp_t;
-+
-+/*-- Reassociation Request ------------------------*/
-+typedef struct wlan_fr_reassocreq {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      u16 *cap_info;
-+      u16 *listen_int;
-+      u8 *curr_ap;
-+      /*-- info elements ----------*/
-+      wlan_ie_ssid_t *ssid;
-+      wlan_ie_supp_rates_t *supp_rates;
-+      wlan_ie_supp_rates_t *ext_rates;
-+} wlan_fr_reassocreq_t;
-+
-+/*-- Reassociation Response -----------------------*/
-+typedef struct wlan_fr_reassocresp {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      u16 *cap_info;
-+      u16 *status;
-+      u16 *aid;
-+      /*-- info elements ----------*/
-+      wlan_ie_supp_rates_t *supp_rates;
-+      wlan_ie_supp_rates_t *ext_rates;
-+} wlan_fr_reassocresp_t;
-+
-+/*-- Probe Request --------------------------------*/
-+typedef struct wlan_fr_probereq {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      /*-- info elements ----------*/
-+      wlan_ie_ssid_t *ssid;
-+      wlan_ie_supp_rates_t *supp_rates;
-+      wlan_ie_supp_rates_t *ext_rates;
-+} wlan_fr_probereq_t;
-+
-+/*-- Authentication -------------------------------*/
-+typedef struct wlan_fr_authen {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      u16 *auth_alg;
-+      u16 *auth_seq;
-+      u16 *status;
-+      /*-- info elements ----------*/
-+      wlan_ie_challenge_t *challenge;
-+} wlan_fr_authen_t;
-+
-+/*-- Deauthenication -----------------------------*/
-+typedef struct wlan_fr_deauthen {
-+      u16 type;
-+      u16 len;
-+      wlan_hdr_t *hdr;
-+      /*-- fixed fields -----------*/
-+      u16 *reason;
-+      /*-- info elements ----------*/
-+} wlan_fr_deauthen_t;
-+
-+/* Types for building mgmt frames */
-+
-+/* Warning. Several types used in below structs are
-+** in fact variable length. Use structs with such fields with caution */
-+typedef struct auth_frame_body {
-+      u16     auth_alg;
-+      u16     auth_seq;
-+      u16     status;
-+      wlan_ie_challenge_t challenge;
-+} WLAN_PACKED auth_frame_body_t;
-+
-+typedef struct assocresp_frame_body {
-+      u16     cap_info;
-+      u16     status;
-+      u16     aid;
-+      wlan_ie_supp_rates_t rates;
-+} WLAN_PACKED assocresp_frame_body_t;
-+
-+typedef struct reassocreq_frame_body {
-+      u16     cap_info;
-+      u16     listen_int;
-+      u8      current_ap[ETH_ALEN];
-+      wlan_ie_ssid_t ssid;
-+/* access to this one is disabled since ssid_t is variable length: */
-+     /* wlan_ie_supp_rates_t rates; */
-+} WLAN_PACKED reassocreq_frame_body_t;
-+
-+typedef struct reassocresp_frame_body {
-+      u16     cap_info;
-+      u16     status;
-+      u16     aid;
-+      wlan_ie_supp_rates_t rates;
-+} WLAN_PACKED reassocresp_frame_body_t;
-+
-+typedef struct deauthen_frame_body {
-+      u16     reason;
-+} WLAN_PACKED deauthen_frame_body_t;
-+
-+typedef struct disassoc_frame_body {
-+      u16     reason;
-+} WLAN_PACKED disassoc_frame_body_t;
-+
-+typedef struct probereq_frame_body {
-+      wlan_ie_ssid_t ssid;
-+      wlan_ie_supp_rates_t rates;
-+} WLAN_PACKED probereq_frame_body_t;
-+
-+typedef struct proberesp_frame_body {
-+      u8      timestamp[8];
-+      u16     beacon_int;
-+      u16     cap_info;
-+      wlan_ie_ssid_t ssid;
-+/* access to these is disabled since ssid_t is variable length: */
-+     /* wlan_ie_supp_rates_t rates; */
-+     /* fhps_t        fhps; */
-+     /* dsps_t        dsps; */
-+     /* cfps_t        cfps; */
-+} WLAN_PACKED proberesp_frame_body_t;
-+
-+
-+/***********************************************************************
-+** Functions
-+*/
-+
-+/* Helpers for parsing mgmt frames */
-+void wlan_mgmt_decode_ibssatim(wlan_fr_ibssatim_t *f);
-+void wlan_mgmt_decode_assocreq(wlan_fr_assocreq_t *f);
-+void wlan_mgmt_decode_assocresp(wlan_fr_assocresp_t *f);
-+void wlan_mgmt_decode_authen(wlan_fr_authen_t *f);
-+void wlan_mgmt_decode_beacon(wlan_fr_beacon_t *f);
-+void wlan_mgmt_decode_deauthen(wlan_fr_deauthen_t *f);
-+void wlan_mgmt_decode_disassoc(wlan_fr_disassoc_t *f);
-+void wlan_mgmt_decode_probereq(wlan_fr_probereq_t *f);
-+void wlan_mgmt_decode_proberesp(wlan_fr_proberesp_t *f);
-+void wlan_mgmt_decode_reassocreq(wlan_fr_reassocreq_t *f);
-+void wlan_mgmt_decode_reassocresp(wlan_fr_reassocresp_t *f);
-+
-+/* Helpers for building mgmt frames */
-+static inline u8*
-+wlan_fill_ie_ssid(u8 *p, int len, const char *ssid)
-+{
-+      struct wlan_ie_ssid *ie = (void*)p;
-+      ie->eid = WLAN_EID_SSID;
-+      ie->len = len;
-+      memcpy(ie->ssid, ssid, len);
-+      return p + len + 2;
-+}
-+/* This controls whether we create 802.11g 'ext supported rates' IEs
-+** or just create overlong 'supported rates' IEs instead
-+** (non-11g compliant) */
-+#define WE_OBEY_802_11G 1
-+static inline u8*
-+wlan_fill_ie_rates(u8 *p, int len, const u8 *rates)
-+{
-+      struct wlan_ie_supp_rates *ie = (void*)p;
-+#if WE_OBEY_802_11G
-+      if (len > 8 ) len = 8;
-+#endif
-+      /* supported rates (1 to 8 octets) */
-+      ie->eid = WLAN_EID_SUPP_RATES;
-+      ie->len = len;
-+      memcpy(ie->rates, rates, len);
-+      return p + len + 2;
-+}
-+/* This one wouldn't create an IE at all if not needed */
-+static inline u8*
-+wlan_fill_ie_rates_ext(u8 *p, int len, const u8 *rates)
-+{
-+      struct wlan_ie_supp_rates *ie = (void*)p;
-+#if !WE_OBEY_802_11G
-+      return p;
-+#endif
-+      len -= 8;
-+      if (len <= 0) return p;
-+      /* ext supported rates */
-+      ie->eid = WLAN_EID_EXT_RATES;
-+      ie->len = len;
-+      memcpy(ie->rates, rates+8, len);
-+      return p + len + 2;
-+}
-+static inline u8*
-+wlan_fill_ie_ds_parms(u8 *p, int channel)
-+{
-+      struct wlan_ie_ds_parms *ie = (void*)p;
-+      ie->eid = WLAN_EID_DS_PARMS;
-+      ie->len = 1;
-+      ie->curr_ch = channel;
-+      return p + sizeof(*ie);
-+}
-+static inline u8*
-+wlan_fill_ie_ibss_parms(u8 *p, int atim_win)
-+{
-+      struct wlan_ie_ibss_parms *ie = (void*)p;
-+      ie->eid = WLAN_EID_IBSS_PARMS;
-+      ie->len = 2;
-+      ie->atim_win = atim_win;
-+      return p + sizeof(*ie);
-+}
-+static inline u8*
-+wlan_fill_ie_tim(u8 *p,       int rem, int period, int bcast,
-+              int ofs, int len, const u8 *vbm)
-+{
-+      struct wlan_ie_tim *ie = (void*)p;
-+      ie->eid = WLAN_EID_TIM;
-+      ie->len = len + 3;
-+      ie->dtim_cnt = rem;
-+      ie->dtim_period = period;
-+      ie->bitmap_ctl = ofs | (bcast!=0);
-+      if (vbm)
-+              memcpy(ie->virt_bm, vbm, len); /* min 1 byte */
-+      else
-+              ie->virt_bm[0] = 0;
-+      return p + len + 3 + 2;
-+}
-Index: linux-2.6.22/drivers/net/wireless/Kconfig
-===================================================================
---- linux-2.6.22.orig/drivers/net/wireless/Kconfig     2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/net/wireless/Kconfig  2007-08-23 18:34:19.000000000 +0200
-@@ -5,6 +5,36 @@
- menu "Wireless LAN"
-       depends on !S390
-+config NET_RADIO
-+      bool "Wireless LAN drivers (non-hamradio) & Wireless Extensions"
-+      select WIRELESS_EXT
-+      ---help---
-+        Support for wireless LANs and everything having to do with radio,
-+        but not with amateur radio or FM broadcasting.
-+
-+        Saying Y here also enables the Wireless Extensions (creates
-+        /proc/net/wireless and enables iwconfig access). The Wireless
-+        Extension is a generic API allowing a driver to expose to the user
-+        space configuration and statistics specific to common Wireless LANs.
-+        The beauty of it is that a single set of tool can support all the
-+        variations of Wireless LANs, regardless of their type (as long as
-+        the driver supports Wireless Extension). Another advantage is that
-+        these parameters may be changed on the fly without restarting the
-+        driver (or Linux). If you wish to use Wireless Extensions with
-+        wireless PCMCIA (PC-) cards, you need to say Y here; you can fetch
-+        the tools from
-+        <http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/Tools.html>.
-+
-+config NET_WIRELESS_RTNETLINK
-+      bool "Wireless Extension API over RtNetlink"
-+      depends on NET_RADIO
-+      ---help---
-+        Support the Wireless Extension API over the RtNetlink socket
-+        in addition to the traditional ioctl interface (selected above).
-+
-+        For now, few tools use this facility, but it might grow in the
-+        future. The only downside is that it adds 4.5 kB to your kernel.
-+
- config WLAN_PRE80211
-       bool "Wireless LAN (pre-802.11)"
-       depends on NETDEVICES
-@@ -549,5 +579,6 @@
- source "drivers/net/wireless/hostap/Kconfig"
- source "drivers/net/wireless/bcm43xx/Kconfig"
- source "drivers/net/wireless/zd1211rw/Kconfig"
-+source "drivers/net/wireless/acx/Kconfig"
- endmenu
-Index: linux-2.6.22/drivers/net/wireless/Makefile
-===================================================================
---- linux-2.6.22.orig/drivers/net/wireless/Makefile    2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/net/wireless/Makefile 2007-08-23 18:34:19.000000000 +0200
-@@ -34,6 +34,8 @@
- obj-$(CONFIG_PRISM54)         += prism54/
-+obj-$(CONFIG_ACX)             += acx/
-+
- obj-$(CONFIG_HOSTAP)          += hostap/
- obj-$(CONFIG_BCM43XX)         += bcm43xx/
- obj-$(CONFIG_ZD1211RW)                += zd1211rw/
diff --git a/meta/packages/linux/linux-rp-2.6.22/htcuni.patch b/meta/packages/linux/linux-rp-2.6.22/htcuni.patch
deleted file mode 100644 (file)
index a83c7af..0000000
+++ /dev/null
@@ -1,8480 +0,0 @@
----
- arch/arm/mach-pxa/Kconfig                                |   89 +
- arch/arm/mach-pxa/Makefile                               |    1 
- arch/arm/mach-pxa/corgi.c                                |    3 
- arch/arm/mach-pxa/generic.c                              |   12 
- arch/arm/mach-pxa/htcuniversal/Makefile                  |   19 
- arch/arm/mach-pxa/htcuniversal/htcuniversal.c            |  468 +++++
- arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.c     |  917 +++++++++++
- arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.h     |   65 
- arch/arm/mach-pxa/htcuniversal/htcuniversal_asic3_leds.c |  143 +
- arch/arm/mach-pxa/htcuniversal/htcuniversal_bl.c         |   61 
- arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.c         |  135 +
- arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.h         |   17 
- arch/arm/mach-pxa/htcuniversal/htcuniversal_buttons.c    |   87 +
- arch/arm/mach-pxa/htcuniversal/htcuniversal_core.c       |  226 ++
- arch/arm/mach-pxa/htcuniversal/htcuniversal_lcd.c        |  212 ++
- arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.c      |  167 ++
- arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.h      |   16 
- arch/arm/mach-pxa/htcuniversal/htcuniversal_pm.c         |   69 
- arch/arm/mach-pxa/htcuniversal/htcuniversal_power2.c     |   97 +
- arch/arm/mach-pxa/htcuniversal/htcuniversal_ts2.c        |  490 ++++++
- arch/arm/mach-pxa/htcuniversal/htcuniversal_udc.c        |   71 
- arch/arm/mach-pxa/htcuniversal/tsc2046_ts.h              |   20 
- arch/arm/mach-pxa/pm.c                                   |   36 
- arch/arm/mach-pxa/spitz.c                                |    2 
- drivers/input/keyboard/Makefile                          |    2 
- drivers/input/keyboard/asic3_keys.c                      |  131 +
- drivers/input/keyboard/pxa27x_keyboard.c                 |    2 
- drivers/leds/Kconfig                                     |    7 
- drivers/leds/Makefile                                    |    1 
- drivers/leds/leds-asic3.c                                |  189 ++
- drivers/mfd/Kconfig                                      |   10 
- drivers/mfd/Makefile                                     |    2 
- drivers/mfd/asic3_base.c                                 | 1208 +++++++++++++++
- drivers/mfd/soc-core.c                                   |  106 +
- drivers/mfd/soc-core.h                                   |   30 
- drivers/mmc/host/Kconfig                                 |    6 
- drivers/mmc/host/Makefile                                |    2 
- drivers/mmc/host/asic3_mmc.c                             |  900 +++++++++++
- drivers/mmc/host/asic3_mmc.h                             |   25 
- drivers/serial/pxa.c                                     |   22 
- drivers/video/backlight/Kconfig                          |    2 
- drivers/video/backlight/corgi_bl.c                       |    4 
- drivers/w1/slaves/Kconfig                                |   11 
- drivers/w1/slaves/Makefile                               |    2 
- drivers/w1/slaves/w1_ds2760.c                            |  213 ++
- drivers/w1/slaves/w1_ds2760.h                            |   50 
- drivers/w1/w1_family.h                                   |    1 
- include/asm-arm/arch-pxa/clock.h                         |   27 
- include/asm-arm/arch-pxa/htcuniversal-asic.h             |  213 ++
- include/asm-arm/arch-pxa/htcuniversal-gpio.h             |  220 ++
- include/asm-arm/arch-pxa/htcuniversal-init.h             |   14 
- include/asm-arm/arch-pxa/htcuniversal.h                  |    3 
- include/asm-arm/arch-pxa/irqs.h                          |    2 
- include/asm-arm/arch-pxa/pxa-pm_ll.h                     |    6 
- include/asm-arm/arch-pxa/pxa-regs.h                      |    2 
- include/asm-arm/arch-pxa/serial.h                        |   78 
- include/asm-arm/arch-pxa/sharpsl.h                       |    6 
- include/asm-arm/hardware/asic3_keys.h                    |   18 
- include/asm-arm/hardware/asic3_leds.h                    |   34 
- include/asm-arm/hardware/ipaq-asic3.h                    |  602 +++++++
- include/linux/backlight.h                                |    7 
- include/linux/gpiodev.h                                  |   44 
- include/linux/input_pda.h                                |   47 
- include/linux/ioport.h                                   |    1 
- include/linux/pda_power.h                                |   31 
- include/linux/soc/asic3_base.h                           |  104 +
- include/linux/soc/tmio_mmc.h                             |   17 
- 67 files changed, 7808 insertions(+), 17 deletions(-)
-
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/Makefile       2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,19 @@
-+#
-+# Makefile for HTC Universal
-+#
-+
-+snd-htcuniversal-ak4641-objs := htcuniversal_ak4641.o
-+
-+obj-$(CONFIG_MACH_HTCUNIVERSAL)               += htcuniversal.o htcuniversal_pm.o
-+obj-$(CONFIG_HTCUNIVERSAL_CORE)               += htcuniversal_core.o
-+obj-$(CONFIG_HTCUNIVERSAL_POWER)      += htcuniversal_power2.o
-+obj-$(CONFIG_HTCUNIVERSAL_LCD)                += htcuniversal_lcd.o
-+obj-$(CONFIG_HTCUNIVERSAL_BACKLIGHT)  += htcuniversal_bl.o
-+obj-$(CONFIG_HTCUNIVERSAL_TS2)                += htcuniversal_ts2.o
-+obj-$(CONFIG_HTCUNIVERSAL_BUTTONS)    += htcuniversal_buttons.o
-+obj-$(CONFIG_HTCUNIVERSAL_BLUETOOTH)  += htcuniversal_bt.o
-+obj-$(CONFIG_HTCUNIVERSAL_PHONE)      += htcuniversal_phone.o
-+obj-$(CONFIG_HTCUNIVERSAL_ASIC3_LEDS) += htcuniversal_asic3_leds.o
-+obj-$(CONFIG_HTCUNIVERSAL_UDC)                += htcuniversal_udc.o
-+
-+obj-$(CONFIG_HTCUNIVERSAL_AK4641)     += htcuniversal_ak4641.o
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal.c 2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,468 @@
-+/*
-+ * Hardware definitions for HTC Universal
-+ *
-+ * Copyright (c) 2006 Oleg Gusev
-+ *
-+ * 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/kernel.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/irq.h>
-+#include <linux/input.h>
-+#include <linux/gpio_keys.h>
-+#include <linux/soc/asic3_base.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/hardware.h>
-+#include <asm/setup.h>
-+
-+#include <asm/mach/irq.h>
-+#include <asm/mach/arch.h>
-+
-+#include <asm/arch/bitfield.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/serial.h>
-+#include <asm/arch/pxa27x_keyboard.h>
-+#include <asm/arch/pxafb.h>
-+#include <asm/arch/irda.h>
-+#include <asm/arch/ohci.h>
-+
-+#include <asm/arch/htcuniversal.h>
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-init.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+
-+#include <asm/hardware/ipaq-asic3.h>
-+
-+#include "../generic.h"
-+
-+#include "htcuniversal_bt.h"
-+#include "htcuniversal_phone.h"
-+#include "tsc2046_ts.h"
-+
-+/*
-+ * IRDA
-+ */
-+
-+static void htcuniversal_irda_transceiver_mode(struct device *dev, int mode)
-+{
-+ /* */
-+}
-+
-+static struct pxaficp_platform_data htcuniversal_ficp_platform_data = {
-+      .transceiver_cap  = IR_SIRMODE | IR_FIRMODE,
-+      .transceiver_mode = htcuniversal_irda_transceiver_mode,
-+};
-+
-+/*
-+ * Bluetooth - Relies on other loadable modules, like ASIC3 and Core,
-+ * so make the calls indirectly through pointers. Requires that the
-+ * htcuniversal_bt module be loaded before any attempt to use
-+ * bluetooth (obviously).
-+ */
-+
-+static struct htcuniversal_bt_funcs bt_funcs;
-+
-+static void
-+htcuniversal_bt_configure( int state )
-+{
-+      if (bt_funcs.configure != NULL)
-+              bt_funcs.configure( state );
-+}
-+
-+static struct htcuniversal_phone_funcs phone_funcs;
-+
-+static void
-+htcuniversal_phone_configure( int state )
-+{
-+      if (phone_funcs.configure != NULL)
-+              phone_funcs.configure( state );
-+}
-+
-+//void htcuniversal_ll_pm_init(void);
-+
-+extern struct platform_device htcuniversal_bl;
-+static struct platform_device htcuniversal_lcd       = { .name = "htcuniversal_lcd", };
-+//static struct platform_device htcuniversal_kbd       = { .name = "htcuniversal_kbd", };
-+static struct platform_device htcuniversal_buttons   = { .name = "htcuniversal_buttons", };
-+//static struct platform_device htcuniversal_ts        = { .name = "htcuniversal_ts", };
-+//static struct platform_device htcuniversal_bt        = { .name = "htcuniversal_bt", };
-+//static struct platform_device htcuniversal_phone        = { .name = "htcuniversal_phone", };
-+static struct platform_device htcuniversal_power        = { .name = "htcuniversal_power", };
-+static struct platform_device htcuniversal_udc       = { .name = "htcuniversal_udc", };
-+
-+static struct tsc2046_mach_info htcuniversal_ts_platform_data = {
-+       .port     = 1,
-+       .clock    = CKEN_SSP1,
-+       .pwrbit_X = 1,
-+       .pwrbit_Y = 1,
-+       .irq    = 0  /* asic3 irq */
-+};
-+
-+static struct platform_device htcuniversal_ts        = {
-+       .name = "htcuniversal_ts",
-+       .dev  = {
-+              .platform_data = &htcuniversal_ts_platform_data,
-+       },
-+};
-+
-+
-+/* Bluetooth */
-+
-+static struct platform_device htcuniversal_bt = {
-+      .name = "htcuniversal_bt",
-+      .id = -1,
-+      .dev = {
-+              .platform_data = &bt_funcs,
-+      },
-+};
-+
-+static struct platform_device htcuniversal_phone = {
-+      .name = "htcuniversal_phone",
-+      .id = -1,
-+      .dev = {
-+              .platform_data = &phone_funcs,
-+      },
-+};
-+
-+/* PXA2xx Keys */
-+
-+static struct gpio_keys_button htcuniversal_button_table[] = {
-+      { KEY_POWER, GPIO_NR_HTCUNIVERSAL_KEY_ON_N, 1 },
-+};
-+
-+static struct gpio_keys_platform_data htcuniversal_pxa_keys_data = {
-+      .buttons = htcuniversal_button_table,
-+      .nbuttons = ARRAY_SIZE(htcuniversal_button_table),
-+};
-+
-+static struct platform_device htcuniversal_pxa_keys = {
-+      .name = "gpio-keys",
-+      .dev = {
-+              .platform_data = &htcuniversal_pxa_keys_data,
-+      },
-+      .id = -1,
-+};
-+
-+/****************************************************************
-+ * Keyboard
-+ ****************************************************************/
-+
-+static struct pxa27x_keyboard_platform_data htcuniversal_kbd = {
-+      .nr_rows = 8,
-+      .nr_cols = 8,
-+      .keycodes = {
-+              {
-+                      /* row 0 */
-+                      KEY_ENTER,
-+                      KEY_MINUS,
-+                      KEY_ESC,
-+                      KEY_1,
-+                      KEY_TAB,
-+                      KEY_CAPSLOCK,
-+                      KEY_LEFTSHIFT,
-+                      KEY_RIGHTALT,   /* Fn */
-+              }, {    /* row 1 */
-+                      KEY_COMMA,
-+                      KEY_EQUAL,
-+                      KEY_F1,
-+                      KEY_2,
-+                      KEY_Q,
-+                      KEY_A,
-+                      KEY_Z,
-+                      KEY_LEFTCTRL,
-+              }, {    /* row 2 */
-+                      KEY_UP,
-+                      KEY_I,
-+                      KEY_F2,
-+                      KEY_3,
-+                      KEY_W,
-+                      KEY_S,
-+                      KEY_X,
-+                      KEY_F6,
-+              }, {    /* row 3 */
-+                      KEY_DOT,
-+                      KEY_O,
-+                      KEY_F3,
-+                      KEY_4,
-+                      KEY_E,
-+                      KEY_D,
-+                      KEY_C,
-+                      KEY_LEFTALT,
-+              }, {    /* row 4 */
-+                      KEY_F9,
-+                      KEY_P,
-+                      KEY_F4,
-+                      KEY_5,
-+                      KEY_R,
-+                      KEY_F,
-+                      KEY_V,
-+                      KEY_SPACE,
-+              }, {    /* row 5 */
-+                      KEY_RIGHT,
-+                      KEY_BACKSPACE,
-+                      KEY_F5,
-+                      KEY_6,
-+                      KEY_T,
-+                      KEY_G,
-+                      KEY_B,
-+                      KEY_F7,
-+              }, {    /* row 6 */
-+                      KEY_F9,
-+                      KEY_K,
-+                      KEY_9,
-+                      KEY_7,
-+                      KEY_Y,
-+                      KEY_H,
-+                      KEY_N,
-+                      KEY_LEFT,
-+              }, {    /* row 7 */
-+                      KEY_F10,
-+                      KEY_L,
-+                      KEY_0,
-+                      KEY_8,
-+                      KEY_U,
-+                      KEY_J,
-+                      KEY_M,
-+                      KEY_DOWN,
-+              },
-+      },
-+      .gpio_modes = {
-+               GPIO_NR_HTCUNIVERSAL_KP_MKIN0_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKIN1_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKIN2_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKIN3_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKIN4_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKIN5_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKIN6_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKIN7_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKOUT0_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKOUT1_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKOUT2_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKOUT3_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKOUT4_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKOUT5_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKOUT6_MD,
-+               GPIO_NR_HTCUNIVERSAL_KP_MKOUT7_MD,
-+       },
-+};
-+
-+static struct platform_device htcuniversal_pxa_keyboard = {
-+        .name   = "pxa27x-keyboard",
-+        .id     = -1,
-+      .dev    =  {
-+              .platform_data  = &htcuniversal_kbd,
-+      },
-+};
-+/* Core Hardware Functions */
-+
-+struct platform_device htcuniversal_core = {
-+      .name           = "htcuniversal_core",
-+      .id             = 0,
-+      .dev = {
-+              .platform_data = NULL,
-+      },
-+};
-+
-+static struct platform_device *devices[] __initdata = {
-+      &htcuniversal_core,
-+//    &htcuniversal_flash,
-+      &htcuniversal_pxa_keyboard,
-+      &htcuniversal_pxa_keys,
-+};
-+
-+static struct platform_device *htcuniversal_asic3_devices[] __initdata = {
-+      &htcuniversal_lcd,
-+#ifdef CONFIG_HTCUNIVERSAL_BACKLIGHT
-+      &htcuniversal_bl,
-+#endif
-+      &htcuniversal_buttons,
-+      &htcuniversal_ts,
-+      &htcuniversal_bt,
-+      &htcuniversal_phone,
-+      &htcuniversal_power,
-+      &htcuniversal_udc,
-+};
-+
-+static struct asic3_platform_data htcuniversal_asic3_platform_data = {
-+
-+   /* Setting ASIC3 GPIO registers to the below initialization states
-+    * HTC Universal asic3 information:
-+    * http://wiki.xda-developers.com/index.php?pagename=UniversalASIC3
-+    * http://wiki.xda-developers.com/index.php?pagename=ASIC3
-+    *
-+    * dir:    Direction of the GPIO pin. 0: input, 1: output.
-+    *         If unknown, set as output to avoid power consuming floating input nodes
-+    * init:   Initial state of the GPIO bits
-+    *
-+    * These registers are configured as they are on Wince.
-+    */
-+        .gpio_a = {
-+              .dir            = (1<<GPIOA_LCD_PWR5_ON)    |
-+                                (1<<GPIOA_FLASHLIGHT)     |
-+                                (1<<GPIOA_UNKNOWN9)       |
-+                                (1<<GPIOA_SPK_PWR2_ON)    |
-+                                (1<<GPIOA_UNKNOWN4)       |
-+                                (1<<GPIOA_EARPHONE_PWR_ON)|
-+                                (1<<GPIOA_AUDIO_PWR_ON)   |
-+                                (1<<GPIOA_SPK_PWR1_ON)    |
-+                                (1<<GPIOA_I2C_EN),
-+              .init           = (1<<GPIOA_LCD_PWR5_ON)    |
-+                                (1<<GPIOA_I2C_EN),
-+              .sleep_out      = 0x0000,
-+              .batt_fault_out = 0x0000,
-+              .alt_function   = 0x0000,
-+              .sleep_conf     = 0x000c,
-+        },
-+        .gpio_b = {
-+              .dir            = 0xc142,
-+              .init           = 0x8842, // TODO: 0x0900
-+              .sleep_out      = 0x0000,
-+              .batt_fault_out = 0x0000,
-+              .alt_function   = 0x0000,
-+                .sleep_conf     = 0x000c,
-+        },
-+        .gpio_c = {
-+                .dir            = 0xc7e7,
-+                .init           = 0xc6e0, // TODO: 0x8000
-+                .sleep_out      = 0x0000,
-+                .batt_fault_out = 0x0000,
-+              .alt_function   = 0x0007, // GPIOC_LED_RED | GPIOC_LED_GREEN | GPIOC_LED_BLUE
-+                .sleep_conf     = 0x000c,
-+        },
-+        .gpio_d = {
-+              .dir            = 0xffc0,
-+              .init           = 0x7840, // TODO: 0x0000
-+              .sleep_out      = 0x0000,
-+              .batt_fault_out = 0x0000,
-+              .alt_function   = 0x0000,
-+              .sleep_conf     = 0x0008,
-+        },
-+      .bus_shift = 1,
-+      .irq_base = HTCUNIVERSAL_ASIC3_IRQ_BASE,
-+
-+      .child_platform_devs     = htcuniversal_asic3_devices,
-+      .num_child_platform_devs = ARRAY_SIZE(htcuniversal_asic3_devices),
-+};
-+
-+static struct resource htcuniversal_asic3_resources[] = {
-+      [0] = {
-+              .start  = HTCUNIVERSAL_ASIC3_GPIO_PHYS,
-+              .end    = HTCUNIVERSAL_ASIC3_GPIO_PHYS + IPAQ_ASIC3_MAP_SIZE,
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start  = HTCUNIVERSAL_IRQ(ASIC3_EXT_INT),
-+              .end    = HTCUNIVERSAL_IRQ(ASIC3_EXT_INT),
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+      [2] = {
-+              .start  = HTCUNIVERSAL_ASIC3_MMC_PHYS,
-+              .end    = HTCUNIVERSAL_ASIC3_MMC_PHYS + IPAQ_ASIC3_MAP_SIZE,
-+              .flags  = IORESOURCE_MEM,
-+      },
-+      [3] = {
-+              .start  = HTCUNIVERSAL_IRQ(ASIC3_SDIO_INT_N),
-+              .flags  = IORESOURCE_IRQ,
-+      },
-+};
-+
-+struct platform_device htcuniversal_asic3 = {
-+      .name           = "asic3",
-+      .id             = 0,
-+      .num_resources  = ARRAY_SIZE(htcuniversal_asic3_resources),
-+      .resource       = htcuniversal_asic3_resources,
-+      .dev = { .platform_data = &htcuniversal_asic3_platform_data, },
-+};
-+EXPORT_SYMBOL(htcuniversal_asic3);
-+
-+static struct pxafb_mode_info htcuniversal_lcd_modes[] = {
-+{
-+      .pixclock               = 96153,
-+      .xres                   = 480,
-+      .yres                   = 640,
-+      .bpp                    = 16,
-+      .hsync_len              = 4,
-+      .vsync_len              = 1,
-+      .left_margin            = 20,
-+      .right_margin           = 8,
-+      .upper_margin           = 7,
-+      .lower_margin           = 8,
-+
-+//    .sync                   = FB_SYNC_HOR_LOW_ACT|FB_SYNC_VERT_LOW_ACT,
-+
-+},
-+};
-+
-+static struct pxafb_mach_info sony_acx526akm = {
-+        .modes                = htcuniversal_lcd_modes,
-+        .num_modes    = ARRAY_SIZE(htcuniversal_lcd_modes),
-+
-+      /* fixme: use constants defined in pxafb.h */
-+      .lccr0                  = 0x00000080,
-+      .lccr3                  = 0x00400000,
-+//    .lccr4                  = 0x80000000,
-+};
-+
-+static void __init htcuniversal_init_irq(void)
-+{
-+      pxa_init_irq();
-+}
-+
-+static struct platform_pxa_serial_funcs htcuniversal_pxa_bt_funcs = {
-+      .configure = htcuniversal_bt_configure,
-+};
-+static struct platform_pxa_serial_funcs htcuniversal_pxa_phone_funcs = {
-+      .configure = htcuniversal_phone_configure,
-+};
-+
-+/* USB OHCI */
-+
-+static int htcuniversal_ohci_init(struct device *dev)
-+{
-+      /* missing GPIO setup here */
-+
-+      /* got the value from wince */
-+      UHCHR=UHCHR_CGR;
-+
-+      return 0;
-+}
-+
-+static struct pxaohci_platform_data htcuniversal_ohci_platform_data = {
-+      .port_mode = PMM_PERPORT_MODE,
-+      .init = htcuniversal_ohci_init,
-+};
-+
-+static void __init htcuniversal_map_io(void)
-+{
-+      pxa_map_io();
-+
-+      pxa_set_btuart_info(&htcuniversal_pxa_bt_funcs);
-+      pxa_set_ffuart_info(&htcuniversal_pxa_phone_funcs);
-+}
-+
-+static void __init htcuniversal_init(void)
-+{
-+      set_pxa_fb_info(&sony_acx526akm);
-+
-+      platform_device_register(&htcuniversal_asic3);
-+      platform_add_devices(devices, ARRAY_SIZE(devices) );
-+      pxa_set_ficp_info(&htcuniversal_ficp_platform_data);
-+      pxa_set_ohci_info(&htcuniversal_ohci_platform_data);
-+}
-+
-+MACHINE_START(HTCUNIVERSAL, "HTC Universal")
-+      /* Maintainer xanadux.org */
-+      .phys_io        = 0x40000000,
-+      .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
-+      .boot_params    = 0xa0000100,
-+      .map_io         = htcuniversal_map_io,
-+      .init_irq       = htcuniversal_init_irq,
-+      .init_machine   = htcuniversal_init,
-+      .timer          = &pxa_timer,
-+MACHINE_END
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.c  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,917 @@
-+/*
-+ * Audio support for codec Asahi Kasei AK4641
-+ *
-+ * 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.
-+ *
-+ * Copyright (c) 2006 Giorgio Padrin <giorgio@mandarinlogiq.org>
-+ *
-+ * History:
-+ *
-+ * 2006-03    Written -- Giorgio Padrin
-+ * 2006-09    Test and debug on machine (HP hx4700) -- Elshin Roman <roxmail@list.ru>
-+ *
-+ * AK4641 codec device driver
-+ *
-+ * Copyright (c) 2005 SDG Systems, LLC
-+ *
-+ * Based on code:
-+ *   Copyright (c) 2002 Hewlett-Packard Company
-+ *   Copyright (c) 2000 Nicolas Pitre <nico@cam.org>
-+ *   Copyright (c) 2000 Lernout & Hauspie Speech Products, N.V.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License.
-+ */
-+
-+#include <sound/driver.h>
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/types.h>
-+#include <linux/string.h>
-+#include <linux/slab.h>
-+#include <linux/errno.h>
-+#include <linux/ioctl.h>
-+#include <linux/delay.h>
-+#include <linux/i2c.h>
-+
-+#include <sound/core.h>
-+#include <sound/control.h>
-+#include <sound/initval.h>
-+#include <sound/info.h>
-+
-+#include "htcuniversal_ak4641.h"
-+
-+/* Registers */
-+#define R_PM1         0x00
-+#define R_PM2         0x01
-+#define R_SEL1                0x02
-+#define R_SEL2                0x03
-+#define       R_MODE1         0x04
-+#define R_MODE2               0x05
-+#define R_DAC         0x06
-+#define R_MIC         0x07
-+#define REG_TIMER     0x08
-+#define REG_ALC1      0x09
-+#define REG_ALC2      0x0a
-+#define R_PGA         0x0b
-+#define R_ATTL                0x0c
-+#define R_ATTR                0x0d
-+#define REG_VOL               0x0e
-+#define R_STATUS      0x0f
-+#define REG_EQLO      0x10
-+#define REG_EQMID     0x11
-+#define REG_EQHI      0x12
-+#define REG_BTIF      0x13
-+
-+/* Register flags */
-+/* REG_PWR1 */
-+#define R_PM1_PMADC   0x01
-+#define R_PM1_PMMIC   0x02
-+#define REG_PWR1_PMAUX  0x04
-+#define REG_PWR1_PMMO   0x08
-+#define R_PM1_PMLO    0x10
-+/* unused               0x20 */
-+/* unused               0x40 */
-+#define R_PM1_PMVCM   0x80
-+
-+/* REG_PWR2 */
-+#define R_PM2_PMDAC   0x01
-+/* unused               0x02 */
-+/* unused               0x04 */
-+#define R_PM2_PMMO2   0x08
-+#define REG_PWR2_MCKAC  0x10
-+/* unused               0x20 */
-+/* unused               0x40 */
-+#define R_PM2_MCKPD   0x80
-+
-+/* REG_SEL1 */
-+#define R_SEL1_PSMO2  0x01
-+/* unused               0x02 */
-+/* unused               0x04 */
-+/* unused               0x08 */
-+#define REG_SEL1_MICM   0x10
-+#define REG_SEL1_DACM   0x20
-+#define REG_SEL1_PSMO   0x40
-+#define REG_SEL1_MOGN   0x80
-+
-+/* REG_SEL2 */
-+#define R_SEL2_PSLOR  0x01
-+#define R_SEL2_PSLOL  0x02
-+#define REG_SEL2_AUXSI  0x04
-+/* unused               0x08 */
-+#define REG_SEL2_MICL   0x10
-+#define REG_SEL2_AUXL   0x20
-+/* unused               0x40 */
-+#define R_SEL2_DACL   0x80
-+
-+/* REG_MODE1 */
-+#define REG_MODE1_DIF0  0x01
-+#define REG_MODE1_DIF1  0x02
-+/* unused               0x04 */
-+/* unused               0x08 */
-+/* unused               0x10 */
-+/* unused               0x20 */
-+/* unused               0x40 */
-+/* unused               0x80 */
-+
-+/* REG_MODE2 */
-+/* unused               0x01 */
-+#define REG_MODE2_LOOP  0x02
-+#define REG_MODE2_HPM   0x04
-+/* unused               0x08 */
-+/* unused               0x10 */
-+#define REG_MODE2_MCK0  0x20
-+#define REG_MODE2_MCK1  0x40
-+/* unused               0x80 */
-+
-+/* REG_DAC */
-+#define REG_DAC_DEM0    0x01
-+#define REG_DAC_DEM1    0x02
-+#define REG_DAC_EQ      0x04
-+/* unused               0x08 */
-+#define R_DAC_DATTC   0x10
-+#define R_DAC_SMUTE   0x20
-+#define REG_DAC_TM      0x40
-+/* unused               0x80 */
-+
-+/* REG_MIC */
-+#define R_MIC_MGAIN   0x01
-+#define R_MIC_MSEL    0x02
-+#define R_MIC_MICAD   0x04
-+#define R_MIC_MPWRI   0x08
-+#define R_MIC_MPWRE   0x10
-+#define REG_MIC_AUXAD   0x20
-+/* unused               0x40 */
-+/* unused               0x80 */
-+
-+/* REG_TIMER */
-+
-+#define REG_TIMER_LTM0  0x01
-+#define REG_TIMER_LTM1  0x02
-+#define REG_TIMER_WTM0  0x04
-+#define REG_TIMER_WTM1  0x08
-+#define REG_TIMER_ZTM0  0x10
-+#define REG_TIMER_ZTM1  0x20
-+/* unused               0x40 */
-+/* unused               0x80 */
-+
-+#define REG_ALC1_LMTH   0x01
-+#define REG_ALC1_RATT   0x02
-+#define REG_ALC1_LMAT0  0x04
-+#define REG_ALC1_LMAT1  0x08
-+#define REG_ALC1_ZELM   0x10
-+#define REG_ALC1_ALC1   0x20
-+/* unused               0x40 */
-+/* unused               0x80 */
-+
-+/* REG_ALC2 */
-+
-+/* REG_PGA */
-+
-+/* REG_ATTL */
-+
-+/* REG_ATTR */
-+
-+/* REG_VOL */
-+#define REG_VOL_ATTM  0x80
-+
-+/* REG_STATUS */
-+#define R_STATUS_DTMIC        0x01
-+
-+/* REG_EQ controls use 4 bits for each of 5 EQ levels */
-+
-+/* Bluetooth not yet implemented */
-+#define REG_BTIF_PMAD2  0x01
-+#define REG_BTIF_PMDA2  0x02
-+#define REG_BTIF_PMBIF  0x04
-+#define REG_BTIF_ADC2   0x08
-+#define REG_BTIF_DAC2   0x10
-+#define REG_BTIF_BTFMT0 0x20
-+#define REG_BTIF_BTFMT1 0x40
-+/* unused               0x80 */
-+
-+/* begin {{ I2C }} */
-+
-+static struct i2c_driver snd_ak4641_i2c_driver = {
-+      .driver = {
-+              .name = "ak4641-i2c"
-+      },
-+};
-+
-+static int snd_ak4641_i2c_init(void)
-+{
-+      return i2c_add_driver(&snd_ak4641_i2c_driver);
-+}
-+
-+static void snd_ak4641_i2c_free(void)
-+{
-+      i2c_del_driver(&snd_ak4641_i2c_driver);
-+}
-+
-+static inline int snd_ak4641_i2c_probe(struct snd_ak4641 *ak)
-+{
-+      if (ak->i2c_client.adapter == NULL) return -EINVAL;
-+      ak->i2c_client.addr = 0x12;
-+      if (i2c_smbus_xfer(ak->i2c_client.adapter, ak->i2c_client.addr,
-+                         0, 0, 0, I2C_SMBUS_QUICK, NULL) < 0)
-+              return -ENODEV;
-+      else return 0;
-+}
-+
-+static int snd_ak4641_i2c_attach(struct snd_ak4641 *ak)
-+{
-+      int ret = 0;
-+      if ((ret = snd_ak4641_i2c_probe(ak)) < 0) return ret;
-+      snprintf(ak->i2c_client.name, sizeof(ak->i2c_client.name),
-+               "ak4641-i2c at %d-%04x",
-+               i2c_adapter_id(ak->i2c_client.adapter), ak->i2c_client.addr);
-+      return i2c_attach_client(&ak->i2c_client);
-+}
-+
-+static void snd_ak4641_i2c_detach(struct snd_ak4641 *ak)
-+{
-+      i2c_detach_client(&ak->i2c_client);
-+}
-+
-+/* end {{ I2C }} */
-+
-+
-+/* begin {{ Registers & Cache Ops }} */
-+
-+static int snd_ak4641_hwsync(struct snd_ak4641 *ak, int read, u8 reg)
-+{
-+      struct i2c_msg msgs[2];
-+      u8 buf[2];
-+      int ret;
-+
-+      snd_assert(reg < ARRAY_SIZE(ak->regs), return -EINVAL);
-+
-+      /* setup i2c msgs */
-+      msgs[0].addr = ak->i2c_client.addr;
-+      msgs[0].flags = 0;
-+      msgs[0].buf = buf;
-+      if (!read)
-+              msgs[0].len = 2;
-+      else {
-+              msgs[1].flags = I2C_M_RD;
-+              msgs[1].addr = msgs[0].addr;
-+              msgs[1].buf = msgs[0].buf + 1;
-+              msgs[0].len = 1;
-+              msgs[1].len = 1;
-+      }
-+
-+      buf[0] = reg;
-+
-+      /* regs[reg] -> buffer, on write */
-+      if (!read) buf[1] = ak->regs[reg];
-+
-+      /* i2c transfer */
-+      ret = i2c_transfer(ak->i2c_client.adapter, msgs, read ? 2 : 1);
-+      if (ret != (read ? 2 : 1)) return ret; /* transfer error */ //@@ error ret < 0, or not ?
-+
-+      /* regs[reg] <- buffer, on read */
-+      if (read) ak->regs[reg] = buf[1];
-+
-+      return 0;
-+}
-+
-+static inline int snd_ak4641_hwsync_read(struct snd_ak4641 *ak, u8 reg)
-+{
-+      return snd_ak4641_hwsync(ak, 1, reg);
-+}
-+
-+static inline int snd_ak4641_hwsync_write(struct snd_ak4641 *ak, u8 reg)
-+{
-+      return snd_ak4641_hwsync(ak, 0, reg);
-+}
-+
-+static int snd_ak4641_hwsync_read_all(struct snd_ak4641 *ak)
-+{
-+      u8 reg;
-+      for (reg = 0; reg < ARRAY_SIZE(ak->regs); reg++)
-+              if (snd_ak4641_hwsync_read(ak, reg) < 0) return -1;
-+      return 0;
-+}
-+
-+static int snd_ak4641_hwsync_write_all(struct snd_ak4641 *ak)
-+{
-+      u8 reg;
-+      for (reg = 0; reg < ARRAY_SIZE(ak->regs); reg++)
-+              if (snd_ak4641_hwsync_write(ak, reg) < 0) return -1;
-+      return 0;
-+}
-+
-+static int snd_ak4641_reg_changed(struct snd_ak4641 *ak, u8 reg)
-+{
-+      if ((reg != R_PGA && ak->powered_on) ||
-+          (reg == R_PGA && (ak->regs[R_PM1] & R_PM1_PMMIC)))
-+              return snd_ak4641_hwsync_write(ak, reg);
-+      return 0;
-+}
-+
-+/* end {{ Registers & Cache Ops }}*/
-+
-+
-+static inline void snd_ak4641_lock(struct snd_ak4641 *ak)
-+{
-+      down(&ak->sem);
-+}
-+
-+static inline void snd_ak4641_unlock(struct snd_ak4641 *ak)
-+{
-+      up(&ak->sem);
-+}
-+
-+#define WRITE_MASK(i, val, mask)      (((i) & ~(mask)) | ((val) & (mask)))
-+
-+
-+/* begin {{ Controls }} */
-+
-+#define INV_RANGE(val, mask) \
-+      (~(val) & (mask))
-+
-+/*-begin----------------------------------------------------------*/
-+static int snd_ak4641_actl_playback_volume_info(struct snd_kcontrol *kcontrol,
-+                                              struct snd_ctl_elem_info *uinfo)
-+{
-+      uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-+      uinfo->count = 2;
-+      uinfo->value.integer.min = 0;
-+      uinfo->value.integer.max = 0xff;
-+      return 0;
-+}
-+
-+static int snd_ak4641_actl_playback_volume_get(struct snd_kcontrol *kcontrol,
-+                                             struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data;
-+
-+      snd_ak4641_lock(ak);
-+      ucontrol->value.integer.value[0] = INV_RANGE(ak->regs[R_ATTL], 0xff);
-+      ucontrol->value.integer.value[1] = INV_RANGE(ak->regs[R_ATTR], 0xff);
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+
-+static int snd_ak4641_actl_playback_volume_put(struct snd_kcontrol *kcontrol,
-+                                             struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data;
-+
-+      snd_ak4641_lock(ak);
-+      ak->regs[R_ATTL] = INV_RANGE(ucontrol->value.integer.value[0], 0xff);
-+      ak->regs[R_ATTR] = INV_RANGE(ucontrol->value.integer.value[1], 0xff);
-+      snd_ak4641_reg_changed(ak, R_ATTL);
-+      snd_ak4641_reg_changed(ak, R_ATTR);
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+/*-end------------------------------------------------------------*/
-+
-+/*-begin----------------------------------------------------------*/
-+static int snd_ak4641_actl_mic_gain_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 = 0x7f;
-+      return 0;
-+}
-+
-+static int snd_ak4641_actl_mic_gain_get(struct snd_kcontrol *kcontrol,
-+                                      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data;
-+
-+      ucontrol->value.integer.value[0] = ak->regs[R_PGA];
-+      return 0;
-+}
-+
-+static int snd_ak4641_actl_mic_gain_put(struct snd_kcontrol *kcontrol,
-+                                      struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data;
-+
-+      snd_ak4641_lock(ak);
-+      ak->regs[R_PGA] = ucontrol->value.integer.value[0];
-+      snd_ak4641_reg_changed(ak, R_PGA);
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+/*-end------------------------------------------------------------*/
-+
-+#define ACTL(ctl_name, _name) \
-+static struct snd_kcontrol_new snd_ak4641_actl_ ## ctl_name = \
-+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = _name, \
-+  .info = snd_ak4641_actl_ ## ctl_name ## _info, \
-+  .get = snd_ak4641_actl_ ## ctl_name ## _get, .put = snd_ak4641_actl_ ## ctl_name ## _put };
-+
-+ACTL(playback_volume, "Master Playback Volume")
-+ACTL(mic_gain, "Mic Capture Gain")
-+
-+struct snd_ak4641_uctl_bool {
-+      int (*get) (struct snd_ak4641 *uda);
-+      int (*set) (struct snd_ak4641 *uda, int on);
-+};
-+
-+static int snd_ak4641_actl_bool_info(struct snd_kcontrol *kcontrol,
-+                                    struct snd_ctl_elem_info *uinfo)
-+{
-+      uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
-+      uinfo->count = 1;
-+      return 0;
-+}
-+
-+static int snd_ak4641_actl_bool_get(struct snd_kcontrol *kcontrol,
-+                                   struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data;
-+      struct snd_ak4641_uctl_bool *uctl =
-+              (struct snd_ak4641_uctl_bool *) kcontrol->private_value;
-+
-+      ucontrol->value.integer.value[0] = uctl->get(ak);
-+      return 0;
-+}
-+
-+static int snd_ak4641_actl_bool_put(struct snd_kcontrol *kcontrol,
-+                                   struct snd_ctl_elem_value *ucontrol)
-+{
-+      struct snd_ak4641 *ak = (struct snd_ak4641 *) kcontrol->private_data;
-+      struct snd_ak4641_uctl_bool *uctl =
-+              (struct snd_ak4641_uctl_bool *) kcontrol->private_value;
-+
-+      return uctl->set(ak, ucontrol->value.integer.value[0]);
-+}
-+
-+/*-begin----------------------------------------------------------*/
-+static int snd_ak4641_uctl_playback_switch_get(struct snd_ak4641 *ak)
-+{
-+      return (ak->regs[R_DAC] & R_DAC_SMUTE) == 0x00;
-+}
-+
-+static int snd_ak4641_uctl_playback_switch_set(struct snd_ak4641 *ak, int on)
-+{
-+      snd_ak4641_lock(ak);
-+      ak->regs[R_DAC] = WRITE_MASK(ak->regs[R_DAC],
-+                                   on ? 0x00 : R_DAC_SMUTE, R_DAC_SMUTE);
-+      snd_ak4641_reg_changed(ak, R_DAC);
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+/*-end------------------------------------------------------------*/
-+
-+/*-begin----------------------------------------------------------*/
-+static int snd_ak4641_uctl_mic_boost_get(struct snd_ak4641 *ak)
-+{
-+      return (ak->regs[R_MIC] & R_MIC_MGAIN) == R_MIC_MGAIN;
-+}
-+
-+static int snd_ak4641_uctl_mic_boost_set(struct snd_ak4641 *ak, int on)
-+{
-+      snd_ak4641_lock(ak);
-+      ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC],
-+                                   on ? R_MIC_MGAIN : 0x00, R_MIC_MGAIN);
-+      snd_ak4641_reg_changed(ak, R_MIC);
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+/*-end------------------------------------------------------------*/
-+
-+/*-begin----------------------------------------------------------*/
-+static int snd_ak4641_uctl_mono_out_get(struct snd_ak4641 *ak)
-+{
-+        printk("mono_out status 0x%8.8x -> 0x%8.8x\n",ak->regs[R_SEL1], ak->regs[R_SEL1] & REG_SEL1_PSMO);
-+      return (ak->regs[R_SEL1] & REG_SEL1_PSMO) == REG_SEL1_PSMO;
-+}
-+
-+static int snd_ak4641_uctl_mono_out_set(struct snd_ak4641 *ak, int on)
-+{
-+        printk("phone mic enable called. on=%d\n",on);
-+      snd_ak4641_lock(ak);
-+      ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], on ? R_PM1_PMMIC : 0x00, R_PM1_PMMIC);
-+      ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], on ? REG_PWR1_PMMO : 0x00, REG_PWR1_PMMO);
-+      snd_ak4641_reg_changed(ak, R_PM1);
-+
-+      snd_ak4641_hwsync_write(ak, R_PGA);     /* mic PGA gain is reset when PMMIC = 0 */
-+
-+      /* internal mic */
-+        ak->regs[R_MIC]       = WRITE_MASK(ak->regs[R_MIC], on ? R_MIC_MPWRI : 0x0, R_MIC_MPWRI);
-+        ak->regs[R_MIC]       = WRITE_MASK(ak->regs[R_MIC],                    0x0, R_MIC_MSEL);
-+        snd_ak4641_hwsync_write(ak, R_MIC);
-+
-+//        ak->regs[REG_BTIF]  = WRITE_MASK(ak->regs[REG_BTIF], 0x0, REG_BTIF_DAC2);
-+//        snd_ak4641_hwsync_write(ak, REG_BTIF);
-+      /* */
-+//    ak->regs[REG_VOL] = WRITE_MASK(ak->regs[REG_VOL], on ? REG_VOL_ATTM : 0x00, REG_VOL_ATTM);
-+//    ak->regs[R_SEL1] = WRITE_MASK(ak->regs[R_SEL1], on ? REG_SEL1_MOGN : 0x00, REG_SEL1_MOGN);
-+      ak->regs[R_SEL1] = WRITE_MASK(ak->regs[R_SEL1], on ? REG_SEL1_MICM : 0x00, REG_SEL1_MICM);
-+      ak->regs[R_SEL1] = WRITE_MASK(ak->regs[R_SEL1], on ? REG_SEL1_PSMO : 0x00, REG_SEL1_PSMO);
-+      snd_ak4641_reg_changed(ak, R_SEL1);
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+/*-end------------------------------------------------------------*/
-+
-+#define ACTL_BOOL(ctl_name, _name) \
-+static struct snd_ak4641_uctl_bool snd_ak4641_actl_ ## ctl_name ## _pvalue = \
-+{ .get = snd_ak4641_uctl_ ## ctl_name ## _get, \
-+  .set = snd_ak4641_uctl_ ## ctl_name ## _set }; \
-+static struct snd_kcontrol_new snd_ak4641_actl_ ## ctl_name = \
-+{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = _name, .info = snd_ak4641_actl_bool_info, \
-+  .get = snd_ak4641_actl_bool_get, .put = snd_ak4641_actl_bool_put, \
-+  .private_value = (unsigned long) &snd_ak4641_actl_ ## ctl_name ## _pvalue };
-+
-+ACTL_BOOL(playback_switch, "Master Playback Switch")
-+ACTL_BOOL(mic_boost, "Mic Boost (+20dB)")
-+ACTL_BOOL(mono_out, "Phone mic enable")
-+
-+static void snd_ak4641_headphone_on(struct snd_ak4641 *ak, int on);
-+static void snd_ak4641_speaker_on(struct snd_ak4641 *ak, int on);
-+static void snd_ak4641_select_mic(struct snd_ak4641 *ak);
-+
-+void snd_ak4641_hp_connected(struct snd_ak4641 *ak, int connected)
-+{
-+      snd_ak4641_lock(ak);
-+      if (connected != ak->hp_connected) {
-+              ak->hp_connected = connected;
-+
-+              /* headphone or speaker, on playback */
-+              if (ak->playback_on) {
-+                      if (connected) {
-+                              snd_ak4641_headphone_on(ak, 1);
-+                              snd_ak4641_speaker_on(ak, 0);
-+                      } else {
-+                              snd_ak4641_speaker_on(ak, 1);
-+                              snd_ak4641_headphone_on(ak, 0);
-+                      }
-+              }
-+
-+              /* headset or internal mic, on capture */
-+              if (ak->capture_on)
-+                      snd_ak4641_select_mic(ak);
-+      }
-+      snd_ak4641_unlock(ak);
-+}
-+
-+/* end {{ Controls }} */
-+
-+
-+/* begin {{ Headphone Detected Notification }} */
-+
-+static void snd_ak4641_hp_detected_w_fn(void *p)
-+{
-+      struct snd_ak4641 *ak = (struct snd_ak4641 *)p;
-+
-+      snd_ak4641_hp_connected(ak, ak->hp_detected.detected);
-+}
-+
-+void snd_ak4641_hp_detected(struct snd_ak4641 *ak, int detected)
-+{
-+      if (detected != ak->hp_detected.detected) {
-+              ak->hp_detected.detected = detected;
-+              queue_work(ak->hp_detected.wq, &ak->hp_detected.w);
-+      }
-+}
-+
-+static int snd_ak4641_hp_detected_init(struct snd_ak4641 *ak)
-+{
-+      INIT_WORK(&ak->hp_detected.w, snd_ak4641_hp_detected_w_fn);
-+      ak->hp_detected.detected = ak->hp_connected;
-+      ak->hp_detected.wq = create_singlethread_workqueue("ak4641");
-+      if (ak->hp_detected.wq) return 0;
-+      else return -1;
-+}
-+
-+static void snd_ak4641_hp_detected_free(struct snd_ak4641 *ak)
-+{
-+      destroy_workqueue(ak->hp_detected.wq);
-+}
-+
-+/* end {{ Headphone Detected Notification }} */
-+
-+
-+/* begin {{ Codec Control }} */
-+
-+static void snd_ak4641_headphone_on(struct snd_ak4641 *ak, int on)
-+{
-+      if (on) {
-+              ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMLO, R_PM1_PMLO);
-+              snd_ak4641_hwsync_write(ak, R_PM1);
-+              ak->headphone_out_on(1);
-+              ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2],
-+                                            R_SEL2_PSLOL | R_SEL2_PSLOR,
-+                                            R_SEL2_PSLOL | R_SEL2_PSLOR);
-+              snd_ak4641_hwsync_write(ak, R_SEL2);
-+      } else {
-+              ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2],
-+                                            0x00, R_SEL2_PSLOL | R_SEL2_PSLOR);
-+              snd_ak4641_hwsync_write(ak, R_SEL2);
-+              ak->headphone_out_on(0);
-+              ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMLO);
-+              snd_ak4641_hwsync_write(ak, R_PM1);
-+      }
-+}
-+
-+static void snd_ak4641_speaker_on(struct snd_ak4641 *ak, int on)
-+{
-+      if (on) {
-+              ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMLO, R_PM1_PMLO);
-+              snd_ak4641_hwsync_write(ak, R_PM1);
-+              ak->speaker_out_on(1);
-+              ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2],
-+                                            R_SEL2_PSLOL | R_SEL2_PSLOR,
-+                                            R_SEL2_PSLOL | R_SEL2_PSLOR);
-+              snd_ak4641_hwsync_write(ak, R_SEL2);
-+      } else {
-+              ak->regs[R_SEL2] = WRITE_MASK(ak->regs[R_SEL2],
-+                                            0x00, R_SEL2_PSLOL | R_SEL2_PSLOR);
-+              snd_ak4641_hwsync_write(ak, R_SEL2);
-+              ak->speaker_out_on(0);
-+              ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMLO);
-+              snd_ak4641_hwsync_write(ak, R_PM1);
-+      }
-+}
-+
-+static inline int snd_ak4641_power_on(struct snd_ak4641 *ak)
-+{
-+      ak->reset_pin(1);
-+      ak->power_on_chip(1);
-+      msleep(1);
-+      ak->reset_pin(0);
-+      ak->powered_on = 1;
-+      return 0;
-+}
-+
-+static inline int snd_ak4641_power_off(struct snd_ak4641 *ak)
-+{
-+      ak->powered_on = 0;
-+      ak->power_on_chip(0);
-+      return 0;
-+}
-+
-+static inline void snd_ak4641_headphone_out_on(struct snd_ak4641 *ak, int on)
-+{
-+      if (ak->headphone_out_on) ak->headphone_out_on(on);
-+}
-+
-+static inline void snd_ak4641_speaker_out_on(struct snd_ak4641 *ak, int on)
-+{
-+      if (ak->speaker_out_on) ak->speaker_out_on(on);
-+}
-+
-+static int snd_ak4641_playback_on(struct snd_ak4641 *ak)
-+{
-+      if (ak->playback_on) return 0;
-+
-+      ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2],
-+                                   R_PM2_PMDAC, R_PM2_MCKPD | R_PM2_PMDAC);
-+      ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMLO, R_PM1_PMLO);
-+      snd_ak4641_hwsync_write(ak, R_PM2);
-+      snd_ak4641_hwsync_write(ak, R_PM1);
-+      if (ak->hp_connected) snd_ak4641_headphone_on(ak, 1);
-+      else snd_ak4641_speaker_on(ak, 1);
-+
-+      ak->playback_on = 1;
-+
-+      return 0;
-+}
-+
-+static int snd_ak4641_playback_off(struct snd_ak4641 *ak)
-+{
-+      if (!ak->playback_on) return 0;
-+
-+      ak->playback_on = 0;
-+
-+      if (ak->hp_connected) snd_ak4641_headphone_on(ak, 0);
-+      else snd_ak4641_speaker_on(ak, 0);
-+      ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMLO);
-+      ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2],
-+                                  (!ak->capture_on ? R_PM2_MCKPD : 0x00) | R_PM2_PMDAC,
-+                                  R_PM2_MCKPD | R_PM2_PMDAC);
-+      snd_ak4641_hwsync_write(ak, R_PM1);
-+      snd_ak4641_hwsync_write(ak, R_PM2);
-+
-+      return 0;
-+}
-+
-+static void snd_ak4641_select_mic(struct snd_ak4641 *ak)
-+{
-+      int mic = 0;
-+      u8 r_mic;
-+
-+      if (ak->hp_connected) {
-+              /* check headset mic */
-+              ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC], R_MIC_MPWRE, R_MIC_MPWRE);
-+              snd_ak4641_hwsync_write(ak, R_MIC);
-+              snd_ak4641_hwsync_read(ak, R_STATUS);
-+              mic = (ak->regs[R_STATUS] & R_STATUS_DTMIC) == R_STATUS_DTMIC;
-+
-+              printk("htcuniversal_ak4641_select_mic: mic=%d\n",mic);
-+
-+       r_mic = WRITE_MASK(ak->regs[R_MIC],
-+                         R_MIC_MSEL | (ak->capture_on ? R_MIC_MPWRE : 0x00),
-+                         R_MIC_MSEL | R_MIC_MPWRI | R_MIC_MPWRE);
-+      }
-+      else
-+       r_mic = WRITE_MASK(ak->regs[R_MIC],
-+                               0x00 | (ak->capture_on ? R_MIC_MPWRI : 0x00),
-+                         R_MIC_MSEL | R_MIC_MPWRI | R_MIC_MPWRE);
-+
-+      if (r_mic != ak->regs[R_MIC]) {
-+              ak->regs[R_MIC] = r_mic;
-+              snd_ak4641_hwsync_write(ak, R_MIC);
-+      }
-+}
-+
-+static int snd_ak4641_capture_on(struct snd_ak4641 *ak)
-+{
-+      if (ak->capture_on) return 0;
-+
-+      if (!ak->playback_on) {
-+              ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], 0x00, R_PM2_MCKPD);
-+              snd_ak4641_hwsync_write(ak, R_PM2);
-+      }
-+      ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMMIC | R_PM1_PMADC,
-+                                                    R_PM1_PMMIC | R_PM1_PMADC);
-+      snd_ak4641_hwsync_write(ak, R_PM1);
-+      snd_ak4641_hwsync_write(ak, R_PGA);     /* mic PGA gain is reset when PMMIC = 0 */
-+
-+      ak->capture_on = 1;
-+
-+      snd_ak4641_select_mic(ak);
-+
-+      msleep(47);     /* accounts for ADC init cycle, time enough for fs >= 44.1 kHz */
-+
-+      return 0;
-+}
-+
-+static int snd_ak4641_capture_off(struct snd_ak4641 *ak)
-+{
-+      if (!ak->capture_on) return 0;
-+
-+      ak->regs[R_MIC] = WRITE_MASK(ak->regs[R_MIC],
-+                                   0x00, R_MIC_MPWRI | R_MIC_MPWRE | R_MIC_MSEL);
-+      ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], 0x00, R_PM1_PMMIC | R_PM1_PMADC);
-+      snd_ak4641_hwsync_write(ak, R_MIC);
-+      snd_ak4641_hwsync_write(ak, R_PM1);
-+      if (!ak->playback_on) {
-+              ak->regs[R_PM2] = WRITE_MASK(ak->regs[R_PM2], R_PM2_MCKPD, R_PM2_MCKPD);
-+              snd_ak4641_hwsync_write(ak, R_PM2);
-+      }
-+
-+      ak->capture_on = 0;
-+
-+      return 0;
-+}
-+
-+int snd_ak4641_open_stream(struct snd_ak4641 *ak, int stream)
-+{
-+      snd_ak4641_lock(ak);
-+      if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+              ak->playback_stream_opened = 1;
-+              snd_ak4641_playback_on(ak);
-+      } else {
-+              ak->capture_stream_opened = 1;
-+              snd_ak4641_capture_on(ak);
-+      }
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+
-+int snd_ak4641_close_stream(struct snd_ak4641 *ak, int stream)
-+{
-+      snd_ak4641_lock(ak);
-+      if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
-+              ak->playback_stream_opened = 0;
-+              snd_ak4641_playback_off(ak);
-+      } else {
-+              ak->capture_stream_opened = 0;
-+              snd_ak4641_capture_off(ak);
-+      }
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+
-+static int snd_ak4641_init_regs(struct snd_ak4641 *ak)
-+{
-+      snd_ak4641_hwsync_read_all(ak);
-+
-+      //@@ MEMO: add some configs
-+
-+      ak->regs[R_PM1] = WRITE_MASK(ak->regs[R_PM1], R_PM1_PMVCM, R_PM1_PMVCM);
-+      ak->regs[R_DAC] = WRITE_MASK(ak->regs[R_DAC], 0x00, R_DAC_DATTC);
-+      snd_ak4641_hwsync_write(ak, R_PM1);
-+      snd_ak4641_hwsync_write(ak, R_DAC);
-+
-+      return 0;
-+}
-+
-+int snd_ak4641_suspend(struct snd_ak4641 *ak, pm_message_t state)
-+{
-+      snd_ak4641_lock(ak);
-+      if (ak->playback_on) snd_ak4641_playback_off(ak);
-+      if (ak->capture_on) snd_ak4641_capture_off(ak);
-+      snd_ak4641_power_off(ak);
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+
-+int snd_ak4641_resume(struct snd_ak4641 *ak)
-+{
-+      snd_ak4641_lock(ak);
-+      snd_ak4641_power_on(ak);
-+      snd_ak4641_hwsync_write_all(ak);
-+      if (ak->playback_stream_opened) snd_ak4641_playback_on(ak);
-+      if (ak->capture_stream_opened) snd_ak4641_capture_on(ak);
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+
-+static void snd_ak4641_init_ak(struct snd_ak4641 *ak)
-+{
-+      init_MUTEX(&ak->sem);
-+      ak->i2c_client.driver = &snd_ak4641_i2c_driver;
-+}
-+
-+int snd_ak4641_activate(struct snd_ak4641 *ak)
-+{
-+      int ret = 0;
-+
-+      snd_ak4641_init_ak(ak);
-+      snd_ak4641_lock(ak);
-+      snd_ak4641_power_on(ak);
-+      if ((ret = snd_ak4641_i2c_attach(ak)) < 0)
-+              goto failed_i2c_attach;
-+      snd_ak4641_init_regs(ak);
-+      if ((ret = snd_ak4641_hp_detected_init(ak)) < 0)
-+              goto failed_hp_detected_init;
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+
-+ failed_hp_detected_init:
-+      snd_ak4641_i2c_detach(ak);
-+ failed_i2c_attach:
-+      snd_ak4641_power_off(ak);
-+      snd_ak4641_unlock(ak);
-+      return ret;
-+}
-+
-+void snd_ak4641_deactivate(struct snd_ak4641 *ak)
-+{
-+      snd_ak4641_lock(ak);
-+      snd_ak4641_hp_detected_free(ak);
-+      snd_ak4641_i2c_detach(ak);
-+      snd_ak4641_power_off(ak);
-+      snd_ak4641_unlock(ak);
-+}
-+
-+int snd_ak4641_add_mixer_controls(struct snd_ak4641 *ak, struct snd_card *card)
-+{
-+      snd_ak4641_lock(ak);
-+      snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_playback_volume, ak));
-+      snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_playback_switch, ak));
-+      snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_mic_gain, ak));
-+      snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_mic_boost, ak));
-+      snd_ctl_add(card, snd_ctl_new1(&snd_ak4641_actl_mono_out, ak));
-+      snd_ak4641_unlock(ak);
-+      return 0;
-+}
-+
-+/* end {{ Codec Control }} */
-+
-+
-+/* begin {{ Module }} */
-+
-+static int __init snd_ak4641_module_on_load(void)
-+{
-+      snd_ak4641_i2c_init();
-+      return 0;
-+}
-+
-+static void __exit snd_ak4641_module_on_unload(void)
-+{
-+      snd_ak4641_i2c_free();
-+}
-+
-+module_init(snd_ak4641_module_on_load);
-+module_exit(snd_ak4641_module_on_unload);
-+
-+EXPORT_SYMBOL(snd_ak4641_activate);
-+EXPORT_SYMBOL(snd_ak4641_deactivate);
-+EXPORT_SYMBOL(snd_ak4641_add_mixer_controls);
-+EXPORT_SYMBOL(snd_ak4641_open_stream);
-+EXPORT_SYMBOL(snd_ak4641_close_stream);
-+EXPORT_SYMBOL(snd_ak4641_suspend);
-+EXPORT_SYMBOL(snd_ak4641_resume);
-+EXPORT_SYMBOL(snd_ak4641_hp_connected);
-+EXPORT_SYMBOL(snd_ak4641_hp_detected);
-+
-+MODULE_AUTHOR("Giorgio Padrin");
-+MODULE_DESCRIPTION("Audio support for codec Asahi Kasei AK4641");
-+MODULE_LICENSE("GPL");
-+
-+/* end {{ Module }} */
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_ak4641.h  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,65 @@
-+/*
-+ * Audio support for codec Asahi Kasei AK4641
-+ *
-+ * 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.
-+ *
-+ * Copyright (c) 2006 Giorgio Padrin <giorgio@mandarinlogiq.org>
-+ */
-+
-+#ifndef __SOUND_AK4641_H
-+#define __SOUND_AK4641_H
-+
-+#include <linux/i2c.h>
-+
-+struct snd_ak4641 {
-+      struct semaphore sem;
-+
-+      u8 regs[0x14];  /* registers cache */
-+
-+      unsigned int
-+              powered_on:1,
-+              playback_on:1,
-+              playback_stream_opened:1,
-+              capture_on:1,
-+              capture_stream_opened:1;
-+
-+      unsigned int
-+              hp_connected:1;
-+
-+      /* -- configuration (to fill before activation) -- */
-+      void (*power_on_chip)(int on);
-+      void (*reset_pin)(int on);
-+      void (*headphone_out_on)(int on);
-+      void (*speaker_out_on)(int on);
-+
-+      struct i2c_client i2c_client; /* to fill .adapter */
-+      /* ----------------------------------------------- */
-+
-+      struct {
-+              int detected;
-+              struct workqueue_struct *wq;
-+              struct work_struct w;
-+      } hp_detected;
-+};
-+
-+
-+/* Note: opening, closing, suspending and resuming a stream
-+ * require the clocks (MCLK and I2S ones) running
-+ */
-+
-+/* don't forget to specify I2C adapter in i2c_client field */
-+int snd_ak4641_activate(struct snd_ak4641 *ak);
-+
-+void snd_ak4641_deactivate(struct snd_ak4641 *ak);
-+int snd_ak4641_add_mixer_controls(struct snd_ak4641 *ak, struct snd_card *card);
-+int snd_ak4641_open_stream(struct snd_ak4641 *ak, int stream);
-+int snd_ak4641_close_stream(struct snd_ak4641 *ak, int stream);
-+int snd_ak4641_suspend(struct snd_ak4641 *ak, pm_message_t state);
-+int snd_ak4641_resume(struct snd_ak4641 *ak);
-+
-+void snd_ak4641_hp_connected(struct snd_ak4641 *ak, int connected); /* non atomic context */
-+void snd_ak4641_hp_detected(struct snd_ak4641 *ak, int detected); /* atomic context */
-+
-+#endif /* __SOUND_AK4641_H */
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_asic3_leds.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_asic3_leds.c      2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,143 @@
-+/*
-+ * LEDs support for the HP iPaq hx4700
-+ *
-+ * Copyright (c) 2006  Anton Vorontsov <cbou@mail.ru>
-+ *
-+ * 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/platform_device.h>
-+#include <linux/leds.h>
-+#include <linux/soc/asic3_base.h>
-+
-+#include <asm/hardware/ipaq-asic3.h>
-+#include <asm/mach-types.h>
-+#include <asm/hardware/asic3_leds.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+
-+//FIXME
-+//DEFINE_LED_TRIGGER_SHARED_GLOBAL(htcuniversal_radio_trig);
-+//EXPORT_LED_TRIGGER_SHARED(htcuniversal_radio_trig);
-+
-+static struct asic3_led htcuniversal_leds[] = {
-+      {
-+              .led_cdev  = {
-+                      .name           = "htcuniversal:red",
-+                      .default_trigger = "htcuniversal-charging",
-+              },
-+              .hw_num = 2,
-+
-+      },
-+      {
-+              .led_cdev  = {
-+                      .name            = "htcuniversal:green",
-+                      .default_trigger = "htcuniversal-chargefull",
-+              },
-+              .hw_num = 1,
-+      },
-+      {
-+              .led_cdev  = {
-+                      .name            = "htcuniversal:wifi-bt",
-+                      .default_trigger = "htcuniversal-radio",
-+              },
-+              .hw_num = 0,
-+      },
-+      {
-+              .led_cdev  = {
-+                      .name            = "htcuniversal:phonebuttons",
-+                      .default_trigger = "htcuniversal-phonebuttons",
-+              },
-+              .hw_num = -1,
-+              .gpio_num = ('D'-'A')*16+GPIOD_BL_KEYP_PWR_ON,
-+      },
-+      {
-+              .led_cdev  = {
-+                      .name            = "htcuniversal:vibra",
-+                      .default_trigger = "htcuniversal-vibra",
-+              },
-+              .hw_num = -1,
-+              .gpio_num = ('D'-'A')*16+GPIOD_VIBRA_PWR_ON,
-+      },
-+      {
-+              .led_cdev  = {
-+                      .name            = "htcuniversal:flashlight1",
-+                      .default_trigger = "htcuniversal-flashlight1",
-+              },
-+              .hw_num = -1,
-+              .gpio_num = ('A'-'A')*16+GPIOA_FLASHLIGHT,
-+      },
-+      {
-+              .led_cdev  = {
-+                      .name            = "htcuniversal:kbdbacklight",
-+                      .default_trigger = "htcuniversal-kbdbacklight",
-+              },
-+              .hw_num = -1,
-+              .gpio_num = ('D'-'A')*16+GPIOD_BL_KEYB_PWR_ON,
-+      },
-+};
-+
-+void htcuniversal_leds_release(struct device *dev)
-+{
-+      return;
-+}
-+
-+static
-+struct asic3_leds_machinfo htcuniversal_leds_machinfo = {
-+      .num_leds = ARRAY_SIZE(htcuniversal_leds),
-+      .leds = htcuniversal_leds,
-+      .asic3_pdev = &htcuniversal_asic3,
-+};
-+
-+static
-+struct platform_device htcuniversal_leds_pdev = {
-+      .name = "asic3-leds",
-+      .dev = {
-+              .platform_data = &htcuniversal_leds_machinfo,
-+              .release = htcuniversal_leds_release,
-+      },
-+};
-+
-+static
-+int __init htcuniversal_leds_init(void)
-+{
-+      int ret;
-+      printk("htcuniversal LEDs Driver\n");
-+//    led_trigger_register_shared("htcuniversal-radio", &htcuniversal_radio_trig);
-+
-+      ret = asic3_leds_register();
-+      if (ret) goto asic3_leds_failed;
-+
-+      ret = platform_device_register(&htcuniversal_leds_pdev);
-+      if (ret) goto platform_device_failed;
-+
-+      goto success;
-+
-+platform_device_failed:
-+      asic3_leds_unregister();
-+asic3_leds_failed:
-+//    led_trigger_unregister_shared(htcuniversal_radio_trig);
-+      printk("htcuniversal LEDs Driver failed to init");
-+success:
-+      return ret;
-+}
-+
-+static
-+void __exit htcuniversal_leds_exit(void)
-+{
-+//    led_trigger_unregister_shared(htcuniversal_radio_trig);
-+      platform_device_unregister(&htcuniversal_leds_pdev);
-+      asic3_leds_unregister();
-+      return;
-+}
-+
-+module_init(htcuniversal_leds_init);
-+module_exit(htcuniversal_leds_exit);
-+
-+MODULE_AUTHOR("Anton Vorontsov <cbou@mail.ru>");
-+MODULE_DESCRIPTION("htcuniversal LEDs driver");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_bl.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_bl.c      2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,61 @@
-+/*
-+ * Use consistent with the GNU GPL is permitted,
-+ * provided that this copyright notice is
-+ * preserved in its entirety in all copies and derived works.
-+ *
-+ * Copyright (C) 2006 Paul Sokolosvky
-+ * Based on code from older versions of htcuniversal_lcd.c
-+ *
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/platform_device.h>
-+#include <asm/arch/hardware.h>  /* for pxa-regs.h (__REG) */
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/mach-types.h>     /* machine_is_htcuniversal */
-+//#include <linux/corgi_bl.h>
-+#include <linux/backlight.h>
-+#include <linux/err.h>
-+
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+#include <asm/hardware/ipaq-asic3.h>
-+#include <linux/soc/asic3_base.h>
-+
-+#define HTCUNIVERSAL_MAX_INTENSITY 0xc7
-+
-+static void htcuniversal_set_bl_intensity(int intensity)
-+{
-+      PWM_CTRL1 = 1;            /* pre-scaler */
-+      PWM_PWDUTY1 = intensity; /* duty cycle */
-+      PWM_PERVAL1 = HTCUNIVERSAL_MAX_INTENSITY+1;      /* period */
-+
-+      if (intensity > 0) {
-+              pxa_set_cken(CKEN_PWM1, 1);
-+                asic3_set_gpio_out_d(&htcuniversal_asic3.dev,
-+                        (1<<GPIOD_FL_PWR_ON), (1<<GPIOD_FL_PWR_ON));
-+      } else {
-+              pxa_set_cken(CKEN_PWM1, 0);
-+                asic3_set_gpio_out_d(&htcuniversal_asic3.dev,
-+                        (1<<GPIOD_FL_PWR_ON), 0);
-+      }
-+}
-+
-+
-+static struct generic_bl_info htcuniversal_bl_machinfo = {
-+        .default_intensity = HTCUNIVERSAL_MAX_INTENSITY / 4,
-+        .limit_mask = 0xff,
-+        .max_intensity = HTCUNIVERSAL_MAX_INTENSITY,
-+        .set_bl_intensity = htcuniversal_set_bl_intensity,
-+};
-+
-+struct platform_device htcuniversal_bl = {
-+        .name = "corgi-bl",
-+        .dev = {
-+              .platform_data = &htcuniversal_bl_machinfo,
-+      },
-+};
-+
-+MODULE_AUTHOR("Paul Sokolovsky <pmiscml@gmail.com>");
-+MODULE_DESCRIPTION("Backlight driver for HTC Universal");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.c      2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,135 @@
-+/* Bluetooth interface driver for TI BRF6150 on HX4700
-+ *
-+ * Copyright (c) 2005 SDG Systems, LLC
-+ *
-+ * 2005-04-21   Todd Blumer             Created.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/delay.h>
-+#include <linux/platform_device.h>
-+#include <linux/soc/asic3_base.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/arch/serial.h>
-+#include <asm/hardware/ipaq-asic3.h>
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+
-+#include "htcuniversal_bt.h"
-+
-+static uint use_led=1;
-+
-+static void
-+htcuniversal_bt_configure( int state )
-+{
-+      int tries;
-+
-+      printk( KERN_NOTICE "htcuniversal configure bluetooth: %d\n", state );
-+      switch (state) {
-+
-+      case PXA_UART_CFG_PRE_STARTUP:
-+              break;
-+
-+      case PXA_UART_CFG_POST_STARTUP:
-+              /* pre-serial-up hardware configuration */
-+              htcuniversal_egpio_enable(1<<EGPIO5_BT_3V3_ON);
-+              mdelay(50);
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_BT_PWR_ON, 1<<GPIOC_BT_PWR_ON);
-+              mdelay(10);
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_BT_RESET, 0);
-+              mdelay(10);
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_BT_RESET, 1<<GPIOC_BT_RESET);
-+              mdelay(10);
-+
-+              /*
-+               * BRF6150's RTS goes low when firmware is ready
-+               * so check for CTS=1 (nCTS=0 -> CTS=1). Typical 150ms
-+               */
-+              tries = 0;
-+              do {
-+                      mdelay(10);
-+              } while ((BTMSR & MSR_CTS) == 0 && tries++ < 50);
-+              if (use_led) {
-+//                    htcuniversal_set_led(2, 16, 16);
-+              }
-+              break;
-+
-+      case PXA_UART_CFG_PRE_SHUTDOWN:
-+              htcuniversal_egpio_disable(1<<EGPIO5_BT_3V3_ON );
-+              mdelay(50);
-+//            htcuniversal_clear_led(2);
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_BT_PWR_ON, 0);
-+              break;
-+
-+      default:
-+              break;
-+      }
-+}
-+
-+
-+static int
-+htcuniversal_bt_probe( struct platform_device *dev )
-+{
-+      struct htcuniversal_bt_funcs *funcs = dev->dev.platform_data;
-+
-+      /* configure bluetooth UART */
-+      pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_BT_RXD_MD );
-+      pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_BT_TXD_MD );
-+      pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_BT_UART_CTS_MD );
-+      pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_BT_UART_RTS_MD );
-+
-+      funcs->configure = htcuniversal_bt_configure;
-+
-+      /* Make sure the LED is off */
-+//    htcuniversal_clear_led(2);
-+
-+      return 0;
-+}
-+
-+static int
-+htcuniversal_bt_remove( struct platform_device *dev )
-+{
-+      struct htcuniversal_bt_funcs *funcs = dev->dev.platform_data;
-+
-+      funcs->configure = NULL;
-+
-+      /* Make sure the LED is off */
-+//    htcuniversal_clear_led(2);
-+
-+      return 0;
-+}
-+
-+static struct platform_driver bt_driver = {
-+      .driver = {
-+              .name     = "htcuniversal_bt",
-+      },
-+      .probe    = htcuniversal_bt_probe,
-+      .remove   = htcuniversal_bt_remove,
-+};
-+
-+module_param(use_led, uint, 0);
-+
-+static int __init
-+htcuniversal_bt_init( void )
-+{
-+      printk(KERN_NOTICE "htcuniversal Bluetooth Driver\n");
-+      return platform_driver_register( &bt_driver );
-+}
-+
-+static void __exit
-+htcuniversal_bt_exit( void )
-+{
-+      platform_driver_unregister( &bt_driver );
-+}
-+
-+module_init( htcuniversal_bt_init );
-+module_exit( htcuniversal_bt_exit );
-+
-+MODULE_AUTHOR("Todd Blumer, SDG Systems, LLC");
-+MODULE_DESCRIPTION("HTC Universal Bluetooth Support Driver");
-+MODULE_LICENSE("GPL");
-+
-+/* vim600: set noexpandtab sw=8 ts=8 :*/
-+
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_bt.h      2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,17 @@
-+/*
-+ * Bluetooth support file for calling bluetooth configuration functions
-+ *
-+ * Copyright (c) 2005 SDG Systems, LLC
-+ *
-+ * 2005-06    Todd Blumer             Initial Revision
-+ */
-+
-+#ifndef _HTCUNIVERSAL_BT_H
-+#define _HTCUNIVERSAL_BT_H
-+
-+struct htcuniversal_bt_funcs {
-+      void (*configure) ( int state );
-+};
-+
-+
-+#endif
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_buttons.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_buttons.c 2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,87 @@
-+/*
-+ * Buttons driver for HTC Universal
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.
-+ *
-+ * Copyright (C) 2005 Pawel Kolodziejski
-+ * Copyright (C) 2003 Joshua Wise
-+ *
-+ */
-+
-+#include <linux/input.h>
-+#include <linux/input_pda.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/irq.h>
-+#include <linux/platform_device.h>
-+#include <linux/gpio_keys.h>
-+#include <linux/soc/asic3_base.h>
-+#include <asm/mach-types.h>
-+#include <asm/hardware/asic3_keys.h>
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+
-+static struct asic3_keys_button asic3_buttons[] = {
-+//{KEY_SCREEN,                ASIC3_GPIOA_IRQ_BASE+GPIOA_COVER_ROTATE_N,      1,      "screen_cover", EV_SW},
-+//{KEY_SWITCHVIDEOMODE,       ASIC3_GPIOB_IRQ_BASE+GPIOB_CLAMSHELL_N,         1,      "clamshell_rotate", EV_SW},
-+//{KEY_KBDILLUMTOGGLE,        ASIC3_GPIOB_IRQ_BASE+GPIOB_NIGHT_SENSOR,        1,      "night_sensor", EV_SW},
-+{SW_LID,              ASIC3_GPIOA_IRQ_BASE+GPIOA_COVER_ROTATE_N,      1,      "screen_cover", EV_SW},
-+{SW_TABLET_MODE,      ASIC3_GPIOB_IRQ_BASE+GPIOB_CLAMSHELL_N,         1,      "clamshell_rotate", EV_SW},
-+//{SW_NIGHT_SENSOR,   ASIC3_GPIOB_IRQ_BASE+GPIOB_NIGHT_SENSOR,        1,      "night_sensor", EV_SW},
-+{KEY_F10,             ASIC3_GPIOA_IRQ_BASE+GPIOA_BUTTON_BACKLIGHT_N,  1,      "backlight_button"},
-+{KEY_RECORD,          ASIC3_GPIOA_IRQ_BASE+GPIOA_BUTTON_RECORD_N,     1,      "record_button"},
-+{KEY_CAMERA,          ASIC3_GPIOA_IRQ_BASE+GPIOA_BUTTON_CAMERA_N,     1,      "camera_button"},
-+{KEY_VOLUMEDOWN,      ASIC3_GPIOA_IRQ_BASE+GPIOA_VOL_UP_N,            1,      "volume_slider_down"},
-+{KEY_VOLUMEUP,                ASIC3_GPIOA_IRQ_BASE+GPIOA_VOL_DOWN_N,          1,      "volume_slider_up"},
-+{KEY_KPENTER,         ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_OK_N,            1,      "select"},
-+{KEY_RIGHT,           ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_RIGHT_N,         1,      "right"},
-+{KEY_LEFT,            ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_LEFT_N,          1,      "left"},
-+{KEY_DOWN,            ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_DOWN_N,          1,      "down"},
-+{KEY_UP,              ASIC3_GPIOD_IRQ_BASE+GPIOD_KEY_UP_N,            1,      "up"},
-+};
-+
-+static struct asic3_keys_platform_data asic3_keys_data = {
-+        .buttons = asic3_buttons,
-+        .nbuttons = ARRAY_SIZE(asic3_buttons),
-+        .asic3_dev = &htcuniversal_asic3.dev,
-+};
-+
-+static struct platform_device htcuniversal_keys_asic3 = {
-+        .name = "asic3-keys",
-+        .dev = { .platform_data = &asic3_keys_data, }
-+};
-+
-+static int __init htcuniversal_buttons_probe(struct platform_device *dev)
-+{
-+      platform_device_register(&htcuniversal_keys_asic3);
-+      return 0;
-+}
-+
-+static struct platform_driver htcuniversal_buttons_driver = {
-+      .driver         = {
-+          .name       = "htcuniversal_buttons",
-+      },
-+      .probe          = htcuniversal_buttons_probe,
-+};
-+
-+static int __init htcuniversal_buttons_init(void)
-+{
-+      if (!machine_is_htcuniversal())
-+              return -ENODEV;
-+
-+      return platform_driver_register(&htcuniversal_buttons_driver);
-+}
-+
-+static void __exit htcuniversal_buttons_exit(void)
-+{
-+      platform_driver_unregister(&htcuniversal_buttons_driver);
-+}
-+
-+module_init(htcuniversal_buttons_init);
-+module_exit(htcuniversal_buttons_exit);
-+
-+MODULE_AUTHOR ("Joshua Wise, Pawel Kolodziejski, Paul Sokolosvky");
-+MODULE_DESCRIPTION ("Buttons support for HTC Universal");
-+MODULE_LICENSE ("GPL");
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_core.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_core.c    2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,226 @@
-+/* Core Hardware driver for Hx4700 (Serial, ASIC3, EGPIOs)
-+ *
-+ * Copyright (c) 2005 SDG Systems, LLC
-+ *
-+ * 2005-03-29   Todd Blumer             Converted  basic structure to support hx4700
-+ * 2005-04-30 Todd Blumer             Add IRDA code from H2200
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+#include <linux/pm.h>
-+#include <linux/irq.h>
-+
-+#include <asm/io.h>
-+#include <asm/mach/irq.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/pxa-pm_ll.h>
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+
-+#include <linux/soc/asic3_base.h>
-+#include <asm/hardware/ipaq-asic3.h>
-+
-+volatile u_int16_t *egpios;
-+u_int16_t egpio_reg;
-+
-+static int htc_bootloader = 0;        /* Is the stock HTC bootloader installed? */
-+
-+/*
-+ * may make sense to put egpios elsewhere, but they're here now
-+ * since they share some of the same address space with the TI WLAN
-+ *
-+ * EGPIO register is write-only
-+ */
-+
-+void
-+htcuniversal_egpio_enable( u_int16_t bits )
-+{
-+      unsigned long flags;
-+
-+      local_irq_save(flags);
-+
-+      egpio_reg |= bits;
-+      *egpios = egpio_reg;
-+
-+      local_irq_restore(flags);
-+}
-+EXPORT_SYMBOL_GPL(htcuniversal_egpio_enable);
-+
-+void
-+htcuniversal_egpio_disable( u_int16_t bits )
-+{
-+      unsigned long flags;
-+
-+      local_irq_save(flags);
-+
-+      egpio_reg &= ~bits;
-+      *egpios = egpio_reg;
-+
-+      local_irq_restore(flags);
-+}
-+EXPORT_SYMBOL_GPL(htcuniversal_egpio_disable);
-+
-+#ifdef CONFIG_PM
-+
-+void htcuniversal_ll_pm_init(void);
-+
-+static int htcuniversal_suspend(struct platform_device *dev, pm_message_t state)
-+{
-+      /* Turn off external clocks here, because htcuniversal_power and asic3_mmc
-+       * scared to do so to not hurt each other. (-5 mA) */
-+
-+
-+      /* 0x20c2 is HTC clock value
-+       * CLOCK_CDEX_SOURCE            2
-+       * CLOCK_CDEX_SPI               0
-+       * CLOCK_CDEX_OWM               0
-+       *
-+       * CLOCK_CDEX_PWM0              0
-+       * CLOCK_CDEX_PWM1              0
-+       * CLOCK_CDEX_LED0              1
-+       * CLOCK_CDEX_LED1              1
-+       *
-+       * CLOCK_CDEX_LED2              0
-+       * CLOCK_CDEX_SD_HOST           0
-+       * CLOCK_CDEX_SD_BUS            0
-+       * CLOCK_CDEX_SMBUS             0
-+       *
-+       * CLOCK_CDEX_CONTROL_CX        0
-+       * CLOCK_CDEX_EX0               1
-+       * CLOCK_CDEX_EX1               0
-+       * */
-+      asic3_set_clock_cdex(&htcuniversal_asic3.dev, 0xffff, CLOCK_CDEX_SOURCE1
-+                                                           |CLOCK_CDEX_LED0
-+                                                           |CLOCK_CDEX_LED1
-+                                                           |CLOCK_CDEX_LED2
-+                                                           |CLOCK_CDEX_EX0
-+                                                           |CLOCK_CDEX_EX1);
-+
-+      *egpios = 0;    /* turn off all egpio power */
-+
-+      /* Wake up enable. */
-+      PWER =    PWER_GPIO0
-+              | PWER_GPIO1 /* reset */
-+              | PWER_GPIO9 /* USB */
-+              | PWER_GPIO10 /* AC on USB */
-+              | PWER_GPIO14 /* ASIC3 mux */
-+              | PWER_RTC;
-+      /* Wake up on falling edge. */
-+      PFER =    PWER_GPIO0
-+              | PWER_GPIO1
-+              | PWER_GPIO9
-+              | PWER_GPIO10
-+              | PWER_GPIO14;
-+
-+      /* Wake up on rising edge. */
-+      PRER =    PWER_GPIO0
-+              | PWER_GPIO1
-+              | PWER_GPIO9
-+              | PWER_GPIO10;
-+      /* 3.6864 MHz oscillator power-down enable */
-+      PCFR = PCFR_OPDE | PCFR_PI2CEN | PCFR_GPROD | PCFR_GPR_EN;
-+
-+      PGSR0 = 0x09088004;
-+      PGSR1 = 0x00020002;
-+      PGSR2 = 0x8001c000;
-+      PGSR3 = 0x00106284;
-+
-+      PSLR  = 0xcc000000;
-+
-+#if 0
-+      /*
-+       * If we're using bootldr and not the stock HTC bootloader,
-+       * we want to wake up periodically to see if the charge is full while
-+       * it is suspended.  We do this with the OS timer 4 in the pxa270.
-+       */
-+      if (!htc_bootloader) {
-+              OMCR4 = 0x4b;   /* Periodic, self-resetting, 1-second timer */
-+              OSMR4 = 5;      /* Wake up bootldr after x seconds so it can
-+                                 figure out what to do with the LEDs. */
-+              OIER |= 0x10;   /* Enable interrupt source for Timer 4 */
-+              OSCR4 = 0;      /* This starts the timer */
-+      }
-+#endif
-+
-+      asic3_set_extcf_select(&htcuniversal_asic3.dev, ASIC3_EXTCF_OWM_EN, 0);
-+
-+      return 0;
-+}
-+
-+static int htcuniversal_resume(struct platform_device *dev)
-+{
-+      htcuniversal_egpio_enable(0);
-+
-+      return 0;
-+}
-+#else
-+#   define htcuniversal_suspend NULL
-+#   define htcuniversal_resume NULL
-+#endif
-+
-+static int
-+htcuniversal_core_probe( struct platform_device *dev )
-+{
-+
-+      printk( KERN_NOTICE "HTC Universal Core Hardware Driver\n" );
-+
-+      egpios = (volatile u_int16_t *)ioremap_nocache(HTCUNIVERSAL_EGPIO_BASE, sizeof *egpios );
-+      if (!egpios)
-+              return -ENODEV;
-+      else
-+       printk( KERN_NOTICE "HTC Universal Core: egpio at phy=0x%8.8x is at virt=0x%p\n",
-+        HTCUNIVERSAL_EGPIO_BASE, egpios );
-+
-+      printk("Using stock HTC first stage bootloader\n");
-+      htc_bootloader = 1;
-+
-+      htcuniversal_ll_pm_init();
-+
-+      return 0;
-+}
-+
-+static int
-+htcuniversal_core_remove( struct platform_device *dev )
-+{
-+
-+      if (egpios != NULL)
-+              iounmap( (void *)egpios );
-+
-+      return 0;
-+}
-+
-+static struct platform_driver htcuniversal_core_driver = {
-+      .driver = {
-+              .name     = "htcuniversal_core",
-+      },
-+      .probe    = htcuniversal_core_probe,
-+      .remove   = htcuniversal_core_remove,
-+      .suspend  = htcuniversal_suspend,
-+      .resume   = htcuniversal_resume,
-+};
-+
-+static int __init
-+htcuniversal_core_init( void )
-+{
-+      return platform_driver_register( &htcuniversal_core_driver );
-+}
-+
-+
-+static void __exit
-+htcuniversal_core_exit( void )
-+{
-+      platform_driver_unregister( &htcuniversal_core_driver );
-+}
-+
-+module_init( htcuniversal_core_init );
-+module_exit( htcuniversal_core_exit );
-+
-+MODULE_AUTHOR("Todd Blumer, SDG Systems, LLC");
-+MODULE_DESCRIPTION("HTC Universal Core Hardware Driver");
-+MODULE_LICENSE("GPL");
-+
-+/* vim600: set noexpandtab sw=8 ts=8 :*/
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_lcd.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_lcd.c     2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,212 @@
-+/*
-+ * Use consistent with the GNU GPL is permitted,
-+ * provided that this copyright notice is
-+ * preserved in its entirety in all copies and derived works.
-+ *
-+ * History:
-+ *
-+ * 2004-03-01   Eddi De Pieri      Adapted for htcuniversal using h3900_lcd.c
-+ * 2004         Shawn Anderson     Lcd hacking on htcuniversal
-+ * see h3900_lcd.c for more history.
-+ *
-+ */
-+
-+#include <linux/types.h>
-+#include <asm/arch/hardware.h>  /* for pxa-regs.h (__REG) */
-+#include <linux/platform_device.h>
-+#include <asm/arch/pxa-regs.h>  /* LCCR[0,1,2,3]* */
-+#include <asm/arch/bitfield.h>  /* for pxa-regs.h (Fld, etc) */
-+#include <asm/arch/pxafb.h>     /* pxafb_mach_info, set_pxa_fb_info */
-+#include <asm/mach-types.h>     /* machine_is_htcuniversal */
-+#include <linux/lcd.h>          /* lcd_device */
-+#include <linux/err.h>
-+#include <linux/delay.h>
-+
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+#include <asm/hardware/ipaq-asic3.h>
-+#include <linux/soc/asic3_base.h>
-+
-+static int saved_lcdpower=-1;
-+
-+static int powerup_lcd(void)
-+{
-+      printk( KERN_INFO "htcuniversal powerup_lcd: called\n");
-+
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR1_ON, 0);
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR2_ON, 0);
-+              asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_LCD_PWR3_ON, 0);
-+              asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_LCD_PWR4_ON, 0);
-+              asic3_set_gpio_out_a(&htcuniversal_asic3.dev, 1<<GPIOA_LCD_PWR5_ON, 0);
-+#if 1
-+              LCCR4|=LCCR4_PCDDIV;
-+#endif
-+              pxa_set_cken(CKEN_LCD, 0);
-+
-+              mdelay(100);
-+              asic3_set_gpio_out_a(&htcuniversal_asic3.dev, 1<<GPIOA_LCD_PWR5_ON, 1<<GPIOA_LCD_PWR5_ON);
-+              mdelay(5);
-+              asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_LCD_PWR3_ON, 1<<GPIOB_LCD_PWR3_ON);
-+              mdelay(2);
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR1_ON, 1<<GPIOC_LCD_PWR1_ON);
-+              mdelay(2);
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR2_ON, 1<<GPIOC_LCD_PWR2_ON);
-+              mdelay(20);
-+              asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_LCD_PWR4_ON, 1<<GPIOD_LCD_PWR4_ON);
-+              mdelay(1);
-+              pxa_set_cken(CKEN_LCD, 1);
-+
-+              SET_HTCUNIVERSAL_GPIO(LCD1,1);
-+              SET_HTCUNIVERSAL_GPIO(LCD2,1);
-+ return 0;
-+}
-+
-+static int powerdown_lcd(void)
-+{
-+      printk( KERN_INFO "htcuniversal powerdown_lcd: called\n");
-+
-+#if 1
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR2_ON, 0);
-+              mdelay(100);
-+              asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_LCD_PWR4_ON, 0);
-+              mdelay(10);
-+              asic3_set_gpio_out_a(&htcuniversal_asic3.dev, 1<<GPIOA_LCD_PWR5_ON, 0);
-+              mdelay(1);
-+              asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_LCD_PWR3_ON, 0);
-+              mdelay(1);
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR1_ON, 0);
-+              pxa_set_cken(CKEN_LCD, 0);
-+
-+              SET_HTCUNIVERSAL_GPIO(LCD1,0);
-+              SET_HTCUNIVERSAL_GPIO(LCD2,0);
-+#else
-+              pxa_set_cken(CKEN_LCD, 0);
-+
-+              SET_HTCUNIVERSAL_GPIO(LCD1,0);
-+              SET_HTCUNIVERSAL_GPIO(LCD2,0);
-+
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR2_ON, 0);
-+              mdelay(100);
-+              asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_LCD_PWR4_ON, 0);
-+              mdelay(10);
-+              asic3_set_gpio_out_a(&htcuniversal_asic3.dev, 1<<GPIOA_LCD_PWR5_ON, 0);
-+              mdelay(1);
-+              asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_LCD_PWR3_ON, 0);
-+              mdelay(1);
-+              asic3_set_gpio_out_c(&htcuniversal_asic3.dev, 1<<GPIOC_LCD_PWR1_ON, 0);
-+#endif
-+ return 0;
-+}
-+
-+static int htcuniversal_lcd_set_power(struct lcd_device *lm, int power)
-+{
-+       /* Enable or disable power to the LCD (0: on; 4: off) */
-+
-+      if ( power < 1 ) {
-+
-+      powerup_lcd();
-+
-+      } else {
-+
-+      powerdown_lcd();
-+
-+      }
-+
-+      saved_lcdpower=power;
-+
-+      return 0;
-+}
-+
-+static int htcuniversal_lcd_get_power(struct lcd_device *lm)
-+{
-+      /* Get the LCD panel power status (0: full on, 1..3: controller
-+       * power on, flat panel power off, 4: full off) */
-+
-+      if (saved_lcdpower == -1)
-+      {
-+       htcuniversal_lcd_set_power(lm, 4);
-+       saved_lcdpower=4;
-+      }
-+
-+ return saved_lcdpower;
-+}
-+
-+static struct lcd_ops htcuniversal_lcd_properties =
-+{
-+      .get_power      = htcuniversal_lcd_get_power,
-+      .set_power      = htcuniversal_lcd_set_power,
-+};
-+
-+static struct lcd_device *htcuniversal_lcd_dev;
-+
-+static int htcuniversal_lcd_probe(struct platform_device * dev)
-+{
-+      htcuniversal_lcd_dev = lcd_device_register("pxa2xx-fb", NULL,
-+                      &htcuniversal_lcd_properties);
-+      if (IS_ERR(htcuniversal_lcd_dev)) {
-+              printk("htcuniversal_lcd_probe: error registering devices\n");
-+              return -1;
-+      }
-+
-+      return 0;
-+}
-+
-+static int htcuniversal_lcd_remove(struct platform_device * dev)
-+{
-+      htcuniversal_lcd_set_power(htcuniversal_lcd_dev, 4);
-+      lcd_device_unregister(htcuniversal_lcd_dev);
-+
-+      return 0;
-+}
-+
-+static int htcuniversal_lcd_suspend(struct platform_device * dev, pm_message_t state)
-+{
-+//    printk("htcuniversal_lcd_suspend: called.\n");
-+      htcuniversal_lcd_set_power(htcuniversal_lcd_dev, 4);
-+      return 0;
-+}
-+
-+static int htcuniversal_lcd_resume(struct platform_device * dev)
-+{
-+//    printk("htcuniversal_lcd_resume: called.\n");
-+
-+      /* */
-+#if 1
-+      LCCR4|=LCCR4_PCDDIV;
-+#endif
-+
-+      htcuniversal_lcd_set_power(htcuniversal_lcd_dev, 0);
-+      return 0;
-+}
-+
-+static struct platform_driver htcuniversal_lcd_driver = {
-+      .driver = {
-+              .name     = "htcuniversal_lcd",
-+      },
-+      .probe    = htcuniversal_lcd_probe,
-+      .remove   = htcuniversal_lcd_remove,
-+      .suspend  = htcuniversal_lcd_suspend,
-+      .resume   = htcuniversal_lcd_resume,
-+};
-+
-+static int htcuniversal_lcd_init(void)
-+{
-+      if (!machine_is_htcuniversal())
-+              return -ENODEV;
-+
-+      return platform_driver_register(&htcuniversal_lcd_driver);
-+}
-+
-+static void htcuniversal_lcd_exit(void)
-+{
-+      lcd_device_unregister(htcuniversal_lcd_dev);
-+      platform_driver_unregister(&htcuniversal_lcd_driver);
-+}
-+
-+module_init(htcuniversal_lcd_init);
-+module_exit(htcuniversal_lcd_exit);
-+
-+MODULE_AUTHOR("xanadux.org");
-+MODULE_DESCRIPTION("Framebuffer driver for HTC Universal");
-+MODULE_LICENSE("GPL");
-+
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.c   2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,167 @@
-+
-+/* Phone interface driver for Qualcomm MSM6250 on HTC Universal
-+ *
-+ * Copyright (c) 2005 SDG Systems, LLC
-+ *
-+ * 2005-04-21   Todd Blumer             Created.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/delay.h>
-+#include <linux/platform_device.h>
-+#include <linux/soc/asic3_base.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/arch/serial.h>
-+#include <asm/hardware/ipaq-asic3.h>
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+
-+#include "htcuniversal_phone.h"
-+
-+static void phone_reset(void)
-+{
-+      asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_RESET2, 0);
-+
-+      SET_HTCUNIVERSAL_GPIO(PHONE_RESET,0);
-+      asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 0);
-+      mdelay(1);
-+      asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 1<<GPIOD_BB_RESET1);
-+      mdelay(20);
-+      SET_HTCUNIVERSAL_GPIO(PHONE_RESET,1);
-+      mdelay(200);
-+      asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 0);
-+}
-+
-+static void phone_off(void)
-+{
-+      asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 1<<GPIOD_BB_RESET1);
-+      mdelay(2000);
-+      asic3_set_gpio_out_d(&htcuniversal_asic3.dev, 1<<GPIOD_BB_RESET1, 0);
-+
-+      asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_RESET2, 1<<GPIOB_BB_RESET2);
-+      SET_HTCUNIVERSAL_GPIO(PHONE_OFF,0);
-+}
-+
-+static void
-+htcuniversal_phone_configure( int state )
-+{
-+      int tries;
-+      unsigned short statusb;
-+
-+      printk( KERN_NOTICE "htcuniversal configure phone: %d\n", state );
-+      switch (state) {
-+
-+      case PXA_UART_CFG_PRE_STARTUP:
-+              break;
-+
-+      case PXA_UART_CFG_POST_STARTUP:
-+              /* pre-serial-up hardware configuration */
-+
-+              SET_HTCUNIVERSAL_GPIO(PHONE_START,0);   /* "bootloader" */
-+              SET_HTCUNIVERSAL_GPIO(PHONE_UNKNOWN,0); /* not used     */
-+              SET_HTCUNIVERSAL_GPIO(PHONE_OFF,0);     /* PHONE_OFF    */
-+
-+              phone_reset();
-+
-+              SET_HTCUNIVERSAL_GPIO(PHONE_START,1); /* phone */
-+
-+              phone_reset();
-+
-+              asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_READY, 0);
-+              asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_UNKNOWN3, 0);
-+
-+              /*
-+               */
-+              tries = 0;
-+              do {
-+                      mdelay(10);
-+                      statusb = asic3_get_gpio_status_b( &htcuniversal_asic3.dev );
-+              } while ( (statusb & (1<<GPIOB_UMTS_DCD)) == 0 && tries++ < 200);
-+
-+              printk("UMTS_DCD tries=%d of 200\n",tries);
-+
-+              tries = 0;
-+              do {
-+                      SET_HTCUNIVERSAL_GPIO(PHONE_OFF,1);
-+                      mdelay(10);
-+                      SET_HTCUNIVERSAL_GPIO(PHONE_OFF,0);
-+                      mdelay(20);
-+                      statusb = asic3_get_gpio_status_b( &htcuniversal_asic3.dev );
-+              } while ( (statusb & (1<<GPIOB_BB_READY)) == 0 && tries++ < 200);
-+
-+              printk("BB_READY tries=%d of 200\n",tries);
-+
-+              break;
-+
-+      case PXA_UART_CFG_PRE_SHUTDOWN:
-+
-+                      phone_off();
-+
-+              break;
-+
-+      default:
-+              break;
-+      }
-+}
-+
-+
-+static int
-+htcuniversal_phone_probe( struct platform_device *dev )
-+{
-+      struct htcuniversal_phone_funcs *funcs = dev->dev.platform_data;
-+
-+      /* configure phone UART */
-+      pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_PHONE_RXD_MD );
-+      pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_PHONE_TXD_MD );
-+      pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_PHONE_UART_CTS_MD );
-+      pxa_gpio_mode( GPIO_NR_HTCUNIVERSAL_PHONE_UART_RTS_MD );
-+
-+      funcs->configure = htcuniversal_phone_configure;
-+
-+      return 0;
-+}
-+
-+static int
-+htcuniversal_phone_remove( struct platform_device *dev )
-+{
-+      struct htcuniversal_phone_funcs *funcs = dev->dev.platform_data;
-+
-+      funcs->configure = NULL;
-+
-+      asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_READY, 1<<GPIOB_BB_READY);
-+      asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_BB_UNKNOWN3, 1<<GPIOB_BB_UNKNOWN3);
-+
-+      return 0;
-+}
-+
-+static struct platform_driver phone_driver = {
-+      .driver   = {
-+              .name     = "htcuniversal_phone",
-+      },
-+      .probe    = htcuniversal_phone_probe,
-+      .remove   = htcuniversal_phone_remove,
-+};
-+
-+static int __init
-+htcuniversal_phone_init( void )
-+{
-+      printk(KERN_NOTICE "htcuniversal Phone Driver\n");
-+      return platform_driver_register( &phone_driver );
-+}
-+
-+static void __exit
-+htcuniversal_phone_exit( void )
-+{
-+      platform_driver_unregister( &phone_driver );
-+}
-+
-+module_init( htcuniversal_phone_init );
-+module_exit( htcuniversal_phone_exit );
-+
-+MODULE_AUTHOR("Todd Blumer, SDG Systems, LLC");
-+MODULE_DESCRIPTION("HTC Universal Phone Support Driver");
-+MODULE_LICENSE("GPL");
-+
-+/* vim600: set noexpandtab sw=8 ts=8 :*/
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_phone.h   2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,16 @@
-+/*
-+ * Bluetooth support file for calling bluetooth configuration functions
-+ *
-+ * Copyright (c) 2005 SDG Systems, LLC
-+ *
-+ * 2005-06    Todd Blumer             Initial Revision
-+ */
-+
-+#ifndef _HTCUNIVERSAL_PHONE_H
-+#define _HTCUNIVERSAL_PHONE_H
-+
-+struct htcuniversal_phone_funcs {
-+      void (*configure) ( int state );
-+};
-+
-+#endif
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_pm.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_pm.c      2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,69 @@
-+/*
-+ * MyPal 716 power management support for the original HTC IPL in DoC G3
-+ *
-+ * Use consistent with the GNU GPL is permitted, provided that this
-+ * copyright notice is preserved in its entirety in all copies and
-+ * derived works.
-+ *
-+ * Copyright (C) 2005 Pawel Kolodziejski
-+ *
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/device.h>
-+#include <linux/pm.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/pxa-pm_ll.h>
-+
-+#ifdef CONFIG_PM
-+
-+static u32 *addr_a0040000;
-+static u32 *addr_a0040004;
-+static u32 *addr_a0040008;
-+static u32 *addr_a004000c;
-+
-+static u32 save_a0040000;
-+static u32 save_a0040004;
-+static u32 save_a0040008;
-+static u32 save_a004000c;
-+
-+static void htcuniversal_pxa_ll_pm_suspend(unsigned long resume_addr)
-+{
-+      save_a0040000 = *addr_a0040000;
-+      save_a0040004 = *addr_a0040004;
-+      save_a0040008 = *addr_a0040008;
-+      save_a004000c = *addr_a004000c;
-+
-+      /* jump to PSPR */
-+      *addr_a0040000 = 0xe3a00101; // mov r0, #0x40000000
-+      *addr_a0040004 = 0xe380060f; // orr r0, r0, #0x0f000000
-+      *addr_a0040008 = 0xe3800008; // orr r0, r0, #8
-+      *addr_a004000c = 0xe590f000; // ldr pc, [r0]
-+}
-+
-+static void htcuniversal_pxa_ll_pm_resume(void)
-+{
-+      *addr_a0040000 = save_a0040000;
-+      *addr_a0040004 = save_a0040004;
-+      *addr_a0040008 = save_a0040008;
-+      *addr_a004000c = save_a004000c;
-+}
-+
-+static struct pxa_ll_pm_ops htcuniversal_ll_pm_ops = {
-+      .suspend = htcuniversal_pxa_ll_pm_suspend,
-+      .resume  = htcuniversal_pxa_ll_pm_resume,
-+};
-+
-+void htcuniversal_ll_pm_init(void) {
-+      addr_a0040000 = phys_to_virt(0xa0040000);
-+      addr_a0040004 = phys_to_virt(0xa0040004);
-+      addr_a0040008 = phys_to_virt(0xa0040008);
-+      addr_a004000c = phys_to_virt(0xa004000c);
-+
-+      pxa_pm_set_ll_ops(&htcuniversal_ll_pm_ops);
-+}
-+#endif /* CONFIG_PM */
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_power2.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_power2.c  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,97 @@
-+/*
-+ * pda_power driver for HTC Universal
-+ *
-+ * 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/platform_device.h>
-+#include <linux/module.h>
-+#include <linux/pda_power.h>
-+#include <linux/soc/asic3_base.h>
-+
-+#include <asm/mach-types.h>
-+#include <asm/hardware.h>
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+
-+static void charge_on(int flags)
-+{
-+        asic3_set_gpio_out_b(&htcuniversal_asic3.dev, 1<<GPIOB_CHARGE_EN, 0);
-+}
-+
-+static int ac_on(void)
-+{
-+ return (GET_HTCUNIVERSAL_GPIO(POWER_DET) == 0);
-+}
-+
-+static int usb_on(void)
-+{
-+ return (GET_HTCUNIVERSAL_GPIO(USB_DET) == 0);
-+}
-+
-+static char *supplicants[] = {
-+      "ds2760-battery.0", "backup-battery"
-+};
-+
-+static struct pda_power_pdata power_pdata = {
-+      .is_ac_online   = ac_on,
-+      .is_usb_online  = usb_on,
-+      .set_charge     = charge_on,
-+      .supplied_to = supplicants,
-+      .num_supplicants = ARRAY_SIZE(supplicants),
-+};
-+
-+static struct resource power_resources[] = {
-+      [0] = {
-+              .name   = "ac",
-+              .start  = HTCUNIVERSAL_IRQ(POWER_DET),
-+              .end    = HTCUNIVERSAL_IRQ(POWER_DET),
-+              .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE,
-+      },
-+      [1] = {
-+              .name   = "usb",
-+              .start  = HTCUNIVERSAL_IRQ(USB_DET),
-+              .end    = HTCUNIVERSAL_IRQ(USB_DET),
-+              .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE | IORESOURCE_IRQ_LOWEDGE,
-+      },
-+};
-+
-+static void dev_release(struct device *dev)
-+{
-+      return;
-+}
-+
-+static struct platform_device power_dev =
-+{
-+      .name           = "pda-power",
-+      .id             = -1,
-+      .resource       = power_resources,
-+      .num_resources  = ARRAY_SIZE(power_resources),
-+      .dev =
-+       {
-+              .platform_data  = &power_pdata,
-+              .release        = dev_release,
-+       },
-+};
-+
-+static int htcuniversal_power_init(void)
-+{
-+ return platform_device_register(&power_dev);
-+}
-+
-+static void htcuniversal_power_exit(void)
-+{
-+      platform_device_unregister(&power_dev);
-+
-+      return;
-+}
-+
-+module_init(htcuniversal_power_init);
-+module_exit(htcuniversal_power_exit);
-+
-+MODULE_DESCRIPTION("Power driver for HTC Universal");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_ts2.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_ts2.c     2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,490 @@
-+/* Touch screen driver for the TI something-or-other
-+ *
-+ * Copyright Â© 2005 SDG Systems, LLC
-+ *
-+ * Based on code that was based on the SAMCOP driver.
-+ *     Copyright Â© 2003, 2004 Compaq Computer Corporation.
-+ *
-+ * Use consistent with the GNU GPL is permitted,
-+ * provided that this copyright notice is
-+ * preserved in its entirety in all copies and derived works.
-+ *
-+ * COMPAQ COMPUTER CORPORATION MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
-+ * AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
-+ * FITNESS FOR ANY PARTICULAR PURPOSE.
-+ *
-+ * Author:  Keith Packard <keith.packard@hp.com>
-+ *          May 2003
-+ *
-+ * Updates:
-+ *
-+ * 2004-02-11   Michael Opdenacker      Renamed names from samcop to shamcop,
-+ *                                      Goal:support HAMCOP and SAMCOP.
-+ * 2004-02-14   Michael Opdenacker      Temporary fix for device id handling
-+ *
-+ * 2005-02-18   Aric Blumer             Converted  basic structure to support hx4700
-+ *
-+ * 2005-06-07   Aric Blumer             Added tssim device handling so we can
-+ *                                      hook in the fbvncserver.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/version.h>
-+
-+#include <linux/init.h>
-+#include <linux/fs.h>
-+#include <linux/cdev.h>
-+#include <linux/interrupt.h>
-+#include <linux/sched.h>
-+#include <linux/pm.h>
-+#include <linux/delay.h>
-+#include <linux/input.h>
-+#include <linux/platform_device.h>
-+#include <linux/irq.h>
-+
-+#include <asm/arch/hardware.h>
-+#include <asm/mach/irq.h>
-+#include <asm/io.h>
-+
-+/* remove me */
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+#include <asm/mach-types.h>
-+
-+#include <asm/hardware/ipaq-asic3.h>
-+#include <linux/soc/asic3_base.h>
-+
-+
-+#include "tsc2046_ts.h"
-+
-+enum touchscreen_state {
-+    STATE_WAIT_FOR_TOUCH,   /* Waiting for a PEN interrupt */
-+    STATE_SAMPLING          /* Actively sampling ADC */
-+};
-+
-+struct touchscreen_data {
-+    enum touchscreen_state state;
-+    struct timer_list      timer;
-+    int                    irq;
-+    struct input_dev       *input;
-+    /* */
-+    int                       port;
-+    int                       clock;
-+    int                       pwrbit_X;
-+    int                       pwrbit_Y;
-+    int                       (*pen_down)(void);
-+};
-+
-+static unsigned long poll_sample_time   = 10; /* Sample every 10 milliseconds */
-+
-+static struct touchscreen_data *ts_data;
-+
-+static int irqblock;
-+
-+module_param(poll_sample_time, ulong, 0644);
-+MODULE_PARM_DESC(poll_sample_time, "Poll sample time");
-+
-+static inline void
-+report_touchpanel(struct touchscreen_data *ts, int pressure, int x, int y)
-+{
-+    input_report_abs(ts->input, ABS_PRESSURE, pressure);
-+    input_report_abs(ts->input, ABS_X, x);
-+    input_report_abs(ts->input, ABS_Y, y);
-+    input_sync(ts->input);
-+}
-+
-+static void start_read(struct touchscreen_data *touch);
-+
-+static irqreturn_t
-+pen_isr(int irq, void *irq_desc)
-+{
-+    struct touchscreen_data *ts = ts_data;
-+
-+    if(irq == ts->irq /* && !irqblock */) {
-+        irqblock = 1;
-+
-+        /*
-+         * Disable the pen interrupt.  It's reenabled when the user lifts the
-+         * pen.
-+         */
-+        disable_irq(ts->irq);
-+
-+        if (ts->state == STATE_WAIT_FOR_TOUCH) {
-+            ts->state = STATE_SAMPLING;
-+            start_read(ts);
-+        } else {
-+            /* Shouldn't happen */
-+            printk(KERN_ERR "Unexpected ts interrupt\n");
-+        }
-+
-+    }
-+    return IRQ_HANDLED;
-+}
-+
-+static void
-+ssp_init(int port, int clock)
-+{
-+
-+    pxa_set_cken(clock, 0);
-+
-+    pxa_gpio_mode(GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_CLK_MD);
-+    pxa_gpio_mode(GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_FRM_MD);
-+    pxa_gpio_mode(GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_DO_MD);
-+    pxa_gpio_mode(GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_DI_MD);
-+
-+    SET_HTCUNIVERSAL_GPIO(SPI_FRM,1);
-+
-+    /* *** Set up the SPI Registers *** */
-+    SSCR0_P(port) =
-+          SSCR0_EDSS         /* Extended Data Size Select */
-+        | SSCR0_SerClkDiv(7) /* Serial Clock Rate */
-+                             /* Synchronous Serial Enable (Disable for now) */
-+        | SSCR0_Motorola     /* Motorola SPI Interface */
-+        | SSCR0_DataSize(8)  /* Data Size Select  (24-bit) */
-+        ;
-+    SSCR1_P(port) = 0;
-+    SSPSP_P(port) = 0;
-+
-+    /* Clear the Status */
-+    SSSR_P(port)  = SSSR_P(port) & 0x00fcfffc;
-+
-+    /* Now enable it */
-+    SSCR0_P(port) =
-+          SSCR0_EDSS         /* Extended Data Size Select */
-+        | SSCR0_SerClkDiv(7) /* Serial Clock Rate */
-+        | SSCR0_SSE          /* Synchronous Serial Enable */
-+        | SSCR0_Motorola     /* Motorola SPI Interface */
-+        | SSCR0_DataSize(8)  /* Data Size Select  (24-bit) */
-+        ;
-+
-+    pxa_set_cken(clock, 1);
-+}
-+
-+static void
-+start_read(struct touchscreen_data *touch)
-+{
-+    unsigned long inc = (poll_sample_time * HZ) / 1000;
-+    int i;
-+
-+    /* Write here to the serial port. We request X and Y only for now.
-+     * Then we have to wait for poll_sample_time before we read out the serial
-+     * port.  Then, when we read it out, we check to see if the pen is still
-+     * down.  If so, then we issue another request here.
-+     */
-+#define TS_SAMPLES 7
-+
-+    /*
-+     * We do four samples for each, and throw out the highest and lowest, then
-+     * average the other two.
-+     */
-+
-+    for(i = 0; i < TS_SAMPLES; i++) {
-+        while(!(SSSR_P(touch->port) & SSSR_TNF))
-+            ;
-+        /* It's not full. Write the command for X */
-+        SSDR_P(touch->port) = (TSC2046_SAMPLE_X|(touch->pwrbit_X))<<16;
-+    }
-+
-+    for(i = 0; i < TS_SAMPLES; i++) {
-+        while(!(SSSR_P(touch->port) & SSSR_TNF))
-+            ;
-+        /* It's not full. Write the command for Y */
-+        SSDR_P(touch->port)  = (TSC2046_SAMPLE_Y|(touch->pwrbit_Y))<<16;
-+    }
-+
-+    /*
-+     * Enable the timer. We should get an interrupt, but we want keep a timer
-+     * to ensure that we can detect missing data
-+     */
-+    mod_timer(&touch->timer, jiffies + inc);
-+}
-+
-+static void
-+ts_timer_callback(unsigned long data)
-+{
-+    struct touchscreen_data *ts = (struct touchscreen_data *)data;
-+    int x, a[TS_SAMPLES], y;
-+    static int oldx, oldy;
-+    int ssrval;
-+
-+    /*
-+     * Check here to see if there is anything in the SPI FIFO.  If so,
-+     * return it if there has been a change.  If not, then we have a
-+     * timeout.  Generate an erro somehow.
-+     */
-+    ssrval = SSSR_P(ts->port);
-+
-+    if(ssrval & SSSR_RNE) { /* Look at Rx Not Empty bit */
-+        int number_of_entries_in_fifo;
-+
-+        /* The FIFO is not emtpy. Good! Now make sure there are at least two
-+         * entries. (Should be two exactly.) */
-+
-+        number_of_entries_in_fifo = ((ssrval >> 12) & 0xf) + 1;
-+
-+        if(number_of_entries_in_fifo < TS_SAMPLES * 2) {
-+            /* Not ready yet. Come back later. */
-+            unsigned long inc = (poll_sample_time * HZ) / 1000;
-+            mod_timer(&ts->timer, jiffies + inc);
-+            return;
-+        }
-+
-+        if(number_of_entries_in_fifo == TS_SAMPLES * 2) {
-+            int i, j;
-+
-+            for(i = 0; i < TS_SAMPLES; i++) {
-+                a[i] = SSDR_P(ts->port);
-+            }
-+            /* Sort them (bubble) */
-+            for(j = TS_SAMPLES - 1; j > 0; j--) {
-+                for(i = 0; i < j; i++) {
-+                    if(a[i] > a[i + 1]) {
-+                        int tmp;
-+                        tmp    = a[i+1];
-+                        a[i+1] = a[i];
-+                        a[i]   = tmp;
-+                    }
-+                }
-+            }
-+
-+            /* Take the average of the middle two */
-+            /* x = (a[TS_SAMPLES/2 - 1] + a[TS_SAMPLES/2] + a[TS_SAMPLES/2+1] + a[TS_SAMPLES/2+2]) >> 2; */
-+            x = a[TS_SAMPLES/2];
-+
-+            for(i = 0; i < TS_SAMPLES; i++) {
-+                a[i] = SSDR_P(ts->port);
-+            }
-+            /* Sort them (bubble) */
-+            for(j = TS_SAMPLES - 1; j > 0; j--) {
-+                for(i = 0; i < j; i++) {
-+                    if(a[i] > a[i + 1]) {
-+                        int tmp;
-+                        tmp    = a[i+1];
-+                        a[i+1] = a[i];
-+                        a[i]   = tmp;
-+                    }
-+                }
-+            }
-+
-+
-+            /* Take the average of the middle two */
-+            /* y = (a[TS_SAMPLES/2 - 1] + a[TS_SAMPLES/2] + a[TS_SAMPLES/2+1] + a[TS_SAMPLES/2+2]) >> 2; */
-+            y = a[TS_SAMPLES/2];
-+        } else {
-+            /* We have an error! Too many entries. */
-+            printk(KERN_ERR "TS: Expected %d entries. Got %d\n", TS_SAMPLES*2, number_of_entries_in_fifo);
-+            /* Try to clear the FIFO */
-+            while(number_of_entries_in_fifo--) {
-+                (void)SSDR_P(ts->port);
-+            }
-+
-+            if (ts->pen_down())
-+                start_read(ts);
-+
-+            return;
-+        }
-+    } else {
-+        /* Not ready yet. Come back later. */
-+        unsigned long inc = (poll_sample_time * HZ) / 1000;
-+        mod_timer(&ts->timer, jiffies + inc);
-+        return;
-+    }
-+
-+    /*
-+     * Now we check to see if the pen is still down.  If it is, then call
-+     * start_read().
-+     */
-+    if (ts->pen_down())
-+    {
-+        /* Still down */
-+        if(oldx != x || oldy != y) {
-+            oldx = x;
-+            oldy = y;
-+            report_touchpanel(ts, 1, x, y);
-+        }
-+        start_read(ts);
-+    } else {
-+        /* Up */
-+        report_touchpanel(ts, 0, 0, 0);
-+        irqblock = 0;
-+        ts->state = STATE_WAIT_FOR_TOUCH;
-+        /* Re-enable pen down interrupt */
-+        enable_irq(ts->irq);
-+    }
-+}
-+
-+static int pen_down(void)
-+{
-+ return ( asic3_get_gpio_status_a( &htcuniversal_asic3.dev ) & (1<<GPIOA_TOUCHSCREEN_N)) == 0 ;
-+}
-+
-+static int
-+ts_probe (struct platform_device *dev)
-+{
-+    int retval;
-+    struct touchscreen_data *ts;
-+    struct tsc2046_mach_info *mach = dev->dev.platform_data;
-+
-+    printk("htcuniversal: ts_probe\n");
-+
-+    ts = ts_data = kmalloc (sizeof (*ts), GFP_KERNEL);
-+    if (ts == NULL) {
-+      printk( KERN_NOTICE "htcuniversal_ts: unable to allocate memory\n" );
-+      return -ENOMEM;
-+    }
-+    memset (ts, 0, sizeof (*ts));
-+
-+    ts->input = input_allocate_device();
-+    if (ts->input == NULL) {
-+      printk( KERN_NOTICE "htcuniversal_ts: unable to allocation touchscreen input\n" );
-+      kfree(ts);
-+      return -ENOMEM;
-+    }
-+    ts->input->evbit[0]             = BIT(EV_ABS);
-+    ts->input->absbit[0]            = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
-+    ts->input->absmin[ABS_X]        = 0;
-+    ts->input->absmax[ABS_X]        = 32767;
-+    ts->input->absmin[ABS_Y]        = 0;
-+    ts->input->absmax[ABS_Y]        = 32767;
-+    ts->input->absmin[ABS_PRESSURE] = 0;
-+    ts->input->absmax[ABS_PRESSURE] = 1;
-+
-+    ts->input->name = "htcuniversal_ts";
-+    ts->input->phys =  "touchscreen/htcuniversal_ts";
-+    ts->input->private = ts;
-+
-+    input_register_device(ts->input);
-+
-+    ts->timer.function = ts_timer_callback;
-+    ts->timer.data = (unsigned long)ts;
-+    ts->state = STATE_WAIT_FOR_TOUCH;
-+    init_timer (&ts->timer);
-+
-+    platform_set_drvdata(dev, ts);
-+
-+    ts->port=-1;
-+
-+    if (mach) {
-+        ts->port = mach->port;
-+        ts->clock = mach->clock;
-+        ts->pwrbit_X = mach->pwrbit_X;
-+        ts->pwrbit_Y = mach->pwrbit_Y;
-+
-+        /* static irq */
-+        if (mach->irq)
-+         ts->irq = mach->irq;
-+
-+        if (mach->pen_down)
-+         ts->pen_down=mach->pen_down;
-+    }
-+
-+    if (ts->port == -1)
-+    {
-+     printk("tsc2046: your device is not supported by this driver\n");
-+     return -ENODEV;
-+    }
-+
-+    /* *** Initialize the SSP interface *** */
-+    ssp_init(ts->port, ts->clock);
-+
-+    while(!(SSSR_P(ts->port) & SSSR_TNF))
-+        ;
-+    SSDR_P(ts->port) = (TSC2046_SAMPLE_X|(ts->pwrbit_X))<<16;
-+
-+    for(retval = 0; retval < 100; retval++) {
-+        if(SSSR_P(ts->port) & SSSR_RNE) {
-+            while(SSSR_P(ts->port) & SSSR_RNE) {
-+                (void)SSDR_P(ts->port);
-+            }
-+            break;
-+        }
-+        mdelay(1);
-+    }
-+
-+    if (machine_is_htcuniversal() )
-+    {
-+     ts->irq = asic3_irq_base( &htcuniversal_asic3.dev ) + ASIC3_GPIOA_IRQ_BASE + GPIOA_TOUCHSCREEN_N;
-+     ts->pen_down=pen_down;
-+    }
-+
-+    retval = request_irq(ts->irq, pen_isr, SA_INTERRUPT, "tsc2046_ts", ts);
-+    if(retval) {
-+        printk("Unable to get interrupt\n");
-+        input_unregister_device (ts->input);
-+        return -ENODEV;
-+    }
-+    set_irq_type(ts->irq, IRQ_TYPE_EDGE_FALLING);
-+
-+    return 0;
-+}
-+
-+static int
-+ts_remove (struct platform_device *dev)
-+{
-+    struct touchscreen_data *ts = platform_get_drvdata(dev);
-+
-+    input_unregister_device (ts->input);
-+    del_timer_sync (&ts->timer);
-+    free_irq (ts->irq, ts);
-+    pxa_set_cken(ts->clock, 0);
-+
-+    kfree(ts);
-+    return 0;
-+}
-+
-+static int
-+ts_suspend (struct platform_device *dev, pm_message_t state)
-+{
-+    struct touchscreen_data *ts = platform_get_drvdata(dev);
-+
-+    disable_irq(ts->irq);
-+
-+    printk("htcuniversal_ts2_suspend: called.\n");
-+    return 0;
-+}
-+
-+static int
-+ts_resume (struct platform_device *dev)
-+{
-+    struct touchscreen_data *ts = platform_get_drvdata(dev);
-+
-+    ts->state = STATE_WAIT_FOR_TOUCH;
-+    ssp_init(ts->port, ts->clock);
-+    enable_irq(ts->irq);
-+
-+    printk("htcuniversal_ts2_resume: called.\n");
-+    return 0;
-+}
-+
-+static struct platform_driver ts_driver = {
-+    .probe    = ts_probe,
-+    .remove   = ts_remove,
-+    .suspend  = ts_suspend,
-+    .resume   = ts_resume,
-+    .driver = {
-+              .name = "htcuniversal_ts",
-+      },
-+};
-+
-+
-+static int
-+ts_module_init (void)
-+{
-+    printk(KERN_NOTICE "HTC Universal Touch Screen Driver\n");
-+
-+    return platform_driver_register(&ts_driver);
-+}
-+
-+static void
-+ts_module_cleanup (void)
-+{
-+    platform_driver_unregister (&ts_driver);
-+}
-+
-+module_init(ts_module_init);
-+module_exit(ts_module_cleanup);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Aric Blumer, SDG Systems, LLC");
-+MODULE_DESCRIPTION("HTC Universal Touch Screen Driver");
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_udc.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/htcuniversal_udc.c     2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,71 @@
-+
-+/*
-+ *
-+ * htcuniversal_udc.c:
-+ * htcuniversal specific code for the pxa27x usb device controller.
-+ *
-+ * Use consistent with the GNU GPL is permitted.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <asm/arch/hardware.h>
-+#include <asm/arch/pxa-regs.h>
-+#include <asm/arch/udc.h>
-+#include <linux/soc/asic3_base.h>
-+#include <asm/arch/htcuniversal-gpio.h>
-+#include <asm/arch/htcuniversal-asic.h>
-+
-+static void htcuniversal_udc_command(int cmd)
-+{
-+      switch (cmd) {
-+      case PXA2XX_UDC_CMD_DISCONNECT:
-+              asic3_set_gpio_out_b(&htcuniversal_asic3.dev,
-+                                         1<<GPIOB_USB_PUEN, 0);
-+//            SET_HTCUNIVERSAL_GPIO(USB_PUEN,0);
-+              break;
-+      case PXA2XX_UDC_CMD_CONNECT:
-+              asic3_set_gpio_out_b(&htcuniversal_asic3.dev,
-+                                         1<<GPIOB_USB_PUEN,  1<<GPIOB_USB_PUEN);
-+//            SET_HTCUNIVERSAL_GPIO(USB_PUEN,1);
-+              break;
-+      default:
-+              printk("_udc_control: unknown command!\n");
-+              break;
-+      }
-+}
-+
-+static int htcuniversal_udc_is_connected(void)
-+{
-+      return (GET_HTCUNIVERSAL_GPIO(USB_DET) != 0);
-+}
-+
-+static struct pxa2xx_udc_mach_info htcuniversal_udc_info __initdata = {
-+      .udc_is_connected = htcuniversal_udc_is_connected,
-+      .udc_command      = htcuniversal_udc_command,
-+};
-+
-+static int htcuniversal_udc_probe(struct platform_device * dev)
-+{
-+      asic3_set_gpio_dir_b(&htcuniversal_asic3.dev, 1<<GPIOB_USB_PUEN, 1<<GPIOB_USB_PUEN);
-+
-+      pxa_set_udc_info(&htcuniversal_udc_info);
-+      return 0;
-+}
-+
-+static struct platform_driver htcuniversal_udc_driver = {
-+      .driver   = {
-+              .name     = "htcuniversal_udc",
-+      },
-+      .probe    = htcuniversal_udc_probe,
-+};
-+
-+static int __init htcuniversal_udc_init(void)
-+{
-+      return platform_driver_register(&htcuniversal_udc_driver);
-+}
-+
-+module_init(htcuniversal_udc_init);
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/arch/arm/mach-pxa/htcuniversal/tsc2046_ts.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/arch/arm/mach-pxa/htcuniversal/tsc2046_ts.h   2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,20 @@
-+/*
-+ * temporary TSC2046 touchscreen hack
-+ */
-+
-+#ifndef _TSC2046_TS_H
-+#define _TSC2046_TS_H
-+
-+struct tsc2046_mach_info {
-+    int port;
-+    int clock;
-+    int pwrbit_X;
-+    int pwrbit_Y;
-+    int irq;
-+    int (*pen_down)(void);
-+};
-+
-+#define TSC2046_SAMPLE_X 0xd0
-+#define TSC2046_SAMPLE_Y 0x90
-+
-+#endif
-Index: linux-2.6.22/arch/arm/mach-pxa/Kconfig
-===================================================================
---- linux-2.6.22.orig/arch/arm/mach-pxa/Kconfig        2007-08-23 13:09:21.000000000 +0200
-+++ linux-2.6.22/arch/arm/mach-pxa/Kconfig     2007-08-23 13:09:22.000000000 +0200
-@@ -46,6 +46,14 @@
-       help
-         This enables support for the HP iPAQ HX2750 handheld.
-+config MACH_HTCUNIVERSAL
-+      bool "HTC Universal"
-+      select PXA27x
-+      help
-+        Say Y here if you intend to run this kernel on a
-+        HTC Universal. Currently there is only basic support
-+        for this PDA.
-+
- endchoice
- if PXA_SHARPSL
-@@ -80,6 +88,86 @@
- endif
-+if MACH_HTCUNIVERSAL
-+
-+menu "HTC Universal support"
-+
-+config HTCUNIVERSAL_CORE
-+        tristate "HTC Universal core"
-+        depends on MACH_HTCUNIVERSAL
-+        help
-+          This selection enables HTC Universal core support.
-+
-+config HTCUNIVERSAL_UDC
-+        bool "USB Device Controller support"
-+        depends on MACH_HTCUNIVERSAL && HTC_ASIC3 && USB_PXA27X
-+        help
-+          Enables HTC Universal specific USB detection
-+
-+config HTCUNIVERSAL_POWER
-+        tristate "HTC Universal power"
-+        depends on MACH_HTCUNIVERSAL && HTC_ASIC3
-+        help
-+          This selection enables HTC Universal power monitoring
-+                  hardware support (through ASIC3).
-+
-+config HTCUNIVERSAL_BACKLIGHT
-+      bool "HTC Universal Backlight"
-+      depends on MACH_HTCUNIVERSAL && HTC_ASIC3 && BACKLIGHT_CLASS_DEVICE
-+      help
-+        This driver provides support for changing power and brightness
-+        on HTC Universal LCD backlight.
-+
-+config HTCUNIVERSAL_LCD
-+      tristate "HTC Universal LCD"
-+      depends on MACH_HTCUNIVERSAL && HTC_ASIC3 && LCD_CLASS_DEVICE
-+      help
-+        This driver provides support for changing power and brightness
-+        on HTC Universal LCD display.
-+
-+config HTCUNIVERSAL_TS2
-+      tristate "HTC Universal Touchscreen (old)"
-+      depends on MACH_HTCUNIVERSAL && HTC_ASIC3
-+      help
-+        Enable support for the HTC Universal Touchscreen Panel.
-+
-+config HTCUNIVERSAL_BUTTONS
-+        tristate "HTC Universal buttons support"
-+        depends on MACH_HTCUNIVERSAL && HTC_ASIC3
-+
-+config HTCUNIVERSAL_BLUETOOTH
-+      tristate "HTC Universal Bluetooth"
-+      depends on MACH_HTCUNIVERSAL && HTCUNIVERSAL_CORE && HTC_ASIC3
-+      help
-+        Enables support for the TI BRF6150 Bluetooth Module
-+        in the HTC Universal.
-+
-+config HTCUNIVERSAL_ASIC3_LEDS
-+      tristate "HTC Universal ASIC3 LED support"
-+      select LEDS_ASIC3
-+      depends on MACH_HTCUNIVERSAL && HTCUNIVERSAL_CORE && HTC_ASIC3
-+      ---help---
-+      Support for right (colors red+green+(amber)) and left (green+blue) led
-+      Off/on hook keys LED backlight
-+      Keyboard backlight
-+      Vibra
-+      Flashlight
-+
-+config HTCUNIVERSAL_PHONE
-+      tristate "HTC Universal Phone"
-+      depends on MACH_HTCUNIVERSAL && HTCUNIVERSAL_CORE && HTC_ASIC3
-+      help
-+        Enables support for the Qualcomm MSM6520 Phone Module
-+        in the HTC Universal.
-+
-+config HTCUNIVERSAL_AK4641
-+      depends on SND && I2C
-+      tristate "AK4641 chipset support"
-+
-+endmenu
-+
-+endif
-+
- endmenu
- config MACH_POODLE
-@@ -160,4 +248,3 @@
-       depends on (PXA25x || PXA27x) && INPUT
- endif
--
-Index: linux-2.6.22/arch/arm/mach-pxa/Makefile
-===================================================================
---- linux-2.6.22.orig/arch/arm/mach-pxa/Makefile       2007-08-23 13:09:21.000000000 +0200
-+++ linux-2.6.22/arch/arm/mach-pxa/Makefile    2007-08-23 13:09:22.000000000 +0200
-@@ -19,6 +19,7 @@
- obj-$(CONFIG_MACH_POODLE)     += poodle.o corgi_ssp.o sharpsl_pm.o poodle_pm.o
- obj-$(CONFIG_MACH_TOSA)         += tosa.o
- obj-$(CONFIG_MACH_HX2750)     += hx2750.o hx2750_test.o
-+obj-$(CONFIG_MACH_HTCUNIVERSAL) += htcuniversal/
- # Support for blinky lights
- led-y := leds.o
-Index: linux-2.6.22/arch/arm/mach-pxa/pm.c
-===================================================================
---- linux-2.6.22.orig/arch/arm/mach-pxa/pm.c   2007-08-23 13:09:20.000000000 +0200
-+++ linux-2.6.22/arch/arm/mach-pxa/pm.c        2007-08-23 13:09:22.000000000 +0200
-@@ -22,6 +22,7 @@
- #include <asm/system.h>
- #include <asm/arch/pm.h>
- #include <asm/arch/pxa-regs.h>
-+#include <asm/arch/pxa-pm_ll.h>
- #include <asm/arch/lubbock.h>
- #include <asm/mach/time.h>
-@@ -75,12 +76,16 @@
- };
-+static struct pxa_ll_pm_ops *ll_ops;
-+
- int pxa_pm_enter(suspend_state_t state)
- {
-       unsigned long sleep_save[SLEEP_SAVE_SIZE];
-       unsigned long checksum = 0;
-+      struct timespec delta, rtc;
-       int i;
-       extern void pxa_cpu_pm_enter(suspend_state_t state);
-+      extern void pxa_cpu_resume(void);
- #ifdef CONFIG_IWMMXT
-       /* force any iWMMXt context to ram **/
-@@ -88,6 +93,11 @@
-               iwmmxt_task_disable(NULL);
- #endif
-+      /* preserve current time */
-+      rtc.tv_sec = RCNR;
-+      rtc.tv_nsec = 0;
-+      save_time_delta(&delta, &rtc);
-+
-       SAVE(GPLR0); SAVE(GPLR1); SAVE(GPLR2);
-       SAVE(GPDR0); SAVE(GPDR1); SAVE(GPDR2);
-       SAVE(GRER0); SAVE(GRER1); SAVE(GRER2);
-@@ -123,6 +133,15 @@
-       /* Clear sleep reset status */
-       RCSR = RCSR_SMR;
-+      /* Set resume return address */
-+      PSPR = virt_to_phys(pxa_cpu_resume);
-+
-+      /* If we have special sus/res logic, use it */
-+      if(ll_ops && ll_ops->suspend) {
-+              extern void pxa_cpu_resume(void);
-+              ll_ops->suspend(virt_to_phys(pxa_cpu_resume));
-+      }
-+
-       /* before sleeping, calculate and save a checksum */
-       for (i = 0; i < SLEEP_SAVE_SIZE - 1; i++)
-               checksum += sleep_save[i];
-@@ -138,6 +157,9 @@
-       for (i = 0; i < SLEEP_SAVE_SIZE - 1; i++)
-               checksum += sleep_save[i];
-+      if(ll_ops && ll_ops->resume)
-+              ll_ops->resume();
-+
-       /* if invalid, display message and wait for a hardware reset */
-       if (checksum != sleep_save[SLEEP_SAVE_CKSUM]) {
- #ifdef CONFIG_ARCH_LUBBOCK
-@@ -179,6 +201,10 @@
-       RESTORE(PSTR);
-+      /* restore current time */
-+      rtc.tv_sec = RCNR;
-+      restore_time_delta(&delta, &rtc);
-+
- #ifdef DEBUG
-       printk(KERN_DEBUG "*** made it back from resume\n");
- #endif
-@@ -188,6 +214,13 @@
- EXPORT_SYMBOL_GPL(pxa_pm_enter);
-+struct pxa_ll_pm_ops *pxa_pm_set_ll_ops(struct pxa_ll_pm_ops *new_ops) {
-+      struct pxa_ll_pm_ops *old_ops = ll_ops;
-+      ll_ops = new_ops;
-+      return old_ops;
-+}
-+EXPORT_SYMBOL(pxa_pm_set_ll_ops);
-+
- unsigned long sleep_phys_sp(void *sp)
- {
-       return virt_to_phys(sp);
-@@ -219,8 +252,9 @@
-       .prepare        = pxa_pm_prepare,
-       .enter          = pxa_pm_enter,
-       .finish         = pxa_pm_finish,
--      .valid          = pm_valid_only_mem,
-+      .valid          = pm_valid_only_mem,
- };
-+//EXPORT_SYMBOL(pxa_pm_ops);
- extern void pxa_cpu_resume(void);
-Index: linux-2.6.22/drivers/input/keyboard/pxa27x_keyboard.c
-===================================================================
---- linux-2.6.22.orig/drivers/input/keyboard/pxa27x_keyboard.c 2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/input/keyboard/pxa27x_keyboard.c      2007-08-23 13:09:22.000000000 +0200
-@@ -140,7 +140,7 @@
-               KPREC = pdata->reg_kprec;
-               /* Enable unit clock */
--              pxa_set_cken(CKEN19_KEYPAD, 1);
-+              pxa_set_cken(CKEN_KEYPAD, 1);
-       }
-       mutex_unlock(&input_dev->mutex);
-Index: linux-2.6.22/drivers/leds/Kconfig
-===================================================================
---- linux-2.6.22.orig/drivers/leds/Kconfig     2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/leds/Kconfig  2007-08-23 13:09:22.000000000 +0200
-@@ -95,6 +95,13 @@
-       help
-         This option enables support for the front LED on Cobalt Server
-+config LEDS_ASIC3
-+      tristate "LED Support for the HTC ASIC3 chip"
-+      depends LEDS_CLASS && HTC_ASIC3
-+      help
-+        This option enables support for the LEDs connected to the
-+        HTC ASIC3 chip.
-+
- comment "LED Triggers"
- config LEDS_TRIGGERS
-Index: linux-2.6.22/drivers/leds/Makefile
-===================================================================
---- linux-2.6.22.orig/drivers/leds/Makefile    2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/leds/Makefile 2007-08-23 13:09:22.000000000 +0200
-@@ -16,6 +16,7 @@
- obj-$(CONFIG_LEDS_WRAP)                       += leds-wrap.o
- obj-$(CONFIG_LEDS_H1940)              += leds-h1940.o
- obj-$(CONFIG_LEDS_COBALT)             += leds-cobalt.o
-+obj-$(CONFIG_LEDS_ASIC3)                += leds-asic3.o
- # LED Triggers
- obj-$(CONFIG_LEDS_TRIGGER_TIMER)      += ledtrig-timer.o
-Index: linux-2.6.22/drivers/leds/leds-asic3.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/leds/leds-asic3.c     2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,189 @@
-+/*
-+ * LEDs support for HTC ASIC3 devices.
-+ *
-+ * Copyright (c) 2006  Anton Vorontsov <cbou@mail.ru>
-+ *
-+ * 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/platform_device.h>
-+#include <linux/leds.h>
-+#include "leds.h"
-+
-+#include <asm/hardware/ipaq-asic3.h>
-+#include <linux/soc/asic3_base.h>
-+#include <asm/mach-types.h>
-+#include <asm/hardware/asic3_leds.h>
-+
-+#ifdef DEBUG
-+#define dbg(msg, ...) printk(msg, __VA_ARGS__)
-+#else
-+#define dbg(msg, ...)
-+#endif
-+
-+static
-+void asic3_leds_set(struct led_classdev *led_cdev, enum led_brightness b)
-+{
-+      struct asic3_led *led = container_of(led_cdev, struct asic3_led,
-+                                           led_cdev);
-+      struct asic3_leds_machinfo *machinfo = led->machinfo;
-+      struct device *asic3_dev = &machinfo->asic3_pdev->dev;
-+
-+      dbg("%s:%s %d(%d)-%s %d\n", __FILE__, __FUNCTION__, led->hw_num,
-+          led->gpio_num, led->led_cdev.name, b);
-+
-+      if (led->hw_num == -1) {
-+              asic3_gpio_set_value(asic3_dev, led->gpio_num, b);
-+              return;
-+      }
-+
-+      if (b == LED_OFF) {
-+              asic3_set_led(asic3_dev, led->hw_num, 0, 16, 6);
-+              asic3_set_gpio_out_c(asic3_dev, led->hw_num, 0);
-+      }
-+      else {
-+              asic3_set_gpio_out_c(asic3_dev, led->hw_num, led->hw_num);
-+              #ifdef CONFIG_LEDS_TRIGGER_HWTIMER
-+              if (led_cdev->trigger && led_cdev->trigger->is_led_supported &&
-+                             (led_cdev->trigger->is_led_supported(led_cdev) &
-+                              LED_SUPPORTS_HWTIMER)) {
-+                      struct hwtimer_data *td = led_cdev->trigger_data;
-+                      if (!td) return;
-+                      asic3_set_led(asic3_dev, led->hw_num, td->delay_on/8,
-+                                         (td->delay_on + td->delay_off)/8, 6);
-+              }
-+              else
-+              #endif
-+              asic3_set_led(asic3_dev, led->hw_num, 16, 16, 6);
-+      }
-+
-+      return;
-+}
-+
-+static
-+int asic3_leds_probe(struct platform_device *pdev)
-+{
-+      struct asic3_leds_machinfo *machinfo = pdev->dev.platform_data;
-+      struct asic3_led *leds = machinfo->leds;
-+      int ret, i = 0;
-+
-+      dbg("%s:%s\n", __FILE__, __FUNCTION__);
-+
-+      // Turn on clocks early, for the case if trigger would enable
-+      // led immediately after led_classdev_register().
-+      asic3_set_clock_cdex(&machinfo->asic3_pdev->dev,
-+              CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2,
-+              CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2);
-+
-+      for (i = 0; i < machinfo->num_leds; i++) {
-+              leds[i].machinfo = machinfo;
-+              leds[i].led_cdev.brightness_set = asic3_leds_set;
-+              ret = led_classdev_register(&pdev->dev, &leds[i].led_cdev);
-+              if (ret) {
-+                      printk(KERN_ERR "Error: can't register %s led\n",
-+                             leds[i].led_cdev.name);
-+                      goto out_err;
-+              }
-+      }
-+
-+      return 0;
-+
-+out_err:
-+      while (--i >= 0) led_classdev_unregister(&leds[i].led_cdev);
-+
-+      asic3_set_clock_cdex(&machinfo->asic3_pdev->dev,
-+              CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2,
-+              0               | 0               | 0);
-+
-+      return ret;
-+}
-+
-+static
-+int asic3_leds_remove(struct platform_device *pdev)
-+{
-+      struct asic3_leds_machinfo *machinfo = pdev->dev.platform_data;
-+      struct asic3_led *leds = machinfo->leds;
-+      int i = 0;
-+
-+      dbg("%s:%s\n", __FILE__, __FUNCTION__);
-+
-+      for (i = 0; i < machinfo->num_leds; i++)
-+              led_classdev_unregister(&leds[i].led_cdev);
-+
-+      asic3_set_clock_cdex(&machinfo->asic3_pdev->dev,
-+              CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2,
-+              0               | 0               | 0);
-+
-+      return 0;
-+}
-+
-+#ifdef CONFIG_PM
-+
-+static
-+int asic3_leds_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct asic3_leds_machinfo *machinfo = pdev->dev.platform_data;
-+      struct asic3_led *leds = machinfo->leds;
-+      int i = 0;
-+
-+      dbg("%s:%s\n", __FILE__, __FUNCTION__);
-+
-+      for (i = 0; i < machinfo->num_leds; i++)
-+              led_classdev_suspend(&leds[i].led_cdev);
-+
-+      return 0;
-+}
-+
-+static
-+int asic3_leds_resume(struct platform_device *pdev)
-+{
-+      struct asic3_leds_machinfo *machinfo = pdev->dev.platform_data;
-+      struct asic3_led *leds = machinfo->leds;
-+      int i = 0;
-+
-+      dbg("%s:%s\n", __FILE__, __FUNCTION__);
-+
-+      for (i = 0; i < machinfo->num_leds; i++)
-+              led_classdev_resume(&leds[i].led_cdev);
-+
-+      return 0;
-+}
-+
-+#endif
-+
-+static
-+struct platform_driver asic3_leds_driver = {
-+      .probe = asic3_leds_probe,
-+      .remove = asic3_leds_remove,
-+#ifdef CONFIG_PM
-+      .suspend = asic3_leds_suspend,
-+      .resume = asic3_leds_resume,
-+#endif
-+      .driver = {
-+              .name = "asic3-leds",
-+      },
-+};
-+
-+int asic3_leds_register(void)
-+{
-+      dbg("%s:%s\n", __FILE__, __FUNCTION__);
-+      return platform_driver_register(&asic3_leds_driver);
-+}
-+
-+void asic3_leds_unregister(void)
-+{
-+      platform_driver_unregister(&asic3_leds_driver);
-+      return;
-+}
-+
-+EXPORT_SYMBOL_GPL(asic3_leds_register);
-+EXPORT_SYMBOL_GPL(asic3_leds_unregister);
-+
-+MODULE_AUTHOR("Anton Vorontsov <cbou@mail.ru>");
-+MODULE_DESCRIPTION("HTC ASIC3 LEDs driver");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/drivers/mfd/Kconfig
-===================================================================
---- linux-2.6.22.orig/drivers/mfd/Kconfig      2007-08-23 13:09:19.000000000 +0200
-+++ linux-2.6.22/drivers/mfd/Kconfig   2007-08-23 13:09:22.000000000 +0200
-@@ -15,6 +15,16 @@
-         interface. The device may be connected by PCI or local bus with
-         varying functions enabled.
-+config HTC_ASIC3
-+        tristate "HTC ASIC3 (iPAQ h1900/h3900/h4000/hx4700/rx3000) support"
-+
-+config HTC_ASIC3_DS1WM
-+       bool "Support HTC ASIC3 builtin DS1WM block"
-+       help
-+           Choose Y here if you want to include support for ASIC3's builtin
-+           W1 controller. Some devices do not use it, and yet other have
-+           separate DS1WM controller. For them, choose N.
-+
- endmenu
- menu "Multimedia Capabilities Port drivers"
-Index: linux-2.6.22/drivers/mfd/Makefile
-===================================================================
---- linux-2.6.22.orig/drivers/mfd/Makefile     2007-08-23 13:09:19.000000000 +0200
-+++ linux-2.6.22/drivers/mfd/Makefile  2007-08-23 13:09:22.000000000 +0200
-@@ -2,6 +2,8 @@
- # Makefile for multifunction miscellaneous devices
- #
-+obj-$(CONFIG_HTC_ASIC3)         += asic3_base.o soc-core.o
-+
- obj-$(CONFIG_MFD_SM501)               += sm501.o
- obj-$(CONFIG_MCP)             += mcp-core.o
-Index: linux-2.6.22/drivers/mfd/asic3_base.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/mfd/asic3_base.c      2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,1208 @@
-+/*
-+ * Driver interface to HTC "ASIC3"
-+ *
-+ * Copyright 2001 Compaq Computer Corporation.
-+ * Copyright 2004-2005 Phil Blundell
-+ *
-+ * 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.
-+ *
-+ * COMPAQ COMPUTER CORPORATION MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
-+ * AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
-+ * FITNESS FOR ANY PARTICULAR PURPOSE.
-+ *
-+ * Author:  Andrew Christian
-+ *          <Andrew.Christian@compaq.com>
-+ *          October 2001
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+#include <linux/init.h>
-+#include <linux/irq.h>
-+#include <linux/clk.h>
-+#include <linux/ds1wm.h>
-+#include <asm/arch/clock.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/io.h>
-+
-+#include <asm/hardware/ipaq-asic3.h>
-+#include <linux/soc/asic3_base.h>
-+#include <linux/soc/tmio_mmc.h>
-+#include "soc-core.h"
-+
-+
-+struct asic3_data {
-+      void *mapping;
-+      unsigned int bus_shift;
-+      int irq_base;
-+      int irq_nr;
-+
-+      u16 irq_bothedge[4];
-+      struct device *dev;
-+
-+      struct platform_device *mmc_dev;
-+};
-+
-+static DEFINE_SPINLOCK(asic3_gpio_lock);
-+
-+static int asic3_remove(struct platform_device *dev);
-+
-+static inline unsigned long asic3_address(struct device *dev,
-+                                        unsigned int reg)
-+{
-+      struct asic3_data *adata;
-+
-+      adata = (struct asic3_data *)dev->driver_data;
-+
-+      return (unsigned long)adata->mapping + (reg >> (2 - adata->bus_shift));
-+}
-+
-+void asic3_write_register(struct device *dev, unsigned int reg, u32 value)
-+{
-+      __raw_writew(value, asic3_address(dev, reg));
-+}
-+EXPORT_SYMBOL(asic3_write_register);
-+
-+u32 asic3_read_register(struct device *dev, unsigned int reg)
-+{
-+      return __raw_readw(asic3_address(dev, reg));
-+}
-+EXPORT_SYMBOL(asic3_read_register);
-+
-+static inline void __asic3_write_register(struct asic3_data *asic,
-+                                        unsigned int reg, u32 value)
-+{
-+      __raw_writew(value, (unsigned long)asic->mapping
-+                          + (reg >> (2 - asic->bus_shift)));
-+}
-+
-+static inline u32 __asic3_read_register(struct asic3_data *asic,
-+                                      unsigned int reg)
-+{
-+      return __raw_readw((unsigned long)asic->mapping
-+                         + (reg >> (2 - asic->bus_shift)));
-+}
-+
-+#define ASIC3_GPIO_FN(get_fn_name, set_fn_name, REG)                  \
-+u32 get_fn_name(struct device *dev)                                   \
-+{                                                                       \
-+      return asic3_read_register(dev, REG);                           \
-+}                                                                       \
-+EXPORT_SYMBOL(get_fn_name);                                           \
-+                                                                      \
-+void set_fn_name(struct device *dev, u32 bits, u32 val)                       \
-+{                                                                       \
-+      unsigned long flags;                                            \
-+                                                                      \
-+      spin_lock_irqsave(&asic3_gpio_lock, flags);                     \
-+      val |= (asic3_read_register(dev, REG) & ~bits);                 \
-+      asic3_write_register(dev, REG, val);                            \
-+      spin_unlock_irqrestore(&asic3_gpio_lock, flags);                \
-+}                                                                       \
-+EXPORT_SYMBOL(set_fn_name);
-+
-+#define ASIC3_GPIO_REGISTER(ACTION, action, fn, FN)                   \
-+      ASIC3_GPIO_FN(asic3_get_gpio_ ## action ## _ ## fn ,            \
-+                     asic3_set_gpio_ ## action ## _ ## fn ,           \
-+                     _IPAQ_ASIC3_GPIO_ ## FN ## _Base                 \
-+                     + _IPAQ_ASIC3_GPIO_ ## ACTION )
-+
-+#define ASIC3_GPIO_FUNCTIONS(fn, FN)                                  \
-+      ASIC3_GPIO_REGISTER(Direction, dir, fn, FN)                     \
-+      ASIC3_GPIO_REGISTER(Out, out, fn, FN)                           \
-+      ASIC3_GPIO_REGISTER(SleepMask, sleepmask, fn, FN)               \
-+      ASIC3_GPIO_REGISTER(SleepOut, sleepout, fn, FN)         \
-+      ASIC3_GPIO_REGISTER(BattFaultOut, battfaultout, fn, FN) \
-+      ASIC3_GPIO_REGISTER(AltFunction, alt_fn, fn, FN)                \
-+      ASIC3_GPIO_REGISTER(SleepConf, sleepconf, fn, FN)               \
-+      ASIC3_GPIO_REGISTER(Status, status, fn, FN)
-+
-+#if 0
-+      ASIC3_GPIO_REGISTER(Mask, mask, fn, FN)
-+      ASIC3_GPIO_REGISTER(TriggerType, trigtype, fn, FN)
-+      ASIC3_GPIO_REGISTER(EdgeTrigger, rising, fn, FN)
-+      ASIC3_GPIO_REGISTER(LevelTrigger, triglevel, fn, FN)
-+      ASIC3_GPIO_REGISTER(IntStatus, intstatus, fn, FN)
-+#endif
-+
-+ASIC3_GPIO_FUNCTIONS(a, A)
-+ASIC3_GPIO_FUNCTIONS(b, B)
-+ASIC3_GPIO_FUNCTIONS(c, C)
-+ASIC3_GPIO_FUNCTIONS(d, D)
-+
-+int asic3_gpio_get_value(struct device *dev, unsigned gpio)
-+{
-+      u32 mask = ASIC3_GPIO_bit(gpio);
-+      printk("%s(%d)\n", __FUNCTION__, gpio);
-+      switch (gpio >> 4) {
-+      case _IPAQ_ASIC3_GPIO_BANK_A:
-+              return asic3_get_gpio_status_a(dev) & mask;
-+      case _IPAQ_ASIC3_GPIO_BANK_B:
-+              return asic3_get_gpio_status_b(dev) & mask;
-+      case _IPAQ_ASIC3_GPIO_BANK_C:
-+              return asic3_get_gpio_status_c(dev) & mask;
-+      case _IPAQ_ASIC3_GPIO_BANK_D:
-+              return asic3_get_gpio_status_d(dev) & mask;
-+      }
-+
-+      printk(KERN_ERR "%s: invalid GPIO value 0x%x", __FUNCTION__, gpio);
-+      return 0;
-+}
-+EXPORT_SYMBOL(asic3_gpio_get_value);
-+
-+void asic3_gpio_set_value(struct device *dev, unsigned gpio, int val)
-+{
-+      u32 mask = ASIC3_GPIO_bit(gpio);
-+      u32 bitval = 0;
-+      if (val)  bitval = mask;
-+      printk("%s(%d, %d)\n", __FUNCTION__, gpio, val);
-+
-+      switch (gpio >> 4) {
-+      case _IPAQ_ASIC3_GPIO_BANK_A:
-+              asic3_set_gpio_out_a(dev, mask, bitval);
-+              return;
-+      case _IPAQ_ASIC3_GPIO_BANK_B:
-+              asic3_set_gpio_out_b(dev, mask, bitval);
-+              return;
-+      case _IPAQ_ASIC3_GPIO_BANK_C:
-+              asic3_set_gpio_out_c(dev, mask, bitval);
-+              return;
-+      case _IPAQ_ASIC3_GPIO_BANK_D:
-+              asic3_set_gpio_out_d(dev, mask, bitval);
-+              return;
-+      }
-+
-+      printk(KERN_ERR "%s: invalid GPIO value 0x%x", __FUNCTION__, gpio);
-+}
-+EXPORT_SYMBOL(asic3_gpio_set_value);
-+
-+int asic3_irq_base(struct device *dev)
-+{
-+      struct asic3_data *asic = dev->driver_data;
-+
-+      return asic->irq_base;
-+}
-+EXPORT_SYMBOL(asic3_irq_base);
-+
-+static int asic3_gpio_to_irq(struct device *dev, unsigned gpio)
-+{
-+      struct asic3_data *asic = dev->driver_data;
-+      printk("%s(%d)\n", __FUNCTION__, gpio);
-+
-+      return asic->irq_base + gpio;
-+}
-+
-+void asic3_set_led(struct device *dev, int led_num, int duty_time,
-+                 int cycle_time, int timebase)
-+{
-+      struct asic3_data *asic = dev->driver_data;
-+      unsigned int led_base;
-+
-+      /* it's a macro thing: see #define _IPAQ_ASIC_LED_0_Base for why you
-+       * can't substitute led_num in the macros below...
-+       */
-+
-+      switch (led_num) {
-+      case 0:
-+              led_base = _IPAQ_ASIC3_LED_0_Base;
-+              break;
-+      case 1:
-+              led_base = _IPAQ_ASIC3_LED_1_Base;
-+              break;
-+      case 2:
-+              led_base = _IPAQ_ASIC3_LED_2_Base;
-+              break;
-+      default:
-+              printk(KERN_ERR "%s: invalid led number %d", __FUNCTION__,
-+                     led_num);
-+              return;
-+      }
-+
-+      __asic3_write_register(asic, led_base + _IPAQ_ASIC3_LED_TimeBase,
-+                             timebase | LED_EN);
-+      __asic3_write_register(asic, led_base + _IPAQ_ASIC3_LED_PeriodTime,
-+                             cycle_time);
-+      __asic3_write_register(asic, led_base + _IPAQ_ASIC3_LED_DutyTime,
-+                             0);
-+      udelay(20);     /* asic voodoo - possibly need a whole duty cycle? */
-+      __asic3_write_register(asic, led_base + _IPAQ_ASIC3_LED_DutyTime,
-+                             duty_time);
-+}
-+EXPORT_SYMBOL(asic3_set_led);
-+
-+void asic3_set_clock_sel(struct device *dev, u32 bits, u32 val)
-+{
-+      struct asic3_data *asic = dev->driver_data;
-+      unsigned long flags;
-+      u32 v;
-+
-+      spin_lock_irqsave(&asic3_gpio_lock, flags);
-+      v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL));
-+      v = (v & ~bits) | val;
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL), v);
-+      spin_unlock_irqrestore(&asic3_gpio_lock, flags);
-+}
-+EXPORT_SYMBOL(asic3_set_clock_sel);
-+
-+void asic3_set_clock_cdex(struct device *dev, u32 bits, u32 val)
-+{
-+      struct asic3_data *asic = dev->driver_data;
-+      unsigned long flags;
-+      u32 v;
-+
-+      spin_lock_irqsave(&asic3_gpio_lock, flags);
-+      v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX));
-+      v = (v & ~bits) | val;
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX), v);
-+      spin_unlock_irqrestore(&asic3_gpio_lock, flags);
-+}
-+EXPORT_SYMBOL(asic3_set_clock_cdex);
-+
-+static void asic3_clock_cdex_enable(struct clk *clk)
-+{
-+      struct asic3_data *asic = (struct asic3_data *)clk->parent->ctrlbit;
-+      unsigned long flags, val;
-+
-+      local_irq_save(flags);
-+
-+      val = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX));
-+      val |= clk->ctrlbit;
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX), val);
-+
-+      local_irq_restore(flags);
-+}
-+
-+static void asic3_clock_cdex_disable(struct clk *clk)
-+{
-+      struct asic3_data *asic = (struct asic3_data *)clk->parent->ctrlbit;
-+      unsigned long flags, val;
-+
-+      local_irq_save(flags);
-+
-+      val = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX));
-+      val &= ~clk->ctrlbit;
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX), val);
-+
-+      local_irq_restore(flags);
-+}
-+
-+/* base clocks */
-+
-+static struct clk clk_g = {
-+      .name           = "gclk",
-+      .rate           = 0,
-+      .parent         = NULL,
-+};
-+
-+/* clock definitions */
-+
-+static struct clk asic3_clocks[] = {
-+      {
-+              .name    = "spi",
-+              .id      = -1,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_SPI,
-+      },
-+#ifdef CONFIG_HTC_ASIC3_DS1WM
-+      {
-+              .name    = "ds1wm",
-+              .id      = -1,
-+              .rate    = 5000000,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_OWM,
-+      },
-+#endif
-+      {
-+              .name    = "pwm0",
-+              .id      = -1,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_PWM0,
-+      },
-+      {
-+              .name    = "pwm1",
-+              .id      = -1,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_PWM1,
-+      },
-+      {
-+              .name    = "led0",
-+              .id      = -1,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_LED0,
-+      },
-+      {
-+              .name    = "led1",
-+              .id      = -1,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_LED1,
-+      },
-+      {
-+              .name    = "led2",
-+              .id      = -1,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_LED2,
-+      },
-+      {
-+              .name    = "smbus",
-+              .id      = -1,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_SMBUS,
-+      },
-+      {
-+              .name    = "ex0",
-+              .id      = -1,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_EX0,
-+      },
-+      {
-+              .name    = "ex1",
-+              .id      = -1,
-+              .parent  = &clk_g,
-+              .enable  = asic3_clock_cdex_enable,
-+              .disable = asic3_clock_cdex_disable,
-+              .ctrlbit = CLOCK_CDEX_EX1,
-+      },
-+};
-+
-+void asic3_set_extcf_select(struct device *dev, u32 bits, u32 val)
-+{
-+      struct asic3_data *asic = dev->driver_data;
-+      unsigned long flags;
-+      u32 v;
-+
-+      spin_lock_irqsave(&asic3_gpio_lock, flags);
-+      v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(EXTCF, Select));
-+      v = (v & ~bits) | val;
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(EXTCF, Select), v);
-+      spin_unlock_irqrestore(&asic3_gpio_lock, flags);
-+}
-+EXPORT_SYMBOL(asic3_set_extcf_select);
-+
-+void asic3_set_extcf_reset(struct device *dev, u32 bits, u32 val)
-+{
-+      struct asic3_data *asic = dev->driver_data;
-+      unsigned long flags;
-+      u32 v;
-+
-+      spin_lock_irqsave(&asic3_gpio_lock, flags);
-+      v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(EXTCF, Reset));
-+      v = (v & ~bits) | val;
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(EXTCF, Reset), v);
-+      spin_unlock_irqrestore(&asic3_gpio_lock, flags);
-+}
-+EXPORT_SYMBOL(asic3_set_extcf_reset);
-+
-+void asic3_set_sdhwctrl(struct device *dev, u32 bits, u32 val)
-+{
-+      struct asic3_data *asic = dev->driver_data;
-+      unsigned long flags;
-+      u32 v;
-+
-+      spin_lock_irqsave (&asic3_gpio_lock, flags);
-+      v = __asic3_read_register(asic, IPAQ_ASIC3_OFFSET(SDHWCTRL, SDConf));
-+      v = (v & ~bits) | val;
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(SDHWCTRL, SDConf), v);
-+      spin_unlock_irqrestore(&asic3_gpio_lock, flags);
-+}
-+EXPORT_SYMBOL(asic3_set_sdhwctrl);
-+
-+
-+#define MAX_ASIC_ISR_LOOPS    20
-+#define _IPAQ_ASIC3_GPIO_Base_INCR \
-+      (_IPAQ_ASIC3_GPIO_B_Base - _IPAQ_ASIC3_GPIO_A_Base)
-+
-+static inline void asic3_irq_flip_edge(struct asic3_data *asic,
-+                                     u32 base, int bit)
-+{
-+      u16 edge = __asic3_read_register(asic,
-+              base + _IPAQ_ASIC3_GPIO_EdgeTrigger);
-+      edge ^= bit;
-+      __asic3_write_register(asic,
-+              base + _IPAQ_ASIC3_GPIO_EdgeTrigger, edge);
-+}
-+
-+static void asic3_irq_demux(unsigned int irq, struct irq_desc *desc)
-+{
-+      int iter;
-+      struct asic3_data *asic;
-+
-+      /* Acknowledge the parrent (i.e. CPU's) IRQ */
-+      desc->chip->ack(irq);
-+
-+      asic = desc->handler_data;
-+
-+      /* printk( KERN_NOTICE "asic3_irq_demux: irq=%d\n", irq ); */
-+      for (iter = 0 ; iter < MAX_ASIC_ISR_LOOPS; iter++) {
-+              u32 status;
-+              int bank;
-+
-+              status = __asic3_read_register(asic,
-+                      IPAQ_ASIC3_OFFSET(INTR, PIntStat));
-+              /* Check all ten register bits */
-+              if ((status & 0x3ff) == 0)
-+                      break;
-+
-+              /* Handle GPIO IRQs */
-+              for (bank = 0; bank < 4; bank++) {
-+                      if (status & (1 << bank)) {
-+                              unsigned long base, i, istat;
-+
-+                              base = _IPAQ_ASIC3_GPIO_A_Base
-+                                     + bank * _IPAQ_ASIC3_GPIO_Base_INCR;
-+                              istat = __asic3_read_register(asic,
-+                                      base + _IPAQ_ASIC3_GPIO_IntStatus);
-+                              /* IntStatus is write 0 to clear */
-+                              /* XXX could miss interrupts! */
-+                              __asic3_write_register(asic,
-+                                      base + _IPAQ_ASIC3_GPIO_IntStatus, 0);
-+
-+                              for (i = 0; i < 16; i++) {
-+                                      int bit = (1 << i);
-+                                      unsigned int irqnr;
-+                                      if (!(istat & bit))
-+                                              continue;
-+
-+                                      irqnr = asic->irq_base
-+                                              + (16 * bank) + i;
-+                                      desc = irq_desc + irqnr;
-+                                      desc->handle_irq(irqnr, desc);
-+                                      if (asic->irq_bothedge[bank] & bit) {
-+                                              asic3_irq_flip_edge(asic, base,
-+                                                                  bit);
-+                                      }
-+                              }
-+                      }
-+              }
-+
-+              /* Handle remaining IRQs in the status register */
-+              {
-+                      int i;
-+
-+                      for (i = ASIC3_LED0_IRQ; i <= ASIC3_OWM_IRQ; i++) {
-+                              /* They start at bit 4 and go up */
-+                              if (status & (1 << (i - ASIC3_LED0_IRQ + 4))) {
-+                                      desc = irq_desc + asic->irq_base + i;
-+                                      desc->handle_irq(asic->irq_base + i,
-+                                                       desc);
-+                              }
-+                      }
-+              }
-+
-+      }
-+
-+      if (iter >= MAX_ASIC_ISR_LOOPS)
-+              printk(KERN_ERR "%s: interrupt processing overrun\n",
-+                     __FUNCTION__);
-+}
-+
-+static inline int asic3_irq_to_bank(struct asic3_data *asic, int irq)
-+{
-+      int n;
-+
-+      n = (irq - asic->irq_base) >> 4;
-+
-+      return (n * (_IPAQ_ASIC3_GPIO_B_Base - _IPAQ_ASIC3_GPIO_A_Base));
-+}
-+
-+static inline int asic3_irq_to_index(struct asic3_data *asic, int irq)
-+{
-+      return (irq - asic->irq_base) & 15;
-+}
-+
-+static void asic3_mask_gpio_irq(unsigned int irq)
-+{
-+      struct asic3_data *asic = get_irq_chip_data(irq);
-+      u32 val, bank, index;
-+      unsigned long flags;
-+
-+      bank = asic3_irq_to_bank(asic, irq);
-+      index = asic3_irq_to_index(asic, irq);
-+
-+      spin_lock_irqsave(&asic3_gpio_lock, flags);
-+      val = __asic3_read_register(asic, bank + _IPAQ_ASIC3_GPIO_Mask);
-+      val |= 1 << index;
-+      __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_Mask, val);
-+      spin_unlock_irqrestore(&asic3_gpio_lock, flags);
-+}
-+
-+static void asic3_mask_irq(unsigned int irq)
-+{
-+      struct asic3_data *asic = get_irq_chip_data(irq);
-+      int regval;
-+
-+      if (irq < ASIC3_NR_GPIO_IRQS) {
-+              printk(KERN_ERR "asic3_base: gpio mask attempt, irq %d\n",
-+                     irq);
-+              return;
-+      }
-+
-+      regval = __asic3_read_register(asic,
-+              _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask);
-+
-+      switch (irq - asic->irq_base) {
-+      case ASIC3_LED0_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval & ~ASIC3_INTMASK_MASK0);
-+              break;
-+      case ASIC3_LED1_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval & ~ASIC3_INTMASK_MASK1);
-+              break;
-+      case ASIC3_LED2_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval & ~ASIC3_INTMASK_MASK2);
-+              break;
-+      case ASIC3_SPI_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval & ~ASIC3_INTMASK_MASK3);
-+              break;
-+      case ASIC3_SMBUS_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval & ~ASIC3_INTMASK_MASK4);
-+              break;
-+      case ASIC3_OWM_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval & ~ASIC3_INTMASK_MASK5);
-+              break;
-+      default:
-+              printk(KERN_ERR "asic3_base: bad non-gpio irq %d\n", irq);
-+              break;
-+      }
-+}
-+
-+static void asic3_unmask_gpio_irq(unsigned int irq)
-+{
-+      struct asic3_data *asic = get_irq_chip_data(irq);
-+      u32 val, bank, index;
-+      unsigned long flags;
-+
-+      bank = asic3_irq_to_bank(asic, irq);
-+      index = asic3_irq_to_index(asic, irq);
-+
-+      spin_lock_irqsave(&asic3_gpio_lock, flags);
-+      val = __asic3_read_register(asic, bank + _IPAQ_ASIC3_GPIO_Mask);
-+      val &= ~(1 << index);
-+      __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_Mask, val);
-+      spin_unlock_irqrestore(&asic3_gpio_lock, flags);
-+}
-+
-+static void asic3_unmask_irq(unsigned int irq)
-+{
-+      struct asic3_data *asic = get_irq_chip_data(irq);
-+      int regval;
-+
-+      if (irq < ASIC3_NR_GPIO_IRQS) {
-+              printk(KERN_ERR "asic3_base: gpio unmask attempt, irq %d\n",
-+                     irq);
-+              return;
-+      }
-+
-+      regval = __asic3_read_register(asic,
-+              _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask);
-+
-+      switch (irq - asic->irq_base) {
-+      case ASIC3_LED0_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval | ASIC3_INTMASK_MASK0);
-+              break;
-+      case ASIC3_LED1_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval | ASIC3_INTMASK_MASK1);
-+              break;
-+      case ASIC3_LED2_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval | ASIC3_INTMASK_MASK2);
-+              break;
-+      case ASIC3_SPI_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval | ASIC3_INTMASK_MASK3);
-+              break;
-+      case ASIC3_SMBUS_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval | ASIC3_INTMASK_MASK4);
-+              break;
-+      case ASIC3_OWM_IRQ:
-+              __asic3_write_register(asic,
-+                      _IPAQ_ASIC3_INTR_Base + _IPAQ_ASIC3_INTR_IntMask,
-+                      regval | ASIC3_INTMASK_MASK5);
-+              break;
-+      default:
-+              printk(KERN_ERR "asic3_base: bad non-gpio irq %d\n", irq);
-+              break;
-+      }
-+}
-+
-+static int asic3_gpio_irq_type(unsigned int irq, unsigned int type)
-+{
-+      struct asic3_data *asic = get_irq_chip_data(irq);
-+      u32 bank, index;
-+      unsigned long flags;
-+      u16 trigger, level, edge, bit;
-+
-+      bank = asic3_irq_to_bank(asic, irq);
-+      index = asic3_irq_to_index(asic, irq);
-+      bit = 1<<index;
-+
-+      spin_lock_irqsave(&asic3_gpio_lock, flags);
-+      level = __asic3_read_register(asic,
-+              bank + _IPAQ_ASIC3_GPIO_LevelTrigger);
-+      edge = __asic3_read_register(asic,
-+              bank + _IPAQ_ASIC3_GPIO_EdgeTrigger);
-+      trigger = __asic3_read_register(asic,
-+              bank + _IPAQ_ASIC3_GPIO_TriggerType);
-+      asic->irq_bothedge[(irq - asic->irq_base) >> 4] &= ~bit;
-+
-+      if (type == IRQT_RISING) {
-+              trigger |= bit;
-+              edge |= bit;
-+      } else if (type == IRQT_FALLING) {
-+              trigger |= bit;
-+              edge &= ~bit;
-+      } else if (type == IRQT_BOTHEDGE) {
-+              trigger |= bit;
-+              if (asic3_gpio_get_value(asic->dev, irq - asic->irq_base))
-+                      edge &= ~bit;
-+              else
-+                      edge |= bit;
-+              asic->irq_bothedge[(irq - asic->irq_base) >> 4] |= bit;
-+      } else if (type == IRQT_LOW) {
-+              trigger &= ~bit;
-+              level &= ~bit;
-+      } else if (type == IRQT_HIGH) {
-+              trigger &= ~bit;
-+              level |= bit;
-+      } else {
-+              /*
-+               * if type == IRQT_NOEDGE, we should mask interrupts, but
-+               * be careful to not unmask them if mask was also called.
-+               * Probably need internal state for mask.
-+               */
-+              printk(KERN_NOTICE "asic3: irq type not changed.\n");
-+      }
-+      __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_LevelTrigger,
-+                             level);
-+      __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_EdgeTrigger,
-+                             edge);
-+      __asic3_write_register(asic, bank + _IPAQ_ASIC3_GPIO_TriggerType,
-+                             trigger);
-+      spin_unlock_irqrestore(&asic3_gpio_lock, flags);
-+      return 0;
-+}
-+
-+static struct irq_chip asic3_gpio_irq_chip = {
-+      .name           = "ASIC3-GPIO",
-+      .ack            = asic3_mask_gpio_irq,
-+      .mask           = asic3_mask_gpio_irq,
-+      .unmask         = asic3_unmask_gpio_irq,
-+      .set_type       = asic3_gpio_irq_type,
-+};
-+
-+static struct irq_chip asic3_irq_chip = {
-+      .name           = "ASIC3",
-+      .ack            = asic3_mask_irq,
-+      .mask           = asic3_mask_irq,
-+      .unmask         = asic3_unmask_irq,
-+};
-+
-+static void asic3_release(struct device *dev)
-+{
-+      struct platform_device *sdev = to_platform_device(dev);
-+
-+      kfree(sdev->resource);
-+      kfree(sdev);
-+}
-+
-+int asic3_register_mmc(struct device *dev)
-+{
-+      struct platform_device *sdev = kzalloc(sizeof(*sdev), GFP_KERNEL);
-+      struct tmio_mmc_hwconfig *mmc_config = kmalloc(sizeof(*mmc_config),
-+                                                     GFP_KERNEL);
-+      struct platform_device *pdev = to_platform_device(dev);
-+      struct asic3_data *asic = dev->driver_data;
-+      struct asic3_platform_data *asic3_pdata = dev->platform_data;
-+      struct resource *res;
-+      int rc;
-+
-+      if (sdev == NULL || mmc_config == NULL)
-+              return -ENOMEM;
-+
-+      if (asic3_pdata->tmio_mmc_hwconfig) {
-+              memcpy(mmc_config, asic3_pdata->tmio_mmc_hwconfig,
-+                     sizeof(*mmc_config));
-+      } else {
-+              memset(mmc_config, 0, sizeof(*mmc_config));
-+      }
-+      mmc_config->address_shift = asic->bus_shift;
-+
-+      sdev->id = -1;
-+      sdev->name = "asic3_mmc";
-+      sdev->dev.parent = dev;
-+      sdev->num_resources = 2;
-+      sdev->dev.platform_data = mmc_config;
-+      sdev->dev.release = asic3_release;
-+
-+      res = kzalloc(sdev->num_resources * sizeof(struct resource),
-+                    GFP_KERNEL);
-+      if (res == NULL) {
-+              kfree(sdev);
-+              kfree(mmc_config);
-+              return -ENOMEM;
-+      }
-+      sdev->resource = res;
-+
-+      res[0].start = pdev->resource[2].start;
-+      res[0].end   = pdev->resource[2].end;
-+      res[0].flags = IORESOURCE_MEM;
-+      res[1].start = res[1].end = pdev->resource[3].start;
-+      res[1].flags = IORESOURCE_IRQ;
-+
-+      rc = platform_device_register(sdev);
-+      if (rc) {
-+              printk(KERN_ERR "asic3_base: "
-+                     "Could not register asic3_mmc device\n");
-+              kfree(res);
-+              kfree(sdev);
-+              return rc;
-+      }
-+
-+      asic->mmc_dev = sdev;
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL(asic3_register_mmc);
-+
-+int asic3_unregister_mmc(struct device *dev)
-+{
-+      struct asic3_data *asic = dev->driver_data;
-+      platform_device_unregister(asic->mmc_dev);
-+      asic->mmc_dev = 0;
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL(asic3_unregister_mmc);
-+
-+#ifdef CONFIG_HTC_ASIC3_DS1WM
-+/*
-+ *    DS1WM subdevice
-+ */
-+
-+static void asic3_ds1wm_enable(struct platform_device *ds1wm_dev)
-+{
-+      struct device *dev = ds1wm_dev->dev.parent;
-+
-+      /* Turn on external clocks and the OWM clock */
-+      asic3_set_clock_cdex(dev,
-+              CLOCK_CDEX_EX0 | CLOCK_CDEX_EX1 | CLOCK_CDEX_OWM,
-+              CLOCK_CDEX_EX0 | CLOCK_CDEX_EX1 | CLOCK_CDEX_OWM);
-+
-+      mdelay(1);
-+
-+      asic3_set_extcf_reset(dev, ASIC3_EXTCF_OWM_RESET,
-+                            ASIC3_EXTCF_OWM_RESET);
-+      mdelay(1);
-+      asic3_set_extcf_reset(dev, ASIC3_EXTCF_OWM_RESET, 0);
-+      mdelay(1);
-+
-+      /* Clear OWM_SMB, set OWM_EN */
-+      asic3_set_extcf_select(dev,
-+              ASIC3_EXTCF_OWM_SMB | ASIC3_EXTCF_OWM_EN,
-+              0                   | ASIC3_EXTCF_OWM_EN);
-+
-+      mdelay(1);
-+}
-+
-+static void asic3_ds1wm_disable(struct platform_device *ds1wm_dev)
-+{
-+      struct device *dev = ds1wm_dev->dev.parent;
-+
-+      asic3_set_extcf_select(dev,
-+              ASIC3_EXTCF_OWM_SMB | ASIC3_EXTCF_OWM_EN,
-+              0                   | 0);
-+
-+      asic3_set_clock_cdex(dev,
-+              CLOCK_CDEX_EX0 | CLOCK_CDEX_EX1 | CLOCK_CDEX_OWM,
-+              CLOCK_CDEX_EX0 | CLOCK_CDEX_EX1 | 0);
-+}
-+
-+
-+static struct resource asic3_ds1wm_resources[] = {
-+      {
-+              .start = _IPAQ_ASIC3_OWM_Base,
-+              .end   = _IPAQ_ASIC3_OWM_Base + 0x14 - 1,
-+              .flags = IORESOURCE_MEM,
-+      },
-+      {
-+              .start = ASIC3_OWM_IRQ,
-+              .end   = ASIC3_OWM_IRQ,
-+              .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |
-+                       IORESOURCE_IRQ_SOC_SUBDEVICE,
-+      },
-+};
-+
-+static struct ds1wm_platform_data ds1wm_pd = {
-+      .enable = asic3_ds1wm_enable,
-+      .disable = asic3_ds1wm_disable,
-+};
-+#endif
-+
-+static struct soc_device_data asic3_blocks[] = {
-+#ifdef CONFIG_HTC_ASIC3_DS1WM
-+      {
-+              .name = "ds1wm",
-+              .res = asic3_ds1wm_resources,
-+              .num_resources = ARRAY_SIZE(asic3_ds1wm_resources),
-+              .hwconfig = &ds1wm_pd,
-+      },
-+#endif
-+};
-+
-+static int asic3_probe(struct platform_device *pdev)
-+{
-+      struct asic3_platform_data *pdata = pdev->dev.platform_data;
-+      struct asic3_data *asic;
-+      struct device *dev = &pdev->dev;
-+      unsigned long clksel;
-+      int i, rc;
-+
-+      asic = kzalloc(sizeof(struct asic3_data), GFP_KERNEL);
-+      if (!asic)
-+              return -ENOMEM;
-+
-+      platform_set_drvdata(pdev, asic);
-+      asic->dev = &pdev->dev;
-+
-+      asic->mapping = ioremap(pdev->resource[0].start, IPAQ_ASIC3_MAP_SIZE);
-+      if (!asic->mapping) {
-+              printk(KERN_ERR "asic3: couldn't ioremap ASIC3\n");
-+              kfree (asic);
-+              return -ENOMEM;
-+      }
-+
-+      if (pdata && pdata->bus_shift)
-+              asic->bus_shift = pdata->bus_shift;
-+      else
-+              asic->bus_shift = 2;
-+
-+      /* XXX: should get correct SD clock values from pdata struct  */
-+      clksel = 0;
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL), clksel);
-+
-+      /* Register ASIC3's clocks. */
-+      clk_g.ctrlbit = (int)asic;
-+
-+      if (clk_register(&clk_g) < 0)
-+              printk(KERN_ERR "asic3: failed to register ASIC3 gclk\n");
-+
-+      for (i = 0; i < ARRAY_SIZE(asic3_clocks); i++) {
-+              rc = clk_register(&asic3_clocks[i]);
-+              if (rc < 0)
-+                      printk(KERN_ERR "asic3: "
-+                             "failed to register clock %s (%d)\n",
-+                             asic3_clocks[i].name, rc);
-+      }
-+
-+      __asic3_write_register(asic, IPAQ_ASIC3_GPIO_OFFSET(A, Mask), 0xffff);
-+      __asic3_write_register(asic, IPAQ_ASIC3_GPIO_OFFSET(B, Mask), 0xffff);
-+      __asic3_write_register(asic, IPAQ_ASIC3_GPIO_OFFSET(C, Mask), 0xffff);
-+      __asic3_write_register(asic, IPAQ_ASIC3_GPIO_OFFSET(D, Mask), 0xffff);
-+
-+      asic3_set_gpio_sleepmask_a(dev, 0xffff, 0xffff);
-+      asic3_set_gpio_sleepmask_b(dev, 0xffff, 0xffff);
-+      asic3_set_gpio_sleepmask_c(dev, 0xffff, 0xffff);
-+      asic3_set_gpio_sleepmask_d(dev, 0xffff, 0xffff);
-+
-+      if (pdata) {
-+              asic3_set_gpio_out_a(dev, 0xffff, pdata->gpio_a.init);
-+              asic3_set_gpio_out_b(dev, 0xffff, pdata->gpio_b.init);
-+              asic3_set_gpio_out_c(dev, 0xffff, pdata->gpio_c.init);
-+              asic3_set_gpio_out_d(dev, 0xffff, pdata->gpio_d.init);
-+
-+              asic3_set_gpio_dir_a(dev, 0xffff, pdata->gpio_a.dir);
-+              asic3_set_gpio_dir_b(dev, 0xffff, pdata->gpio_b.dir);
-+              asic3_set_gpio_dir_c(dev, 0xffff, pdata->gpio_c.dir);
-+              asic3_set_gpio_dir_d(dev, 0xffff, pdata->gpio_d.dir);
-+
-+              asic3_set_gpio_sleepmask_a(dev, 0xffff,
-+                                         pdata->gpio_a.sleep_mask);
-+              asic3_set_gpio_sleepmask_b(dev, 0xffff,
-+                                         pdata->gpio_b.sleep_mask);
-+              asic3_set_gpio_sleepmask_c(dev, 0xffff,
-+                                         pdata->gpio_c.sleep_mask);
-+              asic3_set_gpio_sleepmask_d(dev, 0xffff,
-+                                         pdata->gpio_d.sleep_mask);
-+
-+              asic3_set_gpio_sleepout_a(dev, 0xffff,
-+                                        pdata->gpio_a.sleep_out);
-+              asic3_set_gpio_sleepout_b(dev, 0xffff,
-+                                        pdata->gpio_b.sleep_out);
-+              asic3_set_gpio_sleepout_c(dev, 0xffff,
-+                                        pdata->gpio_c.sleep_out);
-+              asic3_set_gpio_sleepout_d(dev, 0xffff,
-+                                        pdata->gpio_d.sleep_out);
-+
-+              asic3_set_gpio_battfaultout_a(dev, 0xffff,
-+                                            pdata->gpio_a.batt_fault_out);
-+              asic3_set_gpio_battfaultout_b(dev, 0xffff,
-+                                            pdata->gpio_b.batt_fault_out);
-+              asic3_set_gpio_battfaultout_c(dev, 0xffff,
-+                                            pdata->gpio_c.batt_fault_out);
-+              asic3_set_gpio_battfaultout_d(dev, 0xffff,
-+                                            pdata->gpio_d.batt_fault_out);
-+
-+              asic3_set_gpio_sleepconf_a(dev, 0xffff,
-+                                         pdata->gpio_a.sleep_conf);
-+              asic3_set_gpio_sleepconf_b(dev, 0xffff,
-+                                         pdata->gpio_b.sleep_conf);
-+              asic3_set_gpio_sleepconf_c(dev, 0xffff,
-+                                         pdata->gpio_c.sleep_conf);
-+              asic3_set_gpio_sleepconf_d(dev, 0xffff,
-+                                         pdata->gpio_d.sleep_conf);
-+
-+              asic3_set_gpio_alt_fn_a(dev, 0xffff,
-+                                      pdata->gpio_a.alt_function);
-+              asic3_set_gpio_alt_fn_b(dev, 0xffff,
-+                                      pdata->gpio_b.alt_function);
-+              asic3_set_gpio_alt_fn_c(dev, 0xffff,
-+                                      pdata->gpio_c.alt_function);
-+              asic3_set_gpio_alt_fn_d(dev, 0xffff,
-+                                      pdata->gpio_d.alt_function);
-+      }
-+
-+      asic->irq_nr = -1;
-+      asic->irq_base = -1;
-+
-+      if (pdev->num_resources > 1)
-+              asic->irq_nr = pdev->resource[1].start;
-+
-+      if (asic->irq_nr != -1) {
-+              unsigned int i;
-+
-+              if (!pdata->irq_base) {
-+                      printk(KERN_ERR "asic3: IRQ base not specified\n");
-+                      asic3_remove(pdev);
-+                      return -EINVAL;
-+              }
-+
-+              asic->irq_base = pdata->irq_base;
-+
-+              /* turn on clock to IRQ controller */
-+              clksel |= CLOCK_SEL_CX;
-+              __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL),
-+                                     clksel);
-+
-+              printk(KERN_INFO "asic3: using irq %d-%d on irq %d\n",
-+                     asic->irq_base, asic->irq_base + ASIC3_NR_IRQS - 1,
-+                     asic->irq_nr);
-+
-+              for (i = 0 ; i < ASIC3_NR_IRQS ; i++) {
-+                      int irq = i + asic->irq_base;
-+                      if (i < ASIC3_NR_GPIO_IRQS) {
-+                              set_irq_chip(irq, &asic3_gpio_irq_chip);
-+                              set_irq_chip_data(irq, asic);
-+                              set_irq_handler(irq, handle_level_irq);
-+                              set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
-+                      } else {
-+                              /* The remaining IRQs are not GPIO */
-+                              set_irq_chip(irq, &asic3_irq_chip);
-+                              set_irq_chip_data(irq, asic);
-+                              set_irq_handler(irq, handle_level_irq);
-+                              set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
-+                      }
-+              }
-+
-+              __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(INTR, IntMask),
-+                                      ASIC3_INTMASK_GINTMASK);
-+
-+              set_irq_chained_handler(asic->irq_nr, asic3_irq_demux);
-+              set_irq_type(asic->irq_nr, IRQT_RISING);
-+              set_irq_data(asic->irq_nr, asic);
-+      }
-+
-+#ifdef CONFIG_HTC_ASIC3_DS1WM
-+      ds1wm_pd.bus_shift = asic->bus_shift;
-+#endif
-+
-+      pdata->gpiodev_ops.get = asic3_gpio_get_value;
-+      pdata->gpiodev_ops.set = asic3_gpio_set_value;
-+      pdata->gpiodev_ops.to_irq = asic3_gpio_to_irq;
-+
-+      soc_add_devices(pdev, asic3_blocks, ARRAY_SIZE(asic3_blocks),
-+                      &pdev->resource[0],
-+                      asic->bus_shift - ASIC3_DEFAULT_ADDR_SHIFT,
-+                      asic->irq_base);
-+
-+      if (pdev->num_resources > 2) {
-+              int rc;
-+              rc = asic3_register_mmc(dev);
-+              if (rc) {
-+                      asic3_remove(pdev);
-+                      return rc;
-+              }
-+      }
-+
-+      if (pdata && pdata->num_child_platform_devs != 0)
-+              platform_add_devices(pdata->child_platform_devs,
-+                                   pdata->num_child_platform_devs);
-+
-+      return 0;
-+}
-+
-+static int asic3_remove(struct platform_device *pdev)
-+{
-+      struct asic3_platform_data *pdata = pdev->dev.platform_data;
-+      struct asic3_data *asic = platform_get_drvdata(pdev);
-+      int i;
-+
-+      if (pdata && pdata->num_child_platform_devs != 0) {
-+              for (i = 0; i < pdata->num_child_platform_devs; i++) {
-+                      platform_device_unregister(
-+                              pdata->child_platform_devs[i]);
-+              }
-+      }
-+
-+      if (asic->irq_nr != -1) {
-+              unsigned int i;
-+
-+              for (i = 0 ; i < ASIC3_NR_IRQS ; i++) {
-+                      int irq = i + asic->irq_base;
-+                      set_irq_flags(irq, 0);
-+                      set_irq_handler (irq, NULL);
-+                      set_irq_chip (irq, NULL);
-+                      set_irq_chip_data(irq, NULL);
-+              }
-+
-+              set_irq_chained_handler(asic->irq_nr, NULL);
-+      }
-+
-+      if (asic->mmc_dev)
-+              asic3_unregister_mmc(&pdev->dev);
-+
-+      for (i = 0; i < ARRAY_SIZE(asic3_clocks); i++)
-+              clk_unregister(&asic3_clocks[i]);
-+      clk_unregister(&clk_g);
-+
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, SEL), 0);
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(INTR, IntMask), 0);
-+
-+      iounmap(asic->mapping);
-+
-+      kfree(asic);
-+
-+      return 0;
-+}
-+
-+static void asic3_shutdown(struct platform_device *pdev)
-+{
-+}
-+
-+#define ASIC3_SUSPEND_CDEX_MASK \
-+      (CLOCK_CDEX_LED0 | CLOCK_CDEX_LED1 | CLOCK_CDEX_LED2)
-+static unsigned short suspend_cdex;
-+
-+static int asic3_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct asic3_data *asic = platform_get_drvdata(pdev);
-+      suspend_cdex = __asic3_read_register(asic,
-+              _IPAQ_ASIC3_CLOCK_Base + _IPAQ_ASIC3_CLOCK_CDEX);
-+      /* The LEDs are still active during suspend */
-+      __asic3_write_register(asic,
-+              _IPAQ_ASIC3_CLOCK_Base + _IPAQ_ASIC3_CLOCK_CDEX,
-+              suspend_cdex & ASIC3_SUSPEND_CDEX_MASK);
-+      return 0;
-+}
-+
-+static int asic3_resume(struct platform_device *pdev)
-+{
-+      struct asic3_data *asic = platform_get_drvdata(pdev);
-+      unsigned short intmask;
-+
-+      __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(CLOCK, CDEX),
-+                             suspend_cdex);
-+
-+      if (asic->irq_nr != -1) {
-+              /* Toggle the interrupt mask to try to get ASIC3 to show
-+               * the CPU an interrupt edge. For more details see the
-+               * kernel-discuss thread around 13 June 2005 with the
-+               * subject "asic3 suspend / resume". */
-+              intmask = __asic3_read_register(asic,
-+                              IPAQ_ASIC3_OFFSET(INTR, IntMask));
-+              __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(INTR, IntMask),
-+                                     intmask & ~ASIC3_INTMASK_GINTMASK);
-+              mdelay(1);
-+              __asic3_write_register(asic, IPAQ_ASIC3_OFFSET(INTR, IntMask),
-+                                     intmask | ASIC3_INTMASK_GINTMASK);
-+      }
-+
-+      return 0;
-+}
-+
-+static struct platform_driver asic3_device_driver = {
-+      .driver         = {
-+              .name   = "asic3",
-+      },
-+      .probe          = asic3_probe,
-+      .remove         = asic3_remove,
-+      .suspend        = asic3_suspend,
-+      .resume         = asic3_resume,
-+      .shutdown       = asic3_shutdown,
-+};
-+
-+static int __init asic3_base_init(void)
-+{
-+      int retval = 0;
-+      retval = platform_driver_register(&asic3_device_driver);
-+      return retval;
-+}
-+
-+static void __exit asic3_base_exit(void)
-+{
-+      platform_driver_unregister(&asic3_device_driver);
-+}
-+
-+#ifdef MODULE
-+module_init(asic3_base_init);
-+#else /* start early for dependencies */
-+subsys_initcall(asic3_base_init);
-+#endif
-+module_exit(asic3_base_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Phil Blundell <pb@handhelds.org>");
-+MODULE_DESCRIPTION("Core driver for HTC ASIC3");
-+MODULE_SUPPORTED_DEVICE("asic3");
-Index: linux-2.6.22/drivers/mfd/soc-core.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/mfd/soc-core.c        2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,106 @@
-+/*
-+ * drivers/soc/soc-core.c
-+ *
-+ * core SoC support
-+ * Copyright (c) 2006 Ian Molton
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This file contains functionality used by many SoC type devices.
-+ *
-+ * Created: 2006-11-28
-+ *
-+ */
-+
-+#include <linux/ioport.h>
-+#include <linux/slab.h>
-+#include <linux/kernel.h>
-+#include <linux/platform_device.h>
-+#include "soc-core.h"
-+
-+void soc_free_devices(struct platform_device *devices, int nr_devs)
-+{
-+      struct platform_device *dev = devices;
-+      int i;
-+
-+      for (i = 0; i < nr_devs; i++) {
-+              struct resource *res = dev->resource;
-+              platform_device_unregister(dev++);
-+              kfree(res);
-+      }
-+      kfree(devices);
-+}
-+EXPORT_SYMBOL_GPL(soc_free_devices);
-+
-+#define SIGNED_SHIFT(val, shift) ((shift) >= 0 ? ((val) << (shift)) : ((val) >> -(shift)))
-+
-+struct platform_device *soc_add_devices(struct platform_device *dev,
-+                                      struct soc_device_data *soc, int nr_devs,
-+                                      struct resource *mem,
-+                                      int relative_addr_shift, int irq_base)
-+{
-+      struct platform_device *devices;
-+      int i, r, base;
-+
-+      devices = kzalloc(nr_devs * sizeof(struct platform_device), GFP_KERNEL);
-+      if (!devices)
-+              return NULL;
-+
-+      for (i = 0; i < nr_devs; i++) {
-+              struct platform_device *sdev = &devices[i];
-+              struct soc_device_data *blk = &soc[i];
-+              struct resource *res;
-+
-+              sdev->id = -1;
-+              sdev->name = blk->name;
-+
-+              sdev->dev.parent = &dev->dev;
-+              sdev->dev.platform_data = (void *)blk->hwconfig;
-+              sdev->num_resources = blk->num_resources;
-+
-+              /* Allocate space for the subdevice resources */
-+              res = kzalloc (blk->num_resources * sizeof (struct resource), GFP_KERNEL);
-+              if (!res)
-+                      goto fail;
-+
-+              for (r = 0 ; r < blk->num_resources ; r++) {
-+                      res[r].name = blk->res[r].name; // Fixme - should copy
-+
-+                      /* Find out base to use */
-+                      base = 0;
-+                      if (blk->res[r].flags & IORESOURCE_MEM) {
-+                              base = mem->start;
-+                      } else if ((blk->res[r].flags & IORESOURCE_IRQ) &&
-+                              (blk->res[r].flags & IORESOURCE_IRQ_SOC_SUBDEVICE)) {
-+                              base = irq_base;
-+                      }
-+
-+                      /* Adjust resource */
-+                      if (blk->res[r].flags & IORESOURCE_MEM) {
-+                              res[r].parent = mem;
-+                              res[r].start = base + SIGNED_SHIFT(blk->res[r].start, relative_addr_shift);
-+                              res[r].end   = base + SIGNED_SHIFT(blk->res[r].end,   relative_addr_shift);
-+                      } else {
-+                              res[r].start = base + blk->res[r].start;
-+                              res[r].end   = base + blk->res[r].end;
-+                      }
-+                      res[r].flags = blk->res[r].flags;
-+              }
-+
-+              sdev->resource = res;
-+              if (platform_device_register(sdev)) {
-+                      kfree(res);
-+                      goto fail;
-+              }
-+
-+              printk(KERN_INFO "SoC: registering %s\n", blk->name);
-+      }
-+      return devices;
-+
-+fail:
-+      soc_free_devices(devices, i + 1);
-+      return NULL;
-+}
-+EXPORT_SYMBOL_GPL(soc_add_devices);
-Index: linux-2.6.22/drivers/mfd/soc-core.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/mfd/soc-core.h        2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,30 @@
-+/*
-+ * drivers/soc/soc-core.h
-+ *
-+ * core SoC support
-+ * Copyright (c) 2006 Ian Molton
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ * This file contains prototypes for the functions in soc-core.c
-+ *
-+ * Created: 2006-11-28
-+ *
-+ */
-+
-+struct soc_device_data {
-+      char *name;
-+      struct resource *res;
-+      int num_resources;
-+      void *hwconfig; /* platform_data to pass to the subdevice */
-+};
-+
-+struct platform_device *soc_add_devices(struct platform_device *dev,
-+                                      struct soc_device_data *soc, int n_devs,
-+                                      struct resource *mem,
-+                                      int relative_addr_shift, int irq_base);
-+
-+void soc_free_devices(struct platform_device *devices, int nr_devs);
-+
-Index: linux-2.6.22/include/asm-arm/arch-pxa/clock.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/arch-pxa/clock.h      2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,27 @@
-+/*
-+ *  linux/include/asm-arm/arch-pxa/clock.h
-+ *
-+ *  Copyright (C) 2006 Erik Hovland
-+ *
-+ * 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.
-+ */
-+
-+struct clk {
-+      struct list_head        node;
-+      struct module           *owner;
-+      struct clk              *parent;
-+      const char              *name;
-+      int                     id;
-+      unsigned int            enabled;
-+      unsigned long           rate;
-+      unsigned long           ctrlbit;
-+
-+      void                    (*enable)(struct clk *);
-+      void                    (*disable)(struct clk *);
-+};
-+
-+
-+extern int clk_register(struct clk *clk);
-+extern void clk_unregister(struct clk *clk);
-Index: linux-2.6.22/include/asm-arm/arch-pxa/htcuniversal-asic.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/arch-pxa/htcuniversal-asic.h  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,213 @@
-+/*
-+ * include/asm/arm/arch-pxa/htcuniversal-asic.h
-+ *
-+ * Authors: Giuseppe Zompatori <giuseppe_zompatori@yahoo.it>
-+ *
-+ * based on previews work, see below:
-+ *
-+ * include/asm/arm/arch-pxa/hx4700-asic.h
-+ *      Copyright (c) 2004 SDG Systems, LLC
-+ *
-+ */
-+
-+#ifndef _HTCUNIVERSAL_ASIC_H_
-+#define _HTCUNIVERSAL_ASIC_H_
-+
-+#include <asm/hardware/ipaq-asic3.h>
-+
-+/* ASIC3 */
-+
-+#define HTCUNIVERSAL_ASIC3_GPIO_PHYS  PXA_CS4_PHYS
-+#define HTCUNIVERSAL_ASIC3_MMC_PHYS   PXA_CS3_PHYS
-+
-+/* TODO: some information is missing here */
-+
-+/* ASIC3 GPIO A bank */
-+
-+#define GPIOA_I2C_EN                   0      /* Output */
-+#define GPIOA_SPK_PWR1_ON              1      /* Output */
-+#define GPIOA_AUDIO_PWR_ON             2      /* Output */
-+#define GPIOA_EARPHONE_PWR_ON          3      /* Output */
-+
-+#define GPIOA_UNKNOWN4                         4      /* Output */
-+#define GPIOA_BUTTON_BACKLIGHT_N       5      /* Input  */
-+#define GPIOA_SPK_PWR2_ON              6      /* Output */
-+#define GPIOA_BUTTON_RECORD_N          7      /* Input  */
-+
-+#define GPIOA_BUTTON_CAMERA_N          8      /* Input  */
-+#define GPIOA_UNKNOWN9                         9      /* Output */
-+#define GPIOA_FLASHLIGHT              10      /* Output */
-+#define GPIOA_COVER_ROTATE_N          11      /* Input  */
-+
-+#define GPIOA_TOUCHSCREEN_N           12      /* Input  */
-+#define GPIOA_VOL_UP_N                13      /* Input  */
-+#define GPIOA_VOL_DOWN_N              14      /* Input  */
-+#define GPIOA_LCD_PWR5_ON             15      /* Output */
-+
-+/* ASIC3 GPIO B bank */
-+
-+#define GPIOB_BB_READY                         0      /* Input */
-+#define GPIOB_CODEC_PDN                        1      /* Output */
-+#define GPIOB_UNKNOWN2                         2      /* Input  */
-+#define GPIOB_BB_UNKNOWN3              3      /* Input  */
-+
-+#define GPIOB_BT_IRQ                   4      /* Input  */
-+#define GPIOB_CLAMSHELL_N              5      /* Input  */
-+#define GPIOB_LCD_PWR3_ON              6      /* Output */
-+#define GPIOB_BB_ALERT                         7      /* Input  */
-+
-+#define GPIOB_BB_RESET2                        8      /* Output */
-+#define GPIOB_EARPHONE_N               9      /* Input  */
-+#define GPIOB_MICRECORD_N             10      /* Input  */
-+#define GPIOB_NIGHT_SENSOR            11      /* Input  */
-+
-+#define GPIOB_UMTS_DCD                        12      /* Input  */
-+#define GPIOB_UNKNOWN13                       13      /* Input  */
-+#define GPIOB_CHARGE_EN               14      /* Output */
-+#define GPIOB_USB_PUEN                        15      /* Output */
-+
-+/* ASIC3 GPIO C bank */
-+
-+#define GPIOC_LED_BTWIFI               0      /* Output */
-+#define GPIOC_LED_RED                  1      /* Output */
-+#define GPIOC_LED_GREEN                        2      /* Output */
-+#define GPIOC_BOARDID3                 3      /* Input  */
-+
-+#define GPIOC_WIFI_IRQ_N               4      /* Input  */
-+#define GPIOC_WIFI_RESET               5      /* Output */
-+#define GPIOC_WIFI_PWR1_ON             6      /* Output */
-+#define GPIOC_BT_RESET                 7      /* Output */
-+
-+#define GPIOC_UNKNOWN8                 8      /* Output */
-+#define GPIOC_LCD_PWR1_ON              9      /* Output */
-+#define GPIOC_LCD_PWR2_ON             10      /* Output */
-+#define GPIOC_BOARDID2                11      /* Input  */
-+
-+#define GPIOC_BOARDID1                        12      /* Input  */
-+#define GPIOC_BOARDID0                13      /* Input  */
-+#define GPIOC_BT_PWR_ON                       14      /* Output */
-+#define GPIOC_CHARGE_ON                       15      /* Output */
-+
-+/* ASIC3 GPIO D bank */
-+
-+#define GPIOD_KEY_OK_N                         0      /* Input  */
-+#define GPIOD_KEY_RIGHT_N              1      /* Input  */
-+#define GPIOD_KEY_LEFT_N               2      /* Input  */
-+#define GPIOD_KEY_DOWN_N               3      /* Input  */
-+
-+#define GPIOD_KEY_UP_N                 4      /* Input  */
-+#define GPIOD_SDIO_DET                         5      /* Input  */
-+#define GPIOD_WIFI_PWR2_ON             6      /* Output */
-+#define GPIOD_HW_REBOOT                        7      /* Output */
-+
-+#define GPIOD_BB_RESET1                        8      /* Output */
-+#define GPIOD_UNKNOWN9                         9      /* Output */
-+#define GPIOD_VIBRA_PWR_ON            10      /* Output */
-+#define GPIOD_WIFI_PWR3_ON            11      /* Output */
-+
-+#define GPIOD_FL_PWR_ON               12      /* Output */
-+#define GPIOD_LCD_PWR4_ON             13      /* Output */
-+#define GPIOD_BL_KEYP_PWR_ON          14      /* Output */
-+#define GPIOD_BL_KEYB_PWR_ON          15      /* Output */
-+
-+extern struct platform_device htcuniversal_asic3;
-+
-+/* ASIC3 GPIO A bank */
-+
-+#define GPIO_I2C_EN                   0*16+GPIOA_I2C_EN
-+#define GPIO_SPK_PWR1_ON              0*16+GPIOA_SPK_PWR1_ON
-+#define GPIO_AUDIO_PWR_ON             0*16+GPIOA_AUDIO_PWR_ON
-+#define GPIO_EARPHONE_PWR_ON          0*16+GPIOA_EARPHONE_PWR_ON
-+
-+#define GPIO_UNKNOWNA4                        0*16+GPIOA_UNKNOWN4
-+#define GPIO_BUTTON_BACKLIGHT_N               0*16+GPIOA_BUTTON_BACKLIGHT_N
-+#define GPIO_SPK_PWR2_ON              0*16+GPIOA_SPK_PWR2_ON
-+#define GPIO_BUTTON_RECORD_N          0*16+GPIOA_BUTTON_RECORD_N
-+
-+#define GPIO_BUTTON_CAMERA_N          0*16+GPIOA_BUTTON_CAMERA_N
-+#define GPIO_UNKNOWNA9                        0*16+GPIOA_UNKNOWN9
-+#define GPIO_FLASHLIGHT               0*16+GPIOA_FLASHLIGHT
-+#define GPIO_COVER_ROTATE_N           0*16+GPIOA_COVER_ROTATE_N
-+
-+#define GPIO_TOUCHSCREEN_N            0*16+GPIOA_TOUCHSCREEN_N
-+#define GPIO_VOL_UP_N                         0*16+GPIOA_VOL_UP_N
-+#define GPIO_VOL_DOWN_N               0*16+GPIOA_VOL_DOWN_N
-+#define GPIO_LCD_PWR5_ON              0*16+GPIOA_LCD_PWR5_ON
-+
-+/* ASIC3 GPIO B bank */
-+
-+#define GPIO_BB_READY                 1*16+GPIOB_BB_READY
-+#define GPIO_CODEC_PDN                        1*16+GPIOB_CODEC_PDN
-+#define GPIO_UNKNOWNB2                        1*16+GPIOB_UNKNOWN2
-+#define GPIO_BB_UNKNOWN3              1*16+GPIOB_BB_UNKNOWN3
-+
-+#define GPIO_BT_IRQ                   1*16+GPIOB_BT_IRQ
-+#define GPIO_CLAMSHELL_N              1*16+GPIOB_CLAMSHELL_N
-+#define GPIO_LCD_PWR3_ON              1*16+GPIOB_LCD_PWR3_ON
-+#define GPIO_BB_ALERT                 1*16+GPIOB_BB_ALERT
-+
-+#define GPIO_BB_RESET2                        1*16+GPIOB_BB_RESET2
-+#define GPIO_EARPHONE_N                       1*16+GPIOB_EARPHONE_N
-+#define GPIO_MICRECORD_N              1*16+GPIOB_MICRECORD_N
-+#define GPIO_NIGHT_SENSOR             1*16+GPIOB_NIGHT_SENSOR
-+
-+#define GPIO_UMTS_DCD                 1*16+GPIOB_UMTS_DCD
-+#define GPIO_UNKNOWNB13                       1*16+GPIOB_UNKNOWN13
-+#define GPIO_CHARGE_EN                        1*16+GPIOB_CHARGE_EN
-+#define GPIO_USB_PUEN                         1*16+GPIOB_USB_PUEN
-+
-+/* ASIC3 GPIO C bank */
-+
-+#define GPIO_LED_BTWIFI               2*16+GPIOC_LED_BTWIFI
-+#define GPIO_LED_RED                  2*16+GPIOC_LED_RED
-+#define GPIO_LED_GREEN                        2*16+GPIOC_LED_GREEN
-+#define GPIO_BOARDID3                         2*16+GPIOC_BOARDID3
-+
-+#define GPIO_WIFI_IRQ_N               2*16+GPIOC_WIFI_IRQ_N
-+#define GPIO_WIFI_RESET               2*16+GPIOC_WIFI_RESET
-+#define GPIO_WIFI_PWR1_ON             2*16+GPIOC_WIFI_PWR1_ON
-+#define GPIO_BT_RESET                         2*16+GPIOC_BT_RESET
-+
-+#define GPIO_UNKNOWNC8                2*16+GPIOC_UNKNOWN8
-+#define GPIO_LCD_PWR1_ON              2*16+GPIOC_LCD_PWR1_ON
-+#define GPIO_LCD_PWR2_ON              2*16+GPIOC_LCD_PWR2_ON
-+#define GPIO_BOARDID2                         2*16+GPIOC_BOARDID2
-+
-+#define GPIO_BOARDID1                 2*16+GPIOC_BOARDID1
-+#define GPIO_BOARDID0                         2*16+GPIOC_BOARDID0
-+#define GPIO_BT_PWR_ON                        2*16+GPIOC_BT_PWR_ON
-+#define GPIO_CHARGE_ON                        2*16+GPIOC_CHARGE_ON
-+
-+/* ASIC3 GPIO D bank */
-+
-+#define GPIO_KEY_OK_N                 3*16+GPIOD_KEY_OK_N
-+#define GPIO_KEY_RIGHT_N              3*16+GPIOD_KEY_RIGHT_N
-+#define GPIO_KEY_LEFT_N                       3*16+GPIOD_KEY_LEFT_N
-+#define GPIO_KEY_DOWN_N                       3*16+GPIOD_KEY_DOWN_N
-+
-+#define GPIO_KEY_UP_N                         3*16+GPIOD_KEY_UP_N
-+#define GPIO_SDIO_DET                 3*16+GPIOD_SDIO_DET
-+#define GPIO_WIFI_PWR2_ON             3*16+GPIOD_WIFI_PWR2_ON
-+#define GPIO_HW_REBOOT                        3*16+GPIOD_HW_REBOOT
-+
-+#define GPIO_BB_RESET1                        3*16+GPIOD_BB_RESET1
-+#define GPIO_UNKNOWND9                        3*16+GPIOD_UNKNOWN9
-+#define GPIO_VIBRA_PWR_ON             3*16+GPIOD_VIBRA_PWR_ON
-+#define GPIO_WIFI_PWR3_ON             3*16+GPIOD_WIFI_PWR3_ON
-+
-+#define GPIO_FL_PWR_ON                3*16+GPIOD_FL_PWR_ON
-+#define GPIO_LCD_PWR4_ON              3*16+GPIOD_LCD_PWR4_ON
-+#define GPIO_BL_KEYP_PWR_ON           3*16+GPIOD_BL_KEYP_PWR_ON
-+#define GPIO_BL_KEYB_PWR_ON           3*16+GPIOD_BL_KEYB_PWR_ON
-+
-+#define HTCUNIVERSAL_EGPIO_BASE       PXA_CS2_PHYS+0x02000000
-+
-+#define EGPIO4_ON                      4  /* something */
-+#define EGPIO5_BT_3V3_ON               5  /* Bluetooth related */
-+#define EGPIO6_WIFI_ON                         6  /* WLAN related*/
-+
-+extern void htcuniversal_egpio_enable( u_int16_t bits );
-+extern void htcuniversal_egpio_disable( u_int16_t bits );
-+
-+#endif /* _HTCUNIVERSAL_ASIC_H_ */
-+
-Index: linux-2.6.22/include/asm-arm/arch-pxa/htcuniversal-gpio.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/arch-pxa/htcuniversal-gpio.h  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,220 @@
-+/*
-+ * include/asm-arm/arch-pxa/htcuniversal-gpio.h
-+ * History:
-+ *
-+ * 2004-12-10 Michael Opdenacker. Wrote down GPIO settings as identified by Jamey Hicks.
-+ *            Reused the h2200-gpio.h file as a template.
-+ */
-+
-+#ifndef _HTCUNIVERSAL_GPIO_H_
-+#define _HTCUNIVERSAL_GPIO_H_
-+
-+#include <asm/arch/pxa-regs.h>
-+
-+#define GET_HTCUNIVERSAL_GPIO(gpio) \
-+      (GPLR(GPIO_NR_HTCUNIVERSAL_ ## gpio) & GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio))
-+
-+#define SET_HTCUNIVERSAL_GPIO(gpio, setp) \
-+do { \
-+if (setp) \
-+      GPSR(GPIO_NR_HTCUNIVERSAL_ ## gpio) = GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio); \
-+else \
-+      GPCR(GPIO_NR_HTCUNIVERSAL_ ## gpio) = GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio); \
-+} while (0)
-+
-+#define SET_HTCUNIVERSAL_GPIO_N(gpio, setp) \
-+do { \
-+if (setp) \
-+      GPCR(GPIO_NR_HTCUNIVERSAL_ ## gpio ## _N) = GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio ## _N); \
-+else \
-+      GPSR(GPIO_NR_HTCUNIVERSAL_ ## gpio ## _N) = GPIO_bit(GPIO_NR_HTCUNIVERSAL_ ## gpio ## _N); \
-+} while (0)
-+
-+#define HTCUNIVERSAL_IRQ(gpio) \
-+      IRQ_GPIO(GPIO_NR_HTCUNIVERSAL_ ## gpio)
-+
-+#define GPIO_NR_HTCUNIVERSAL_KEY_ON_N                 0
-+#define GPIO_NR_HTCUNIVERSAL_GP_RST_N                 1
-+
-+#define GPIO_NR_HTCUNIVERSAL_USB_DET                  9
-+#define GPIO_NR_HTCUNIVERSAL_POWER_DET                        10
-+
-+#define GPIO_NR_HTCUNIVERSAL_CIF_DD7                  12
-+#define GPIO_NR_HTCUNIVERSAL_ASIC3_SDIO_INT_N         13
-+#define GPIO_NR_HTCUNIVERSAL_ASIC3_EXT_INT            14
-+#define GPIO_NR_HTCUNIVERSAL_CS1_N                    15
-+
-+#define GPIO_NR_HTCUNIVERSAL_CIF_DD6                  17
-+#define GPIO_NR_HTCUNIVERSAL_RDY                      18
-+
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_START              19
-+
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT7                        22
-+#define GPIO_NR_HTCUNIVERSAL_SPI_CLK                  23
-+#define GPIO_NR_HTCUNIVERSAL_SPI_FRM                  24
-+#define GPIO_NR_HTCUNIVERSAL_SPI_DO                   25
-+#define GPIO_NR_HTCUNIVERSAL_SPI_DI                   26
-+
-+#define GPIO_NR_HTCUNIVERSAL_CODEC_ON                 27
-+#define GPIO_NR_HTCUNIVERSAL_I2S_BCK                  28
-+#define GPIO_NR_HTCUNIVERSAL_I2S_DIN                  29
-+#define GPIO_NR_HTCUNIVERSAL_I2S_DOUT                 30
-+#define GPIO_NR_HTCUNIVERSAL_I2S_SYNC                 31
-+
-+#define GPIO_NR_HTCUNIVERSAL_RS232_ON                 32
-+#define GPIO_NR_HTCUNIVERSAL_CS5_N                    33
-+
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_RXD                        34
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_UART_CTS           35
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN7                 36
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN3                 37
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN4                 38
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_TXD                        39
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT6                        40
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_UART_RTS           41
-+#define GPIO_NR_HTCUNIVERSAL_BT_RXD                   42
-+#define GPIO_NR_HTCUNIVERSAL_BT_TXD                   43
-+#define GPIO_NR_HTCUNIVERSAL_BT_UART_CTS              44
-+#define GPIO_NR_HTCUNIVERSAL_BT_UART_RTS              45
-+
-+#define GPIO_NR_HTCUNIVERSAL_SIR_RXD                  42
-+#define GPIO_NR_HTCUNIVERSAL_SIR_TXD                  43
-+
-+#define GPIO_NR_HTCUNIVERSAL_POE_N                    48
-+#define GPIO_NR_HTCUNIVERSAL_PWE_N                    49
-+#define GPIO_NR_HTCUNIVERSAL_CIF_DD3                  50
-+#define GPIO_NR_HTCUNIVERSAL_CIF_DD2                  51
-+#define GPIO_NR_HTCUNIVERSAL_CIF_DD4                  52
-+
-+#define GPIO_NR_HTCUNIVERSAL_CIF_MCLK                 53
-+#define GPIO_NR_HTCUNIVERSAL_CIF_PCLK                 54
-+#define GPIO_NR_HTCUNIVERSAL_CIF_DD1                  55
-+
-+#define GPIO_NR_HTCUNIVERSAL_LDD0                     58
-+#define GPIO_NR_HTCUNIVERSAL_LDD1                     59
-+#define GPIO_NR_HTCUNIVERSAL_LDD2                     60
-+#define GPIO_NR_HTCUNIVERSAL_LDD3                     61
-+#define GPIO_NR_HTCUNIVERSAL_LDD4                     62
-+#define GPIO_NR_HTCUNIVERSAL_LDD5                     63
-+#define GPIO_NR_HTCUNIVERSAL_LDD6                     64
-+#define GPIO_NR_HTCUNIVERSAL_LDD7                     65
-+#define GPIO_NR_HTCUNIVERSAL_LDD8                     66
-+#define GPIO_NR_HTCUNIVERSAL_LDD9                     67
-+#define GPIO_NR_HTCUNIVERSAL_LDD10                    68
-+#define GPIO_NR_HTCUNIVERSAL_LDD11                    69
-+#define GPIO_NR_HTCUNIVERSAL_LDD12                    70
-+#define GPIO_NR_HTCUNIVERSAL_LDD13                    71
-+#define GPIO_NR_HTCUNIVERSAL_LDD14                    72
-+#define GPIO_NR_HTCUNIVERSAL_LDD15                    73
-+
-+#define GPIO_NR_HTCUNIVERSAL_LFCLK_RD                 74
-+#define GPIO_NR_HTCUNIVERSAL_LFCLK_A0                 75
-+#define GPIO_NR_HTCUNIVERSAL_LFCLK_WR                 76
-+#define GPIO_NR_HTCUNIVERSAL_LBIAS                    77
-+
-+#define GPIO_NR_HTCUNIVERSAL_CS2_N                    78
-+#define GPIO_NR_HTCUNIVERSAL_CS3_N                    79
-+#define GPIO_NR_HTCUNIVERSAL_CS4_N                    80
-+#define GPIO_NR_HTCUNIVERSAL_CIF_DD0                  81
-+#define GPIO_NR_HTCUNIVERSAL_CIF_DD5                  82
-+
-+#define GPIO_NR_HTCUNIVERSAL_CIF_LV                   84
-+#define GPIO_NR_HTCUNIVERSAL_CIF_FV                   85
-+
-+#define GPIO_NR_HTCUNIVERSAL_LCD1                     86
-+#define GPIO_NR_HTCUNIVERSAL_LCD2                     87
-+
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN5                 90
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN6                 91
-+
-+#define GPIO_NR_HTCUNIVERSAL_DREQ1                    97
-+
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_RESET              98
-+
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN0                 100
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN1                 101
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN2                 102
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT0                        103
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT1                        104
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT2                        105
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT3                        106
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT4                        107
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT5                        108
-+
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_UNKNOWN            109
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_OFF                        110
-+
-+#define GPIO_NR_HTCUNIVERSAL_USB_PUEN                 112
-+#define GPIO_NR_HTCUNIVERSAL_I2S_SYSCLK                       113
-+
-+#define GPIO_NR_HTCUNIVERSAL_PWM_OUT1                 115
-+
-+#define GPIO_NR_HTCUNIVERSAL_I2C_SCL                  117
-+#define GPIO_NR_HTCUNIVERSAL_I2C_SDA                  118
-+
-+#if 0
-+#define GPIO_NR_HTCUNIVERSAL_CPU_BATT_FAULT_N
-+#define GPIO_NR_HTCUNIVERSAL_ASIC3_RESET_N
-+#define GPIO_NR_HTCUNIVERSAL_CHARGE_EN_N
-+#define GPIO_NR_HTCUNIVERSAL_FLASH_VPEN
-+#define GPIO_NR_HTCUNIVERSAL_BATT_OFF
-+#define GPIO_NR_HTCUNIVERSAL_USB_CHARGE_RATE
-+#define GPIO_NR_HTCUNIVERSAL_BL_DETECT_N
-+#define GPIO_NR_HTCUNIVERSAL_CPU_HW_RESET_N
-+#endif
-+
-+
-+#define GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_CLK_MD   (23 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_FRM_MD   (24 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_DO_MD    (25 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_TOUCHSCREEN_SPI_DI_MD    (26 | GPIO_ALT_FN_1_IN)
-+
-+#define GPIO_NR_HTCUNIVERSAL_I2S_BCK_MD                       (28 | GPIO_ALT_FN_1_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_I2S_DIN_MD                       (29 | GPIO_ALT_FN_2_IN)
-+#define GPIO_NR_HTCUNIVERSAL_I2S_DOUT_MD              (30 | GPIO_ALT_FN_1_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_I2S_SYNC_MD              (31 | GPIO_ALT_FN_1_OUT)
-+
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_RXD_MD             (34 | GPIO_ALT_FN_1_IN)
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_UART_CTS_MD                (35 | GPIO_ALT_FN_1_IN)
-+
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_TXD_MD             (39 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_PHONE_UART_RTS_MD                (41 | GPIO_ALT_FN_2_OUT)
-+
-+#define GPIO_NR_HTCUNIVERSAL_BT_RXD_MD                        (42 | GPIO_ALT_FN_1_IN)
-+#define GPIO_NR_HTCUNIVERSAL_BT_TXD_MD                        (43 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_BT_UART_CTS_MD           (44 | GPIO_ALT_FN_1_IN)
-+#define GPIO_NR_HTCUNIVERSAL_BT_UART_RTS_MD           (45 | GPIO_ALT_FN_2_OUT)
-+
-+#define GPIO_NR_HTCUNIVERSAL_SIR_RXD_MD                       (46 | GPIO_ALT_FN_2_IN)
-+#define GPIO_NR_HTCUNIVERSAL_SIR_TXD_MD                       (47 | GPIO_ALT_FN_1_OUT)
-+
-+#define GPIO_NR_HTCUNIVERSAL_POE_N_MD                 (48 | GPIO_ALT_FN_2_OUT | GPIO_DFLT_HIGH)
-+#define GPIO_NR_HTCUNIVERSAL_PWE_N_MD                 (49 | GPIO_ALT_FN_2_OUT | GPIO_DFLT_HIGH)
-+
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN0_MD              (GPIO_NR_HTCUNIVERSAL_KP_MKIN0 | GPIO_ALT_FN_1_IN)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN1_MD              (GPIO_NR_HTCUNIVERSAL_KP_MKIN1 | GPIO_ALT_FN_1_IN)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN2_MD              (GPIO_NR_HTCUNIVERSAL_KP_MKIN2 | GPIO_ALT_FN_1_IN)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN3_MD              (GPIO_NR_HTCUNIVERSAL_KP_MKIN3 | GPIO_ALT_FN_3_IN)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN4_MD              (GPIO_NR_HTCUNIVERSAL_KP_MKIN4 | GPIO_ALT_FN_2_IN)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN5_MD              (GPIO_NR_HTCUNIVERSAL_KP_MKIN5 | GPIO_ALT_FN_1_IN)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN6_MD              (GPIO_NR_HTCUNIVERSAL_KP_MKIN6 | GPIO_ALT_FN_1_IN)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKIN7_MD              (GPIO_NR_HTCUNIVERSAL_KP_MKIN7 | GPIO_ALT_FN_3_IN)
-+
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT0_MD             (GPIO_NR_HTCUNIVERSAL_KP_MKOUT0 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT1_MD             (GPIO_NR_HTCUNIVERSAL_KP_MKOUT1 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT2_MD             (GPIO_NR_HTCUNIVERSAL_KP_MKOUT2 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT3_MD             (GPIO_NR_HTCUNIVERSAL_KP_MKOUT3 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT4_MD             (GPIO_NR_HTCUNIVERSAL_KP_MKOUT4 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT5_MD             (GPIO_NR_HTCUNIVERSAL_KP_MKOUT5 | GPIO_ALT_FN_2_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT6_MD             (GPIO_NR_HTCUNIVERSAL_KP_MKOUT6 | GPIO_ALT_FN_1_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_KP_MKOUT7_MD             (GPIO_NR_HTCUNIVERSAL_KP_MKOUT7 | GPIO_ALT_FN_1_OUT)
-+
-+
-+#define GPIO_NR_HTCUNIVERSAL_I2S_SYSCLK_MD            (113 | GPIO_ALT_FN_1_OUT)
-+
-+#define GPIO_NR_HTCUNIVERSAL_PWM1OUT_MD                       (115 | GPIO_ALT_FN_3_OUT)
-+
-+#define GPIO_NR_HTCUNIVERSAL_I2C_SCL_MD                       (117 | GPIO_ALT_FN_1_OUT)
-+#define GPIO_NR_HTCUNIVERSAL_I2C_SDA_MD                       (118 | GPIO_ALT_FN_1_OUT)
-+
-+#endif /* _HTCUNIVERSAL_GPIO_H */
-Index: linux-2.6.22/include/asm-arm/arch-pxa/htcuniversal-init.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/arch-pxa/htcuniversal-init.h  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,14 @@
-+/*
-+ * include/asm/arm/arch-pxa/htcuniversal-init.h
-+ *      Copyright (c) 2004 SDG Systems, LLC
-+ */
-+
-+#ifndef _HTCUNIVERSAL_INIT_H_
-+#define _HTCUNIVERSAL_INIT_H_
-+
-+/* htcuniversal initialization data should be found here
-+ * See -init.h files from other devices for details
-+ */
-+
-+#endif /* _HTCUNIVERSAL_INIT_H_ */
-+
-Index: linux-2.6.22/include/asm-arm/arch-pxa/htcuniversal.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/arch-pxa/htcuniversal.h       2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,3 @@
-+#include <asm/arch/irqs.h>
-+
-+#define HTCUNIVERSAL_ASIC3_IRQ_BASE IRQ_BOARD_START
-Index: linux-2.6.22/include/asm-arm/arch-pxa/pxa-pm_ll.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/arch-pxa/pxa-pm_ll.h  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,6 @@
-+struct pxa_ll_pm_ops {
-+      void (*suspend)(unsigned long);
-+      void (*resume)(void);
-+};
-+
-+extern struct pxa_ll_pm_ops *pxa_pm_set_ll_ops(struct pxa_ll_pm_ops *new_ops);
-Index: linux-2.6.22/include/asm-arm/arch-pxa/sharpsl.h
-===================================================================
---- linux-2.6.22.orig/include/asm-arm/arch-pxa/sharpsl.h       2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/include/asm-arm/arch-pxa/sharpsl.h    2007-08-23 13:09:22.000000000 +0200
-@@ -25,12 +25,6 @@
- /*
-  * SharpSL Backlight
-  */
--struct corgibl_machinfo {
--      int max_intensity;
--      int default_intensity;
--      int limit_mask;
--      void (*set_bl_intensity)(int intensity);
--};
- extern void corgibl_limit_intensity(int limit);
-Index: linux-2.6.22/include/asm-arm/hardware/asic3_keys.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/hardware/asic3_keys.h 2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,18 @@
-+#include <linux/input.h>
-+
-+struct asic3_keys_button {
-+      /* Configuration parameters */
-+      int keycode;
-+      int gpio;
-+      int active_low;
-+      char *desc;
-+      int type;
-+      /* Internal state vars - add below */
-+};
-+
-+struct asic3_keys_platform_data {
-+      struct asic3_keys_button *buttons;
-+      int nbuttons;
-+        struct input_dev *input;
-+        struct device *asic3_dev;
-+};
-Index: linux-2.6.22/include/asm-arm/hardware/asic3_leds.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/hardware/asic3_leds.h 2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,34 @@
-+/*
-+ * LEDs support for HTC ASIC3 devices.
-+ *
-+ * Copyright (c) 2006  Anton Vorontsov <cbou@mail.ru>
-+ *
-+ * 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/platform_device.h>
-+#include <linux/leds.h>
-+
-+struct asic3_leds_machinfo;
-+
-+struct asic3_led {
-+      struct led_classdev led_cdev;
-+      int hw_num;     /* Number of "hardware-accelerated" led */
-+      int gpio_num;   /* Number of GPIO if hw_num == -1 */
-+      struct asic3_leds_machinfo *machinfo;
-+};
-+
-+struct asic3_leds_machinfo {
-+      int num_leds;
-+      struct asic3_led *leds;
-+      struct platform_device *asic3_pdev;
-+};
-+
-+extern int asic3_leds_register(void);
-+extern void asic3_leds_unregister(void);
-+
-Index: linux-2.6.22/include/asm-arm/hardware/ipaq-asic3.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/hardware/ipaq-asic3.h 2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,602 @@
-+/*
-+ *
-+ * Definitions for the HTC ASIC3 chip found in several handheld devices
-+ *
-+ * Copyright 2001 Compaq Computer Corporation.
-+ *
-+ * 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.
-+ *
-+ * COMPAQ COMPUTER CORPORATION MAKES NO WARRANTIES, EXPRESSED OR IMPLIED,
-+ * AS TO THE USEFULNESS OR CORRECTNESS OF THIS CODE OR ITS
-+ * FITNESS FOR ANY PARTICULAR PURPOSE.
-+ *
-+ * Author: Andrew Christian
-+ *
-+ */
-+
-+#ifndef IPAQ_ASIC3_H
-+#define IPAQ_ASIC3_H
-+
-+/****************************************************/
-+/* IPAQ, ASIC #3, replaces ASIC #1 */
-+
-+#define IPAQ_ASIC3_OFFSET(x,y) (_IPAQ_ASIC3_ ## x ## _Base + _IPAQ_ASIC3_ ## x ## _ ## y)
-+#define IPAQ_ASIC3_GPIO_OFFSET(x,y) (_IPAQ_ASIC3_GPIO_ ## x ## _Base + _IPAQ_ASIC3_GPIO_ ## y)
-+
-+
-+/* All offsets below are specified with the following address bus shift */
-+#define ASIC3_DEFAULT_ADDR_SHIFT 2
-+
-+#define _IPAQ_ASIC3_GPIO_A_Base      0x0000
-+#define _IPAQ_ASIC3_GPIO_B_Base      0x0100
-+#define _IPAQ_ASIC3_GPIO_C_Base      0x0200
-+#define _IPAQ_ASIC3_GPIO_D_Base      0x0300
-+
-+#define _IPAQ_ASIC3_GPIO_Mask          0x00    /* R/W 0:don't mask, 1:mask interrupt */
-+#define _IPAQ_ASIC3_GPIO_Direction     0x04    /* R/W 0:input, 1:output              */
-+#define _IPAQ_ASIC3_GPIO_Out           0x08    /* R/W 0:output low, 1:output high    */
-+#define _IPAQ_ASIC3_GPIO_TriggerType   0x0c    /* R/W 0:level, 1:edge                */
-+#define _IPAQ_ASIC3_GPIO_EdgeTrigger   0x10    /* R/W 0:falling, 1:rising            */
-+#define _IPAQ_ASIC3_GPIO_LevelTrigger  0x14    /* R/W 0:low, 1:high level detect     */
-+#define _IPAQ_ASIC3_GPIO_SleepMask     0x18    /* R/W 0:don't mask, 1:mask trigger in sleep mode  */
-+#define _IPAQ_ASIC3_GPIO_SleepOut      0x1c    /* R/W level 0:low, 1:high in sleep mode           */
-+#define _IPAQ_ASIC3_GPIO_BattFaultOut  0x20    /* R/W level 0:low, 1:high in batt_fault           */
-+#define _IPAQ_ASIC3_GPIO_IntStatus     0x24    /* R/W 0:none, 1:detect               */
-+#define _IPAQ_ASIC3_GPIO_AltFunction   0x28   /* R/W 0:normal control 1:LED register control */
-+#define _IPAQ_ASIC3_GPIO_SleepConf     0x2c    /* R/W bit 1: autosleep 0: disable gposlpout in normal mode, enable gposlpout in sleep mode */
-+#define _IPAQ_ASIC3_GPIO_Status        0x30    /* R   Pin status                                  */
-+
-+#define IPAQ_ASIC3_GPIO_A_MASK(_b)            IPAQ_ASIC3_GPIO( _b, u16, A, Mask )
-+#define IPAQ_ASIC3_GPIO_A_DIR(_b)             IPAQ_ASIC3_GPIO( _b, u16, A, Direction )
-+#define IPAQ_ASIC3_GPIO_A_OUT(_b)             IPAQ_ASIC3_GPIO( _b, u16, A, Out )
-+#define IPAQ_ASIC3_GPIO_A_LEVELTRI(_b)        IPAQ_ASIC3_GPIO( _b, u16, A, TriggerType )
-+#define IPAQ_ASIC3_GPIO_A_RISING(_b)          IPAQ_ASIC3_GPIO( _b, u16, A, EdgeTrigger )
-+#define IPAQ_ASIC3_GPIO_A_LEVEL(_b)           IPAQ_ASIC3_GPIO( _b, u16, A, LevelTrigger )
-+#define IPAQ_ASIC3_GPIO_A_SLEEP_MASK(_b)      IPAQ_ASIC3_GPIO( _b, u16, A, SleepMask )
-+#define IPAQ_ASIC3_GPIO_A_SLEEP_OUT(_b)       IPAQ_ASIC3_GPIO( _b, u16, A, SleepOut )
-+#define IPAQ_ASIC3_GPIO_A_BATT_FAULT_OUT(_b)  IPAQ_ASIC3_GPIO( _b, u16, A, BattFaultOut )
-+#define IPAQ_ASIC3_GPIO_A_INT_STATUS(_b)      IPAQ_ASIC3_GPIO( _b, u16, A, IntStatus )
-+#define IPAQ_ASIC3_GPIO_A_ALT_FUNCTION(_b)    IPAQ_ASIC3_GPIO( _b, u16, A, AltFunction )
-+#define IPAQ_ASIC3_GPIO_A_SLEEP_CONF(_b)      IPAQ_ASIC3_GPIO( _b, u16, A, SleepConf )
-+#define IPAQ_ASIC3_GPIO_A_STATUS(_b)          IPAQ_ASIC3_GPIO( _b, u16, A, Status )
-+
-+#define IPAQ_ASIC3_GPIO_B_MASK(_b)            IPAQ_ASIC3_GPIO( _b, u16, B, Mask )
-+#define IPAQ_ASIC3_GPIO_B_DIR(_b)             IPAQ_ASIC3_GPIO( _b, u16, B, Direction )
-+#define IPAQ_ASIC3_GPIO_B_OUT(_b)             IPAQ_ASIC3_GPIO( _b, u16, B, Out )
-+#define IPAQ_ASIC3_GPIO_B_LEVELTRI(_b)        IPAQ_ASIC3_GPIO( _b, u16, B, TriggerType )
-+#define IPAQ_ASIC3_GPIO_B_RISING(_b)          IPAQ_ASIC3_GPIO( _b, u16, B, EdgeTrigger )
-+#define IPAQ_ASIC3_GPIO_B_LEVEL(_b)           IPAQ_ASIC3_GPIO( _b, u16, B, LevelTrigger )
-+#define IPAQ_ASIC3_GPIO_B_SLEEP_MASK(_b)      IPAQ_ASIC3_GPIO( _b, u16, B, SleepMask )
-+#define IPAQ_ASIC3_GPIO_B_SLEEP_OUT(_b)       IPAQ_ASIC3_GPIO( _b, u16, B, SleepOut )
-+#define IPAQ_ASIC3_GPIO_B_BATT_FAULT_OUT(_b)  IPAQ_ASIC3_GPIO( _b, u16, B, BattFaultOut )
-+#define IPAQ_ASIC3_GPIO_B_INT_STATUS(_b)      IPAQ_ASIC3_GPIO( _b, u16, B, IntStatus )
-+#define IPAQ_ASIC3_GPIO_B_ALT_FUNCTION(_b)    IPAQ_ASIC3_GPIO( _b, u16, B, AltFunction )
-+#define IPAQ_ASIC3_GPIO_B_SLEEP_CONF(_b)      IPAQ_ASIC3_GPIO( _b, u16, B, SleepConf )
-+#define IPAQ_ASIC3_GPIO_B_STATUS(_b)          IPAQ_ASIC3_GPIO( _b, u16, B, Status )
-+
-+#define IPAQ_ASIC3_GPIO_C_MASK(_b)            IPAQ_ASIC3_GPIO( _b, u16, C, Mask )
-+#define IPAQ_ASIC3_GPIO_C_DIR(_b)             IPAQ_ASIC3_GPIO( _b, u16, C, Direction )
-+#define IPAQ_ASIC3_GPIO_C_OUT(_b)             IPAQ_ASIC3_GPIO( _b, u16, C, Out )
-+#define IPAQ_ASIC3_GPIO_C_LEVELTRI(_b)        IPAQ_ASIC3_GPIO( _b, u16, C, TriggerType )
-+#define IPAQ_ASIC3_GPIO_C_RISING(_b)          IPAQ_ASIC3_GPIO( _b, u16, C, EdgeTrigger )
-+#define IPAQ_ASIC3_GPIO_C_LEVEL(_b)           IPAQ_ASIC3_GPIO( _b, u16, C, LevelTrigger )
-+#define IPAQ_ASIC3_GPIO_C_SLEEP_MASK(_b)      IPAQ_ASIC3_GPIO( _b, u16, C, SleepMask )
-+#define IPAQ_ASIC3_GPIO_C_SLEEP_OUT(_b)       IPAQ_ASIC3_GPIO( _b, u16, C, SleepOut )
-+#define IPAQ_ASIC3_GPIO_C_BATT_FAULT_OUT(_b)  IPAQ_ASIC3_GPIO( _b, u16, C, BattFaultOut )
-+#define IPAQ_ASIC3_GPIO_C_INT_STATUS(_b)      IPAQ_ASIC3_GPIO( _b, u16, C, IntStatus )
-+#define IPAQ_ASIC3_GPIO_C_ALT_FUNCTION(_b)    IPAQ_ASIC3_GPIO( _b, u16, C, AltFunction )
-+#define IPAQ_ASIC3_GPIO_C_SLEEP_CONF(_b)      IPAQ_ASIC3_GPIO( _b, u16, C, SleepConf )
-+#define IPAQ_ASIC3_GPIO_C_STATUS(_b)          IPAQ_ASIC3_GPIO( _b, u16, C, Status )
-+
-+#define IPAQ_ASIC3_GPIO_D_MASK(_b)            IPAQ_ASIC3_GPIO( _b, u16, D, Mask )
-+#define IPAQ_ASIC3_GPIO_D_DIR(_b)             IPAQ_ASIC3_GPIO( _b, u16, D, Direction )
-+#define IPAQ_ASIC3_GPIO_D_OUT(_b)             IPAQ_ASIC3_GPIO( _b, u16, D, Out )
-+#define IPAQ_ASIC3_GPIO_D_LEVELTRI(_b)        IPAQ_ASIC3_GPIO( _b, u16, D, TriggerType )
-+#define IPAQ_ASIC3_GPIO_D_RISING(_b)          IPAQ_ASIC3_GPIO( _b, u16, D, EdgeTrigger )
-+#define IPAQ_ASIC3_GPIO_D_LEVEL(_b)           IPAQ_ASIC3_GPIO( _b, u16, D, LevelTrigger )
-+#define IPAQ_ASIC3_GPIO_D_SLEEP_MASK(_b)      IPAQ_ASIC3_GPIO( _b, u16, D, SleepMask )
-+#define IPAQ_ASIC3_GPIO_D_SLEEP_OUT(_b)       IPAQ_ASIC3_GPIO( _b, u16, D, SleepOut )
-+#define IPAQ_ASIC3_GPIO_D_BATT_FAULT_OUT(_b)  IPAQ_ASIC3_GPIO( _b, u16, D, BattFaultOut )
-+#define IPAQ_ASIC3_GPIO_D_INT_STATUS(_b)      IPAQ_ASIC3_GPIO( _b, u16, D, IntStatus )
-+#define IPAQ_ASIC3_GPIO_D_ALT_FUNCTION(_b)    IPAQ_ASIC3_GPIO( _b, u16, D, AltFunction )
-+#define IPAQ_ASIC3_GPIO_D_SLEEP_CONF(_b)      IPAQ_ASIC3_GPIO( _b, u16, D, SleepConf )
-+#define IPAQ_ASIC3_GPIO_D_STATUS(_b)          IPAQ_ASIC3_GPIO( _b, u16, D, Status )
-+
-+#define _IPAQ_ASIC3_SPI_Base                0x0400
-+#define _IPAQ_ASIC3_SPI_Control               0x0000
-+#define _IPAQ_ASIC3_SPI_TxData                0x0004
-+#define _IPAQ_ASIC3_SPI_RxData                0x0008
-+#define _IPAQ_ASIC3_SPI_Int                   0x000c
-+#define _IPAQ_ASIC3_SPI_Status                0x0010
-+
-+#define IPAQ_ASIC3_SPI_Control(_b)            IPAQ_ASIC3( _b, u16, SPI, Control )
-+#define IPAQ_ASIC3_SPI_TxData(_b)             IPAQ_ASIC3( _b, u16, SPI, TxData )
-+#define IPAQ_ASIC3_SPI_RxData(_b)             IPAQ_ASIC3( _b, u16, SPI, RxData )
-+#define IPAQ_ASIC3_SPI_Int(_b)                IPAQ_ASIC3( _b, u16, SPI, Int )
-+#define IPAQ_ASIC3_SPI_Status(_b)             IPAQ_ASIC3( _b, u16, SPI, Status )
-+
-+#define SPI_CONTROL_SPR(clk)      ((clk) & 0x0f)  /* Clock rate */
-+
-+#define _IPAQ_ASIC3_PWM_0_Base                0x0500
-+#define _IPAQ_ASIC3_PWM_1_Base                0x0600
-+#define _IPAQ_ASIC3_PWM_TimeBase              0x0000
-+#define _IPAQ_ASIC3_PWM_PeriodTime            0x0004
-+#define _IPAQ_ASIC3_PWM_DutyTime              0x0008
-+
-+#define IPAQ_ASIC3_PWM_TimeBase(_b, x)        IPAQ_ASIC3_N( _b, u16, PWM, x, TimeBase )
-+#define IPAQ_ASIC3_PWM_PeriodTime(_b, x)      IPAQ_ASIC3_N( _b, u16, PWM, x, PeriodTime )
-+#define IPAQ_ASIC3_PWM_DutyTime(_b, x)        IPAQ_ASIC3_N( _b, u16, PWM, x, DutyTime )
-+
-+#define PWM_TIMEBASE_VALUE(x)    ((x)&0xf)   /* Low 4 bits sets time base */
-+#define PWM_TIMEBASE_ENABLE     (1 << 4)   /* Enable clock */
-+
-+#define _IPAQ_ASIC3_LED_0_Base                0x0700
-+#define _IPAQ_ASIC3_LED_1_Base                0x0800
-+#define _IPAQ_ASIC3_LED_2_Base                      0x0900
-+#define _IPAQ_ASIC3_LED_TimeBase              0x0000    /* R/W  7 bits */
-+#define _IPAQ_ASIC3_LED_PeriodTime            0x0004    /* R/W 12 bits */
-+#define _IPAQ_ASIC3_LED_DutyTime              0x0008    /* R/W 12 bits */
-+#define _IPAQ_ASIC3_LED_AutoStopCount         0x000c    /* R/W 16 bits */
-+
-+#define IPAQ_ASIC3_LED_TimeBase(_b, x)         IPAQ_ASIC3_N( _b,  u8, LED, x, TimeBase )
-+#define IPAQ_ASIC3_LED_PeriodTime(_b, x)       IPAQ_ASIC3_N( _b, u16, LED, x, PeriodTime )
-+#define IPAQ_ASIC3_LED_DutyTime(_b, x)         IPAQ_ASIC3_N( _b, u16, LED, x, DutyTime )
-+#define IPAQ_ASIC3_LED_AutoStopCount(_b, x)    IPAQ_ASIC3_N( _b, u16, LED, x, AutoStopCount )
-+
-+/* LED TimeBase bits - match ASIC2 */
-+#define LED_TBS               0x0f            /* Low 4 bits sets time base, max = 13          */
-+                                      /* Note: max = 5 on hx4700                      */
-+                                      /* 0: maximum time base                         */
-+                                      /* 1: maximum time base / 2                     */
-+                                      /* n: maximum time base / 2^n                   */
-+
-+#define LED_EN                (1 << 4)        /* LED ON/OFF 0:off, 1:on                       */
-+#define LED_AUTOSTOP  (1 << 5)        /* LED ON/OFF auto stop set 0:disable, 1:enable */
-+#define LED_ALWAYS    (1 << 6)        /* LED Interrupt Mask 0:No mask, 1:mask         */
-+
-+#define _IPAQ_ASIC3_CLOCK_Base                0x0A00
-+#define _IPAQ_ASIC3_CLOCK_CDEX           0x00
-+#define _IPAQ_ASIC3_CLOCK_SEL            0x04
-+
-+#define IPAQ_ASIC3_CLOCK_CDEX(_b)         IPAQ_ASIC3( _b, u16, CLOCK, CDEX )
-+#define IPAQ_ASIC3_CLOCK_SEL(_b)          IPAQ_ASIC3( _b, u16, CLOCK, SEL )
-+
-+#define CLOCK_CDEX_SOURCE       (1 << 0)  /* 2 bits */
-+#define CLOCK_CDEX_SOURCE0      (1 << 0)
-+#define CLOCK_CDEX_SOURCE1      (1 << 1)
-+#define CLOCK_CDEX_SPI          (1 << 2)
-+#define CLOCK_CDEX_OWM          (1 << 3)
-+#define CLOCK_CDEX_PWM0         (1 << 4)
-+#define CLOCK_CDEX_PWM1         (1 << 5)
-+#define CLOCK_CDEX_LED0         (1 << 6)
-+#define CLOCK_CDEX_LED1         (1 << 7)
-+#define CLOCK_CDEX_LED2         (1 << 8)
-+
-+#define CLOCK_CDEX_SD_HOST      (1 << 9)   /* R/W: SD host clock source 24.576M/12.288M */
-+#define CLOCK_CDEX_SD_BUS       (1 << 10)  /* R/W: SD bus clock source control 24.576M/12.288M */
-+#define CLOCK_CDEX_SMBUS        (1 << 11)
-+#define CLOCK_CDEX_CONTROL_CX   (1 << 12)
-+
-+#define CLOCK_CDEX_EX0          (1 << 13)  /* R/W: 32.768 kHz crystal */
-+#define CLOCK_CDEX_EX1          (1 << 14)  /* R/W: 24.576 MHz crystal */
-+
-+#define CLOCK_SEL_SD_HCLK_SEL   (1 << 0)   /* R/W: SDIO host clock select  -  1: 24.576 Mhz, 0: 12.288 MHz */
-+#define CLOCK_SEL_SD_BCLK_SEL   (1 << 1)   /* R/W: SDIO bus clock select -  1: 24.576 MHz, 0: 12.288 MHz */
-+#define CLOCK_SEL_CX            (1 << 2)   /* R/W: INT clock source control (32.768 kHz) */
-+
-+
-+#define _IPAQ_ASIC3_INTR_Base         0x0B00
-+
-+#define _IPAQ_ASIC3_INTR_IntMask       0x00  /* Interrupt mask control */
-+#define _IPAQ_ASIC3_INTR_PIntStat      0x04  /* Peripheral interrupt status */
-+#define _IPAQ_ASIC3_INTR_IntCPS        0x08  /* Interrupt timer clock pre-scale */
-+#define _IPAQ_ASIC3_INTR_IntTBS        0x0c  /* Interrupt timer set */
-+
-+#define IPAQ_ASIC3_INTR_IntMask(_b)       IPAQ_ASIC3( _b, u8, INTR, IntMask )
-+#define IPAQ_ASIC3_INTR_PIntStat(_b)      IPAQ_ASIC3( _b, u8, INTR, PIntStat )
-+#define IPAQ_ASIC3_INTR_IntCPS(_b)        IPAQ_ASIC3( _b, u8, INTR, IntCPS )
-+#define IPAQ_ASIC3_INTR_IntTBS(_b)        IPAQ_ASIC3( _b, u16, INTR, IntTBS )
-+
-+#define ASIC3_INTMASK_GINTMASK    (1 << 0)  /* Global interrupt mask 1:enable */
-+#define ASIC3_INTMASK_GINTEL      (1 << 1)  /* 1: rising edge, 0: hi level */
-+#define ASIC3_INTMASK_MASK0       (1 << 2)
-+#define ASIC3_INTMASK_MASK1       (1 << 3)
-+#define ASIC3_INTMASK_MASK2       (1 << 4)
-+#define ASIC3_INTMASK_MASK3       (1 << 5)
-+#define ASIC3_INTMASK_MASK4       (1 << 6)
-+#define ASIC3_INTMASK_MASK5       (1 << 7)
-+
-+#define ASIC3_INTR_PERIPHERAL_A   (1 << 0)
-+#define ASIC3_INTR_PERIPHERAL_B   (1 << 1)
-+#define ASIC3_INTR_PERIPHERAL_C   (1 << 2)
-+#define ASIC3_INTR_PERIPHERAL_D   (1 << 3)
-+#define ASIC3_INTR_LED0           (1 << 4)
-+#define ASIC3_INTR_LED1           (1 << 5)
-+#define ASIC3_INTR_LED2           (1 << 6)
-+#define ASIC3_INTR_SPI            (1 << 7)
-+#define ASIC3_INTR_SMBUS          (1 << 8)
-+#define ASIC3_INTR_OWM            (1 << 9)
-+
-+#define ASIC3_INTR_CPS(x)         ((x)&0x0f)    /* 4 bits, max 14 */
-+#define ASIC3_INTR_CPS_SET        ( 1 << 4 )    /* Time base enable */
-+
-+
-+/* Basic control of the SD ASIC */
-+#define _IPAQ_ASIC3_SDHWCTRL_Base     0x0E00
-+
-+#define _IPAQ_ASIC3_SDHWCTRL_SDConf    0x00
-+#define IPAQ_ASIC3_SDHWCTRL_SDConf(_b)    IPAQ_ASIC3( _b, u8, SDHWCTRL, SDConf )
-+
-+#define ASIC3_SDHWCTRL_SUSPEND    (1 << 0)  /* 1=suspend all SD operations */
-+#define ASIC3_SDHWCTRL_CLKSEL     (1 << 1)  /* 1=SDICK, 0=HCLK */
-+#define ASIC3_SDHWCTRL_PCLR       (1 << 2)  /* All registers of SDIO cleared */
-+#define ASIC3_SDHWCTRL_LEVCD      (1 << 3)  /* Level of SD card detection: 1:high, 0:low */
-+#define ASIC3_SDHWCTRL_LEVWP      (1 << 4)  /* Level of SD card write protection: 1=low, 0=high */
-+#define ASIC3_SDHWCTRL_SDLED      (1 << 5)  /* SD card LED signal 1=enable, 0=disable */
-+#define ASIC3_SDHWCTRL_SDPWR      (1 << 6)  /* SD card power supply control 1=enable */
-+
-+
-+/* This is a pointer to an array of 12 u32 values - but only the lower 2 bytes matter */
-+/* Use it as "IPAQ_ASIC3_HWPROTECT_ARRAY[x]" */
-+
-+#define _IPAQ_ASIC3_HWPROTECT_Base    0x1000
-+#define IPAQ_ASIC3_HWPROTECT_ARRAY  ((volatile u32*)(_IPAQ_ASIC3_Base + _IPAQ_ASIC3_HWPROTECT_Base))
-+#define HWPROTECT_ARRAY_LEN 12
-+#define HWPROTECT_ARRAY_VALUES {0x4854,0x432d,0x5344,0x494f,0x2050,0x2f4e,0x3a33,0x3048,0x3830,0x3032,0x382d,0x3030}
-+
-+
-+#define _IPAQ_ASIC3_EXTCF_Base                0x1100
-+
-+#define _IPAQ_ASIC3_EXTCF_Select         0x00
-+#define _IPAQ_ASIC3_EXTCF_Reset          0x04
-+
-+#define IPAQ_ASIC3_EXTCF_Select(_b)    IPAQ_ASIC3( _b, u16, EXTCF, Select )
-+#define IPAQ_ASIC3_EXTCF_Reset(_b)     IPAQ_ASIC3( _b, u16, EXTCF, Reset )
-+
-+#define ASIC3_EXTCF_SMOD0              (1 << 0)  /* slot number of mode 0 */
-+#define ASIC3_EXTCF_SMOD1              (1 << 1)  /* slot number of mode 1 */
-+#define ASIC3_EXTCF_SMOD2              (1 << 2)  /* slot number of mode 2 */
-+#define ASIC3_EXTCF_OWM_EN             (1 << 4)  /* enable onewire module */
-+#define ASIC3_EXTCF_OWM_SMB            (1 << 5)  /* OWM bus selection */
-+#define ASIC3_EXTCF_OWM_RESET            (1 << 6)  /* undocumented, used by OWM and CF */
-+#define ASIC3_EXTCF_CF0_SLEEP_MODE       (1 << 7)  /* CF0 sleep state control */
-+#define ASIC3_EXTCF_CF1_SLEEP_MODE       (1 << 8)  /* CF1 sleep state control */
-+#define ASIC3_EXTCF_CF0_PWAIT_EN         (1 << 10)  /* CF0 PWAIT_n control */
-+#define ASIC3_EXTCF_CF1_PWAIT_EN         (1 << 11)  /* CF1 PWAIT_n control */
-+#define ASIC3_EXTCF_CF0_BUF_EN           (1 << 12)  /* CF0 buffer control */
-+#define ASIC3_EXTCF_CF1_BUF_EN           (1 << 13)  /* CF1 buffer control */
-+#define ASIC3_EXTCF_SD_MEM_ENABLE        (1 << 14)
-+#define ASIC3_EXTCF_CF_SLEEP             (1 << 15)  /* CF sleep mode control */
-+
-+/*****************************************************************************
-+ *  The Onewire interface registers
-+ *
-+ *  OWM_CMD
-+ *  OWM_DAT
-+ *  OWM_INTR
-+ *  OWM_INTEN
-+ *  OWM_CLKDIV
-+ *
-+ *****************************************************************************/
-+
-+#define _IPAQ_ASIC3_OWM_Base          0xC00
-+
-+#define _IPAQ_ASIC3_OWM_CMD         0x00
-+#define _IPAQ_ASIC3_OWM_DAT         0x04
-+#define _IPAQ_ASIC3_OWM_INTR        0x08
-+#define _IPAQ_ASIC3_OWM_INTEN       0x0C
-+#define _IPAQ_ASIC3_OWM_CLKDIV      0x10
-+
-+#define ASIC3_OWM_CMD_ONEWR         (1 << 0)
-+#define ASIC3_OWM_CMD_SRA           (1 << 1)
-+#define ASIC3_OWM_CMD_DQO           (1 << 2)
-+#define ASIC3_OWM_CMD_DQI           (1 << 3)
-+
-+#define ASIC3_OWM_INTR_PD          (1 << 0)
-+#define ASIC3_OWM_INTR_PDR         (1 << 1)
-+#define ASIC3_OWM_INTR_TBE         (1 << 2)
-+#define ASIC3_OWM_INTR_TEMP        (1 << 3)
-+#define ASIC3_OWM_INTR_RBF         (1 << 4)
-+
-+#define ASIC3_OWM_INTEN_EPD        (1 << 0)
-+#define ASIC3_OWM_INTEN_IAS        (1 << 1)
-+#define ASIC3_OWM_INTEN_ETBE       (1 << 2)
-+#define ASIC3_OWM_INTEN_ETMT       (1 << 3)
-+#define ASIC3_OWM_INTEN_ERBF       (1 << 4)
-+
-+#define ASIC3_OWM_CLKDIV_PRE       (3 << 0) /* two bits wide at bit position 0 */
-+#define ASIC3_OWM_CLKDIV_DIV       (7 << 2) /* 3 bits wide at bit position 2 */
-+
-+
-+/*****************************************************************************
-+ *  The SD configuration registers are at a completely different location
-+ *  in memory.  They are divided into three sets of registers:
-+ *
-+ *  SD_CONFIG         Core configuration register
-+ *  SD_CTRL           Control registers for SD operations
-+ *  SDIO_CTRL         Control registers for SDIO operations
-+ *
-+ *****************************************************************************/
-+
-+#define IPAQ_ASIC3_SD_CONFIG(_b, s,x)   \
-+     (*((volatile s *) ((_b) + _IPAQ_ASIC3_SD_CONFIG_Base + (_IPAQ_ASIC3_SD_CONFIG_ ## x))))
-+
-+#define _IPAQ_ASIC3_SD_CONFIG_Base            0x0400    // Assumes 32 bit addressing
-+
-+#define _IPAQ_ASIC3_SD_CONFIG_Command           0x08   /* R/W: Command */
-+#define _IPAQ_ASIC3_SD_CONFIG_Addr0             0x20   /* [9:31] SD Control Register Base Address */
-+#define _IPAQ_ASIC3_SD_CONFIG_Addr1             0x24   /* [9:31] SD Control Register Base Address */
-+#define _IPAQ_ASIC3_SD_CONFIG_IntPin            0x78   /* R/O: interrupt assigned to pin */
-+#define _IPAQ_ASIC3_SD_CONFIG_ClkStop           0x80   /* Set to 0x1f to clock SD controller, 0 otherwise. */
-+                                                      /* at 0x82 - Gated Clock Control */
-+#define _IPAQ_ASIC3_SD_CONFIG_ClockMode         0x84   /* Control clock of SD controller */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_PinStatus    0x88   /* R/0: read status of SD pins */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_Power1       0x90   /* Power1 - manual power control */
-+                                                      /* Power2 is at 0x92 - auto power up after card inserted */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_Power3       0x94   /* auto power down when card removed */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_CardDetect   0x98   /* */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_Slot         0xA0   /* R/O: define support slot number */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk1  0x1E0  /* Could be used for gated clock (don't use) */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk2  0x1E2  /* Could be used for gated clock (don't use) */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_GPIO_OutAndEnable  0x1E8  /* GPIO Output Reg. , at 0x1EA - GPIO Output Enable Reg. */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_GPIO_Status  0x1EC  /* GPIO Status Reg. */
-+#define _IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk3  0x1F0  /* Bit 1: double buffer/single buffer */
-+
-+#define IPAQ_ASIC3_SD_CONFIG_Command(_b)           IPAQ_ASIC3_SD_CONFIG(_b, u16, Command )
-+#define IPAQ_ASIC3_SD_CONFIG_Addr0(_b)             IPAQ_ASIC3_SD_CONFIG(_b, u16, Addr0 )
-+#define IPAQ_ASIC3_SD_CONFIG_Addr1(_b)             IPAQ_ASIC3_SD_CONFIG(_b, u16, Addr1 )
-+#define IPAQ_ASIC3_SD_CONFIG_IntPin(_b)            IPAQ_ASIC3_SD_CONFIG(_b, u8, IntPin )
-+#define IPAQ_ASIC3_SD_CONFIG_ClkStop(_b)           IPAQ_ASIC3_SD_CONFIG(_b, u8, ClkStop )
-+#define IPAQ_ASIC3_SD_CONFIG_ClockMode(_b)         IPAQ_ASIC3_SD_CONFIG(_b, u8, ClockMode )
-+#define IPAQ_ASIC3_SD_CONFIG_SDHC_PinStatus(_b)    IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_PinStatus )
-+#define IPAQ_ASIC3_SD_CONFIG_SDHC_Power1(_b)       IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_Power1 )
-+#define IPAQ_ASIC3_SD_CONFIG_SDHC_Power3(_b)       IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_Power3 )
-+#define IPAQ_ASIC3_SD_CONFIG_SDHC_CardDetect(_b)   IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_CardDetect )
-+#define IPAQ_ASIC3_SD_CONFIG_SDHC_Slot(_b)         IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_Slot )
-+#define IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk1(_b)  IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_ExtGateClk1 )
-+#define IPAQ_ASIC3_SD_CONFIG_SDHC_ExtGateClk3(_b)  IPAQ_ASIC3_SD_CONFIG(_b, u16, SDHC_ExtGateClk3 )
-+
-+#define SD_CONFIG_
-+
-+#define SD_CONFIG_COMMAND_MAE                (1<<1)    /* Memory access enable (set to 1 to access SD Controller) */
-+
-+#define SD_CONFIG_CLK_ENABLE_ALL             0x1f
-+
-+#define SD_CONFIG_POWER1_PC_33V              0x0200    /* Set for 3.3 volts */
-+#define SD_CONFIG_POWER1_PC_OFF              0x0000    /* Turn off power */
-+
-+#define SD_CONFIG_CARDDETECTMODE_CLK           ((x)&0x3) /* two bits - number of cycles for card detection */
-+
-+
-+#define _IPAQ_ASIC3_SD_CTRL_Base            0x1000
-+
-+#define IPAQ_ASIC3_SD(_b, s,x)   \
-+     (*((volatile s *) ((_b) + _IPAQ_ASIC3_SD_CTRL_Base + (_IPAQ_ASIC3_SD_CTRL_ ## x))))
-+
-+#define _IPAQ_ASIC3_SD_CTRL_Cmd                  0x00
-+#define _IPAQ_ASIC3_SD_CTRL_Arg0                 0x08
-+#define _IPAQ_ASIC3_SD_CTRL_Arg1                 0x0C
-+#define _IPAQ_ASIC3_SD_CTRL_StopInternal         0x10
-+#define _IPAQ_ASIC3_SD_CTRL_TransferSectorCount  0x14
-+#define _IPAQ_ASIC3_SD_CTRL_Response0            0x18
-+#define _IPAQ_ASIC3_SD_CTRL_Response1            0x1C
-+#define _IPAQ_ASIC3_SD_CTRL_Response2            0x20
-+#define _IPAQ_ASIC3_SD_CTRL_Response3            0x24
-+#define _IPAQ_ASIC3_SD_CTRL_Response4            0x28
-+#define _IPAQ_ASIC3_SD_CTRL_Response5            0x2C
-+#define _IPAQ_ASIC3_SD_CTRL_Response6            0x30
-+#define _IPAQ_ASIC3_SD_CTRL_Response7            0x34
-+#define _IPAQ_ASIC3_SD_CTRL_CardStatus           0x38
-+#define _IPAQ_ASIC3_SD_CTRL_BufferCtrl           0x3C
-+#define _IPAQ_ASIC3_SD_CTRL_IntMaskCard          0x40
-+#define _IPAQ_ASIC3_SD_CTRL_IntMaskBuffer        0x44
-+#define _IPAQ_ASIC3_SD_CTRL_CardClockCtrl        0x48
-+#define _IPAQ_ASIC3_SD_CTRL_MemCardXferDataLen   0x4C
-+#define _IPAQ_ASIC3_SD_CTRL_MemCardOptionSetup   0x50
-+#define _IPAQ_ASIC3_SD_CTRL_ErrorStatus0         0x58
-+#define _IPAQ_ASIC3_SD_CTRL_ErrorStatus1         0x5C
-+#define _IPAQ_ASIC3_SD_CTRL_DataPort             0x60
-+#define _IPAQ_ASIC3_SD_CTRL_TransactionCtrl      0x68
-+#define _IPAQ_ASIC3_SD_CTRL_SoftwareReset        0x1C0
-+
-+#define IPAQ_ASIC3_SD_CTRL_Cmd(_b)                  IPAQ_ASIC3_SD( _b, u16, Cmd )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Arg0(_b)                 IPAQ_ASIC3_SD( _b, u16, Arg0 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Arg1(_b)                 IPAQ_ASIC3_SD( _b, u16, Arg1 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_StopInternal(_b)         IPAQ_ASIC3_SD( _b, u16, StopInternal )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_TransferSectorCount(_b)  IPAQ_ASIC3_SD( _b, u16, TransferSectorCount )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Response0(_b)            IPAQ_ASIC3_SD( _b, u16, Response0 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Response1(_b)            IPAQ_ASIC3_SD( _b, u16, Response1 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Response2(_b)            IPAQ_ASIC3_SD( _b, u16, Response2 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Response3(_b)            IPAQ_ASIC3_SD( _b, u16, Response3 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Response4(_b)            IPAQ_ASIC3_SD( _b, u16, Response4 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Response5(_b)            IPAQ_ASIC3_SD( _b, u16, Response5 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Response6(_b)            IPAQ_ASIC3_SD( _b, u16, Response6 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_Response7(_b)            IPAQ_ASIC3_SD( _b, u16, Response7 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_CardStatus(_b)           IPAQ_ASIC3_SD( _b, u16, CardStatus )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_BufferCtrl(_b)           IPAQ_ASIC3_SD( _b, u16, BufferCtrl )   /* and error status*/
-+#define IPAQ_ASIC3_SD_CTRL_IntMaskCard(_b)          IPAQ_ASIC3_SD( _b, u16, IntMaskCard )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_IntMaskBuffer(_b)        IPAQ_ASIC3_SD( _b, u16, IntMaskBuffer )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_CardClockCtrl(_b)        IPAQ_ASIC3_SD( _b, u16, CardClockCtrl )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_MemCardXferDataLen(_b)   IPAQ_ASIC3_SD( _b, u16, MemCardXferDataLen )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_MemCardOptionSetup(_b)   IPAQ_ASIC3_SD( _b, u16, MemCardOptionSetup )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_ErrorStatus0(_b)         IPAQ_ASIC3_SD( _b, u16, ErrorStatus0 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_ErrorStatus1(_b)         IPAQ_ASIC3_SD( _b, u16, ErrorStatus1 )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_DataPort(_b)             IPAQ_ASIC3_SD( _b, u16, DataPort )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_TransactionCtrl(_b)      IPAQ_ASIC3_SD( _b, u16, TransactionCtrl )   /* */
-+#define IPAQ_ASIC3_SD_CTRL_SoftwareReset(_b)        IPAQ_ASIC3_SD( _b, u16, SoftwareReset )   /* */
-+
-+#define SD_CTRL_SOFTWARE_RESET_CLEAR            (1<<0)
-+
-+#define SD_CTRL_TRANSACTIONCONTROL_SET          (1<<8) // 0x0100
-+
-+#define SD_CTRL_CARDCLOCKCONTROL_FOR_SD_CARD    (1<<15)// 0x8000
-+#define SD_CTRL_CARDCLOCKCONTROL_ENABLE_CLOCK   (1<<8) // 0x0100
-+#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_512    (1<<7) // 0x0080
-+#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_256    (1<<6) // 0x0040
-+#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_128    (1<<5) // 0x0020
-+#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_64     (1<<4) // 0x0010
-+#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_32     (1<<3) // 0x0008
-+#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_16     (1<<2) // 0x0004
-+#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_8      (1<<1) // 0x0002
-+#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_4      (1<<0) // 0x0001
-+#define SD_CTRL_CARDCLOCKCONTROL_CLK_DIV_2      (0<<0) // 0x0000
-+
-+#define MEM_CARD_OPTION_REQUIRED                   0x000e
-+#define MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(x)   (((x)&0x0f)<<4)      /* Four bits */
-+#define MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT      (1<<14) // 0x4000
-+#define MEM_CARD_OPTION_DATA_XFR_WIDTH_1           (1<<15) // 0x8000
-+#define MEM_CARD_OPTION_DATA_XFR_WIDTH_4           (0<<15) //~0x8000
-+
-+#define SD_CTRL_COMMAND_INDEX(x)                   ((x)&0x3f)           /* 0=CMD0, 1=CMD1, ..., 63=CMD63 */
-+#define SD_CTRL_COMMAND_TYPE_CMD                   (0 << 6)
-+#define SD_CTRL_COMMAND_TYPE_ACMD                  (1 << 6)
-+#define SD_CTRL_COMMAND_TYPE_AUTHENTICATION        (2 << 6)
-+#define SD_CTRL_COMMAND_RESPONSE_TYPE_NORMAL       (0 << 8)
-+#define SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R1       (4 << 8)
-+#define SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R1B      (5 << 8)
-+#define SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R2       (6 << 8)
-+#define SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R3       (7 << 8)
-+#define SD_CTRL_COMMAND_DATA_PRESENT               (1 << 11)
-+#define SD_CTRL_COMMAND_TRANSFER_READ              (1 << 12)
-+#define SD_CTRL_COMMAND_TRANSFER_WRITE             (0 << 12)
-+#define SD_CTRL_COMMAND_MULTI_BLOCK                (1 << 13)
-+#define SD_CTRL_COMMAND_SECURITY_CMD               (1 << 14)
-+
-+#define SD_CTRL_STOP_INTERNAL_ISSSUE_CMD12         (1 << 0)
-+#define SD_CTRL_STOP_INTERNAL_AUTO_ISSUE_CMD12     (1 << 8)
-+
-+#define SD_CTRL_CARDSTATUS_RESPONSE_END            (1 << 0)
-+#define SD_CTRL_CARDSTATUS_RW_END                  (1 << 2)
-+#define SD_CTRL_CARDSTATUS_CARD_REMOVED_0          (1 << 3)
-+#define SD_CTRL_CARDSTATUS_CARD_INSERTED_0         (1 << 4)
-+#define SD_CTRL_CARDSTATUS_SIGNAL_STATE_PRESENT_0  (1 << 5)
-+#define SD_CTRL_CARDSTATUS_WRITE_PROTECT           (1 << 7)
-+#define SD_CTRL_CARDSTATUS_CARD_REMOVED_3          (1 << 8)
-+#define SD_CTRL_CARDSTATUS_CARD_INSERTED_3         (1 << 9)
-+#define SD_CTRL_CARDSTATUS_SIGNAL_STATE_PRESENT_3  (1 << 10)
-+
-+#define SD_CTRL_BUFFERSTATUS_CMD_INDEX_ERROR       (1 << 0) // 0x0001
-+#define SD_CTRL_BUFFERSTATUS_CRC_ERROR             (1 << 1) // 0x0002
-+#define SD_CTRL_BUFFERSTATUS_STOP_BIT_END_ERROR    (1 << 2) // 0x0004
-+#define SD_CTRL_BUFFERSTATUS_DATA_TIMEOUT          (1 << 3) // 0x0008
-+#define SD_CTRL_BUFFERSTATUS_BUFFER_OVERFLOW       (1 << 4) // 0x0010
-+#define SD_CTRL_BUFFERSTATUS_BUFFER_UNDERFLOW      (1 << 5) // 0x0020
-+#define SD_CTRL_BUFFERSTATUS_CMD_TIMEOUT           (1 << 6) // 0x0040
-+#define SD_CTRL_BUFFERSTATUS_UNK7                  (1 << 7) // 0x0080
-+#define SD_CTRL_BUFFERSTATUS_BUFFER_READ_ENABLE    (1 << 8) // 0x0100
-+#define SD_CTRL_BUFFERSTATUS_BUFFER_WRITE_ENABLE   (1 << 9) // 0x0200
-+#define SD_CTRL_BUFFERSTATUS_ILLEGAL_FUNCTION      (1 << 13)// 0x2000
-+#define SD_CTRL_BUFFERSTATUS_CMD_BUSY              (1 << 14)// 0x4000
-+#define SD_CTRL_BUFFERSTATUS_ILLEGAL_ACCESS        (1 << 15)// 0x8000
-+
-+#define SD_CTRL_INTMASKCARD_RESPONSE_END           (1 << 0) // 0x0001
-+#define SD_CTRL_INTMASKCARD_RW_END                 (1 << 2) // 0x0004
-+#define SD_CTRL_INTMASKCARD_CARD_REMOVED_0         (1 << 3) // 0x0008
-+#define SD_CTRL_INTMASKCARD_CARD_INSERTED_0        (1 << 4) // 0x0010
-+#define SD_CTRL_INTMASKCARD_SIGNAL_STATE_PRESENT_0 (1 << 5) // 0x0020
-+#define SD_CTRL_INTMASKCARD_UNK6                   (1 << 6) // 0x0040
-+#define SD_CTRL_INTMASKCARD_WRITE_PROTECT          (1 << 7) // 0x0080
-+#define SD_CTRL_INTMASKCARD_CARD_REMOVED_3         (1 << 8) // 0x0100
-+#define SD_CTRL_INTMASKCARD_CARD_INSERTED_3        (1 << 9) // 0x0200
-+#define SD_CTRL_INTMASKCARD_SIGNAL_STATE_PRESENT_3 (1 << 10)// 0x0400
-+
-+#define SD_CTRL_INTMASKBUFFER_CMD_INDEX_ERROR      (1 << 0) // 0x0001
-+#define SD_CTRL_INTMASKBUFFER_CRC_ERROR            (1 << 1) // 0x0002
-+#define SD_CTRL_INTMASKBUFFER_STOP_BIT_END_ERROR   (1 << 2) // 0x0004
-+#define SD_CTRL_INTMASKBUFFER_DATA_TIMEOUT         (1 << 3) // 0x0008
-+#define SD_CTRL_INTMASKBUFFER_BUFFER_OVERFLOW      (1 << 4) // 0x0010
-+#define SD_CTRL_INTMASKBUFFER_BUFFER_UNDERFLOW     (1 << 5) // 0x0020
-+#define SD_CTRL_INTMASKBUFFER_CMD_TIMEOUT          (1 << 6) // 0x0040
-+#define SD_CTRL_INTMASKBUFFER_UNK7                 (1 << 7) // 0x0080
-+#define SD_CTRL_INTMASKBUFFER_BUFFER_READ_ENABLE   (1 << 8) // 0x0100
-+#define SD_CTRL_INTMASKBUFFER_BUFFER_WRITE_ENABLE  (1 << 9) // 0x0200
-+#define SD_CTRL_INTMASKBUFFER_ILLEGAL_FUNCTION     (1 << 13)// 0x2000
-+#define SD_CTRL_INTMASKBUFFER_CMD_BUSY             (1 << 14)// 0x4000
-+#define SD_CTRL_INTMASKBUFFER_ILLEGAL_ACCESS       (1 << 15)// 0x8000
-+
-+#define SD_CTRL_DETAIL0_RESPONSE_CMD_ERROR                   (1 << 0) // 0x0001
-+#define SD_CTRL_DETAIL0_END_BIT_ERROR_FOR_RESPONSE_NON_CMD12 (1 << 2) // 0x0004
-+#define SD_CTRL_DETAIL0_END_BIT_ERROR_FOR_RESPONSE_CMD12     (1 << 3) // 0x0008
-+#define SD_CTRL_DETAIL0_END_BIT_ERROR_FOR_READ_DATA          (1 << 4) // 0x0010
-+#define SD_CTRL_DETAIL0_END_BIT_ERROR_FOR_WRITE_CRC_STATUS   (1 << 5) // 0x0020
-+#define SD_CTRL_DETAIL0_CRC_ERROR_FOR_RESPONSE_NON_CMD12     (1 << 8) // 0x0100
-+#define SD_CTRL_DETAIL0_CRC_ERROR_FOR_RESPONSE_CMD12         (1 << 9) // 0x0200
-+#define SD_CTRL_DETAIL0_CRC_ERROR_FOR_READ_DATA              (1 << 10)// 0x0400
-+#define SD_CTRL_DETAIL0_CRC_ERROR_FOR_WRITE_CMD              (1 << 11)// 0x0800
-+
-+#define SD_CTRL_DETAIL1_NO_CMD_RESPONSE                      (1 << 0) // 0x0001
-+#define SD_CTRL_DETAIL1_TIMEOUT_READ_DATA                    (1 << 4) // 0x0010
-+#define SD_CTRL_DETAIL1_TIMEOUT_CRS_STATUS                   (1 << 5) // 0x0020
-+#define SD_CTRL_DETAIL1_TIMEOUT_CRC_BUSY                     (1 << 6) // 0x0040
-+
-+#define _IPAQ_ASIC3_SDIO_CTRL_Base          0x1200
-+
-+#define IPAQ_ASIC3_SDIO(_b, s,x)   \
-+     (*((volatile s *) ((_b) + _IPAQ_ASIC3_SDIO_CTRL_Base + (_IPAQ_ASIC3_SDIO_CTRL_ ## x))))
-+
-+#define _IPAQ_ASIC3_SDIO_CTRL_Cmd                  0x00
-+#define _IPAQ_ASIC3_SDIO_CTRL_CardPortSel          0x04
-+#define _IPAQ_ASIC3_SDIO_CTRL_Arg0                 0x08
-+#define _IPAQ_ASIC3_SDIO_CTRL_Arg1                 0x0C
-+#define _IPAQ_ASIC3_SDIO_CTRL_TransferBlockCount   0x14
-+#define _IPAQ_ASIC3_SDIO_CTRL_Response0            0x18
-+#define _IPAQ_ASIC3_SDIO_CTRL_Response1            0x1C
-+#define _IPAQ_ASIC3_SDIO_CTRL_Response2            0x20
-+#define _IPAQ_ASIC3_SDIO_CTRL_Response3            0x24
-+#define _IPAQ_ASIC3_SDIO_CTRL_Response4            0x28
-+#define _IPAQ_ASIC3_SDIO_CTRL_Response5            0x2C
-+#define _IPAQ_ASIC3_SDIO_CTRL_Response6            0x30
-+#define _IPAQ_ASIC3_SDIO_CTRL_Response7            0x34
-+#define _IPAQ_ASIC3_SDIO_CTRL_CardStatus           0x38
-+#define _IPAQ_ASIC3_SDIO_CTRL_BufferCtrl           0x3C
-+#define _IPAQ_ASIC3_SDIO_CTRL_IntMaskCard          0x40
-+#define _IPAQ_ASIC3_SDIO_CTRL_IntMaskBuffer        0x44
-+#define _IPAQ_ASIC3_SDIO_CTRL_CardXferDataLen      0x4C
-+#define _IPAQ_ASIC3_SDIO_CTRL_CardOptionSetup      0x50
-+#define _IPAQ_ASIC3_SDIO_CTRL_ErrorStatus0         0x54
-+#define _IPAQ_ASIC3_SDIO_CTRL_ErrorStatus1         0x58
-+#define _IPAQ_ASIC3_SDIO_CTRL_DataPort             0x60
-+#define _IPAQ_ASIC3_SDIO_CTRL_TransactionCtrl      0x68
-+#define _IPAQ_ASIC3_SDIO_CTRL_CardIntCtrl          0x6C
-+#define _IPAQ_ASIC3_SDIO_CTRL_ClocknWaitCtrl       0x70
-+#define _IPAQ_ASIC3_SDIO_CTRL_HostInformation      0x74
-+#define _IPAQ_ASIC3_SDIO_CTRL_ErrorCtrl            0x78
-+#define _IPAQ_ASIC3_SDIO_CTRL_LEDCtrl              0x7C
-+#define _IPAQ_ASIC3_SDIO_CTRL_SoftwareReset        0x1C0
-+
-+#define IPAQ_ASIC3_SDIO_CTRL_Cmd(_b)                  IPAQ_ASIC3_SDIO( _b, u16, Cmd )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_CardPortSel(_b)          IPAQ_ASIC3_SDIO( _b, u16, CardPortSel )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Arg0(_b)                 IPAQ_ASIC3_SDIO( _b, u16, Arg0 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Arg1(_b)                 IPAQ_ASIC3_SDIO( _b, u16, Arg1 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_TransferBlockCount(_b)   IPAQ_ASIC3_SDIO( _b, u16, TransferBlockCount )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Response0(_b)            IPAQ_ASIC3_SDIO( _b, u16, Response0 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Response1(_b)            IPAQ_ASIC3_SDIO( _b, u16, Response1 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Response2(_b)            IPAQ_ASIC3_SDIO( _b, u16, Response2 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Response3(_b)            IPAQ_ASIC3_SDIO( _b, u16, Response3 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Response4(_b)            IPAQ_ASIC3_SDIO( _b, u16, Response4 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Response5(_b)            IPAQ_ASIC3_SDIO( _b, u16, Response5 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Response6(_b)            IPAQ_ASIC3_SDIO( _b, u16, Response6 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_Response7(_b)            IPAQ_ASIC3_SDIO( _b, u16, Response7 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_CardStatus(_b)           IPAQ_ASIC3_SDIO( _b, u16, CardStatus )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_BufferCtrl(_b)           IPAQ_ASIC3_SDIO( _b, u16, BufferCtrl )   /* and error status*/
-+#define IPAQ_ASIC3_SDIO_CTRL_IntMaskCard(_b)          IPAQ_ASIC3_SDIO( _b, u16, IntMaskCard )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_IntMaskBuffer(_b)        IPAQ_ASIC3_SDIO( _b, u16, IntMaskBuffer )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_CardXferDataLen(_b)      IPAQ_ASIC3_SDIO( _b, u16, CardXferDataLen )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_CardOptionSetup(_b)      IPAQ_ASIC3_SDIO( _b, u16, CardOptionSetup )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_ErrorStatus0(_b)         IPAQ_ASIC3_SDIO( _b, u16, ErrorStatus0 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_ErrorStatus1(_b)         IPAQ_ASIC3_SDIO( _b, u16, ErrorStatus1 )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_DataPort(_b)             IPAQ_ASIC3_SDIO( _b, u16, DataPort )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_TransactionCtrl(_b)      IPAQ_ASIC3_SDIO( _b, u16, TransactionCtrl )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_CardIntCtrl(_b)          IPAQ_ASIC3_SDIO( _b, u16, CardIntCtrl )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_ClocknWaitCtrl(_b)       IPAQ_ASIC3_SDIO( _b, u16, ClocknWaitCtrl )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_HostInformation(_b)      IPAQ_ASIC3_SDIO( _b, u16, HostInformation )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_ErrorCtrl(_b)            IPAQ_ASIC3_SDIO( _b, u16, ErrorCtrl )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_LEDCtrl(_b)              IPAQ_ASIC3_SDIO( _b, u16, LEDCtrl )   /* */
-+#define IPAQ_ASIC3_SDIO_CTRL_SoftwareReset(_b)        IPAQ_ASIC3_SDIO( _b, u16, SoftwareReset )   /* */
-+
-+#define IPAQ_ASIC3_MAP_SIZE        0x2000
-+
-+#endif
-Index: linux-2.6.22/include/linux/backlight.h
-===================================================================
---- linux-2.6.22.orig/include/linux/backlight.h        2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/include/linux/backlight.h     2007-08-23 13:09:22.000000000 +0200
-@@ -87,4 +87,11 @@
- #define to_backlight_device(obj) container_of(obj, struct backlight_device, class_dev)
-+struct generic_bl_info {
-+      int max_intensity;
-+      int default_intensity;
-+      int limit_mask;
-+      void (*set_bl_intensity)(int intensity);
-+};
-+
- #endif
-Index: linux-2.6.22/include/linux/gpiodev.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/linux/gpiodev.h       2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,44 @@
-+#ifndef __GPIODEV_H
-+#define __GPIODEV_H
-+
-+#include <linux/device.h>
-+#include <linux/platform_device.h>
-+#include <asm/gpio.h>
-+
-+/* Interface */
-+
-+/* This structure must be first member of device platform_data structure
-+   of a device which provides gpiodev interface. All method pointers
-+   must be non-NULL, so stubs must be used for non-implemented ones. */
-+struct gpiodev_ops {
-+        int (*get)(struct device *this, unsigned gpio_no);
-+        void (*set)(struct device *this, unsigned gpio_no, int val);
-+        int (*to_irq)(struct device *this, unsigned gpio_no);
-+};
-+
-+/* Generalized GPIO structure */
-+
-+struct gpio {
-+      struct device *gpio_dev;
-+      unsigned gpio_no;
-+};
-+
-+/* API functions */
-+
-+static inline int gpiodev_get_value(struct gpio *gpio)
-+{
-+      struct gpiodev_ops *ops = gpio->gpio_dev->platform_data;
-+      return ops->get(gpio->gpio_dev, gpio->gpio_no);
-+}
-+static inline void gpiodev_set_value(struct gpio *gpio, int val)
-+{
-+      struct gpiodev_ops *ops = gpio->gpio_dev->platform_data;
-+      ops->set(gpio->gpio_dev, gpio->gpio_no, val);
-+}
-+static inline int gpiodev_to_irq(struct gpio *gpio)
-+{
-+      struct gpiodev_ops *ops = gpio->gpio_dev->platform_data;
-+      return ops->to_irq(gpio->gpio_dev, gpio->gpio_no);
-+}
-+
-+#endif /* __GPIODEV_H */
-Index: linux-2.6.22/include/linux/input_pda.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/linux/input_pda.h     2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,47 @@
-+#ifndef _INPUT_PDA_H
-+#define _INPUT_PDA_H
-+
-+/*
-+ * This is temporary virtual button key codes map
-+ * for keyboardless handheld computers.
-+ * Its purpose is to provide map common to all devices
-+ * and known to work with current software and its bugs
-+ * and misfeatures. Once issues with the software are
-+ * solved, codes from input.h will be used directly
-+ * (missing key definitions will be added).
-+ */
-+
-+/* Some directly usable keycodes:
-+KEY_POWER - Power/suspend button
-+KEY_ENTER - Enter/Action/Central button on joypad
-+KEY_UP
-+KEY_DOWN
-+KEY_LEFT
-+KEY_RIGHT
-+*/
-+
-+/* XXX Instead of using any values in include/linux/input.h, we have to use
-+       use values < 128 due to some munging that kdrive does to get keystrokes.
-+       When kdrive gets its key events from evdev instead of the console,
-+       we should be able to switch to using input.h values and get rid of
-+       xmodmap. */
-+
-+#define _KEY_APP1     KEY_F9          // xmodmap sees 67 + 8 = 75
-+#define _KEY_APP2     KEY_F10         // xmodmap 76
-+#define _KEY_APP3     KEY_F11         // xmodmap 95
-+#define _KEY_APP4     KEY_F12         // xmodmap 96
-+
-+#define _KEY_RECORD   KEY_RO
-+
-+/* It is highly recommended to use exactly 4 codes above for
-+   4 buttons the device has. This will ensure that console and
-+   framebuffer applications (e.g. games) will work ok on all
-+   devices. If you'd like more distinguishable names, following
-+   convenience defines are provided, suiting many devices. */
-+
-+#define _KEY_CALENDAR _KEY_APP1
-+#define _KEY_CONTACTS _KEY_APP2
-+#define _KEY_MAIL     _KEY_APP3
-+#define _KEY_HOMEPAGE _KEY_APP4
-+
-+#endif
-Index: linux-2.6.22/include/linux/pda_power.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/linux/pda_power.h     2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,31 @@
-+/*
-+ * Common power driver for PDAs and phones with one or two external
-+ * power supplies (AC/USB) connected to main and backup batteries,
-+ * and optional builtin charger.
-+ *
-+ * Copyright 2007 Anton Vorontsov <cbou@mail.ru>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef __PDA_POWER_H__
-+#define __PDA_POWER_H__
-+
-+#define PDA_POWER_CHARGE_AC  (1 << 0)
-+#define PDA_POWER_CHARGE_USB (1 << 1)
-+
-+struct pda_power_pdata {
-+      int (*is_ac_online)(void);
-+      int (*is_usb_online)(void);
-+      void (*set_charge)(int flags);
-+
-+      char **supplied_to;
-+      size_t num_supplicants;
-+
-+      unsigned int wait_for_status; /* msecs, default is 500 */
-+      unsigned int wait_for_charger; /* msecs, default is 500 */
-+};
-+
-+#endif /* __PDA_POWER_H__ */
-Index: linux-2.6.22/include/linux/soc/asic3_base.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/linux/soc/asic3_base.h        2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,104 @@
-+#include <asm/types.h>
-+#include <linux/gpiodev.h>
-+
-+/* Private API - for ASIC3 devices internal use only */
-+#define HDR_IPAQ_ASIC3_ACTION(ACTION,action,fn,FN)                  \
-+u32  asic3_get_gpio_ ## action ## _ ## fn (struct device *dev);      \
-+void asic3_set_gpio_ ## action ## _ ## fn (struct device *dev, u32 bits, u32 val);
-+
-+#define HDR_IPAQ_ASIC3_FN(fn,FN)                                      \
-+      HDR_IPAQ_ASIC3_ACTION ( MASK,mask,fn,FN)                        \
-+      HDR_IPAQ_ASIC3_ACTION ( DIR, dir, fn, FN)                       \
-+      HDR_IPAQ_ASIC3_ACTION ( OUT, out, fn, FN)                       \
-+      HDR_IPAQ_ASIC3_ACTION ( LEVELTRI, trigtype, fn, FN)             \
-+      HDR_IPAQ_ASIC3_ACTION ( RISING, rising, fn, FN)                 \
-+      HDR_IPAQ_ASIC3_ACTION ( LEVEL, triglevel, fn, FN)               \
-+      HDR_IPAQ_ASIC3_ACTION ( SLEEP_MASK, sleepmask, fn, FN)          \
-+      HDR_IPAQ_ASIC3_ACTION ( SLEEP_OUT, sleepout, fn, FN)            \
-+      HDR_IPAQ_ASIC3_ACTION ( BATT_FAULT_OUT, battfaultout, fn, FN)   \
-+      HDR_IPAQ_ASIC3_ACTION ( INT_STATUS, intstatus, fn, FN)          \
-+      HDR_IPAQ_ASIC3_ACTION ( ALT_FUNCTION, alt_fn, fn, FN)           \
-+      HDR_IPAQ_ASIC3_ACTION ( SLEEP_CONF, sleepconf, fn, FN)          \
-+      HDR_IPAQ_ASIC3_ACTION ( STATUS, status, fn, FN)
-+
-+/* Public API */
-+
-+#define ASIC3_GPIOA_IRQ_BASE  0
-+#define ASIC3_GPIOB_IRQ_BASE  16
-+#define ASIC3_GPIOC_IRQ_BASE  32
-+#define ASIC3_GPIOD_IRQ_BASE  48
-+#define ASIC3_LED0_IRQ                64
-+#define ASIC3_LED1_IRQ                65
-+#define ASIC3_LED2_IRQ                66
-+#define ASIC3_SPI_IRQ         67
-+#define ASIC3_SMBUS_IRQ               68
-+#define ASIC3_OWM_IRQ         69
-+
-+#define ASIC3_NR_GPIO_IRQS    64      /* 16 bits each GPIO A...D banks */
-+#define ASIC3_NR_IRQS         (ASIC3_OWM_IRQ + 1)
-+
-+extern int asic3_irq_base(struct device *dev);
-+
-+extern void asic3_write_register(struct device *dev, unsigned int reg,
-+                                 u32 value);
-+extern u32  asic3_read_register(struct device *dev, unsigned int reg);
-+
-+/* old clock api */
-+extern void asic3_set_clock_sel(struct device *dev, u32 bits, u32 val);
-+extern u32  asic3_get_clock_cdex(struct device *dev);
-+extern void asic3_set_clock_cdex(struct device *dev, u32 bits, u32 val);
-+
-+extern void asic3_set_extcf_select(struct device *dev, u32 bits, u32 val);
-+extern void asic3_set_extcf_reset(struct device *dev, u32 bits, u32 val);
-+extern void asic3_set_sdhwctrl(struct device *dev, u32 bits, u32 val);
-+
-+extern void asic3_set_led(struct device *dev, int led_num, int duty_time,
-+                          int cycle_time, int timebase);
-+
-+extern int asic3_register_mmc(struct device *dev);
-+extern int asic3_unregister_mmc(struct device *dev);
-+
-+/* Accessors for GPIO banks */
-+HDR_IPAQ_ASIC3_FN(a, A)
-+HDR_IPAQ_ASIC3_FN(b, B)
-+HDR_IPAQ_ASIC3_FN(c, C)
-+HDR_IPAQ_ASIC3_FN(d, D)
-+
-+#define _IPAQ_ASIC3_GPIO_BANK_A      0
-+#define _IPAQ_ASIC3_GPIO_BANK_B      1
-+#define _IPAQ_ASIC3_GPIO_BANK_C      2
-+#define _IPAQ_ASIC3_GPIO_BANK_D      3
-+
-+#define ASIC3_GPIO_bit(gpio) (1 << (gpio & 0xf))
-+
-+extern int asic3_get_gpio_bit(struct device *dev, int gpio);
-+extern void asic3_set_gpio_bit(struct device *dev, int gpio, int val);
-+extern int asic3_gpio_get_value(struct device *dev, unsigned gpio);
-+extern void asic3_gpio_set_value(struct device *dev, unsigned gpio, int val);
-+
-+
-+struct tmio_mmc_hwconfig;
-+
-+struct asic3_platform_data
-+{
-+      // Must be first member
-+      struct gpiodev_ops gpiodev_ops;
-+
-+      struct {
-+              u32 dir;
-+              u32 init;
-+              u32 sleep_mask;
-+              u32 sleep_out;
-+              u32 batt_fault_out;
-+              u32 sleep_conf;
-+              u32 alt_function;
-+      } gpio_a, gpio_b, gpio_c, gpio_d;
-+
-+      int irq_base;
-+      unsigned int bus_shift;
-+
-+      struct platform_device **child_platform_devs;
-+      int num_child_platform_devs;
-+
-+      struct tmio_mmc_hwconfig *tmio_mmc_hwconfig;
-+};
-Index: linux-2.6.22/include/linux/soc/tmio_mmc.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/linux/soc/tmio_mmc.h  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,17 @@
-+#include <linux/platform_device.h>
-+
-+#define MMC_CLOCK_DISABLED 0
-+#define MMC_CLOCK_ENABLED  1
-+
-+#define TMIO_WP_ALWAYS_RW ((void*)-1)
-+
-+struct tmio_mmc_hwconfig {
-+      void (*hwinit)(struct platform_device *sdev);
-+      void (*set_mmc_clock)(struct platform_device *sdev, int state);
-+
-+      /* NULL - use ASIC3 signal,
-+         TMIO_WP_ALWAYS_RW - assume always R/W (e.g. miniSD)
-+         otherwise - machine-specific handler */
-+      int (*mmc_get_ro)(struct platform_device *pdev);
-+      short address_shift;
-+};
-Index: linux-2.6.22/include/asm-arm/arch-pxa/pxa-regs.h
-===================================================================
---- linux-2.6.22.orig/include/asm-arm/arch-pxa/pxa-regs.h      2007-08-23 13:09:21.000000000 +0200
-+++ linux-2.6.22/include/asm-arm/arch-pxa/pxa-regs.h   2007-08-23 13:09:22.000000000 +0200
-@@ -2063,6 +2063,8 @@
- #define LDCMD_SOFINT  (1 << 22)
- #define LDCMD_EOFINT  (1 << 21)
-+#define LCCR4_13M_PCD_EN        (1<<25)          /* 13M PCD enable */
-+#define LCCR4_PCDDIV            (1<<31)          /* PCD selection */
- #define LCCR5_SOFM1   (1<<0)          /* Start Of Frame Mask for Overlay 1 (channel 1) */
- #define LCCR5_SOFM2   (1<<1)          /* Start Of Frame Mask for Overlay 2 (channel 2) */
-Index: linux-2.6.22/drivers/mmc/host/Kconfig
-===================================================================
---- linux-2.6.22.orig/drivers/mmc/host/Kconfig 2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/mmc/host/Kconfig      2007-08-23 13:09:22.000000000 +0200
-@@ -100,3 +100,9 @@
-           To compile this driver as a module, choose M here: the
-         module will be called tifm_sd.
-+config MMC_ASIC3
-+      tristate "HTC ASIC3 SD/MMC support"
-+      depends on MMC && HTC_ASIC3
-+      help
-+        This provides support for the ASIC3 SD/MMC controller, used
-+        in the iPAQ hx4700 and others.
-Index: linux-2.6.22/drivers/mmc/host/Makefile
-===================================================================
---- linux-2.6.22.orig/drivers/mmc/host/Makefile        2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/mmc/host/Makefile     2007-08-23 13:09:22.000000000 +0200
-@@ -15,4 +15,4 @@
- obj-$(CONFIG_MMC_OMAP)                += omap.o
- obj-$(CONFIG_MMC_AT91)                += at91_mci.o
- obj-$(CONFIG_MMC_TIFM_SD)     += tifm_sd.o
--
-+obj-$(CONFIG_MMC_ASIC3)         += asic3_mmc.o
-Index: linux-2.6.22/drivers/mmc/host/asic3_mmc.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/mmc/host/asic3_mmc.c  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,900 @@
-+/* Note that this driver can likely be merged into the tmio driver, so
-+ * consider this code temporary.  It works, though.
-+ */
-+/*
-+ *  linux/drivers/mmc/asic3_mmc.c
-+ *
-+ *  Copyright (c) 2005 SDG Systems, LLC
-+ *
-+ *  based on tmio_mmc.c
-+ *      Copyright (C) 2004 Ian Molton
-+ *
-+ *  Refactored to support all ASIC3 devices, 2006 Paul Sokolovsky
-+ *
-+ * 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.
-+ *
-+ * Driver for the SD / SDIO cell found in:
-+ *
-+ * TC6393XB
-+ *
-+ * This driver draws mainly on scattered spec sheets, Reverse engineering
-+ * of the toshiba e800  SD driver and some parts of the 2.4 ASIC3 driver (4 bit
-+ * support).
-+ *
-+ * Supports MMC 1 bit transfers and SD 1 and 4 bit modes.
-+ *
-+ * TODO:
-+ *   Eliminate FIXMEs
-+ *   SDIO support
-+ *   Power management
-+ *   Handle MMC errors (at all)
-+ *
-+ */
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/platform_device.h>
-+#include <linux/interrupt.h>
-+#include <linux/blkdev.h>
-+#include <linux/delay.h>
-+#include <linux/err.h>
-+#include <linux/mmc/mmc.h>
-+#include <linux/mmc/host.h>
-+#include <linux/mmc/card.h>
-+//#include <linux/mmc/protocol.h>
-+#include <linux/mmc/sd.h>
-+#include <linux/scatterlist.h>
-+//#include <linux/soc-old.h>
-+#include <linux/soc/asic3_base.h>
-+#include <linux/soc/tmio_mmc.h>
-+
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/mach/irq.h>
-+#include <linux/clk.h>
-+#include <asm/mach-types.h>
-+
-+#include <asm/hardware/ipaq-asic3.h>
-+#include "asic3_mmc.h"
-+
-+struct asic3_mmc_host {
-+    void                    *ctl_base;
-+    struct device           *asic3_dev;       /* asic3 device */
-+    struct tmio_mmc_hwconfig *hwconfig;       /* HW config data/handlers, guaranteed != NULL */
-+    unsigned long           bus_shift;
-+    struct mmc_command      *cmd;
-+    struct mmc_request      *mrq;
-+    struct mmc_data         *data;
-+    struct mmc_host         *mmc;
-+    int                     irq;
-+    unsigned short          clock_for_sd;
-+
-+    /* I/O related stuff */
-+    struct scatterlist      *sg_ptr;
-+    unsigned int            sg_len;
-+    unsigned int            sg_off;
-+};
-+
-+static void
-+mmc_finish_request(struct asic3_mmc_host *host)
-+{
-+    struct mmc_request *mrq = host->mrq;
-+
-+    /* Write something to end the command */
-+    host->mrq  = NULL;
-+    host->cmd  = NULL;
-+    host->data = NULL;
-+
-+    mmc_request_done(host->mmc, mrq);
-+}
-+
-+
-+#define ASIC3_MMC_REG(host, block, reg) (*((volatile u16 *) ((host->ctl_base) + ((_IPAQ_ASIC3_## block ## _Base + _IPAQ_ASIC3_ ## block ## _ ## reg) >> (2 - host->bus_shift))) ))
-+
-+static void
-+mmc_start_command(struct asic3_mmc_host *host, struct mmc_command *cmd)
-+{
-+    struct mmc_data *data = host->data;
-+    int c                 = cmd->opcode;
-+
-+    DBG("\e[1;33mOpcode: %d\e[0m, base: %p\n", cmd->opcode, host->ctl_base);
-+
-+    if(cmd->opcode == MMC_STOP_TRANSMISSION) {
-+        ASIC3_MMC_REG(host, SD_CTRL, StopInternal) = SD_CTRL_STOP_INTERNAL_ISSSUE_CMD12;
-+        cmd->resp[0] = cmd->opcode;
-+        cmd->resp[1] = 0;
-+        cmd->resp[2] = 0;
-+        cmd->resp[3] = 0;
-+        cmd->resp[4] = 0;
-+        return;
-+    }
-+
-+    switch(cmd->flags & 0x1f) {
-+        case MMC_RSP_NONE: c |= SD_CTRL_COMMAND_RESPONSE_TYPE_NORMAL; break;
-+        case MMC_RSP_R1:   c |= SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R1;   break;
-+        case MMC_RSP_R1B:  c |= SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R1B;  break;
-+        case MMC_RSP_R2:   c |= SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R2;   break;
-+        case MMC_RSP_R3:   c |= SD_CTRL_COMMAND_RESPONSE_TYPE_EXT_R3;   break;
-+        default:
-+            DBG("Unknown response type %d\n", cmd->flags & 0x1f);
-+            break;
-+    }
-+
-+    host->cmd = cmd;
-+
-+    if(cmd->opcode == MMC_APP_CMD) {
-+        c |= APP_CMD;
-+    }
-+    if (cmd->opcode == MMC_GO_IDLE_STATE) {
-+        c |= (3 << 8); /* This was removed from ipaq-asic3.h for some reason */
-+    }
-+    if(data) {
-+        c |= SD_CTRL_COMMAND_DATA_PRESENT;
-+        if(data->blocks > 1) {
-+            ASIC3_MMC_REG(host, SD_CTRL, StopInternal) = SD_CTRL_STOP_INTERNAL_AUTO_ISSUE_CMD12;
-+            c |= SD_CTRL_COMMAND_MULTI_BLOCK;
-+        }
-+        if(data->flags & MMC_DATA_READ) {
-+            c |= SD_CTRL_COMMAND_TRANSFER_READ;
-+        }
-+        /* MMC_DATA_WRITE does not require a bit to be set */
-+    }
-+
-+    /* Enable the command and data interrupts */
-+    ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) = ~(
-+          SD_CTRL_INTMASKCARD_RESPONSE_END
-+        | SD_CTRL_INTMASKCARD_RW_END
-+        | SD_CTRL_INTMASKCARD_CARD_REMOVED_0
-+        | SD_CTRL_INTMASKCARD_CARD_INSERTED_0
-+#if 0
-+        | SD_CTRL_INTMASKCARD_CARD_REMOVED_3
-+        | SD_CTRL_INTMASKCARD_CARD_INSERTED_3
-+#endif
-+    );
-+
-+    ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) = ~(
-+          SD_CTRL_INTMASKBUFFER_UNK7
-+        | SD_CTRL_INTMASKBUFFER_CMD_BUSY
-+#if 0
-+        | SD_CTRL_INTMASKBUFFER_CMD_INDEX_ERROR
-+        | SD_CTRL_INTMASKBUFFER_CRC_ERROR
-+        | SD_CTRL_INTMASKBUFFER_STOP_BIT_END_ERROR
-+        | SD_CTRL_INTMASKBUFFER_DATA_TIMEOUT
-+        | SD_CTRL_INTMASKBUFFER_BUFFER_OVERFLOW
-+        | SD_CTRL_INTMASKBUFFER_BUFFER_UNDERFLOW
-+        | SD_CTRL_INTMASKBUFFER_CMD_TIMEOUT
-+        | SD_CTRL_INTMASKBUFFER_BUFFER_READ_ENABLE
-+        | SD_CTRL_INTMASKBUFFER_BUFFER_WRITE_ENABLE
-+        | SD_CTRL_INTMASKBUFFER_ILLEGAL_ACCESS
-+#endif
-+    );
-+
-+    /* Send the command */
-+    ASIC3_MMC_REG(host, SD_CTRL, Arg1) = cmd->arg >> 16;
-+    ASIC3_MMC_REG(host, SD_CTRL, Arg0) = cmd->arg & 0xffff;
-+    ASIC3_MMC_REG(host, SD_CTRL, Cmd) = c;
-+}
-+
-+/* This chip always returns (at least?) as much data as you ask for.  I'm
-+ * unsure what happens if you ask for less than a block. This should be looked
-+ * into to ensure that a funny length read doesnt mess up the controller data
-+ * state machine.
-+ *
-+ * Aric: Statement above may not apply to ASIC3.
-+ *
-+ * FIXME - this chip cannot do 1 and 2 byte data requests in 4 bit mode
-+ *
-+ * Aric: Statement above may not apply to ASIC3.
-+ */
-+
-+static struct tasklet_struct mmc_data_read_tasklet;
-+
-+static void
-+mmc_data_transfer(unsigned long h)
-+{
-+    struct asic3_mmc_host *host = (struct asic3_mmc_host *)h;
-+    struct mmc_data *data = host->data;
-+    unsigned short *buf;
-+    int count;
-+    /* unsigned long flags; */
-+
-+    if(!data){
-+        printk(KERN_WARNING DRIVER_NAME ": Spurious Data IRQ\n");
-+        return;
-+    }
-+
-+    /* local_irq_save(flags); */
-+    /* buf = kmap_atomic(host->sg_ptr->page, KM_BIO_SRC_IRQ); */
-+    buf = kmap(host->sg_ptr->page);
-+    buf += host->sg_ptr->offset/2 + host->sg_off/2;
-+
-+    /*
-+     * Ensure we dont read more than one block. The chip will interrupt us
-+     * When the next block is available.
-+     */
-+    count = host->sg_ptr->length - host->sg_off;
-+    if(count > data->blksz) {
-+        count = data->blksz;
-+    }
-+
-+    DBG("count: %08x, page: %p, offset: %08x flags %08x\n",
-+        count, host->sg_ptr->page, host->sg_off, data->flags);
-+
-+    host->sg_off += count;
-+
-+    /* Transfer the data */
-+    if(data->flags & MMC_DATA_READ) {
-+        while(count > 0) {
-+            /* Read two bytes from SD/MMC controller. */
-+            *buf = ASIC3_MMC_REG(host, SD_CTRL, DataPort);
-+            buf++;
-+            count -= 2;
-+        }
-+      flush_dcache_page(host->sg_ptr->page);
-+    } else {
-+        while(count > 0) {
-+            /* Write two bytes to SD/MMC controller. */
-+            ASIC3_MMC_REG(host, SD_CTRL, DataPort) = *buf;
-+            buf++;
-+            count -= 2;
-+        }
-+    }
-+
-+    /* kunmap_atomic(host->sg_ptr->page, KM_BIO_SRC_IRQ); */
-+    kunmap(host->sg_ptr->page);
-+    /* local_irq_restore(flags); */
-+    if(host->sg_off == host->sg_ptr->length) {
-+        host->sg_ptr++;
-+        host->sg_off = 0;
-+        --host->sg_len;
-+    }
-+
-+    return;
-+}
-+
-+static void
-+mmc_data_end_irq(struct asic3_mmc_host *host)
-+{
-+    struct mmc_data *data = host->data;
-+
-+    host->data = NULL;
-+
-+    if(!data){
-+        printk(KERN_WARNING DRIVER_NAME ": Spurious data end IRQ\n");
-+        return;
-+    }
-+
-+    if (data->error == MMC_ERR_NONE) {
-+        data->bytes_xfered = data->blocks * data->blksz;
-+    } else {
-+        data->bytes_xfered = 0;
-+    }
-+
-+    DBG("Completed data request\n");
-+
-+    ASIC3_MMC_REG(host, SD_CTRL, StopInternal) = 0;
-+
-+    /* Make sure read enable interrupt and write enable interrupt are disabled */
-+    if(data->flags & MMC_DATA_READ) {
-+        ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) |= SD_CTRL_INTMASKBUFFER_BUFFER_READ_ENABLE;
-+    } else {
-+        ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) |= SD_CTRL_INTMASKBUFFER_BUFFER_WRITE_ENABLE;
-+    }
-+
-+    mmc_finish_request(host);
-+}
-+
-+static void
-+mmc_cmd_irq(struct asic3_mmc_host *host, unsigned int buffer_stat)
-+{
-+    struct mmc_command *cmd = host->cmd;
-+    u8 *buf = (u8 *)cmd->resp;
-+    u16 data;
-+
-+    if(!host->cmd) {
-+        printk(KERN_WARNING DRIVER_NAME ": Spurious CMD irq\n");
-+        return;
-+    }
-+
-+    host->cmd = NULL;
-+    if(cmd->flags & MMC_RSP_PRESENT && cmd->flags & MMC_RSP_136) {
-+        /* R2 */
-+        buf[12] = 0xff;
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response0);
-+        buf[13] = data & 0xff;
-+        buf[14] = data >> 8;
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response1);
-+        buf[15] = data & 0xff;
-+        buf[8] = data >> 8;
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response2);
-+        buf[9] = data & 0xff;
-+        buf[10] = data >> 8;
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response3);
-+        buf[11] = data & 0xff;
-+        buf[4] = data >> 8;
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response4);
-+        buf[5] = data & 0xff;
-+        buf[6] = data >> 8;
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response5);
-+        buf[7] = data & 0xff;
-+        buf[0] = data >> 8;
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response6);
-+        buf[1] = data & 0xff;
-+        buf[2] = data >> 8;
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response7);
-+        buf[3] = data & 0xff;
-+    } else if(cmd->flags & MMC_RSP_PRESENT) {
-+        /* R1, R1B, R3 */
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response0);
-+        buf[0] = data & 0xff;
-+        buf[1] = data >> 8;
-+        data = ASIC3_MMC_REG(host, SD_CTRL, Response1);
-+        buf[2] = data & 0xff;
-+        buf[3] = data >> 8;
-+    }
-+    DBG("Response: %08x %08x %08x %08x\n", cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);
-+
-+    if(buffer_stat & SD_CTRL_BUFFERSTATUS_CMD_TIMEOUT) {
-+        cmd->error = MMC_ERR_TIMEOUT;
-+    } else if((buffer_stat & SD_CTRL_BUFFERSTATUS_CRC_ERROR) && (cmd->flags & MMC_RSP_CRC)) {
-+        cmd->error = MMC_ERR_BADCRC;
-+    } else if(buffer_stat &
-+                (
-+                      SD_CTRL_BUFFERSTATUS_ILLEGAL_ACCESS
-+                    | SD_CTRL_BUFFERSTATUS_CMD_INDEX_ERROR
-+                    | SD_CTRL_BUFFERSTATUS_STOP_BIT_END_ERROR
-+                    | SD_CTRL_BUFFERSTATUS_BUFFER_OVERFLOW
-+                    | SD_CTRL_BUFFERSTATUS_BUFFER_UNDERFLOW
-+                    | SD_CTRL_BUFFERSTATUS_DATA_TIMEOUT
-+                )
-+    ) {
-+        DBG("Buffer status ERROR 0x%04x - inside check buffer\n", buffer_stat);
-+        DBG("detail0 error status 0x%04x\n", ASIC3_MMC_REG(host, SD_CTRL, ErrorStatus0));
-+        DBG("detail1 error status 0x%04x\n", ASIC3_MMC_REG(host, SD_CTRL, ErrorStatus1));
-+        cmd->error = MMC_ERR_FAILED;
-+    }
-+
-+    if(cmd->error == MMC_ERR_NONE) {
-+        switch (cmd->opcode) {
-+            case SD_APP_SET_BUS_WIDTH:
-+                if(cmd->arg == SD_BUS_WIDTH_4) {
-+                    host->clock_for_sd = SD_CTRL_CARDCLOCKCONTROL_FOR_SD_CARD;
-+                    ASIC3_MMC_REG(host, SD_CTRL, MemCardOptionSetup) =
-+                              MEM_CARD_OPTION_REQUIRED
-+                            | MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(14)
-+                            | MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT
-+                            | MEM_CARD_OPTION_DATA_XFR_WIDTH_4;
-+                } else {
-+                    host->clock_for_sd = 0;
-+                    ASIC3_MMC_REG(host, SD_CTRL, MemCardOptionSetup) =
-+                              MEM_CARD_OPTION_REQUIRED
-+                            | MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(14)
-+                            | MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT
-+                            | MEM_CARD_OPTION_DATA_XFR_WIDTH_1;
-+                }
-+                break;
-+            case MMC_SELECT_CARD:
-+                if((cmd->arg >> 16) == 0) {
-+                    /* We have been deselected. */
-+                    ASIC3_MMC_REG(host, SD_CTRL, MemCardOptionSetup) =
-+                          MEM_CARD_OPTION_REQUIRED
-+                        | MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(14)
-+                        | MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT
-+                        | MEM_CARD_OPTION_DATA_XFR_WIDTH_1;
-+                }
-+        }
-+    }
-+
-+    /*
-+     * If there is data to handle we enable data IRQs here, and we will
-+     * ultimatley finish the request in the mmc_data_end_irq handler.
-+     */
-+    if(host->data && (cmd->error == MMC_ERR_NONE)){
-+        if(host->data->flags & MMC_DATA_READ) {
-+            /* Enable the read enable interrupt */
-+            ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) &=
-+                ~SD_CTRL_INTMASKBUFFER_BUFFER_READ_ENABLE;
-+        } else {
-+            /* Enable the write enable interrupt */
-+            ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) &=
-+                ~SD_CTRL_INTMASKBUFFER_BUFFER_WRITE_ENABLE;
-+        }
-+    } else {
-+        /* There's no data, or we encountered an error, so finish now. */
-+        mmc_finish_request(host);
-+    }
-+
-+    return;
-+}
-+
-+static void hwinit2_irqsafe(struct asic3_mmc_host *host);
-+
-+static irqreturn_t
-+mmc_irq(int irq, void *irq_desc)
-+{
-+    struct asic3_mmc_host *host;
-+    unsigned int breg, bmask, bstatus, creg, cmask, cstatus;
-+
-+    host = irq_desc;
-+
-+    /* asic3 bstatus has errors */
-+    bstatus = ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl);
-+    bmask   = ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer);
-+    cstatus = ASIC3_MMC_REG(host, SD_CTRL, CardStatus);
-+    cmask   = ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard);
-+    breg    = bstatus & ~bmask & ~DONT_CARE_BUFFER_BITS;
-+    creg    = cstatus & ~cmask & ~DONT_CARE_CARD_BITS;
-+
-+    if (!breg && !creg) {
-+        /* This occurs sometimes for no known reason.  It doesn't hurt
-+         * anything, so I don't print it.  */
-+        ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) &= ~breg;
-+        ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) &= ~creg;
-+        goto out;
-+    }
-+
-+    while (breg || creg) {
-+
-+        /* XXX TODO: Need to handle errors in breg here. */
-+
-+        /*
-+         * Card insert/remove.  The mmc controlling code is stateless.  That
-+         * is, it doesn't care if it was an insert or a remove.  It treats
-+         * both the same.
-+         */
-+        /* XXX Asic3 has _3 versions of these status bits, too, for a second slot, perhaps? */
-+        if (creg & (SD_CTRL_CARDSTATUS_CARD_INSERTED_0 | SD_CTRL_CARDSTATUS_CARD_REMOVED_0)) {
-+            ASIC3_MMC_REG(host, SD_CTRL, CardStatus) &=
-+                ~(SD_CTRL_CARDSTATUS_CARD_REMOVED_0 | SD_CTRL_CARDSTATUS_CARD_INSERTED_0);
-+            if(creg & SD_CTRL_CARDSTATUS_CARD_INSERTED_0) {
-+                hwinit2_irqsafe(host);
-+            }
-+            mmc_detect_change(host->mmc,1);
-+        }
-+
-+        /* Command completion */
-+        if (creg & SD_CTRL_CARDSTATUS_RESPONSE_END) {
-+            ASIC3_MMC_REG(host, SD_CTRL, CardStatus) &=
-+                ~(SD_CTRL_CARDSTATUS_RESPONSE_END);
-+            mmc_cmd_irq(host, bstatus);
-+        }
-+
-+        /* Data transfer */
-+        if (breg & (SD_CTRL_BUFFERSTATUS_BUFFER_READ_ENABLE | SD_CTRL_BUFFERSTATUS_BUFFER_WRITE_ENABLE)) {
-+            ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl) &=
-+                ~(SD_CTRL_BUFFERSTATUS_BUFFER_WRITE_ENABLE | SD_CTRL_BUFFERSTATUS_BUFFER_READ_ENABLE);
-+          tasklet_schedule(&mmc_data_read_tasklet);
-+        }
-+
-+        /* Data transfer completion */
-+        if (creg & SD_CTRL_CARDSTATUS_RW_END) {
-+            ASIC3_MMC_REG(host, SD_CTRL, CardStatus) &= ~(SD_CTRL_CARDSTATUS_RW_END);
-+            mmc_data_end_irq(host);
-+        }
-+
-+        /* Check status - keep going until we've handled it all */
-+        bstatus = ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl);
-+        bmask   = ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer);
-+        cstatus = ASIC3_MMC_REG(host, SD_CTRL, CardStatus);
-+        cmask   = ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard);
-+        breg    = bstatus & ~bmask & ~DONT_CARE_BUFFER_BITS;
-+        creg    = cstatus & ~cmask & ~DONT_CARE_CARD_BITS;
-+    }
-+
-+out:
-+    /* Ensure all interrupt sources are cleared */
-+    ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl) = 0;
-+    ASIC3_MMC_REG(host, SD_CTRL, CardStatus) = 0;
-+    return IRQ_HANDLED;
-+}
-+
-+static void
-+mmc_start_data(struct asic3_mmc_host *host, struct mmc_data *data)
-+{
-+    DBG("setup data transfer: blocksize %08x  nr_blocks %d, page: %08x, offset: %08x\n", data->blksz,
-+        data->blocks, (int)data->sg->page, data->sg->offset);
-+
-+    host->sg_len = data->sg_len;
-+    host->sg_ptr = data->sg;
-+    host->sg_off = 0;
-+    host->data   = data;
-+
-+    /* Set transfer length and blocksize */
-+    ASIC3_MMC_REG(host, SD_CTRL, TransferSectorCount) = data->blocks;
-+    ASIC3_MMC_REG(host, SD_CTRL, MemCardXferDataLen)  = data->blksz;
-+}
-+
-+/* Process requests from the MMC layer */
-+static void
-+mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
-+{
-+    struct asic3_mmc_host *host = mmc_priv(mmc);
-+
-+    WARN_ON(host->mrq != NULL);
-+
-+    host->mrq = mrq;
-+
-+    /* If we're performing a data request we need to setup some
-+       extra information */
-+    if(mrq->data) {
-+        mmc_start_data(host, mrq->data);
-+    }
-+
-+    mmc_start_command(host, mrq->cmd);
-+}
-+
-+/* Set MMC clock / power.
-+ * Note: This controller uses a simple divider scheme therefore it cannot run
-+ * a MMC card at full speed (20MHz). The max clock is 24MHz on SD, but as MMC
-+ * wont run that fast, it has to be clocked at 12MHz which is the next slowest
-+ * setting.  This is likely not an issue because we are doing single 16-bit
-+ * writes for data I/O.
-+ */
-+static void
-+mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
-+{
-+    struct asic3_mmc_host *host = mmc_priv(mmc);
-+    u32 clk = 0;
-+
-+    DBG("clock %uHz busmode %u powermode %u Vdd %u\n",
-+        ios->clock, ios->bus_mode, ios->power_mode, ios->vdd);
-+
-+    if (ios->clock) {
-+        clk = 0x80; /* slowest by default */
-+        if(ios->clock >= 24000000 / 256) clk >>= 1;
-+        if(ios->clock >= 24000000 / 128) clk >>= 1;
-+        if(ios->clock >= 24000000 / 64)  clk >>= 1;
-+        if(ios->clock >= 24000000 / 32)  clk >>= 1;
-+        if(ios->clock >= 24000000 / 16)  clk >>= 1;
-+        if(ios->clock >= 24000000 / 8)   clk >>= 1;
-+        if(ios->clock >= 24000000 / 4)   clk >>= 1;
-+        if(ios->clock >= 24000000 / 2)   clk >>= 1;
-+        if(ios->clock >= 24000000 / 1)   clk >>= 1;
-+        if(clk == 0) { /* For fastest speed we disable the divider. */
-+            ASIC3_MMC_REG(host, SD_CONFIG, ClockMode) = 0;
-+        } else {
-+            ASIC3_MMC_REG(host, SD_CONFIG, ClockMode) = 1;
-+        }
-+        ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0;
-+        ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) =
-+              host->clock_for_sd
-+            | SD_CTRL_CARDCLOCKCONTROL_ENABLE_CLOCK
-+            | clk;
-+        msleep(10);
-+    } else {
-+        ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0;
-+    }
-+
-+    switch (ios->power_mode) {
-+        case MMC_POWER_OFF:
-+            ASIC3_MMC_REG(host, SD_CONFIG, SDHC_Power1) = 0;
-+            msleep(1);
-+            break;
-+        case MMC_POWER_UP:
-+            break;
-+        case MMC_POWER_ON:
-+            ASIC3_MMC_REG(host, SD_CONFIG, SDHC_Power1) = SD_CONFIG_POWER1_PC_33V;
-+            msleep(20);
-+            break;
-+    }
-+}
-+
-+static int
-+mmc_get_ro(struct mmc_host *mmc)
-+{
-+    struct asic3_mmc_host *host = mmc_priv(mmc);
-+
-+    /* Call custom handler for RO status */
-+    if(host->hwconfig->mmc_get_ro) {
-+            /* Special case for cards w/o WP lock (like miniSD) */
-+            if (host->hwconfig->mmc_get_ro == (void*)-1) {
-+                  return 0;
-+            } else {
-+                  struct platform_device *pdev = to_platform_device(mmc_dev(mmc));
-+                  return host->hwconfig->mmc_get_ro(pdev);
-+            }
-+    }
-+
-+    /* WRITE_PROTECT is active low */
-+    return (ASIC3_MMC_REG(host, SD_CTRL, CardStatus) & SD_CTRL_CARDSTATUS_WRITE_PROTECT)?0:1;
-+}
-+
-+static struct mmc_host_ops mmc_ops = {
-+    .request        = mmc_request,
-+    .set_ios        = mmc_set_ios,
-+    .get_ro         = mmc_get_ro,
-+};
-+
-+static void
-+hwinit2_irqsafe(struct asic3_mmc_host *host)
-+{
-+    ASIC3_MMC_REG(host, SD_CONFIG, Addr1) = 0x0000;
-+    ASIC3_MMC_REG(host, SD_CONFIG, Addr0) = 0x0800;
-+
-+    ASIC3_MMC_REG(host, SD_CONFIG, ClkStop) = SD_CONFIG_CLKSTOP_ENABLE_ALL;
-+    ASIC3_MMC_REG(host, SD_CONFIG, SDHC_CardDetect) = 2;
-+    ASIC3_MMC_REG(host, SD_CONFIG, Command) = SD_CONFIG_COMMAND_MAE;
-+
-+    ASIC3_MMC_REG(host, SD_CTRL, SoftwareReset) = 0; /* reset on */
-+    mdelay(2);
-+
-+    ASIC3_MMC_REG(host, SD_CTRL, SoftwareReset) = 1; /* reset off */
-+    mdelay(2);
-+
-+    ASIC3_MMC_REG(host, SD_CTRL, MemCardOptionSetup) =
-+          MEM_CARD_OPTION_REQUIRED
-+        | MEM_CARD_OPTION_DATA_RESPONSE_TIMEOUT(14)
-+        | MEM_CARD_OPTION_C2_MODULE_NOT_PRESENT
-+        | MEM_CARD_OPTION_DATA_XFR_WIDTH_1
-+        ;
-+    host->clock_for_sd = 0;
-+
-+    ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0;
-+    ASIC3_MMC_REG(host, SD_CTRL, CardStatus) = 0;
-+    ASIC3_MMC_REG(host, SD_CTRL, BufferCtrl) = 0;
-+    ASIC3_MMC_REG(host, SD_CTRL, ErrorStatus0) = 0;
-+    ASIC3_MMC_REG(host, SD_CTRL, ErrorStatus1) = 0;
-+    ASIC3_MMC_REG(host, SD_CTRL, StopInternal) = 0;
-+
-+    ASIC3_MMC_REG(host, SDIO_CTRL, ClocknWaitCtrl) = 0x100;
-+    /* *((unsigned short *)(((char *)host->ctl_base) + 0x938)) = 0x100; */
-+
-+    ASIC3_MMC_REG(host, SD_CONFIG, ClockMode) = 0;
-+    ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0;
-+
-+    mdelay(1);
-+
-+
-+    ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) = ~(
-+          SD_CTRL_INTMASKCARD_RESPONSE_END
-+        | SD_CTRL_INTMASKCARD_RW_END
-+        | SD_CTRL_INTMASKCARD_CARD_REMOVED_0
-+        | SD_CTRL_INTMASKCARD_CARD_INSERTED_0
-+#if 0
-+        | SD_CTRL_INTMASKCARD_CARD_REMOVED_3
-+        | SD_CTRL_INTMASKCARD_CARD_INSERTED_3
-+#endif
-+        )
-+        ; /* check */
-+    ASIC3_MMC_REG(host, SD_CTRL, IntMaskBuffer) = 0xffff;  /* IRQs off */
-+
-+    /*
-+     * ASIC3_MMC_REG(host, SD_CTRL, TransactionCtrl) = SD_CTRL_TRANSACTIONCONTROL_SET;
-+     *   Wince has 0x1000
-+     */
-+    /* ASIC3_MMC_REG(host, SD_CTRL, TransactionCtrl) = 0x1000; */
-+
-+
-+    asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_SDPWR, ASIC3_SDHWCTRL_SDPWR); /* turn on power at controller(?) */
-+
-+}
-+
-+static void
-+hwinit(struct asic3_mmc_host *host, struct platform_device *pdev)
-+{
-+    /* Call custom handler for enabling clock (if needed) */
-+    if(host->hwconfig->set_mmc_clock)
-+            host->hwconfig->set_mmc_clock(pdev, MMC_CLOCK_ENABLED);
-+
-+    /* Not sure if it must be done bit by bit, but leaving as-is */
-+    asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_LEVCD, ASIC3_SDHWCTRL_LEVCD);
-+    asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_LEVWP, ASIC3_SDHWCTRL_LEVWP);
-+    asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_SUSPEND, 0);
-+    asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_PCLR, 0);
-+
-+    asic3_set_clock_cdex (host->asic3_dev,
-+        CLOCK_CDEX_EX1 | CLOCK_CDEX_EX0, CLOCK_CDEX_EX1 | CLOCK_CDEX_EX0);
-+    msleep(1);
-+
-+    asic3_set_clock_sel (host->asic3_dev,
-+        CLOCK_SEL_SD_HCLK_SEL | CLOCK_SEL_SD_BCLK_SEL,
-+      CLOCK_SEL_SD_HCLK_SEL | 0);     /* ? */
-+
-+    asic3_set_clock_cdex (host->asic3_dev,
-+        CLOCK_CDEX_SD_HOST | CLOCK_CDEX_SD_BUS,
-+      CLOCK_CDEX_SD_HOST | CLOCK_CDEX_SD_BUS);
-+    msleep(1);
-+
-+    asic3_set_extcf_select(host->asic3_dev, ASIC3_EXTCF_SD_MEM_ENABLE, ASIC3_EXTCF_SD_MEM_ENABLE);
-+
-+    /* Long Delay */
-+    if( !machine_is_h4700())
-+        msleep(500);
-+
-+    hwinit2_irqsafe(host);
-+}
-+
-+#ifdef CONFIG_PM
-+static int
-+mmc_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+    struct mmc_host *mmc = platform_get_drvdata(pdev);
-+    struct asic3_mmc_host *host = mmc_priv(mmc);
-+    int ret;
-+
-+    ret = mmc_suspend_host(mmc, state);
-+
-+    if (ret) {
-+      printk(KERN_ERR DRIVER_NAME ": Could not suspend MMC host, hardware not suspended");
-+      return ret;
-+    }
-+
-+    /* disable the card insert / remove interrupt while sleeping */
-+    ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) = ~(
-+          SD_CTRL_INTMASKCARD_RESPONSE_END
-+        | SD_CTRL_INTMASKCARD_RW_END);
-+
-+    /* disable clock */
-+    ASIC3_MMC_REG(host, SD_CTRL, CardClockCtrl) = 0;
-+    ASIC3_MMC_REG(host, SD_CONFIG, ClkStop) = 0;
-+
-+    /* power down */
-+    ASIC3_MMC_REG(host, SD_CONFIG, SDHC_Power1) = 0;
-+
-+    asic3_set_clock_cdex (host->asic3_dev,
-+        CLOCK_CDEX_SD_HOST | CLOCK_CDEX_SD_BUS, 0);
-+
-+    /* disable core clock */
-+    if(host->hwconfig->set_mmc_clock)
-+        host->hwconfig->set_mmc_clock(pdev, MMC_CLOCK_DISABLED);
-+
-+    /* Put in suspend mode */
-+    asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_SUSPEND, ASIC3_SDHWCTRL_SUSPEND);
-+    return 0;
-+}
-+
-+static int
-+mmc_resume(struct platform_device *pdev)
-+{
-+    struct mmc_host *mmc = platform_get_drvdata(pdev);
-+    struct asic3_mmc_host *host = mmc_priv(mmc);
-+
-+    printk(KERN_INFO "%s: starting resume\n", DRIVER_NAME);
-+
-+    asic3_set_sdhwctrl(host->asic3_dev, ASIC3_SDHWCTRL_SUSPEND, 0);
-+    hwinit(host, pdev);
-+
-+    /* re-enable card remove / insert interrupt */
-+    ASIC3_MMC_REG(host, SD_CTRL, IntMaskCard) = ~(
-+          SD_CTRL_INTMASKCARD_RESPONSE_END
-+        | SD_CTRL_INTMASKCARD_RW_END
-+        | SD_CTRL_INTMASKCARD_CARD_REMOVED_0
-+        | SD_CTRL_INTMASKCARD_CARD_INSERTED_0 );
-+
-+    mmc_resume_host(mmc);
-+
-+    printk(KERN_INFO "%s: finished resume\n", DRIVER_NAME);
-+    return 0;
-+}
-+#endif
-+
-+static int
-+mmc_probe(struct platform_device *pdev)
-+{
-+    struct mmc_host *mmc;
-+    struct asic3_mmc_host *host = NULL;
-+    int retval = 0;
-+    struct tmio_mmc_hwconfig *mmc_config = (struct tmio_mmc_hwconfig *)pdev->dev.platform_data;
-+
-+    /* bus_shift is mandatory */
-+    if (!mmc_config) {
-+        printk(KERN_ERR DRIVER_NAME ": Invalid configuration\n");
-+      return -EINVAL;
-+    }
-+
-+    mmc = mmc_alloc_host(sizeof(struct asic3_mmc_host) + 128, &pdev->dev);
-+    if (!mmc) {
-+        retval = -ENOMEM;
-+        goto exceptional_return;
-+    }
-+
-+    host = mmc_priv(mmc);
-+    host->mmc = mmc;
-+    platform_set_drvdata(pdev, mmc);
-+
-+    host->ctl_base = 0;
-+    host->hwconfig = mmc_config;
-+    host->bus_shift = mmc_config->address_shift;
-+    host->asic3_dev = pdev->dev.parent;
-+    host->clock_for_sd = 0;
-+
-+    tasklet_init(&mmc_data_read_tasklet, mmc_data_transfer, (unsigned long)host);
-+
-+    host->ctl_base = ioremap_nocache ((unsigned long)pdev->resource[0].start, pdev->resource[0].end - pdev->resource[0].start);
-+    if(!host->ctl_base){
-+      printk(KERN_ERR DRIVER_NAME ": Could not map ASIC3 SD controller\n");
-+        retval = -ENODEV;
-+        goto exceptional_return;
-+    }
-+
-+    printk(DRIVER_NAME ": ASIC3 MMC/SD Driver, controller at 0x%lx\n", (unsigned long)pdev->resource[0].start);
-+
-+    mmc->ops = &mmc_ops;
-+    mmc->caps = MMC_CAP_4_BIT_DATA;
-+    mmc->f_min = 46875; /* ARIC: not sure what these should be */
-+    mmc->f_max = 24000000; /* ARIC: not sure what these should be */
-+    mmc->ocr_avail = MMC_VDD_32_33;
-+
-+    hwinit(host, pdev);
-+
-+
-+    host->irq = pdev->resource[1].start;
-+
-+    retval = request_irq(host->irq, mmc_irq, 0, DRIVER_NAME, host);
-+    if(retval) {
-+        printk(KERN_ERR DRIVER_NAME ": Unable to get interrupt\n");
-+        retval = -ENODEV;
-+        goto exceptional_return;
-+    }
-+    set_irq_type(host->irq, IRQT_FALLING);
-+
-+    mmc_add_host(mmc);
-+
-+#ifdef CONFIG_PM
-+    // resume_timer.function = resume_timer_callback;
-+    // resume_timer.data = 0;
-+    // init_timer(&resume_timer);
-+#endif
-+
-+    return 0;
-+
-+exceptional_return:
-+    if (mmc) {
-+        mmc_free_host(mmc);
-+    }
-+    if(host && host->ctl_base) iounmap(host->ctl_base);
-+    return retval;
-+}
-+
-+static int
-+mmc_remove(struct platform_device *pdev)
-+{
-+    struct mmc_host *mmc = platform_get_drvdata(pdev);
-+
-+    platform_set_drvdata(pdev, NULL);
-+
-+    if (mmc) {
-+        struct asic3_mmc_host *host = mmc_priv(mmc);
-+        mmc_remove_host(mmc);
-+        free_irq(host->irq, host);
-+        /* FIXME - we might want to consider stopping the chip here... */
-+        iounmap(host->ctl_base);
-+        mmc_free_host(mmc); /* FIXME - why does this call hang? */
-+    }
-+    return 0;
-+}
-+
-+/* ------------------- device registration ----------------------- */
-+
-+static struct platform_driver mmc_asic3_driver = {
-+    .driver = {
-+      .name    = DRIVER_NAME,
-+    },
-+    .probe   = mmc_probe,
-+    .remove  = mmc_remove,
-+#ifdef CONFIG_PM
-+    .suspend = mmc_suspend,
-+    .resume  = mmc_resume,
-+#endif
-+};
-+
-+static int __init mmc_init(void)
-+{
-+    return platform_driver_register(&mmc_asic3_driver);
-+}
-+
-+static void __exit mmc_exit(void)
-+{
-+    platform_driver_unregister(&mmc_asic3_driver);
-+}
-+
-+late_initcall(mmc_init);
-+module_exit(mmc_exit);
-+
-+MODULE_DESCRIPTION("HTC ASIC3 SD/MMC driver");
-+MODULE_AUTHOR("Aric Blumer, SDG Systems, LLC");
-+MODULE_LICENSE("GPL");
-+
-Index: linux-2.6.22/drivers/mmc/host/asic3_mmc.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/mmc/host/asic3_mmc.h  2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,25 @@
-+#ifndef __ASIC3_MMC_H
-+#define __ASIC3_MMC_H
-+
-+#define DRIVER_NAME   "asic3_mmc"
-+
-+#ifdef CONFIG_MMC_DEBUG
-+#define DBG(x...)       printk(DRIVER_NAME ": " x)
-+#else
-+#define DBG(x...)       do { } while (0)
-+#endif
-+
-+/* Response types */
-+#define APP_CMD        0x0040
-+
-+#define SD_CONFIG_CLKSTOP_ENABLE_ALL 0x1f
-+
-+#define DONT_CARE_CARD_BITS ( \
-+      SD_CTRL_INTMASKCARD_SIGNAL_STATE_PRESENT_3 \
-+    | SD_CTRL_INTMASKCARD_WRITE_PROTECT \
-+    | SD_CTRL_INTMASKCARD_UNK6 \
-+    | SD_CTRL_INTMASKCARD_SIGNAL_STATE_PRESENT_0 \
-+  )
-+#define DONT_CARE_BUFFER_BITS ( SD_CTRL_INTMASKBUFFER_UNK7 | SD_CTRL_INTMASKBUFFER_CMD_BUSY )
-+
-+#endif // __ASIC3_MMC_H
-Index: linux-2.6.22/drivers/input/keyboard/Makefile
-===================================================================
---- linux-2.6.22.orig/drivers/input/keyboard/Makefile  2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/input/keyboard/Makefile       2007-08-23 13:09:22.000000000 +0200
-@@ -21,4 +21,4 @@
- obj-$(CONFIG_KEYBOARD_PXA27x)         += pxa27x_keyboard.o
- obj-$(CONFIG_KEYBOARD_AAED2000)               += aaed2000_kbd.o
- obj-$(CONFIG_KEYBOARD_GPIO)           += gpio_keys.o
--
-+obj-$(CONFIG_KEYBOARD_ASIC3)          += asic3_keys.o
-Index: linux-2.6.22/drivers/input/keyboard/asic3_keys.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/input/keyboard/asic3_keys.c   2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,131 @@
-+/*
-+ * Generic buttons driver for ASIC3 SoC.
-+ *
-+ * 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 (C) 2003 Joshua Wise
-+ * Copyright (C) 2005 Pawel Kolodziejski
-+ * Copyright (C) 2006 Paul Sokolovsky
-+ *
-+ */
-+
-+#include <linux/input.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include <linux/irq.h>
-+#include <linux/soc/asic3_base.h>
-+#include <asm/mach/arch.h>
-+#include <asm/mach/map.h>
-+#include <asm/arch/irqs.h>
-+#include <asm/hardware.h>
-+#include <asm/hardware/ipaq-asic3.h>
-+#include <asm/hardware/asic3_keys.h>
-+
-+static irqreturn_t asic3_keys_asic_handle(int irq, void *data)
-+{
-+      struct asic3_keys_platform_data *pdata = data;
-+      int i, base_irq;
-+
-+      base_irq = asic3_irq_base(pdata->asic3_dev);
-+      for (i = 0; i < pdata->nbuttons; i++) {
-+              struct asic3_keys_button *b = &pdata->buttons[i];
-+              if ((base_irq + b->gpio) == irq) {
-+                      int state = !!asic3_gpio_get_value(pdata->asic3_dev, b->gpio);
-+
-+                      if (pdata->buttons[i].type == EV_SW)
-+                              input_report_switch(pdata->input, pdata->buttons[i].keycode, state ^ b->active_low);
-+                      else
-+                              input_report_key(pdata->input, b->keycode, state ^ b->active_low);
-+                      input_sync(pdata->input);
-+              }
-+      }
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static int __devinit asic3_keys_probe(struct platform_device *pdev)
-+{
-+      struct asic3_keys_platform_data *pdata = pdev->dev.platform_data;
-+      int i, base_irq;
-+      int j, ret;
-+
-+      pdata->input = input_allocate_device();
-+
-+      base_irq = asic3_irq_base(pdata->asic3_dev);
-+
-+      for (i = 0; i < pdata->nbuttons; i++) {
-+              struct asic3_keys_button *b = &pdata->buttons[i];
-+              set_bit(b->keycode, pdata->input->keybit);
-+                ret=request_irq(base_irq + b->gpio, asic3_keys_asic_handle, SA_SAMPLE_RANDOM, b->desc, pdata);
-+                if (ret)
-+                {
-+                 printk(KERN_NOTICE "Failed to allocate asic3_keys irq=%d.\n",b->gpio);
-+
-+                 for(j=0; j<i ; j++)
-+                  free_irq(base_irq + pdata->buttons[i].gpio, NULL);
-+
-+                 input_unregister_device (pdata->input);
-+
-+                 return -ENODEV;
-+                }
-+
-+              set_irq_type(base_irq + b->gpio, IRQT_BOTHEDGE);
-+              if (pdata->buttons[i].type == EV_SW) {
-+                      pdata->input->evbit[0] |= BIT(EV_SW);
-+                      set_bit(b->keycode, pdata->input->swbit);
-+              } else {
-+                      pdata->input->evbit[0] |= BIT(EV_KEY);
-+                      set_bit(b->keycode, pdata->input->keybit);
-+              }
-+      }
-+
-+      pdata->input->name = pdev->name;
-+      input_register_device(pdata->input);
-+
-+      return 0;
-+}
-+
-+static int __devexit asic3_keys_remove(struct platform_device *pdev)
-+{
-+      struct asic3_keys_platform_data *pdata = pdev->dev.platform_data;
-+      int i, base_irq;
-+
-+      base_irq = asic3_irq_base(pdata->asic3_dev);
-+      for (i = 0; i < pdata->nbuttons; i++) {
-+              free_irq(base_irq + pdata->buttons[i].gpio, NULL);
-+      }
-+
-+      input_unregister_device(pdata->input);
-+
-+      return 0;
-+}
-+
-+
-+static struct platform_driver asic3_keys_driver = {
-+      .probe          = asic3_keys_probe,
-+        .remove         = __devexit_p(asic3_keys_remove),
-+      .driver         = {
-+          .name       = "asic3-keys",
-+      },
-+};
-+
-+static int __init asic3_keys_init(void)
-+{
-+      return platform_driver_register(&asic3_keys_driver);
-+}
-+
-+static void __exit asic3_keys_exit(void)
-+{
-+      platform_driver_unregister(&asic3_keys_driver);
-+}
-+
-+module_init(asic3_keys_init);
-+module_exit(asic3_keys_exit);
-+
-+MODULE_AUTHOR("Joshua Wise, Pawel Kolodziejski, Paul Sokolovsky");
-+MODULE_DESCRIPTION("Buttons driver for HTC ASIC3 SoC");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/include/asm-arm/arch-pxa/irqs.h
-===================================================================
---- linux-2.6.22.orig/include/asm-arm/arch-pxa/irqs.h  2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/include/asm-arm/arch-pxa/irqs.h       2007-08-23 13:09:22.000000000 +0200
-@@ -178,6 +178,8 @@
-       defined(CONFIG_MACH_LOGICPD_PXA270) || \
-       defined(CONFIG_MACH_MAINSTONE)
- #define NR_IRQS                       (IRQ_BOARD_END)
-+#elif defined(CONFIG_MACH_HTCUNIVERSAL)
-+#define NR_IRQS                       (IRQ_BOARD_START + 96)
- #else
- #define NR_IRQS                       (IRQ_BOARD_START)
- #endif
-Index: linux-2.6.22/include/linux/ioport.h
-===================================================================
---- linux-2.6.22.orig/include/linux/ioport.h   2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/include/linux/ioport.h        2007-08-23 13:09:22.000000000 +0200
-@@ -56,6 +56,7 @@
- #define IORESOURCE_IRQ_HIGHLEVEL      (1<<2)
- #define IORESOURCE_IRQ_LOWLEVEL               (1<<3)
- #define IORESOURCE_IRQ_SHAREABLE      (1<<4)
-+#define IORESOURCE_IRQ_SOC_SUBDEVICE    (1<<5)
- /* ISA PnP DMA specific bits (IORESOURCE_BITS) */
- #define IORESOURCE_DMA_TYPE_MASK      (3<<0)
-Index: linux-2.6.22/drivers/video/backlight/Kconfig
-===================================================================
---- linux-2.6.22.orig/drivers/video/backlight/Kconfig  2007-08-23 13:09:19.000000000 +0200
-+++ linux-2.6.22/drivers/video/backlight/Kconfig       2007-08-23 13:09:22.000000000 +0200
-@@ -34,7 +34,7 @@
- config BACKLIGHT_CORGI
-       tristate "Sharp Corgi Backlight Driver (SL Series)"
--      depends on BACKLIGHT_CLASS_DEVICE && PXA_SHARPSL
-+      depends on BACKLIGHT_CLASS_DEVICE
-       default y
-       help
-         If you have a Sharp Zaurus SL-C7xx, SL-Cxx00 or SL-6000x say y to enable the
-Index: linux-2.6.22/drivers/video/backlight/corgi_bl.c
-===================================================================
---- linux-2.6.22.orig/drivers/video/backlight/corgi_bl.c       2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/video/backlight/corgi_bl.c    2007-08-23 13:09:22.000000000 +0200
-@@ -24,7 +24,7 @@
- static int corgibl_intensity;
- static struct backlight_properties corgibl_data;
- static struct backlight_device *corgi_backlight_device;
--static struct corgibl_machinfo *bl_machinfo;
-+static struct generic_bl_info *bl_machinfo;
- static unsigned long corgibl_flags;
- #define CORGIBL_SUSPENDED     0x01
-@@ -107,7 +107,7 @@
- static int corgibl_probe(struct platform_device *pdev)
- {
--      struct corgibl_machinfo *machinfo = pdev->dev.platform_data;
-+      struct generic_bl_info *machinfo = pdev->dev.platform_data;
-       bl_machinfo = machinfo;
-       if (!machinfo->limit_mask)
-Index: linux-2.6.22/arch/arm/mach-pxa/corgi.c
-===================================================================
---- linux-2.6.22.orig/arch/arm/mach-pxa/corgi.c        2007-08-23 13:09:20.000000000 +0200
-+++ linux-2.6.22/arch/arm/mach-pxa/corgi.c     2007-08-23 13:09:22.000000000 +0200
-@@ -20,6 +20,7 @@
- #include <linux/interrupt.h>
- #include <linux/mmc/host.h>
- #include <linux/pm.h>
-+#include <linux/backlight.h>
- #include <asm/setup.h>
- #include <asm/memory.h>
-@@ -142,7 +143,7 @@
- /*
-  * Corgi Backlight Device
-  */
--static struct corgibl_machinfo corgi_bl_machinfo = {
-+static struct generic_bl_info corgi_bl_machinfo = {
-       .max_intensity = 0x2f,
-       .default_intensity = 0x1f,
-       .limit_mask = 0x0b,
-Index: linux-2.6.22/arch/arm/mach-pxa/spitz.c
-===================================================================
---- linux-2.6.22.orig/arch/arm/mach-pxa/spitz.c        2007-08-23 13:09:20.000000000 +0200
-+++ linux-2.6.22/arch/arm/mach-pxa/spitz.c     2007-08-23 13:09:22.000000000 +0200
-@@ -221,7 +221,7 @@
- /*
-  * Spitz Backlight Device
-  */
--static struct corgibl_machinfo spitz_bl_machinfo = {
-+static struct generic_bl_info spitz_bl_machinfo = {
-       .default_intensity = 0x1f,
-       .limit_mask = 0x0b,
-       .max_intensity = 0x2f,
-Index: linux-2.6.22/arch/arm/mach-pxa/generic.c
-===================================================================
---- linux-2.6.22.orig/arch/arm/mach-pxa/generic.c      2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/arch/arm/mach-pxa/generic.c   2007-08-23 13:09:22.000000000 +0200
-@@ -345,6 +345,18 @@
-       .id             = 3,
- };
-+void __init pxa_set_ffuart_info(struct platform_pxa_serial_funcs *info)
-+{
-+      ffuart_device.dev.platform_data = info;
-+}
-+EXPORT_SYMBOL(pxa_set_ffuart_info);
-+
-+void __init pxa_set_btuart_info(struct platform_pxa_serial_funcs *info)
-+{
-+      btuart_device.dev.platform_data = info;
-+}
-+EXPORT_SYMBOL(pxa_set_btuart_info);
-+
- static struct resource i2c_resources[] = {
-       {
-               .start  = 0x40301680,
-Index: linux-2.6.22/drivers/w1/slaves/Kconfig
-===================================================================
---- linux-2.6.22.orig/drivers/w1/slaves/Kconfig        2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/w1/slaves/Kconfig     2007-08-23 13:09:22.000000000 +0200
-@@ -35,4 +35,15 @@
-         Each block has 30 bytes of data and a two byte CRC16.
-         Full block writes are only allowed if the CRC is valid.
-+config W1_SLAVE_DS2760
-+       tristate "Dallas 2760 battery monitor chip (HP iPAQ & others)"
-+       depends on W1
-+       help
-+         If you enable this you will have the DS2760 battery monitor
-+         chip support.
-+         The battery monitor chip is used in many batteries/devices
-+         as the one who is responsible for charging/discharging/monitoring
-+         Li+ batteries.
-+         If you are unsure, say N.
-+
- endmenu
-Index: linux-2.6.22/drivers/w1/slaves/Makefile
-===================================================================
---- linux-2.6.22.orig/drivers/w1/slaves/Makefile       2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/w1/slaves/Makefile    2007-08-23 13:09:22.000000000 +0200
-@@ -5,4 +5,4 @@
- obj-$(CONFIG_W1_SLAVE_THERM)  += w1_therm.o
- obj-$(CONFIG_W1_SLAVE_SMEM)   += w1_smem.o
- obj-$(CONFIG_W1_SLAVE_DS2433) += w1_ds2433.o
--
-+obj-$(CONFIG_W1_SLAVE_DS2760)         += w1_ds2760.o
-Index: linux-2.6.22/drivers/w1/w1_family.h
-===================================================================
---- linux-2.6.22.orig/drivers/w1/w1_family.h   2007-07-09 01:32:17.000000000 +0200
-+++ linux-2.6.22/drivers/w1/w1_family.h        2007-08-23 13:09:22.000000000 +0200
-@@ -33,6 +33,7 @@
- #define W1_THERM_DS1822       0x22
- #define W1_EEPROM_DS2433      0x23
- #define W1_THERM_DS18B20      0x28
-+#define W1_FAMILY_DS2760        0x30
- #define MAXNAMELEN            32
-Index: linux-2.6.22/include/asm-arm/arch-pxa/serial.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/asm-arm/arch-pxa/serial.h     2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,78 @@
-+/*
-+ *  linux/include/asm-arm/arch-pxa/serial.h
-+ *
-+ * Author:    Nicolas Pitre
-+ * Copyright: (C) 2001 MontaVista Software 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.
-+ */
-+
-+#include <asm/arch/pxa-regs.h>
-+
-+#define BAUD_BASE     921600
-+
-+/* Standard COM flags */
-+#define STD_COM_FLAGS (ASYNC_SKIP_TEST)
-+
-+#define STD_SERIAL_PORT_DEFNS \
-+      {       \
-+              type:                   PORT_PXA,       \
-+              xmit_fifo_size:         64,             \
-+              baud_base:              BAUD_BASE,      \
-+              iomem_base:             &FFUART,        \
-+              iomem_reg_shift:        2,              \
-+              io_type:                SERIAL_IO_MEM,  \
-+              irq:                    IRQ_FFUART,     \
-+              flags:                  STD_COM_FLAGS,  \
-+      }, {    \
-+              type:                   PORT_PXA,       \
-+              xmit_fifo_size:         64,             \
-+              baud_base:              BAUD_BASE,      \
-+              iomem_base:             &STUART,        \
-+              iomem_reg_shift:        2,              \
-+              io_type:                SERIAL_IO_MEM,  \
-+              irq:                    IRQ_STUART,     \
-+              flags:                  STD_COM_FLAGS,  \
-+      }, {    \
-+              type:                   PORT_PXA,       \
-+              xmit_fifo_size:         64,             \
-+              baud_base:              BAUD_BASE,      \
-+              iomem_base:             &BTUART,        \
-+              iomem_reg_shift:        2,              \
-+              io_type:                SERIAL_IO_MEM,  \
-+              irq:                    IRQ_BTUART,     \
-+              flags:                  STD_COM_FLAGS,  \
-+      }
-+
-+#define EXTRA_SERIAL_PORT_DEFNS
-+
-+struct platform_pxa_serial_funcs {
-+
-+      /* Initialize whatever is connected to this serial port. */
-+      void (*configure)(int state);
-+#define PXA_UART_CFG_PRE_STARTUP   0
-+#define PXA_UART_CFG_POST_STARTUP  1
-+#define PXA_UART_CFG_PRE_SHUTDOWN  2
-+#define PXA_UART_CFG_POST_SHUTDOWN 3
-+
-+      /* Enable or disable the individual transmitter/receiver submodules.
-+       * On transceivers without echo cancellation (e.g. SIR)
-+       * transmitter always has priority; e.g. if both bits are set,
-+       * only the transmitter is enabled. */
-+        void (*set_txrx)(int txrx);
-+#define PXA_SERIAL_TX 1
-+#define PXA_SERIAL_RX 2
-+
-+      /* Get the current state of tx/rx. */
-+      int (*get_txrx)(void);
-+
-+      int (*suspend)(struct platform_device *dev, pm_message_t state);
-+      int (*resume)(struct platform_device *dev);
-+};
-+
-+void pxa_set_ffuart_info(struct platform_pxa_serial_funcs *ffuart_funcs);
-+void pxa_set_btuart_info(struct platform_pxa_serial_funcs *btuart_funcs);
-+void pxa_set_stuart_info(struct platform_pxa_serial_funcs *stuart_funcs);
-+void pxa_set_hwuart_info(struct platform_pxa_serial_funcs *hwuart_funcs);
-Index: linux-2.6.22/drivers/w1/slaves/w1_ds2760.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/w1/slaves/w1_ds2760.c 2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,213 @@
-+/*
-+ * 1-Wire implementation for the ds2760 chip
-+ *
-+ * Copyright (c) 2004-2005, Szabolcs Gyurko <szabolcs.gyurko@tlt.hu>
-+ *
-+ * 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/kernel.h>
-+#include <linux/module.h>
-+#include <linux/device.h>
-+#include <linux/types.h>
-+#include <linux/platform_device.h>
-+#include <linux/mutex.h>
-+#include <linux/idr.h>
-+
-+#include "../w1.h"
-+#include "../w1_int.h"
-+#include "../w1_family.h"
-+#include "w1_ds2760.h"
-+
-+static int w1_ds2760_io(struct device *dev, char *buf, int addr, size_t count,
-+                        int io)
-+{
-+      struct w1_slave *sl = container_of(dev, struct w1_slave, dev);
-+
-+      if (!dev)
-+              return 0;
-+
-+      mutex_lock(&sl->master->mutex);
-+
-+      if (addr > DS2760_DATA_SIZE || addr < 0) {
-+              count = 0;
-+              goto out;
-+      }
-+      if (addr + count > DS2760_DATA_SIZE)
-+              count = DS2760_DATA_SIZE - addr;
-+
-+      if (!w1_reset_select_slave(sl)) {
-+              if (!io) {
-+                      w1_write_8(sl->master, W1_DS2760_READ_DATA);
-+                      w1_write_8(sl->master, addr);
-+                      count = w1_read_block(sl->master, buf, count);
-+              } else {
-+                      w1_write_8(sl->master, W1_DS2760_WRITE_DATA);
-+                      w1_write_8(sl->master, addr);
-+                      w1_write_block(sl->master, buf, count);
-+                      /* XXX w1_write_block returns void, not n_written */
-+              }
-+      }
-+
-+out:
-+      mutex_unlock(&sl->master->mutex);
-+
-+      return count;
-+}
-+
-+int w1_ds2760_read(struct device *dev, char *buf, int addr, size_t count)
-+{
-+      return w1_ds2760_io(dev, buf, addr, count, 0);
-+}
-+
-+int w1_ds2760_write(struct device *dev, char *buf, int addr, size_t count)
-+{
-+      return w1_ds2760_io(dev, buf, addr, count, 1);
-+}
-+
-+static ssize_t w1_ds2760_read_bin(struct kobject *kobj, char *buf, loff_t off,
-+                                  size_t count)
-+{
-+      struct device *dev = container_of(kobj, struct device, kobj);
-+      return w1_ds2760_read(dev, buf, off, count);
-+}
-+
-+static struct bin_attribute w1_ds2760_bin_attr = {
-+      .attr = {
-+              .name = "w1_slave",
-+              .mode = S_IRUGO,
-+              .owner = THIS_MODULE,
-+      },
-+      .size = DS2760_DATA_SIZE,
-+      .read = w1_ds2760_read_bin,
-+};
-+
-+static DEFINE_IDR(bat_idr);
-+static DEFINE_MUTEX(bat_idr_lock);
-+
-+static int new_bat_id(void)
-+{
-+      int ret;
-+
-+      while (1) {
-+              int id;
-+
-+              ret = idr_pre_get(&bat_idr, GFP_KERNEL);
-+              if (ret == 0)
-+                      return -ENOMEM;
-+
-+              mutex_lock(&bat_idr_lock);
-+              ret = idr_get_new(&bat_idr, NULL, &id);
-+              mutex_unlock(&bat_idr_lock);
-+
-+              if (ret == 0) {
-+                      ret = id & MAX_ID_MASK;
-+                      break;
-+              }
-+              else if (ret == -EAGAIN)
-+                      continue;
-+              else
-+                      break;
-+      }
-+
-+      return ret;
-+}
-+
-+static void release_bat_id(int id)
-+{
-+      mutex_lock(&bat_idr_lock);
-+      idr_remove(&bat_idr, id);
-+      mutex_unlock(&bat_idr_lock);
-+
-+      return;
-+}
-+
-+static int w1_ds2760_add_slave(struct w1_slave *sl)
-+{
-+      int ret;
-+      int id;
-+      struct platform_device *pdev;
-+
-+      id = new_bat_id();
-+      if (id < 0) {
-+              ret = id;
-+              goto noid;
-+      }
-+
-+      pdev = platform_device_alloc("ds2760-battery", id);
-+      if (!pdev) {
-+              ret = -ENOMEM;
-+              goto pdev_alloc_failed;
-+      }
-+      pdev->dev.parent = &sl->dev;
-+
-+      ret = platform_device_add(pdev);
-+      if (ret)
-+              goto pdev_add_failed;
-+
-+      ret = sysfs_create_bin_file(&sl->dev.kobj, &w1_ds2760_bin_attr);
-+      if (ret)
-+              goto bin_attr_failed;
-+
-+      dev_set_drvdata(&sl->dev, pdev);
-+
-+      goto success;
-+
-+bin_attr_failed:
-+pdev_add_failed:
-+      platform_device_unregister(pdev);
-+pdev_alloc_failed:
-+      release_bat_id(id);
-+noid:
-+success:
-+      return ret;
-+}
-+
-+static void w1_ds2760_remove_slave(struct w1_slave *sl)
-+{
-+      struct platform_device *pdev = dev_get_drvdata(&sl->dev);
-+      int id = pdev->id;
-+
-+      platform_device_unregister(pdev);
-+      release_bat_id(id);
-+      sysfs_remove_bin_file(&sl->dev.kobj, &w1_ds2760_bin_attr);
-+
-+      return;
-+}
-+
-+static struct w1_family_ops w1_ds2760_fops = {
-+      .add_slave    = w1_ds2760_add_slave,
-+      .remove_slave = w1_ds2760_remove_slave,
-+};
-+
-+static struct w1_family w1_ds2760_family = {
-+      .fid = W1_FAMILY_DS2760,
-+      .fops = &w1_ds2760_fops,
-+};
-+
-+static int __init w1_ds2760_init(void)
-+{
-+      printk(KERN_INFO "1-Wire driver for the DS2760 battery monitor "
-+             " chip  - (c) 2004-2005, Szabolcs Gyurko\n");
-+      idr_init(&bat_idr);
-+      return w1_register_family(&w1_ds2760_family);
-+}
-+
-+static void __exit w1_ds2760_exit(void)
-+{
-+      w1_unregister_family(&w1_ds2760_family);
-+      idr_destroy(&bat_idr);
-+}
-+
-+EXPORT_SYMBOL(w1_ds2760_read);
-+EXPORT_SYMBOL(w1_ds2760_write);
-+
-+module_init(w1_ds2760_init);
-+module_exit(w1_ds2760_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Szabolcs Gyurko <szabolcs.gyurko@tlt.hu>");
-+MODULE_DESCRIPTION("1-wire Driver Dallas 2760 battery monitor chip");
-Index: linux-2.6.22/drivers/w1/slaves/w1_ds2760.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/w1/slaves/w1_ds2760.h 2007-08-23 13:09:22.000000000 +0200
-@@ -0,0 +1,50 @@
-+/*
-+ * 1-Wire implementation for the ds2760 chip
-+ *
-+ * Copyright (c) 2004-2005, Szabolcs Gyurko <szabolcs.gyurko@tlt.hu>
-+ *
-+ * Use consistent with the GNU GPL is permitted,
-+ * provided that this copyright notice is
-+ * preserved in its entirety in all copies and derived works.
-+ *
-+ */
-+
-+#ifndef __w1_ds2760_h__
-+#define __w1_ds2760_h__
-+
-+/* Known commands to the DS2760 chip */
-+#define W1_DS2760_SWAP                      0xAA
-+#define W1_DS2760_READ_DATA                 0x69
-+#define W1_DS2760_WRITE_DATA                0x6C
-+#define W1_DS2760_COPY_DATA                 0x48
-+#define W1_DS2760_RECALL_DATA               0xB8
-+#define W1_DS2760_LOCK                      0x6A
-+
-+/* Number of valid register addresses */
-+#define DS2760_DATA_SIZE          0x40
-+
-+#define DS2760_PROTECTION_REG     0x00
-+#define DS2760_STATUS_REG         0x01
-+#define DS2760_EEPROM_REG         0x07
-+#define DS2760_SPECIAL_FEATURE_REG  0x08
-+#define DS2760_VOLTAGE_MSB        0x0c
-+#define DS2760_VOLTAGE_LSB        0x0d
-+#define DS2760_CURRENT_MSB        0x0e
-+#define DS2760_CURRENT_LSB        0x0f
-+#define DS2760_CURRENT_ACCUM_MSB    0x10
-+#define DS2760_CURRENT_ACCUM_LSB    0x11
-+#define DS2760_TEMP_MSB                   0x18
-+#define DS2760_TEMP_LSB                   0x19
-+#define DS2760_EEPROM_BLOCK0      0x20
-+#define DS2760_ACTIVE_FULL        0x20
-+#define DS2760_EEPROM_BLOCK1      0x30
-+#define DS2760_RATED_CAPACITY     0x32
-+#define DS2760_CURRENT_OFFSET_BIAS  0x33
-+#define DS2760_ACTIVE_EMPTY       0x3b
-+
-+extern int w1_ds2760_read(struct device *dev, char *buf, int addr,
-+                          size_t count);
-+extern int w1_ds2760_write(struct device *dev, char *buf, int addr,
-+                           size_t count);
-+
-+#endif /* !__w1_ds2760_h__ */
-Index: linux-2.6.22/drivers/serial/pxa.c
-===================================================================
---- linux-2.6.22.orig/drivers/serial/pxa.c     2007-08-23 13:21:54.000000000 +0200
-+++ linux-2.6.22/drivers/serial/pxa.c  2007-08-23 13:22:54.000000000 +0200
-@@ -46,6 +46,7 @@
- #include <asm/io.h>
- #include <asm/hardware.h>
- #include <asm/irq.h>
-+#include <asm/arch/serial.h>
- #include <asm/arch/pxa-regs.h>
-@@ -59,6 +60,14 @@
-       char                    *name;
- };
-+
-+#define IS_METHOD(dev, method) (dev && (dev)->platform_data && ((struct platform_pxa_serial_funcs *)(dev)->platform_data)->method)
-+#define METHOD_CALL(dev, method) \
-+              ((struct platform_pxa_serial_funcs *)(dev)->platform_data)->method()
-+#define SAFE_METHOD_CALL(dev, method, args...) \
-+      if (IS_METHOD(dev, method)) \
-+              ((struct platform_pxa_serial_funcs *)(dev)->platform_data)->method(args)
-+
- static inline unsigned int serial_in(struct uart_pxa_port *up, int offset)
- {
-       offset <<= 2;
-@@ -346,6 +355,9 @@
-       unsigned long flags;
-       int retval;
-+      /* Perform platform-specific port initialization, if needed. */
-+      SAFE_METHOD_CALL(port->dev, configure, PXA_UART_CFG_PRE_STARTUP);
-+
-       if (port->line == 3) /* HWUART */
-               up->mcr |= UART_MCR_AFE;
-       else
-@@ -401,6 +413,12 @@
-       (void) serial_in(up, UART_IIR);
-       (void) serial_in(up, UART_MSR);
-+      /*
-+       * Perform platform-specific port initialization if needed
-+       */
-+      SAFE_METHOD_CALL(port->dev, configure, PXA_UART_CFG_POST_STARTUP);
-+      SAFE_METHOD_CALL(port->dev, set_txrx, PXA_SERIAL_RX);
-+
-       return 0;
- }
-@@ -409,6 +427,8 @@
-       struct uart_pxa_port *up = (struct uart_pxa_port *)port;
-       unsigned long flags;
-+      SAFE_METHOD_CALL(port->dev, configure, PXA_UART_CFG_PRE_SHUTDOWN);
-+
-       free_irq(up->port.irq, up);
-       /*
-@@ -430,6 +450,8 @@
-                                 UART_FCR_CLEAR_RCVR |
-                                 UART_FCR_CLEAR_XMIT);
-       serial_out(up, UART_FCR, 0);
-+
-+      SAFE_METHOD_CALL(port->dev, configure, PXA_UART_CFG_POST_SHUTDOWN);
- }
- static void
diff --git a/meta/packages/linux/linux-rp-2.6.22/pda-power.patch b/meta/packages/linux/linux-rp-2.6.22/pda-power.patch
deleted file mode 100644 (file)
index face2f4..0000000
+++ /dev/null
@@ -1,3373 +0,0 @@
----
- arch/arm/Kconfig                   |    2 
- drivers/Kconfig                    |    2 
- drivers/Makefile                   |    1 
- drivers/power/Kconfig              |   70 +++++
- drivers/power/Makefile             |   28 ++
- drivers/power/adc_battery.c        |  278 +++++++++++++++++++++
- drivers/power/apm_power.c          |  247 +++++++++++++++++++
- drivers/power/ds2760_battery.c     |  475 +++++++++++++++++++++++++++++++++++++
- drivers/power/micro_battery.c      |  257 ++++++++++++++++++++
- drivers/power/olpc_battery.c       |  302 +++++++++++++++++++++++
- drivers/power/pda_power.c          |  263 ++++++++++++++++++++
- drivers/power/pmu_battery.c        |  215 ++++++++++++++++
- drivers/power/power_supply.h       |   42 +++
- drivers/power/power_supply_core.c  |  168 +++++++++++++
- drivers/power/power_supply_leds.c  |  188 ++++++++++++++
- drivers/power/power_supply_sysfs.c |  289 ++++++++++++++++++++++
- drivers/power/simpad-battery.c     |  242 ++++++++++++++++++
- include/linux/power_supply.h       |  175 +++++++++++++
- 18 files changed, 3244 insertions(+)
-
-Index: linux-2.6.22/drivers/power/adc_battery.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/adc_battery.c   2007-08-23 12:26:28.000000000 +0200
-@@ -0,0 +1,278 @@
-+/*
-+ * Copyright (c) 2007 Paul Sokolovsky
-+ *
-+ * 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.
-+ *
-+ */
-+
-+//#define DEBUG
-+
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/pm.h>
-+#include <linux/delay.h>
-+#include <linux/workqueue.h>
-+#include <linux/platform_device.h>
-+#include <linux/power_supply.h>
-+#include <linux/adc.h>
-+#include <linux/adc_battery.h>
-+
-+#include <asm/irq.h>
-+
-+#define PIN_NO_VOLT 0
-+#define PIN_NO_CURR 1
-+#define PIN_NO_TEMP 2
-+
-+struct battery_adc_priv {
-+      struct power_supply batt_cdev;
-+
-+      struct battery_adc_platform_data *pdata;
-+
-+      struct adc_request req;
-+      struct adc_sense pins[3];
-+      struct adc_sense last_good_pins[3];
-+
-+      struct workqueue_struct *wq;
-+      struct delayed_work work;
-+};
-+
-+/*
-+ *  Battery properties
-+ */
-+
-+static int adc_battery_get_property(struct power_supply *psy,
-+                                    enum power_supply_property psp,
-+                                    union power_supply_propval *val)
-+{
-+      struct battery_adc_priv* drvdata = (struct battery_adc_priv*)psy;
-+      int voltage;
-+
-+      switch (psp) {
-+      case POWER_SUPPLY_PROP_STATUS:
-+              val->intval = drvdata->pdata->charge_status;
-+              break;
-+      case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
-+              val->intval = drvdata->pdata->battery_info.voltage_max_design;
-+              break;
-+      case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
-+              val->intval = drvdata->pdata->battery_info.voltage_min_design;
-+              break;
-+      case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
-+              val->intval = drvdata->pdata->battery_info.charge_full_design;
-+              break;
-+      case POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN:
-+              val->intval = drvdata->pdata->battery_info.charge_empty_design;
-+              break;
-+      case POWER_SUPPLY_PROP_VOLTAGE_NOW:
-+              val->intval = drvdata->last_good_pins[PIN_NO_VOLT].value * drvdata->pdata->voltage_mult;
-+              break;
-+      case POWER_SUPPLY_PROP_CURRENT_NOW:
-+              val->intval = drvdata->last_good_pins[PIN_NO_CURR].value * drvdata->pdata->current_mult;
-+              break;
-+      case POWER_SUPPLY_PROP_CHARGE_NOW:
-+              /* We do calculations in mX, not uX, because todo it in uX we should use "long long"s,
-+               * which is a mess (need to use do_div) when you need divide operation). */
-+              voltage = drvdata->last_good_pins[PIN_NO_VOLT].value * drvdata->pdata->voltage_mult;
-+              val->intval = ((voltage/1000 - drvdata->pdata->battery_info.voltage_min_design/1000) *
-+                   (drvdata->pdata->battery_info.charge_full_design/1000 -
-+                    drvdata->pdata->battery_info.charge_empty_design/1000)) /
-+                   (drvdata->pdata->battery_info.voltage_max_design/1000 -
-+                    drvdata->pdata->battery_info.voltage_min_design/1000);
-+              val->intval *= 1000; /* convert final result to uX */
-+              break;
-+      case POWER_SUPPLY_PROP_TEMP:
-+              val->intval = drvdata->last_good_pins[PIN_NO_TEMP].value * drvdata->pdata->temperature_mult / 1000;
-+              break;
-+      default:
-+              return -EINVAL;
-+      };
-+      return 0;
-+}
-+
-+/*
-+ *  Driver body
-+ */
-+
-+static void adc_battery_query(struct battery_adc_priv *drvdata)
-+{
-+      struct battery_adc_platform_data *pdata = drvdata->pdata;
-+      int powered, charging;
-+
-+      adc_request_sample(&drvdata->req);
-+
-+      powered = power_supply_am_i_supplied(&drvdata->batt_cdev);
-+      charging = pdata->is_charging ? pdata->is_charging() : -1;
-+
-+      if (powered && charging)
-+              pdata->charge_status = POWER_SUPPLY_STATUS_CHARGING;
-+      else if (powered && !charging && charging != -1)
-+              pdata->charge_status = POWER_SUPPLY_STATUS_FULL;
-+      else
-+              pdata->charge_status = POWER_SUPPLY_STATUS_DISCHARGING;
-+
-+      /* Throw away invalid samples, this may happen soon after resume for example. */
-+      if (drvdata->pins[PIN_NO_VOLT].value > 0) {
-+              memcpy(drvdata->last_good_pins, drvdata->pins, sizeof(drvdata->pins));
-+#ifdef DEBUG
-+              printk("%d %d %d\n", drvdata->pins[PIN_NO_VOLT].value,
-+                                   drvdata->pins[PIN_NO_CURR].value,
-+                                   drvdata->pins[PIN_NO_TEMP].value);
-+#endif
-+      }
-+}
-+
-+static void adc_battery_charge_power_changed(struct power_supply *bat)
-+{
-+      struct battery_adc_priv *drvdata = (struct battery_adc_priv*)bat;
-+      cancel_delayed_work(&drvdata->work);
-+      queue_delayed_work(drvdata->wq, &drvdata->work, 0);
-+}
-+
-+static void adc_battery_work_func(struct work_struct *work)
-+{
-+      struct delayed_work *delayed_work = container_of(work, struct delayed_work, work);
-+      struct battery_adc_priv *drvdata = container_of(delayed_work, struct battery_adc_priv, work);
-+
-+      adc_battery_query(drvdata);
-+      power_supply_changed(&drvdata->batt_cdev);
-+
-+      queue_delayed_work(drvdata->wq, &drvdata->work, (5000 * HZ) / 1000);
-+}
-+
-+static int adc_battery_probe(struct platform_device *pdev)
-+{
-+        int retval;
-+      struct battery_adc_platform_data *pdata = pdev->dev.platform_data;
-+      struct battery_adc_priv *drvdata;
-+      int i, j;
-+      enum power_supply_property props[] = {
-+              POWER_SUPPLY_PROP_STATUS,
-+              POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
-+              POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
-+              POWER_SUPPLY_PROP_VOLTAGE_NOW,
-+              POWER_SUPPLY_PROP_CURRENT_NOW,
-+              POWER_SUPPLY_PROP_CHARGE_NOW,
-+              POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
-+              POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN,
-+              POWER_SUPPLY_PROP_TEMP,
-+      };
-+
-+      // Initialize ts data structure.
-+      drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
-+      if (!drvdata)
-+              return -ENOMEM;
-+
-+      drvdata->batt_cdev.name           = pdata->battery_info.name;
-+      drvdata->batt_cdev.use_for_apm    = pdata->battery_info.use_for_apm;
-+      drvdata->batt_cdev.num_properties = ARRAY_SIZE(props);
-+      drvdata->batt_cdev.get_property   = adc_battery_get_property;
-+      drvdata->batt_cdev.external_power_changed =
-+                                adc_battery_charge_power_changed;
-+
-+      if (!pdata->voltage_pin) {
-+              drvdata->batt_cdev.num_properties--;
-+              props[3] = -1;
-+      }
-+      if (!pdata->current_pin) {
-+              drvdata->batt_cdev.num_properties--;
-+              props[4] = -1;
-+      }
-+      if (!pdata->temperature_pin) {
-+              drvdata->batt_cdev.num_properties--;
-+              props[8] = -1;
-+      }
-+
-+      drvdata->batt_cdev.properties = kmalloc(
-+                      sizeof(*drvdata->batt_cdev.properties) *
-+                      drvdata->batt_cdev.num_properties, GFP_KERNEL);
-+      if (!drvdata->batt_cdev.properties)
-+              return -ENOMEM;
-+
-+      j = 0;
-+      for (i = 0; i < ARRAY_SIZE(props); i++) {
-+              if (props[i] == -1)
-+                      continue;
-+              drvdata->batt_cdev.properties[j++] = props[i];
-+      }
-+
-+      retval = power_supply_register(&pdev->dev, &drvdata->batt_cdev);
-+      if (retval) {
-+              printk("adc-battery: Error registering battery classdev");
-+              return retval;
-+      }
-+
-+      drvdata->req.senses = drvdata->pins;
-+      drvdata->req.num_senses = ARRAY_SIZE(drvdata->pins);
-+      drvdata->pins[PIN_NO_VOLT].name = pdata->voltage_pin;
-+      drvdata->pins[PIN_NO_CURR].name = pdata->current_pin;
-+      drvdata->pins[PIN_NO_TEMP].name = pdata->temperature_pin;
-+
-+      adc_request_register(&drvdata->req);
-+
-+      /* Here we assume raw values in mV */
-+      if (!pdata->voltage_mult)
-+              pdata->voltage_mult = 1000;
-+      /* Here we assume raw values in mA */
-+      if (!pdata->current_mult)
-+              pdata->current_mult = 1000;
-+      /* Here we assume raw values in 1/10 C */
-+      if (!pdata->temperature_mult)
-+              pdata->temperature_mult = 1000;
-+
-+      drvdata->pdata = pdata;
-+      pdata->drvdata = drvdata; /* Seems ugly, we need better solution */
-+
-+      platform_set_drvdata(pdev, drvdata);
-+
-+        // Load initial values ASAP
-+      adc_battery_query(drvdata);
-+
-+      // Still schedule next sampling soon
-+      INIT_DELAYED_WORK(&drvdata->work, adc_battery_work_func);
-+      drvdata->wq = create_workqueue(pdev->dev.bus_id);
-+      if (!drvdata->wq)
-+              return -ESRCH;
-+
-+      queue_delayed_work(drvdata->wq, &drvdata->work, (5000 * HZ) / 1000);
-+
-+      return retval;
-+}
-+
-+static int adc_battery_remove(struct platform_device *pdev)
-+{
-+      struct battery_adc_priv *drvdata = platform_get_drvdata(pdev);
-+      cancel_delayed_work(&drvdata->work);
-+      destroy_workqueue(drvdata->wq);
-+      power_supply_unregister(&drvdata->batt_cdev);
-+      adc_request_unregister(&drvdata->req);
-+      kfree(drvdata->batt_cdev.properties);
-+      return 0;
-+}
-+
-+static struct platform_driver adc_battery_driver = {
-+      .driver         = {
-+              .name   = "adc-battery",
-+      },
-+      .probe          = adc_battery_probe,
-+      .remove         = adc_battery_remove,
-+};
-+
-+static int __init adc_battery_init(void)
-+{
-+      return platform_driver_register(&adc_battery_driver);
-+}
-+
-+static void __exit adc_battery_exit(void)
-+{
-+      platform_driver_unregister(&adc_battery_driver);
-+}
-+
-+module_init(adc_battery_init)
-+module_exit(adc_battery_exit)
-+
-+MODULE_AUTHOR("Paul Sokolovsky");
-+MODULE_DESCRIPTION("Battery driver for ADC device");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/drivers/power/apm_power.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/apm_power.c     2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,247 @@
-+/*
-+ * Copyright (c) 2007 Anton Vorontsov <cbou@mail.ru>
-+ * Copyright (c) 2007 Eugeny Boger <eugenyboger@dgap.mipt.ru>
-+ *
-+ * Author: Eugeny Boger <eugenyboger@dgap.mipt.ru>
-+ *
-+ * 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/power_supply.h>
-+#include <linux/apm-emulation.h>
-+
-+#define PSY_PROP(psy, prop, val) psy->get_property(psy, \
-+                         POWER_SUPPLY_PROP_##prop, val)
-+
-+#define _MPSY_PROP(prop, val) main_battery->get_property(main_battery, \
-+                                                         prop, val)
-+
-+#define MPSY_PROP(prop, val) _MPSY_PROP(POWER_SUPPLY_PROP_##prop, val)
-+
-+static struct power_supply *main_battery;
-+
-+static void find_main_battery(void)
-+{
-+      struct device *dev;
-+      struct power_supply *bat, *batm;
-+      union power_supply_propval full;
-+      int max_charge = 0;
-+
-+      main_battery = NULL;
-+      batm = NULL;
-+      list_for_each_entry(dev, &power_supply_class->devices, node) {
-+              bat = dev_get_drvdata(dev);
-+              /* If none of battery devices cantains 'use_for_apm' flag,
-+                 choice one with maximum design charge */
-+              if (!PSY_PROP(bat, CHARGE_FULL_DESIGN, &full)) {
-+                      if (full.intval > max_charge) {
-+                              batm = bat;
-+                              max_charge = full.intval;
-+                      }
-+              }
-+
-+              if (bat->use_for_apm)
-+                      main_battery = bat;
-+      }
-+      if (!main_battery)
-+              main_battery = batm;
-+
-+      return;
-+}
-+
-+static int calculate_time(int status)
-+{
-+      union power_supply_propval charge_full, charge_empty;
-+      union power_supply_propval charge, I;
-+
-+      if (MPSY_PROP(CHARGE_FULL, &charge_full)) {
-+              /* if battery can't report this property, use design value */
-+              if (MPSY_PROP(CHARGE_FULL_DESIGN, &charge_full))
-+                      return -1;
-+      }
-+
-+      if (MPSY_PROP(CHARGE_EMPTY, &charge_empty)) {
-+              /* if battery can't report this property, use design value */
-+              if (MPSY_PROP(CHARGE_EMPTY_DESIGN, &charge_empty))
-+                      charge_empty.intval = 0;
-+      }
-+
-+      if (MPSY_PROP(CHARGE_AVG, &charge)) {
-+              /* if battery can't report average value, use momentary */
-+              if (MPSY_PROP(CHARGE_NOW, &charge))
-+                      return -1;
-+      }
-+
-+      if (MPSY_PROP(CURRENT_AVG, &I)) {
-+              /* if battery can't report average value, use momentary */
-+              if (MPSY_PROP(CURRENT_NOW, &I))
-+                      return -1;
-+      }
-+
-+      if (I.intval == 0)
-+              return 0;
-+      else if (status == POWER_SUPPLY_STATUS_CHARGING)
-+              return ((charge.intval - charge_full.intval) * 60L) /
-+                     I.intval;
-+      else
-+              return -((charge.intval - charge_empty.intval) * 60L) /
-+                      I.intval;
-+}
-+
-+static int calculate_capacity(int using_charge)
-+{
-+      enum power_supply_property full_prop, empty_prop;
-+      enum power_supply_property full_design_prop, empty_design_prop;
-+      enum power_supply_property now_prop, avg_prop;
-+      union power_supply_propval empty, full, cur;
-+      int ret;
-+
-+      if (using_charge) {
-+              full_prop = POWER_SUPPLY_PROP_CHARGE_FULL;
-+              empty_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY;
-+              full_design_prop = POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN;
-+              empty_design_prop = POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN;
-+              now_prop = POWER_SUPPLY_PROP_CHARGE_NOW;
-+              avg_prop = POWER_SUPPLY_PROP_CHARGE_AVG;
-+      }
-+      else {
-+              full_prop = POWER_SUPPLY_PROP_ENERGY_FULL;
-+              empty_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY;
-+              full_design_prop = POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN;
-+              empty_design_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN;
-+              now_prop = POWER_SUPPLY_PROP_ENERGY_NOW;
-+              avg_prop = POWER_SUPPLY_PROP_ENERGY_AVG;
-+      }
-+
-+      if (_MPSY_PROP(full_prop, &full)) {
-+              /* if battery can't report this property, use design value */
-+              if (_MPSY_PROP(full_design_prop, &full))
-+                      return -1;
-+      }
-+
-+      if (_MPSY_PROP(avg_prop, &cur)) {
-+              /* if battery can't report average value, use momentary */
-+              if (_MPSY_PROP(now_prop, &cur))
-+                      return -1;
-+      }
-+
-+      if (_MPSY_PROP(empty_prop, &empty)) {
-+              /* if battery can't report this property, use design value */
-+              if (_MPSY_PROP(empty_design_prop, &empty))
-+                      empty.intval = 0;
-+      }
-+
-+      if (full.intval - empty.intval)
-+              ret =  ((cur.intval - empty.intval) * 100L) /
-+                     (full.intval - empty.intval);
-+      else
-+              return -1;
-+
-+      if (ret > 100)
-+              return 100;
-+      else if (ret < 0)
-+              return 0;
-+
-+      return ret;
-+}
-+
-+static void apm_battery_apm_get_power_status(struct apm_power_info *info)
-+{
-+      union power_supply_propval status;
-+      union power_supply_propval capacity, time_to_full, time_to_empty;
-+
-+      down(&power_supply_class->sem);
-+      find_main_battery();
-+      if (!main_battery) {
-+              up(&power_supply_class->sem);
-+              return;
-+      }
-+
-+      /* status */
-+
-+      if (MPSY_PROP(STATUS, &status))
-+              status.intval = POWER_SUPPLY_STATUS_UNKNOWN;
-+
-+      /* ac line status */
-+
-+      if ((status.intval == POWER_SUPPLY_STATUS_CHARGING) ||
-+          (status.intval == POWER_SUPPLY_STATUS_NOT_CHARGING) ||
-+          (status.intval == POWER_SUPPLY_STATUS_FULL))
-+              info->ac_line_status = APM_AC_ONLINE;
-+      else
-+              info->ac_line_status = APM_AC_OFFLINE;
-+
-+      /* battery life (i.e. capacity, in percents) */
-+
-+      if (MPSY_PROP(CAPACITY, &capacity) == 0)
-+              info->battery_life = capacity.intval;
-+      else {
-+              /* try calculate using energy */
-+              info->battery_life = calculate_capacity(0);
-+              /* if failed try calculate using charge instead */
-+              if (info->battery_life == -1)
-+                      info->battery_life = calculate_capacity(1);
-+      }
-+
-+      /* charging status */
-+
-+      if (status.intval == POWER_SUPPLY_STATUS_CHARGING)
-+              info->battery_status = APM_BATTERY_STATUS_CHARGING;
-+      else {
-+              if (info->battery_life > 50)
-+                      info->battery_status = APM_BATTERY_STATUS_HIGH;
-+              else if (info->battery_life > 5)
-+                      info->battery_status = APM_BATTERY_STATUS_LOW;
-+              else
-+                      info->battery_status = APM_BATTERY_STATUS_CRITICAL;
-+      }
-+      info->battery_flag = info->battery_status;
-+
-+      /* time */
-+
-+      info->units = APM_UNITS_MINS;
-+
-+      if (status.intval == POWER_SUPPLY_STATUS_CHARGING) {
-+              if (MPSY_PROP(TIME_TO_FULL_AVG, &time_to_full)) {
-+                      if (MPSY_PROP(TIME_TO_FULL_NOW, &time_to_full))
-+                              info->time = calculate_time(status.intval);
-+                      else
-+                              info->time = time_to_full.intval / 60;
-+              }
-+      }
-+      else {
-+              if (MPSY_PROP(TIME_TO_EMPTY_AVG, &time_to_empty)) {
-+                      if (MPSY_PROP(TIME_TO_EMPTY_NOW, &time_to_empty))
-+                              info->time = calculate_time(status.intval);
-+                      else
-+                              info->time = time_to_empty.intval / 60;
-+              }
-+      }
-+
-+      up(&power_supply_class->sem);
-+      return;
-+}
-+
-+static int __init apm_battery_init(void)
-+{
-+      printk(KERN_INFO "APM Battery Driver\n");
-+
-+      apm_get_power_status = apm_battery_apm_get_power_status;
-+      return 0;
-+}
-+
-+static void __exit apm_battery_exit(void)
-+{
-+      apm_get_power_status = NULL;
-+      return;
-+}
-+
-+module_init(apm_battery_init);
-+module_exit(apm_battery_exit);
-+
-+MODULE_AUTHOR("Eugeny Boger <eugenyboger@dgap.mipt.ru>");
-+MODULE_DESCRIPTION("APM emulation driver for battery monitoring class");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/drivers/power/ds2760_battery.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/ds2760_battery.c        2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,475 @@
-+/*
-+ * Driver for batteries with DS2760 chips inside.
-+ *
-+ * Copyright (c) 2007 Anton Vorontsov
-+ *               2004-2007 Matt Reimer
-+ *               2004 Szabolcs Gyurko
-+ *
-+ * Use consistent with the GNU GPL is permitted,
-+ * provided that this copyright notice is
-+ * preserved in its entirety in all copies and derived works.
-+ *
-+ * Author:  Anton Vorontsov <cbou@mail.ru>
-+ *          February 2007
-+ *
-+ *          Matt Reimer <mreimer@vpop.net>
-+ *          April 2004, 2005, 2007
-+ *
-+ *          Szabolcs Gyurko <szabolcs.gyurko@tlt.hu>
-+ *          September 2004
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/param.h>
-+#include <linux/jiffies.h>
-+#include <linux/workqueue.h>
-+#include <linux/pm.h>
-+#include <linux/platform_device.h>
-+#include <linux/power_supply.h>
-+
-+#include "../w1/w1.h"
-+#include "../w1/slaves/w1_ds2760.h"
-+
-+struct ds2760_device_info {
-+      struct device *dev;
-+
-+      /* DS2760 data, valid after calling ds2760_battery_read_status() */
-+      unsigned long update_time;      /* jiffies when data read */
-+      char raw[DS2760_DATA_SIZE];     /* raw DS2760 data */
-+      int voltage_raw;                /* units of 4.88 mV */
-+      int voltage_uV;                 /* units of uV */
-+      int current_raw;                /* units of 0.625 mA */
-+      int current_uA;                 /* units of uA */
-+      int accum_current_raw;          /* units of 0.25 mAh */
-+      int accum_current_uAh;          /* units of uAh */
-+      int temp_raw;                   /* units of 0.125 C */
-+      int temp_C;                     /* units of 0.1 C */
-+      int rated_capacity;             /* units of uAh */
-+      int rem_capacity;               /* percentage */
-+      int full_active_uAh;            /* units of uAh */
-+      int empty_uAh;                  /* units of uAh */
-+      int life_sec;                   /* units of seconds */
-+      int charge_status;              /* POWER_SUPPLY_STATUS_* */
-+
-+      int full_counter;
-+      struct power_supply bat;
-+      struct device *w1_dev;
-+      struct workqueue_struct *monitor_wqueue;
-+      struct delayed_work monitor_work;
-+};
-+
-+static unsigned int cache_time = 1000;
-+module_param(cache_time, uint, 0644);
-+MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
-+
-+/* Some batteries have their rated capacity stored a N * 10 mAh, while
-+ * others use an index into this table. */
-+static int rated_capacities[] = {
-+      0,
-+      920,        /* Samsung */
-+      920,        /* BYD */
-+      920,        /* Lishen */
-+      920,        /* NEC */
-+      1440,       /* Samsung */
-+      1440,       /* BYD */
-+      1440,       /* Lishen */
-+      1440,       /* NEC */
-+      2880,       /* Samsung */
-+      2880,       /* BYD */
-+      2880,       /* Lishen */
-+      2880        /* NEC */
-+};
-+
-+/* array is level at temps 0C, 10C, 20C, 30C, 40C
-+ * temp is in Celsius */
-+static int battery_interpolate(int array[], int temp)
-+{
-+      int index, dt;
-+
-+      if (temp <= 0)
-+              return array[0];
-+      if (temp >= 40)
-+              return array[4];
-+
-+      index = temp / 10;
-+      dt    = temp % 10;
-+
-+      return array[index] + (((array[index + 1] - array[index]) * dt) / 10);
-+}
-+
-+static int ds2760_battery_read_status(struct ds2760_device_info *di)
-+{
-+      int ret, i, start, count, scale[5];
-+
-+      if (di->update_time && time_before(jiffies, di->update_time +
-+                                         msecs_to_jiffies(cache_time)))
-+              return 0;
-+
-+      /* The first time we read the entire contents of SRAM/EEPROM,
-+       * but after that we just read the interesting bits that change. */
-+      if (di->update_time == 0) {
-+              start = 0;
-+              count = DS2760_DATA_SIZE;
-+      }
-+      else {
-+              start = DS2760_VOLTAGE_MSB;
-+              count = DS2760_TEMP_LSB - start + 1;
-+      }
-+
-+      ret = w1_ds2760_read(di->w1_dev, di->raw + start, start, count);
-+      if (ret != count) {
-+              dev_warn(di->dev, "call to w1_ds2760_read failed (0x%p)\n",
-+                       di->w1_dev);
-+              return 1;
-+      }
-+
-+      di->update_time = jiffies;
-+
-+      /* DS2760 reports voltage in units of 4.88mV, but the battery class
-+       * reports in units of uV, so convert by multiplying by 4880. */
-+      di->voltage_raw = (di->raw[DS2760_VOLTAGE_MSB] << 3) |
-+                        (di->raw[DS2760_VOLTAGE_LSB] >> 5);
-+      di->voltage_uV = di->voltage_raw * 4880;
-+
-+      /* DS2760 reports current in signed units of 0.625mA, but the battery
-+       * class reports in units of uA, so convert by multiplying by 625. */
-+      di->current_raw =
-+          (((signed char)di->raw[DS2760_CURRENT_MSB]) << 5) |
-+                        (di->raw[DS2760_CURRENT_LSB] >> 3);
-+      di->current_uA = di->current_raw * 625;
-+
-+      /* DS2760 reports accumulated current in signed units of 0.25mAh. */
-+      di->accum_current_raw =
-+          (((signed char)di->raw[DS2760_CURRENT_ACCUM_MSB]) << 8) |
-+                         di->raw[DS2760_CURRENT_ACCUM_LSB];
-+      di->accum_current_uAh = di->accum_current_raw * 250;
-+
-+      /* DS2760 reports temperature in signed units of 0.125C, but the
-+       * battery class reports in units of 1/10 C, so we convert by
-+       * multiplying by .125 * 10 = 1.25. */
-+      di->temp_raw = (((signed char)di->raw[DS2760_TEMP_MSB]) << 3) |
-+                                   (di->raw[DS2760_TEMP_LSB] >> 5);
-+      di->temp_C = di->temp_raw + (di->temp_raw / 4);
-+
-+      /* At least some battery monitors (e.g. HP iPAQ) store the battery's
-+       * maximum rated capacity. */
-+      if (di->raw[DS2760_RATED_CAPACITY] < ARRAY_SIZE(rated_capacities))
-+              di->rated_capacity = rated_capacities[
-+                      (unsigned int)di->raw[DS2760_RATED_CAPACITY]];
-+      else
-+              di->rated_capacity = di->raw[DS2760_RATED_CAPACITY] * 10;
-+
-+      di->rated_capacity *= 1000; /* convert to uAh */
-+
-+      /* Calculate the full level at the present temperature. */
-+      di->full_active_uAh = di->raw[DS2760_ACTIVE_FULL] << 8 |
-+                            di->raw[DS2760_ACTIVE_FULL + 1];
-+
-+      scale[0] = di->raw[DS2760_ACTIVE_FULL] << 8 |
-+                 di->raw[DS2760_ACTIVE_FULL + 1];
-+      for (i = 1; i < 5; i++)
-+              scale[i] = scale[i - 1] + di->raw[DS2760_ACTIVE_FULL + 2 + i];
-+
-+      di->full_active_uAh = battery_interpolate(scale, di->temp_C / 10);
-+      di->full_active_uAh *= 1000; /* convert to uAh */
-+
-+      /* Calculate the empty level at the present temperature. */
-+      scale[4] = di->raw[DS2760_ACTIVE_EMPTY + 4];
-+      for (i = 3; i >= 0; i--)
-+              scale[i] = scale[i + 1] + di->raw[DS2760_ACTIVE_EMPTY + i];
-+
-+      di->empty_uAh = battery_interpolate(scale, di->temp_C / 10);
-+      di->empty_uAh *= 1000; /* convert to uAh */
-+
-+      /* From Maxim Application Note 131: remaining capacity =
-+       * ((ICA - Empty Value) / (Full Value - Empty Value)) x 100% */
-+      di->rem_capacity = ((di->accum_current_uAh - di->empty_uAh) * 100L) /
-+                          (di->full_active_uAh - di->empty_uAh);
-+
-+      if (di->rem_capacity < 0)
-+              di->rem_capacity = 0;
-+      if (di->rem_capacity > 100)
-+              di->rem_capacity = 100;
-+
-+      if (di->current_uA)
-+              di->life_sec = -((di->accum_current_uAh - di->empty_uAh) *
-+                               3600L) / di->current_uA;
-+      else
-+              di->life_sec = 0;
-+
-+      return 0;
-+}
-+
-+static void ds2760_battery_update_status(struct ds2760_device_info *di)
-+{
-+      int old_charge_status = di->charge_status;
-+
-+      ds2760_battery_read_status(di);
-+
-+      if (di->charge_status == POWER_SUPPLY_STATUS_UNKNOWN)
-+              di->full_counter = 0;
-+
-+      if (power_supply_am_i_supplied(&di->bat)) {
-+              if (di->current_uA > 10000) {
-+                      di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
-+                      di->full_counter = 0;
-+              }
-+              else if (di->current_uA < -5000) {
-+                      if (di->charge_status != POWER_SUPPLY_STATUS_NOT_CHARGING)
-+                              dev_notice(di->dev, "not enough power to "
-+                                         "charge\n");
-+                      di->charge_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
-+                      di->full_counter = 0;
-+              }
-+              else if (di->current_uA < 10000 &&
-+                          di->charge_status != POWER_SUPPLY_STATUS_FULL) {
-+
-+                      /* Don't consider the battery to be full unless
-+                       * we've seen the current < 10 mA at least two
-+                       * consecutive times. */
-+
-+                      di->full_counter++;
-+
-+                      if (di->full_counter < 2)
-+                              di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
-+                      else {
-+                              unsigned char acr[2];
-+                              int acr_val;
-+
-+                              /* acr is in units of 0.25 mAh */
-+                              acr_val = di->full_active_uAh * 4L / 1000;
-+
-+                              acr[0] = acr_val >> 8;
-+                              acr[1] = acr_val & 0xff;
-+
-+                              if (w1_ds2760_write(di->w1_dev, acr,
-+                                  DS2760_CURRENT_ACCUM_MSB, 2) < 2)
-+                                      dev_warn(di->dev,
-+                                               "ACR reset failed\n");
-+
-+                              di->charge_status = POWER_SUPPLY_STATUS_FULL;
-+                      }
-+              }
-+      }
-+      else {
-+              di->charge_status = POWER_SUPPLY_STATUS_DISCHARGING;
-+              di->full_counter = 0;
-+      }
-+
-+      if (di->charge_status != old_charge_status)
-+              power_supply_changed(&di->bat);
-+
-+      return;
-+}
-+
-+static void ds2760_battery_work(struct work_struct *work)
-+{
-+      struct ds2760_device_info *di = container_of(work,
-+              struct ds2760_device_info, monitor_work.work);
-+      const int interval = HZ * 60;
-+
-+      dev_dbg(di->dev, "%s\n", __FUNCTION__);
-+
-+      ds2760_battery_update_status(di);
-+      queue_delayed_work(di->monitor_wqueue, &di->monitor_work, interval);
-+
-+      return;
-+}
-+
-+#define to_ds2760_device_info(x) container_of((x), struct ds2760_device_info, \
-+                                              bat);
-+
-+static void ds2760_battery_external_power_changed(struct power_supply *psy)
-+{
-+      struct ds2760_device_info *di = to_ds2760_device_info(psy);
-+
-+      dev_dbg(di->dev, "%s\n", __FUNCTION__);
-+
-+      cancel_delayed_work(&di->monitor_work);
-+      queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ/10);
-+
-+      return;
-+}
-+
-+static int ds2760_battery_get_property(struct power_supply *psy,
-+                                       enum power_supply_property psp,
-+                                       union power_supply_propval *val)
-+{
-+      struct ds2760_device_info *di = to_ds2760_device_info(psy);
-+
-+      switch (psp) {
-+      case POWER_SUPPLY_PROP_STATUS:
-+              val->intval = di->charge_status;
-+              return 0;
-+      default:
-+              break;
-+      }
-+
-+      ds2760_battery_read_status(di);
-+
-+      switch (psp) {
-+      case POWER_SUPPLY_PROP_VOLTAGE_NOW:
-+              val->intval = di->voltage_uV;
-+              break;
-+      case POWER_SUPPLY_PROP_CURRENT_NOW:
-+              val->intval = di->current_uA;
-+              break;
-+      case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
-+              val->intval = di->rated_capacity;
-+              break;
-+      case POWER_SUPPLY_PROP_CHARGE_FULL:
-+              val->intval = di->full_active_uAh;
-+              break;
-+      case POWER_SUPPLY_PROP_CHARGE_EMPTY:
-+              val->intval = di->empty_uAh;
-+              break;
-+      case POWER_SUPPLY_PROP_CHARGE_NOW:
-+              val->intval = di->accum_current_uAh;
-+              break;
-+      case POWER_SUPPLY_PROP_TEMP:
-+              val->intval = di->temp_C;
-+              break;
-+      default:
-+              return -EINVAL;
-+      }
-+
-+      return 0;
-+}
-+
-+static enum power_supply_property ds2760_battery_props[] = {
-+      POWER_SUPPLY_PROP_STATUS,
-+      POWER_SUPPLY_PROP_VOLTAGE_NOW,
-+      POWER_SUPPLY_PROP_CURRENT_NOW,
-+      POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
-+      POWER_SUPPLY_PROP_CHARGE_FULL,
-+      POWER_SUPPLY_PROP_CHARGE_EMPTY,
-+      POWER_SUPPLY_PROP_CHARGE_NOW,
-+      POWER_SUPPLY_PROP_TEMP,
-+};
-+
-+static int ds2760_battery_probe(struct platform_device *pdev)
-+{
-+      int retval = 0;
-+      struct ds2760_device_info *di;
-+      struct ds2760_platform_data *pdata;
-+
-+      di = kzalloc(sizeof(*di), GFP_KERNEL);
-+      if (!di) {
-+              retval = -ENOMEM;
-+              goto di_alloc_failed;
-+      }
-+
-+      platform_set_drvdata(pdev, di);
-+
-+      pdata = pdev->dev.platform_data;
-+      di->dev                = &pdev->dev;
-+      di->w1_dev             = pdev->dev.parent;
-+      di->bat.name           = pdev->dev.bus_id;
-+      di->bat.type           = POWER_SUPPLY_TYPE_BATTERY;
-+      di->bat.properties     = ds2760_battery_props;
-+      di->bat.num_properties = ARRAY_SIZE(ds2760_battery_props);
-+      di->bat.get_property   = ds2760_battery_get_property;
-+      di->bat.external_power_changed =
-+                                ds2760_battery_external_power_changed;
-+      di->bat.use_for_apm = 1;
-+
-+      di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN;
-+
-+      retval = power_supply_register(&pdev->dev, &di->bat);
-+      if (retval) {
-+              dev_err(di->dev, "failed to register battery");
-+              goto batt_failed;
-+      }
-+
-+      INIT_DELAYED_WORK(&di->monitor_work, ds2760_battery_work);
-+      di->monitor_wqueue = create_singlethread_workqueue(pdev->dev.bus_id);
-+      if (!di->monitor_wqueue) {
-+              retval = -ESRCH;
-+              goto workqueue_failed;
-+      }
-+      queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ * 1);
-+
-+      goto success;
-+
-+workqueue_failed:
-+      power_supply_unregister(&di->bat);
-+batt_failed:
-+      kfree(di);
-+di_alloc_failed:
-+success:
-+      return retval;
-+}
-+
-+static int ds2760_battery_remove(struct platform_device *pdev)
-+{
-+      struct ds2760_device_info *di = platform_get_drvdata(pdev);
-+
-+      cancel_rearming_delayed_workqueue(di->monitor_wqueue,
-+                                        &di->monitor_work);
-+      destroy_workqueue(di->monitor_wqueue);
-+      power_supply_unregister(&di->bat);
-+
-+      return 0;
-+}
-+
-+#ifdef CONFIG_PM
-+
-+static int ds2760_battery_suspend(struct platform_device *pdev,
-+                                  pm_message_t state)
-+{
-+      struct ds2760_device_info *di = platform_get_drvdata(pdev);
-+
-+      di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN;
-+
-+      return 0;
-+}
-+
-+static int ds2760_battery_resume(struct platform_device *pdev)
-+{
-+      struct ds2760_device_info *di = platform_get_drvdata(pdev);
-+
-+      di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN;
-+      power_supply_changed(&di->bat);
-+
-+      cancel_delayed_work(&di->monitor_work);
-+      queue_delayed_work(di->monitor_wqueue, &di->monitor_work, HZ);
-+
-+      return 0;
-+}
-+
-+#else
-+
-+#define ds2760_battery_suspend NULL
-+#define ds2760_battery_resume NULL
-+
-+#endif /* CONFIG_PM */
-+
-+static struct platform_driver ds2760_battery_driver = {
-+      .driver = {
-+              .name = "ds2760-battery",
-+      },
-+      .probe    = ds2760_battery_probe,
-+      .remove   = ds2760_battery_remove,
-+      .suspend  = ds2760_battery_suspend,
-+      .resume   = ds2760_battery_resume,
-+};
-+
-+static int __init ds2760_battery_init(void)
-+{
-+      return platform_driver_register(&ds2760_battery_driver);
-+}
-+
-+static void __exit ds2760_battery_exit(void)
-+{
-+      platform_driver_unregister(&ds2760_battery_driver);
-+      return;
-+}
-+
-+module_init(ds2760_battery_init);
-+module_exit(ds2760_battery_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Szabolcs Gyurko <szabolcs.gyurko@tlt.hu>, "
-+              "Matt Reimer <mreimer@vpop.net>, "
-+              "Anton Vorontsov <cbou@mail.ru>");
-+MODULE_DESCRIPTION("ds2760 battery driver");
-Index: linux-2.6.22/drivers/power/Kconfig
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/Kconfig 2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,70 @@
-+menuconfig POWER_SUPPLY
-+      tristate "Power supply class support"
-+      help
-+        Say Y here to enable power supply class support. This allows
-+        power supply (batteries, AC, USB) monitoring by userspace
-+        via sysfs and uevent (if available) and/or APM kernel interface
-+        (if selected below).
-+
-+if POWER_SUPPLY
-+
-+config POWER_SUPPLY_DEBUG
-+      bool "Power supply debug"
-+      help
-+        Say Y here to enable debugging messages for power supply class
-+        and drivers.
-+
-+config PDA_POWER
-+      tristate "Generic PDA/phone power driver"
-+      help
-+        Say Y here to enable generic power driver for PDAs and phones with
-+        one or two external power supplies (AC/USB) connected to main and
-+        backup batteries, and optional builtin charger.
-+
-+config APM_POWER
-+      tristate "APM emulation for class batteries"
-+      depends on APM_EMULATION
-+      help
-+        Say Y here to enable support APM status emulation using
-+        battery class devices.
-+
-+config BATTERY_DS2760
-+      tristate "DS2760 battery driver (HP iPAQ & others)"
-+      select W1
-+      select W1_SLAVE_DS2760
-+      help
-+        Say Y here to enable support for batteries with ds2760 chip.
-+
-+config BATTERY_PMU
-+      tristate "Apple PMU battery"
-+      depends on ADB_PMU
-+      help
-+        Say Y here to expose battery information on Apple machines
-+        through the generic battery class.
-+
-+config BATTERY_OLPC
-+      tristate "One Laptop Per Child battery"
-+      depends on X86_32
-+      help
-+        Say Y to enable support for the battery on the OLPC laptop.
-+
-+# drivers below are not in battery2-2.6 tree
-+
-+config ADC_BATTERY
-+      tristate "Generic ADC battery driver"
-+      depends on ADC && POWER_SUPPLY
-+      help
-+        Say Y here to enable support for battery monitoring using generic ADC device.
-+
-+config IPAQ_MICRO_BATTERY
-+      tristate "HP iPAQ Micro ASIC battery driver"
-+      depends on IPAQ_MICRO && POWER_SUPPLY
-+      help
-+        Choose this option if you want to monitor battery status on
-+        Compaq/HP iPAQ h3100 h3600
-+
-+config MCP_UCB1x00_SIMPAD_BATTERY
-+      tristate "SIMpad Battery Reading Support"
-+      depends on MCP_UCB1x00 && POWER_SUPPLY
-+
-+endif # POWER_SUPPLY
-Index: linux-2.6.22/drivers/power/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/Makefile        2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,28 @@
-+power_supply-objs := power_supply_core.o
-+
-+ifeq ($(CONFIG_SYSFS),y)
-+power_supply-objs += power_supply_sysfs.o
-+endif
-+
-+ifeq ($(CONFIG_LEDS_TRIGGERS),y)
-+power_supply-objs += power_supply_leds.o
-+endif
-+
-+ifeq ($(CONFIG_POWER_SUPPLY_DEBUG),y)
-+EXTRA_CFLAGS += -DDEBUG
-+endif
-+
-+obj-$(CONFIG_POWER_SUPPLY)         += power_supply.o
-+
-+obj-$(CONFIG_PDA_POWER)            += pda_power.o
-+obj-$(CONFIG_APM_POWER)            += apm_power.o
-+
-+obj-$(CONFIG_BATTERY_DS2760)       += ds2760_battery.o
-+obj-$(CONFIG_BATTERY_PMU)          += pmu_battery.o
-+obj-$(CONFIG_BATTERY_OLPC)         += olpc_battery.o
-+
-+# drivers below are not in battery2-2.6 tree
-+
-+obj-$(CONFIG_ADC_BATTERY)          += adc_battery.o
-+obj-$(CONFIG_IPAQ_MICRO_BATTERY)   += micro_battery.o
-+obj-$(CONFIG_MCP_UCB1x00_SIMPAD_BATTERY) += simpad-battery.o
-Index: linux-2.6.22/drivers/power/micro_battery.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/micro_battery.c 2007-08-23 12:25:20.000000000 +0200
-@@ -0,0 +1,257 @@
-+/*
-+ * 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.
-+ *
-+ * h3600 atmel micro companion support, battery subdevice
-+ * based on previous kernel 2.4 version
-+ * Author : Alessandro Gardich <gremlin@gremlin.it>
-+ *
-+ */
-+
-+
-+#include <linux/module.h>
-+#include <linux/version.h>
-+
-+#include <linux/init.h>
-+#include <linux/fs.h>
-+#include <linux/interrupt.h>
-+#include <linux/sched.h>
-+#include <linux/pm.h>
-+#include <linux/sysctl.h>
-+#include <linux/proc_fs.h>
-+#include <linux/delay.h>
-+#include <linux/device.h>
-+#include <linux/power_supply.h>
-+#include <linux/platform_device.h>
-+#include <linux/timer.h>
-+
-+#include <asm/arch/hardware.h>
-+
-+#include <asm/arch/h3600.h>
-+#include <asm/arch/SA-1100.h>
-+
-+#include <asm/hardware/micro.h>
-+
-+#define BATT_PERIOD 10*HZ
-+
-+#define H3600_BATT_STATUS_HIGH         0x01
-+#define H3600_BATT_STATUS_LOW          0x02
-+#define H3600_BATT_STATUS_CRITICAL     0x04
-+#define H3600_BATT_STATUS_CHARGING     0x08
-+#define H3600_BATT_STATUS_CHARGEMAIN   0x10
-+#define H3600_BATT_STATUS_DEAD         0x20 /* Battery will not charge */
-+#define H3600_BATT_STATUS_NOTINSTALLED 0x20 /* For expansion pack batteries */
-+#define H3600_BATT_STATUS_FULL         0x40 /* Battery fully charged (and connected to AC) */
-+#define H3600_BATT_STATUS_NOBATTERY    0x80
-+#define H3600_BATT_STATUS_UNKNOWN      0xff
-+
-+
-+//static struct power_supply_dev *micro_battery;
-+
-+static micro_private_t *p_micro;
-+
-+struct timer_list batt_timer;
-+
-+struct {
-+      int ac;
-+      int update_time;
-+      int chemistry;
-+      int voltage;
-+      int temperature;
-+      int flag;
-+} micro_battery;
-+
-+static void micro_battery_receive (int len, unsigned char *data) {
-+      if (0) {
-+              printk(KERN_ERR "h3600_battery - AC = %02x\n", data[0]);
-+              printk(KERN_ERR "h3600_battery - BAT1 chemistry = %02x\n", data[1]);
-+              printk(KERN_ERR "h3600_battery - BAT1 voltage = %d %02x%02x\n", (data[3]<<8)+data[2], data[2], data[3]);
-+              printk(KERN_ERR "h3600_battery - BAT1 status = %02x\n", data[4]);
-+      }
-+
-+      micro_battery.ac = data[0];
-+      micro_battery.chemistry = data[1];
-+      micro_battery.voltage = ((((unsigned short)data[3]<<8)+data[2]) * 5000L ) * 1000 / 1024;
-+      micro_battery.flag = data[4];
-+
-+      if (len == 9) {
-+              if (0) {
-+                      printk(KERN_ERR "h3600_battery - BAT2 chemistry = %02x\n", data[5]);
-+                      printk(KERN_ERR "h3600_battery - BAT2 voltage = %d %02x%02x\n", (data[7]<<8)+data[6], data[6], data[7]);
-+                      printk(KERN_ERR "h3600_battery - BAT2 status = %02x\n", data[8]);
-+              }
-+      }
-+}
-+
-+static void micro_temperature_receive (int len, unsigned char *data) {
-+      micro_battery.temperature = ((unsigned short)data[1]<<8)+data[0];
-+}
-+
-+void h3600_battery_read_status(unsigned long data) {
-+
-+      if (++data % 2)
-+              h3600_micro_tx_msg(0x09,0,NULL);
-+      else
-+              h3600_micro_tx_msg(0x06,0,NULL);
-+
-+      batt_timer.expires += BATT_PERIOD;
-+      batt_timer.data = data;
-+
-+      add_timer(&batt_timer);
-+}
-+
-+int get_capacity(struct power_supply *b) {
-+    switch (micro_battery.flag) {
-+    case H3600_BATT_STATUS_HIGH :     return 100; break;
-+    case H3600_BATT_STATUS_LOW :      return 50; break;
-+    case H3600_BATT_STATUS_CRITICAL : return 5; break;
-+    default: break;
-+    }
-+    return 0;
-+}
-+
-+int get_status(struct power_supply *b) {
-+
-+   if (micro_battery.flag == H3600_BATT_STATUS_UNKNOWN)
-+      return POWER_SUPPLY_STATUS_UNKNOWN;
-+
-+   if (micro_battery.flag & H3600_BATT_STATUS_FULL)
-+      return POWER_SUPPLY_STATUS_FULL;
-+
-+   if ((micro_battery.flag & H3600_BATT_STATUS_CHARGING) ||
-+       (micro_battery.flag & H3600_BATT_STATUS_CHARGEMAIN))
-+      return POWER_SUPPLY_STATUS_CHARGING;
-+
-+   return POWER_SUPPLY_STATUS_DISCHARGING;
-+}
-+
-+static int micro_batt_get_property(struct power_supply *b,
-+                                   enum power_supply_property psp,
-+                                   union power_supply_propval *val)
-+{
-+      switch (psp) {
-+      case POWER_SUPPLY_PROP_STATUS:
-+              val->intval = get_status(b);
-+              break;
-+      case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
-+              val->intval = 4700000;
-+              break;
-+      case POWER_SUPPLY_PROP_CAPACITY:
-+              val->intval = get_capacity(b);
-+              break;
-+      case POWER_SUPPLY_PROP_TEMP:
-+              val->intval = micro_battery.temperature;
-+              break;
-+      case POWER_SUPPLY_PROP_VOLTAGE_NOW:
-+              val->intval = micro_battery.voltage;
-+              break;
-+      default:
-+              return -EINVAL;
-+      };
-+
-+      return 0;
-+}
-+
-+static enum power_supply_property micro_batt_props[] = {
-+      POWER_SUPPLY_PROP_STATUS,
-+      POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
-+      POWER_SUPPLY_PROP_CAPACITY,
-+      POWER_SUPPLY_PROP_TEMP,
-+      POWER_SUPPLY_PROP_VOLTAGE_NOW,
-+};
-+
-+static struct power_supply h3600_battery = {
-+      .name               = "main-battery",
-+      .properties         = micro_batt_props,
-+      .num_properties     = ARRAY_SIZE(micro_batt_props),
-+      .get_property       = micro_batt_get_property,
-+      .use_for_apm        = 1,
-+};
-+
-+static int micro_batt_probe (struct platform_device *pdev)
-+{
-+      if (1) printk(KERN_ERR "micro battery probe : begin\n");
-+
-+      power_supply_register(&pdev->dev, &h3600_battery);
-+
-+      { /*--- callback ---*/
-+              p_micro = platform_get_drvdata(pdev);
-+              spin_lock(p_micro->lock);
-+              p_micro->h_batt = micro_battery_receive;
-+              p_micro->h_temp = micro_temperature_receive;
-+              spin_unlock(p_micro->lock);
-+      }
-+
-+      { /*--- timer ---*/
-+              init_timer(&batt_timer);
-+              batt_timer.expires = jiffies + BATT_PERIOD;
-+              batt_timer.data = 0;
-+              batt_timer.function = h3600_battery_read_status;
-+
-+              add_timer(&batt_timer);
-+      }
-+
-+      if (1) printk(KERN_ERR "micro battery probe : end\n");
-+      return 0;
-+}
-+
-+static int micro_batt_remove (struct platform_device *pdev)
-+{
-+      power_supply_unregister(&h3600_battery);
-+      { /*--- callback ---*/
-+              init_timer(&batt_timer);
-+              p_micro->h_batt = NULL;
-+              p_micro->h_temp = NULL;
-+              spin_unlock(p_micro->lock);
-+      }
-+      { /*--- timer ---*/
-+              del_timer_sync(&batt_timer);
-+      }
-+        return 0;
-+}
-+
-+static int micro_batt_suspend ( struct platform_device *pdev, pm_message_t state)
-+{
-+      { /*--- timer ---*/
-+              del_timer(&batt_timer);
-+      }
-+      return 0;
-+}
-+
-+static int micro_batt_resume ( struct platform_device *pdev)
-+{
-+      { /*--- timer ---*/
-+              add_timer(&batt_timer);
-+      }
-+      return 0;
-+}
-+
-+struct platform_driver micro_batt_device_driver = {
-+      .driver  = {
-+              .name    = "h3600-micro-battery",
-+      },
-+      .probe   = micro_batt_probe,
-+      .remove  = micro_batt_remove,
-+      .suspend = micro_batt_suspend,
-+      .resume  = micro_batt_resume,
-+};
-+
-+static int micro_batt_init (void)
-+{
-+      return platform_driver_register(&micro_batt_device_driver);
-+}
-+
-+static void micro_batt_cleanup (void)
-+{
-+      platform_driver_unregister (&micro_batt_device_driver);
-+}
-+
-+module_init (micro_batt_init);
-+module_exit (micro_batt_cleanup);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("gremlin.it");
-+MODULE_DESCRIPTION("driver for iPAQ Atmel micro battery");
-+
-+
-Index: linux-2.6.22/drivers/power/olpc_battery.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/olpc_battery.c  2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,302 @@
-+/*
-+ * Battery driver for One Laptop Per Child board.
-+ *
-+ *    Copyright Â© 2006  David Woodhouse <dwmw2@infradead.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/err.h>
-+#include <linux/platform_device.h>
-+#include <linux/power_supply.h>
-+#include <linux/jiffies.h>
-+#include <linux/sched.h>
-+#include <asm/io.h>
-+
-+#define wBAT_VOLTAGE     0xf900  /* *9.76/32,    mV   */
-+#define wBAT_CURRENT     0xf902  /* *15.625/120, mA   */
-+#define wBAT_TEMP        0xf906  /* *256/1000,   Â°C  */
-+#define wAMB_TEMP        0xf908  /* *256/1000,   Â°C  */
-+#define SOC              0xf910  /* percentage        */
-+#define sMBAT_STATUS     0xfaa4
-+#define sBAT_PRESENT          1
-+#define sBAT_FULL             2
-+#define sBAT_DESTROY          4  /* what is this exactly? */
-+#define sBAT_LOW             32
-+#define sBAT_DISCHG          64
-+#define sMCHARGE_STATUS  0xfaa5
-+#define sBAT_CHARGE           1
-+#define sBAT_OVERTEMP         4
-+#define sBAT_NiMH             8
-+#define sPOWER_FLAG      0xfa40
-+#define ADAPTER_IN            1
-+
-+/*********************************************************************
-+ *            EC locking and access
-+ *********************************************************************/
-+
-+static int lock_ec(void)
-+{
-+      unsigned long timeo = jiffies + HZ / 20;
-+
-+      while (1) {
-+              unsigned char lock = inb(0x6c) & 0x80;
-+              if (!lock)
-+                      return 0;
-+              if (time_after(jiffies, timeo)) {
-+                      printk(KERN_ERR "olpc_battery: failed to lock EC for "
-+                             "battery access\n");
-+                      return 1;
-+              }
-+              yield();
-+      }
-+}
-+
-+static void unlock_ec(void)
-+{
-+      outb(0xff, 0x6c);
-+      return;
-+}
-+
-+static unsigned char read_ec_byte(unsigned short adr)
-+{
-+      outb(adr >> 8, 0x381);
-+      outb(adr, 0x382);
-+      return inb(0x383);
-+}
-+
-+static unsigned short read_ec_word(unsigned short adr)
-+{
-+      return (read_ec_byte(adr) << 8) | read_ec_byte(adr + 1);
-+}
-+
-+/*********************************************************************
-+ *            Power
-+ *********************************************************************/
-+
-+static int olpc_ac_get_prop(struct power_supply *psy,
-+                            enum power_supply_property psp,
-+                            union power_supply_propval *val)
-+{
-+      int ret = 0;
-+
-+      if (lock_ec())
-+              return -EIO;
-+
-+      switch (psp) {
-+      case POWER_SUPPLY_PROP_ONLINE:
-+              if (!(read_ec_byte(sMBAT_STATUS) & sBAT_PRESENT)) {
-+                      ret = -ENODEV;
-+                      goto out;
-+              }
-+              val->intval = !!(read_ec_byte(sPOWER_FLAG) & ADAPTER_IN);
-+              break;
-+      default:
-+              ret = -EINVAL;
-+              break;
-+      }
-+out:
-+      unlock_ec();
-+      return ret;
-+}
-+
-+static enum power_supply_property olpc_ac_props[] = {
-+      POWER_SUPPLY_PROP_ONLINE,
-+};
-+
-+static struct power_supply olpc_ac = {
-+      .name = "olpc-ac",
-+      .type = POWER_SUPPLY_TYPE_MAINS,
-+      .properties = olpc_ac_props,
-+      .num_properties = ARRAY_SIZE(olpc_ac_props),
-+      .get_property = olpc_ac_get_prop,
-+};
-+
-+/*********************************************************************
-+ *            Battery properties
-+ *********************************************************************/
-+
-+static int olpc_bat_get_property(struct power_supply *psy,
-+                                 enum power_supply_property psp,
-+                                 union power_supply_propval *val)
-+{
-+      int ret = 0;
-+
-+      if (lock_ec())
-+              return -EIO;
-+
-+      switch (psp) {
-+      case POWER_SUPPLY_PROP_STATUS:
-+              {
-+                      int status = POWER_SUPPLY_STATUS_UNKNOWN;
-+
-+                      val->intval = read_ec_byte(sMBAT_STATUS);
-+
-+                      if (!(val->intval & sBAT_PRESENT)) {
-+                              ret = -ENODEV;
-+                              goto out;
-+                      }
-+
-+                      if (val->intval & sBAT_DISCHG)
-+                              status = POWER_SUPPLY_STATUS_DISCHARGING;
-+                      else if (val->intval & sBAT_FULL)
-+                              status = POWER_SUPPLY_STATUS_FULL;
-+
-+                      val->intval = read_ec_byte(sMCHARGE_STATUS);
-+                      if (val->intval & sBAT_CHARGE)
-+                              status = POWER_SUPPLY_STATUS_CHARGING;
-+
-+                      val->intval = status;
-+                      break;
-+              }
-+      case POWER_SUPPLY_PROP_PRESENT:
-+              val->intval = !!(read_ec_byte(sMBAT_STATUS) & sBAT_PRESENT);
-+              break;
-+      case POWER_SUPPLY_PROP_HEALTH:
-+              val->intval = read_ec_byte(sMCHARGE_STATUS);
-+              if (val->intval & sBAT_OVERTEMP)
-+                      val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
-+              else
-+                      val->intval = POWER_SUPPLY_HEALTH_GOOD;
-+              break;
-+      case POWER_SUPPLY_PROP_TECHNOLOGY:
-+              val->intval = read_ec_byte(sMCHARGE_STATUS);
-+              if (val->intval & sBAT_NiMH)
-+                      val->intval = POWER_SUPPLY_TECHNOLOGY_NIMH;
-+              else
-+                      val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
-+              break;
-+      case POWER_SUPPLY_PROP_VOLTAGE_AVG:
-+              val->intval = read_ec_byte(wBAT_VOLTAGE) * 9760L / 32;
-+              break;
-+      case POWER_SUPPLY_PROP_CURRENT_AVG:
-+              val->intval = read_ec_byte(wBAT_CURRENT) * 15625L / 120;
-+              break;
-+      case POWER_SUPPLY_PROP_CAPACITY:
-+              val->intval = read_ec_byte(SOC);
-+              break;
-+      case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
-+              val->intval = read_ec_byte(sMBAT_STATUS);
-+              if (val->intval & sBAT_FULL)
-+                      val->intval = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
-+              else if (val->intval & sBAT_LOW)
-+                      val->intval = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
-+              else
-+                      val->intval = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
-+              break;
-+      case POWER_SUPPLY_PROP_TEMP:
-+              val->intval = read_ec_byte(wBAT_TEMP) * 256 / 100;
-+              break;
-+      case POWER_SUPPLY_PROP_TEMP_AMBIENT:
-+              val->intval = read_ec_byte(wAMB_TEMP) * 256 / 100;
-+              break;
-+      default:
-+              ret = -EINVAL;
-+              break;
-+      }
-+
-+out:
-+      unlock_ec();
-+      return ret;
-+}
-+
-+static enum power_supply_property olpc_bat_props[] = {
-+      POWER_SUPPLY_PROP_STATUS,
-+      POWER_SUPPLY_PROP_PRESENT,
-+      POWER_SUPPLY_PROP_HEALTH,
-+      POWER_SUPPLY_PROP_TECHNOLOGY,
-+      POWER_SUPPLY_PROP_VOLTAGE_AVG,
-+      POWER_SUPPLY_PROP_CURRENT_AVG,
-+      POWER_SUPPLY_PROP_CAPACITY,
-+      POWER_SUPPLY_PROP_CAPACITY_LEVEL,
-+      POWER_SUPPLY_PROP_TEMP,
-+      POWER_SUPPLY_PROP_TEMP_AMBIENT,
-+};
-+
-+/*********************************************************************
-+ *            Initialisation
-+ *********************************************************************/
-+
-+static struct platform_device *bat_pdev;
-+
-+static struct power_supply olpc_bat = {
-+      .properties = olpc_bat_props,
-+      .num_properties = ARRAY_SIZE(olpc_bat_props),
-+      .get_property = olpc_bat_get_property,
-+      .use_for_apm = 1,
-+};
-+
-+static int __init olpc_bat_init(void)
-+{
-+      int ret = 0;
-+      unsigned short tmp;
-+
-+      if (!request_region(0x380, 4, "olpc-battery")) {
-+              ret = -EIO;
-+              goto region_failed;
-+      }
-+
-+      if (lock_ec()) {
-+              ret = -EIO;
-+              goto lock_failed;
-+      }
-+
-+      tmp = read_ec_word(0xfe92);
-+      unlock_ec();
-+
-+      if (tmp != 0x380) {
-+              /* Doesn't look like OLPC EC */
-+              ret = -ENODEV;
-+              goto not_olpc_ec;
-+      }
-+
-+      bat_pdev = platform_device_register_simple("olpc-battery", 0, NULL, 0);
-+      if (IS_ERR(bat_pdev)) {
-+              ret = PTR_ERR(bat_pdev);
-+              goto pdev_failed;
-+      }
-+
-+      ret = power_supply_register(&bat_pdev->dev, &olpc_ac);
-+      if (ret)
-+              goto ac_failed;
-+
-+      olpc_bat.name = bat_pdev->name;
-+
-+      ret = power_supply_register(&bat_pdev->dev, &olpc_bat);
-+      if (ret)
-+              goto battery_failed;
-+
-+      goto success;
-+
-+battery_failed:
-+      power_supply_unregister(&olpc_ac);
-+ac_failed:
-+      platform_device_unregister(bat_pdev);
-+pdev_failed:
-+not_olpc_ec:
-+lock_failed:
-+      release_region(0x380, 4);
-+region_failed:
-+success:
-+      return ret;
-+}
-+
-+static void __exit olpc_bat_exit(void)
-+{
-+      power_supply_unregister(&olpc_bat);
-+      power_supply_unregister(&olpc_ac);
-+      platform_device_unregister(bat_pdev);
-+      release_region(0x380, 4);
-+      return;
-+}
-+
-+module_init(olpc_bat_init);
-+module_exit(olpc_bat_exit);
-+
-+MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION("Battery driver for One Laptop Per Child "
-+                   "($100 laptop) board.");
-Index: linux-2.6.22/drivers/power/pda_power.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/pda_power.c     2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,263 @@
-+/*
-+ * Common power driver for PDAs and phones with one or two external
-+ * power supplies (AC/USB) connected to main and backup batteries,
-+ * and optional builtin charger.
-+ *
-+ * Copyright 2007 Anton Vorontsov <cbou@mail.ru>
-+ *
-+ * 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/platform_device.h>
-+#include <linux/interrupt.h>
-+#include <linux/power_supply.h>
-+#include <linux/pda_power.h>
-+#include <linux/timer.h>
-+#include <linux/jiffies.h>
-+
-+static inline unsigned int get_irq_flags(struct resource *res)
-+{
-+      unsigned int flags = IRQF_DISABLED | IRQF_SHARED;
-+
-+      flags |= res->flags & IRQF_TRIGGER_MASK;
-+
-+      return flags;
-+}
-+
-+static struct device *dev;
-+static struct pda_power_pdata *pdata;
-+static struct resource *ac_irq, *usb_irq;
-+static struct timer_list charger_timer;
-+static struct timer_list supply_timer;
-+
-+static int pda_power_get_property(struct power_supply *psy,
-+                                  enum power_supply_property psp,
-+                                  union power_supply_propval *val)
-+{
-+      switch (psp) {
-+      case POWER_SUPPLY_PROP_ONLINE:
-+              if (psy->type == POWER_SUPPLY_TYPE_MAINS)
-+                      val->intval = pdata->is_ac_online ?
-+                                    pdata->is_ac_online() : 0;
-+              else
-+                      val->intval = pdata->is_usb_online ?
-+                                    pdata->is_usb_online() : 0;
-+              break;
-+      default:
-+              return -EINVAL;
-+      }
-+      return 0;
-+}
-+
-+static enum power_supply_property pda_power_props[] = {
-+      POWER_SUPPLY_PROP_ONLINE,
-+};
-+
-+static char *pda_power_supplied_to[] = {
-+      "main-battery",
-+      "backup-battery",
-+};
-+
-+static struct power_supply pda_power_supplies[] = {
-+      {
-+              .name = "ac",
-+              .type = POWER_SUPPLY_TYPE_MAINS,
-+              .supplied_to = pda_power_supplied_to,
-+              .num_supplicants = ARRAY_SIZE(pda_power_supplied_to),
-+              .properties = pda_power_props,
-+              .num_properties = ARRAY_SIZE(pda_power_props),
-+              .get_property = pda_power_get_property,
-+      },
-+      {
-+              .name = "usb",
-+              .type = POWER_SUPPLY_TYPE_USB,
-+              .supplied_to = pda_power_supplied_to,
-+              .num_supplicants = ARRAY_SIZE(pda_power_supplied_to),
-+              .properties = pda_power_props,
-+              .num_properties = ARRAY_SIZE(pda_power_props),
-+              .get_property = pda_power_get_property,
-+      },
-+};
-+
-+static void update_charger(void)
-+{
-+      if (!pdata->set_charge)
-+              return;
-+
-+      if (pdata->is_ac_online && pdata->is_ac_online()) {
-+              dev_dbg(dev, "charger on (AC)\n");
-+              pdata->set_charge(PDA_POWER_CHARGE_AC);
-+      }
-+      else if (pdata->is_usb_online && pdata->is_usb_online()) {
-+              dev_dbg(dev, "charger on (USB)\n");
-+              pdata->set_charge(PDA_POWER_CHARGE_USB);
-+      }
-+      else {
-+              dev_dbg(dev, "charger off\n");
-+              pdata->set_charge(0);
-+      }
-+
-+      return;
-+}
-+
-+static void supply_timer_func(unsigned long irq)
-+{
-+      if (ac_irq && irq == ac_irq->start)
-+              power_supply_changed(&pda_power_supplies[0]);
-+      else if (usb_irq && irq == usb_irq->start)
-+              power_supply_changed(&pda_power_supplies[1]);
-+      return;
-+}
-+
-+static void charger_timer_func(unsigned long irq)
-+{
-+      update_charger();
-+
-+      /* Okay, charger set. Now wait a bit before notifying supplicants,
-+       * charge power should stabilize. */
-+      supply_timer.data = irq;
-+      mod_timer(&supply_timer,
-+                jiffies + msecs_to_jiffies(pdata->wait_for_charger));
-+      return;
-+}
-+
-+static irqreturn_t power_changed_isr(int irq, void *unused)
-+{
-+      /* Wait a bit before reading ac/usb line status and setting charger,
-+       * because ac/usb status readings may lag from irq. */
-+      charger_timer.data = irq;
-+      mod_timer(&charger_timer,
-+                jiffies + msecs_to_jiffies(pdata->wait_for_status));
-+      return IRQ_HANDLED;
-+}
-+
-+static int pda_power_probe(struct platform_device *pdev)
-+{
-+      int ret = 0;
-+
-+      dev = &pdev->dev;
-+
-+      if (pdev->id != -1) {
-+              dev_err(dev, "it's meaningless to register several "
-+                      "pda_powers, use id = -1\n");
-+              ret = -EINVAL;
-+              goto wrongid;
-+      }
-+
-+      pdata = pdev->dev.platform_data;
-+
-+      update_charger();
-+
-+      if (!pdata->wait_for_status)
-+              pdata->wait_for_status = 500;
-+
-+      if (!pdata->wait_for_charger)
-+              pdata->wait_for_charger = 500;
-+
-+      setup_timer(&charger_timer, charger_timer_func, 0);
-+      setup_timer(&supply_timer, supply_timer_func, 0);
-+
-+      ac_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "ac");
-+      usb_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "usb");
-+      if (!ac_irq && !usb_irq) {
-+              dev_err(dev, "no ac/usb irq specified\n");
-+              ret = -ENODEV;
-+              goto noirqs;
-+      }
-+
-+      if (pdata->supplied_to) {
-+              pda_power_supplies[0].supplied_to = pdata->supplied_to;
-+              pda_power_supplies[1].supplied_to = pdata->supplied_to;
-+              pda_power_supplies[0].num_supplicants = pdata->num_supplicants;
-+              pda_power_supplies[1].num_supplicants = pdata->num_supplicants;
-+      }
-+
-+      ret = power_supply_register(&pdev->dev, &pda_power_supplies[0]);
-+      if (ret) {
-+              dev_err(dev, "failed to register %s power supply\n",
-+                      pda_power_supplies[0].name);
-+              goto supply0_failed;
-+      }
-+
-+      ret = power_supply_register(&pdev->dev, &pda_power_supplies[1]);
-+      if (ret) {
-+              dev_err(dev, "failed to register %s power supply\n",
-+                      pda_power_supplies[1].name);
-+              goto supply1_failed;
-+      }
-+
-+      if (ac_irq) {
-+              ret = request_irq(ac_irq->start, power_changed_isr,
-+                                get_irq_flags(ac_irq), ac_irq->name,
-+                                &pda_power_supplies[0]);
-+              if (ret) {
-+                      dev_err(dev, "request ac irq failed\n");
-+                      goto ac_irq_failed;
-+              }
-+      }
-+
-+      if (usb_irq) {
-+              ret = request_irq(usb_irq->start, power_changed_isr,
-+                                get_irq_flags(usb_irq), usb_irq->name,
-+                                &pda_power_supplies[1]);
-+              if (ret) {
-+                      dev_err(dev, "request usb irq failed\n");
-+                      goto usb_irq_failed;
-+              }
-+      }
-+
-+      goto success;
-+
-+usb_irq_failed:
-+      if (ac_irq)
-+              free_irq(ac_irq->start, &pda_power_supplies[0]);
-+ac_irq_failed:
-+      power_supply_unregister(&pda_power_supplies[1]);
-+supply1_failed:
-+      power_supply_unregister(&pda_power_supplies[0]);
-+supply0_failed:
-+noirqs:
-+wrongid:
-+success:
-+      return ret;
-+}
-+
-+static int pda_power_remove(struct platform_device *pdev)
-+{
-+      if (usb_irq)
-+              free_irq(usb_irq->start, &pda_power_supplies[1]);
-+      if (ac_irq)
-+              free_irq(ac_irq->start, &pda_power_supplies[0]);
-+      del_timer_sync(&charger_timer);
-+      del_timer_sync(&supply_timer);
-+      power_supply_unregister(&pda_power_supplies[1]);
-+      power_supply_unregister(&pda_power_supplies[0]);
-+      return 0;
-+}
-+
-+static struct platform_driver pda_power_pdrv = {
-+      .driver = {
-+              .name = "pda-power",
-+      },
-+      .probe = pda_power_probe,
-+      .remove = pda_power_remove,
-+};
-+
-+static int __init pda_power_init(void)
-+{
-+      return platform_driver_register(&pda_power_pdrv);
-+}
-+
-+static void __exit pda_power_exit(void)
-+{
-+      platform_driver_unregister(&pda_power_pdrv);
-+      return;
-+}
-+
-+module_init(pda_power_init);
-+module_exit(pda_power_exit);
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Anton Vorontsov <cbou@mail.ru>");
-Index: linux-2.6.22/drivers/power/pmu_battery.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/pmu_battery.c   2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,215 @@
-+/*
-+ * Battery class driver for Apple PMU
-+ *
-+ *    Copyright Â© 2006  David Woodhouse <dwmw2@infradead.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/err.h>
-+#include <linux/power_supply.h>
-+#include <linux/adb.h>
-+#include <linux/pmu.h>
-+
-+static struct pmu_battery_dev {
-+      struct power_supply bat;
-+      struct pmu_battery_info *pbi;
-+      char name[16];
-+      int propval;
-+} *pbats[PMU_MAX_BATTERIES];
-+
-+#define to_pmu_battery_dev(x) container_of(x, struct pmu_battery_dev, bat)
-+
-+/*********************************************************************
-+ *            Power
-+ *********************************************************************/
-+
-+static int pmu_get_ac_prop(struct power_supply *psy,
-+                           enum power_supply_property psp,
-+                           union power_supply_propval *val)
-+{
-+      switch (psp) {
-+      case POWER_SUPPLY_PROP_ONLINE:
-+              val->intval = (!!(pmu_power_flags & PMU_PWR_AC_PRESENT)) ||
-+                            (pmu_battery_count == 0);
-+              break;
-+      default:
-+              return -EINVAL;
-+      }
-+
-+      return 0;
-+}
-+
-+static enum power_supply_property pmu_ac_props[] = {
-+      POWER_SUPPLY_PROP_ONLINE,
-+};
-+
-+static struct power_supply pmu_ac = {
-+      .name = "pmu-ac",
-+      .type = POWER_SUPPLY_TYPE_MAINS,
-+      .properties = pmu_ac_props,
-+      .num_properties = ARRAY_SIZE(pmu_ac_props),
-+      .get_property = pmu_get_ac_prop,
-+};
-+
-+/*********************************************************************
-+ *            Battery properties
-+ *********************************************************************/
-+
-+static char *pmu_batt_types[] = {
-+      "Smart", "Comet", "Hooper", "Unknown"
-+};
-+
-+static char *pmu_bat_get_model_name(struct pmu_battery_info *pbi)
-+{
-+      switch (pbi->flags & PMU_BATT_TYPE_MASK) {
-+      case PMU_BATT_TYPE_SMART:
-+              return pmu_batt_types[0];
-+      case PMU_BATT_TYPE_COMET:
-+              return pmu_batt_types[1];
-+      case PMU_BATT_TYPE_HOOPER:
-+              return pmu_batt_types[2];
-+      default: break;
-+      }
-+      return pmu_batt_types[3];
-+}
-+
-+static int pmu_bat_get_property(struct power_supply *psy,
-+                                enum power_supply_property psp,
-+                                union power_supply_propval *val)
-+{
-+      struct pmu_battery_dev *pbat = to_pmu_battery_dev(psy);
-+      struct pmu_battery_info *pbi = pbat->pbi;
-+
-+      switch (psp) {
-+      case POWER_SUPPLY_PROP_STATUS:
-+              if (pbi->flags & PMU_BATT_CHARGING)
-+                      val->intval = POWER_SUPPLY_STATUS_CHARGING;
-+              else
-+                      val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
-+              break;
-+      case POWER_SUPPLY_PROP_PRESENT:
-+              val->intval = !!(pbi->flags & PMU_BATT_PRESENT);
-+              break;
-+      case POWER_SUPPLY_PROP_MODEL_NAME:
-+              val->strval = pmu_bat_get_model_name(pbi);
-+              break;
-+      case POWER_SUPPLY_PROP_ENERGY_AVG:
-+              val->intval = pbi->charge     * 1000; /* mWh -> ÂµWh */
-+              break;
-+      case POWER_SUPPLY_PROP_ENERGY_FULL:
-+              val->intval = pbi->max_charge * 1000; /* mWh -> ÂµWh */
-+              break;
-+      case POWER_SUPPLY_PROP_CURRENT_AVG:
-+              val->intval = pbi->amperage   * 1000; /* mA -> ÂµA */
-+              break;
-+      case POWER_SUPPLY_PROP_VOLTAGE_AVG:
-+              val->intval = pbi->voltage    * 1000; /* mV -> ÂµV */
-+              break;
-+      case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG:
-+              val->intval = pbi->time_remaining;
-+              break;
-+      default:
-+              return -EINVAL;
-+      }
-+
-+      return 0;
-+}
-+
-+static enum power_supply_property pmu_bat_props[] = {
-+      POWER_SUPPLY_PROP_STATUS,
-+      POWER_SUPPLY_PROP_PRESENT,
-+      POWER_SUPPLY_PROP_MODEL_NAME,
-+      POWER_SUPPLY_PROP_ENERGY_AVG,
-+      POWER_SUPPLY_PROP_ENERGY_FULL,
-+      POWER_SUPPLY_PROP_CURRENT_AVG,
-+      POWER_SUPPLY_PROP_VOLTAGE_AVG,
-+      POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
-+};
-+
-+/*********************************************************************
-+ *            Initialisation
-+ *********************************************************************/
-+
-+static struct platform_device *bat_pdev;
-+
-+static int __init pmu_bat_init(void)
-+{
-+      int ret;
-+      int i;
-+
-+      bat_pdev = platform_device_register_simple("pmu-battery",
-+                                                 0, NULL, 0);
-+      if (IS_ERR(bat_pdev)) {
-+              ret = PTR_ERR(bat_pdev);
-+              goto pdev_register_failed;
-+      }
-+
-+      ret = power_supply_register(&bat_pdev->dev, &pmu_ac);
-+      if (ret)
-+              goto ac_register_failed;
-+
-+      for (i = 0; i < pmu_battery_count; i++) {
-+              struct pmu_battery_dev *pbat = kzalloc(sizeof(*pbat),
-+                                                     GFP_KERNEL);
-+              if (!pbat)
-+                      break;
-+
-+              sprintf(pbat->name, "PMU battery %d", i);
-+              pbat->bat.name = pbat->name;
-+              pbat->bat.properties = pmu_bat_props;
-+              pbat->bat.num_properties = ARRAY_SIZE(pmu_bat_props);
-+              pbat->bat.get_property = pmu_bat_get_property;
-+              pbat->pbi = &pmu_batteries[i];
-+
-+              ret = power_supply_register(&bat_pdev->dev, &pbat->bat);
-+              if (ret) {
-+                      kfree(pbat);
-+                      goto battery_register_failed;
-+              }
-+              pbats[i] = pbat;
-+      }
-+
-+      goto success;
-+
-+battery_register_failed:
-+      while (i--) {
-+              if (!pbats[i])
-+                      continue;
-+              power_supply_unregister(&pbats[i]->bat);
-+              kfree(pbats[i]);
-+      }
-+      power_supply_unregister(&pmu_ac);
-+ac_register_failed:
-+      platform_device_unregister(bat_pdev);
-+pdev_register_failed:
-+success:
-+      return ret;
-+}
-+
-+static void __exit pmu_bat_exit(void)
-+{
-+      int i;
-+
-+      for (i = 0; i < PMU_MAX_BATTERIES; i++) {
-+              if (!pbats[i])
-+                      continue;
-+              power_supply_unregister(&pbats[i]->bat);
-+              kfree(pbats[i]);
-+      }
-+      power_supply_unregister(&pmu_ac);
-+      platform_device_unregister(bat_pdev);
-+
-+      return;
-+}
-+
-+module_init(pmu_bat_init);
-+module_exit(pmu_bat_exit);
-+
-+MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION("PMU battery driver");
-Index: linux-2.6.22/drivers/power/power_supply_core.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/power_supply_core.c     2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,168 @@
-+/*
-+ *  Universal power supply monitor class
-+ *
-+ *  Copyright (c) 2007  Anton Vorontsov <cbou@mail.ru>
-+ *  Copyright (c) 2004  Szabolcs Gyurko
-+ *  Copyright (c) 2003  Ian Molton <spyro@f2s.com>
-+ *
-+ *  Modified: 2004, Oct     Szabolcs Gyurko
-+ *
-+ *  You may use this code as per GPL version 2
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/init.h>
-+#include <linux/device.h>
-+#include <linux/err.h>
-+#include <linux/power_supply.h>
-+#include "power_supply.h"
-+
-+struct class *power_supply_class;
-+
-+static void power_supply_changed_work(struct work_struct *work)
-+{
-+      struct power_supply *psy = container_of(work, struct power_supply,
-+                                              changed_work);
-+      int i;
-+
-+      dev_dbg(psy->dev, "%s\n", __FUNCTION__);
-+
-+      for (i = 0; i < psy->num_supplicants; i++) {
-+              struct device *dev;
-+
-+              down(&power_supply_class->sem);
-+              list_for_each_entry(dev, &power_supply_class->devices, node) {
-+                      struct power_supply *pst = dev_get_drvdata(dev);
-+
-+                      if (!strcmp(psy->supplied_to[i], pst->name)) {
-+                              if (pst->external_power_changed)
-+                                      pst->external_power_changed(pst);
-+                      }
-+              }
-+              up(&power_supply_class->sem);
-+      }
-+
-+      power_supply_update_leds(psy);
-+
-+      kobject_uevent(&psy->dev->kobj, KOBJ_CHANGE);
-+
-+      return;
-+}
-+
-+void power_supply_changed(struct power_supply *psy)
-+{
-+      dev_dbg(psy->dev, "%s\n", __FUNCTION__);
-+
-+      schedule_work(&psy->changed_work);
-+
-+      return;
-+}
-+
-+int power_supply_am_i_supplied(struct power_supply *psy)
-+{
-+      union power_supply_propval ret = {0,};
-+      struct device *dev;
-+
-+      down(&power_supply_class->sem);
-+      list_for_each_entry(dev, &power_supply_class->devices, node) {
-+              struct power_supply *epsy = dev_get_drvdata(dev);
-+              int i;
-+
-+              for (i = 0; i < epsy->num_supplicants; i++) {
-+                      if (!strcmp(epsy->supplied_to[i], psy->name)) {
-+                              if (epsy->get_property(epsy,
-+                                        POWER_SUPPLY_PROP_ONLINE, &ret))
-+                                      continue;
-+                              if (ret.intval)
-+                                      goto out;
-+                      }
-+              }
-+      }
-+out:
-+      up(&power_supply_class->sem);
-+
-+      dev_dbg(psy->dev, "%s %d\n", __FUNCTION__, ret.intval);
-+
-+      return ret.intval;
-+}
-+
-+int power_supply_register(struct device *parent, struct power_supply *psy)
-+{
-+      int rc = 0;
-+
-+      psy->dev = device_create(power_supply_class, parent, 0,
-+                               "%s", psy->name);
-+      if (IS_ERR(psy->dev)) {
-+              rc = PTR_ERR(psy->dev);
-+              goto dev_create_failed;
-+      }
-+
-+      dev_set_drvdata(psy->dev, psy);
-+
-+      INIT_WORK(&psy->changed_work, power_supply_changed_work);
-+
-+      rc = power_supply_create_attrs(psy);
-+      if (rc)
-+              goto create_attrs_failed;
-+
-+      rc = power_supply_create_triggers(psy);
-+      if (rc)
-+              goto create_triggers_failed;
-+
-+      power_supply_changed(psy);
-+
-+      goto success;
-+
-+create_triggers_failed:
-+      power_supply_remove_attrs(psy);
-+create_attrs_failed:
-+      device_unregister(psy->dev);
-+dev_create_failed:
-+success:
-+      return rc;
-+}
-+
-+void power_supply_unregister(struct power_supply *psy)
-+{
-+      flush_scheduled_work();
-+      power_supply_remove_triggers(psy);
-+      power_supply_remove_attrs(psy);
-+      device_unregister(psy->dev);
-+      return;
-+}
-+
-+static int __init power_supply_class_init(void)
-+{
-+      power_supply_class = class_create(THIS_MODULE, "power_supply");
-+
-+      if (IS_ERR(power_supply_class))
-+              return PTR_ERR(power_supply_class);
-+
-+      power_supply_class->dev_uevent = power_supply_uevent;
-+
-+      return 0;
-+}
-+
-+static void __exit power_supply_class_exit(void)
-+{
-+      class_destroy(power_supply_class);
-+      return;
-+}
-+
-+EXPORT_SYMBOL_GPL(power_supply_changed);
-+EXPORT_SYMBOL_GPL(power_supply_am_i_supplied);
-+EXPORT_SYMBOL_GPL(power_supply_register);
-+EXPORT_SYMBOL_GPL(power_supply_unregister);
-+
-+/* exported for the APM Power driver, APM emulation */
-+EXPORT_SYMBOL_GPL(power_supply_class);
-+
-+subsys_initcall(power_supply_class_init);
-+module_exit(power_supply_class_exit);
-+
-+MODULE_DESCRIPTION("Universal power supply monitor class");
-+MODULE_AUTHOR("Ian Molton <spyro@f2s.com>, "
-+              "Szabolcs Gyurko, "
-+              "Anton Vorontsov <cbou@mail.ru>");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/drivers/power/power_supply.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/power_supply.h  2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,42 @@
-+/*
-+ *  Functions private to power supply class
-+ *
-+ *  Copyright (c) 2007  Anton Vorontsov <cbou@mail.ru>
-+ *  Copyright (c) 2004  Szabolcs Gyurko
-+ *  Copyright (c) 2003  Ian Molton <spyro@f2s.com>
-+ *
-+ *  Modified: 2004, Oct     Szabolcs Gyurko
-+ *
-+ *  You may use this code as per GPL version 2
-+ */
-+
-+#ifdef CONFIG_SYSFS
-+
-+extern int power_supply_create_attrs(struct power_supply *psy);
-+extern void power_supply_remove_attrs(struct power_supply *psy);
-+extern int power_supply_uevent(struct device *dev, char **envp, int num_envp,
-+                               char *buffer, int buffer_size);
-+
-+#else
-+
-+static inline int power_supply_create_attrs(struct power_supply *psy)
-+{ return 0; }
-+static inline void power_supply_remove_attrs(struct power_supply *psy) {}
-+#define power_supply_uevent NULL
-+
-+#endif /* CONFIG_SYSFS */
-+
-+#ifdef CONFIG_LEDS_TRIGGERS
-+
-+extern void power_supply_update_leds(struct power_supply *psy);
-+extern int power_supply_create_triggers(struct power_supply *psy);
-+extern void power_supply_remove_triggers(struct power_supply *psy);
-+
-+#else
-+
-+static inline void power_supply_update_leds(struct power_supply *psy) {}
-+static inline int power_supply_create_triggers(struct power_supply *psy)
-+{ return 0; }
-+static inline void power_supply_remove_triggers(struct power_supply *psy) {}
-+
-+#endif /* CONFIG_LEDS_TRIGGERS */
-Index: linux-2.6.22/drivers/power/power_supply_leds.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/power_supply_leds.c     2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,188 @@
-+/*
-+ *  LEDs triggers for power supply class
-+ *
-+ *  Copyright (c) 2007  Anton Vorontsov <cbou@mail.ru>
-+ *  Copyright (c) 2004  Szabolcs Gyurko
-+ *  Copyright (c) 2003  Ian Molton <spyro@f2s.com>
-+ *
-+ *  Modified: 2004, Oct     Szabolcs Gyurko
-+ *
-+ *  You may use this code as per GPL version 2
-+ */
-+
-+#include <linux/power_supply.h>
-+
-+/* If we have hwtimer trigger, then use it to blink charging LED */
-+
-+#if defined(CONFIG_LEDS_TRIGGER_HWTIMER) ||                  \
-+               (defined(CONFIG_BATTERY_MODULE) &&            \
-+                defined(CONFIG_LEDS_TRIGGER_HWTIMER_MODULE))
-+       #define led_trigger_register_charging led_trigger_register_hwtimer
-+       #define led_trigger_unregister_charging led_trigger_unregister_hwtimer
-+#else
-+       #define led_trigger_register_charging led_trigger_register_simple
-+       #define led_trigger_unregister_charging led_trigger_unregister_simple
-+#endif
-+
-+/* Battery specific LEDs triggers. */
-+
-+static void power_supply_update_bat_leds(struct power_supply *psy)
-+{
-+      union power_supply_propval status;
-+
-+      if (psy->get_property(psy, POWER_SUPPLY_PROP_STATUS, &status))
-+              return;
-+
-+      dev_dbg(psy->dev, "%s %d\n", __FUNCTION__, status.intval);
-+
-+      switch(status.intval) {
-+      case POWER_SUPPLY_STATUS_FULL:
-+              led_trigger_event(psy->charging_full_trig, LED_FULL);
-+              led_trigger_event(psy->charging_trig, LED_OFF);
-+              led_trigger_event(psy->full_trig, LED_FULL);
-+              break;
-+      case POWER_SUPPLY_STATUS_CHARGING:
-+              led_trigger_event(psy->charging_full_trig, LED_FULL);
-+              led_trigger_event(psy->charging_trig, LED_FULL);
-+              led_trigger_event(psy->full_trig, LED_OFF);
-+              break;
-+      default:
-+              led_trigger_event(psy->charging_full_trig, LED_OFF);
-+              led_trigger_event(psy->charging_trig, LED_OFF);
-+              led_trigger_event(psy->full_trig, LED_OFF);
-+              break;
-+      }
-+
-+      return;
-+}
-+
-+static int power_supply_create_bat_triggers(struct power_supply *psy)
-+{
-+      int rc = 0;
-+
-+      psy->charging_full_trig_name = kmalloc(strlen(psy->name) +
-+                                sizeof("-charging-or-full"), GFP_KERNEL);
-+      if (!psy->charging_full_trig_name)
-+              goto charging_full_failed;
-+
-+      psy->charging_trig_name = kmalloc(strlen(psy->name) +
-+                                        sizeof("-charging"), GFP_KERNEL);
-+      if (!psy->charging_trig_name)
-+              goto charging_failed;
-+
-+      psy->full_trig_name = kmalloc(strlen(psy->name) +
-+                                    sizeof("-full"), GFP_KERNEL);
-+      if (!psy->full_trig_name)
-+              goto full_failed;
-+
-+      strcpy(psy->charging_full_trig_name, psy->name);
-+      strcat(psy->charging_full_trig_name, "-charging-or-full");
-+      strcpy(psy->charging_trig_name, psy->name);
-+      strcat(psy->charging_trig_name, "-charging");
-+      strcpy(psy->full_trig_name, psy->name);
-+      strcat(psy->full_trig_name, "-full");
-+
-+      led_trigger_register_simple(psy->charging_full_trig_name,
-+                                  &psy->charging_full_trig);
-+      led_trigger_register_charging(psy->charging_trig_name,
-+                                    &psy->charging_trig);
-+      led_trigger_register_simple(psy->full_trig_name,
-+                                  &psy->full_trig);
-+
-+      goto success;
-+
-+full_failed:
-+      kfree(psy->charging_trig_name);
-+charging_failed:
-+      kfree(psy->charging_full_trig_name);
-+charging_full_failed:
-+      rc = -ENOMEM;
-+success:
-+      return rc;
-+}
-+
-+static void power_supply_remove_bat_triggers(struct power_supply *psy)
-+{
-+      led_trigger_unregister_simple(psy->charging_full_trig);
-+      led_trigger_unregister_charging(psy->charging_trig);
-+      led_trigger_unregister_simple(psy->full_trig);
-+      kfree(psy->full_trig_name);
-+      kfree(psy->charging_trig_name);
-+      kfree(psy->charging_full_trig_name);
-+      return;
-+}
-+
-+/* Generated power specific LEDs triggers. */
-+
-+static void power_supply_update_gen_leds(struct power_supply *psy)
-+{
-+      union power_supply_propval online;
-+
-+      if (psy->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &online))
-+              return;
-+
-+      dev_dbg(psy->dev, "%s %d\n", __FUNCTION__, online.intval);
-+
-+      if (online.intval)
-+              led_trigger_event(psy->online_trig, LED_FULL);
-+      else
-+              led_trigger_event(psy->online_trig, LED_OFF);
-+
-+      return;
-+}
-+
-+static int power_supply_create_gen_triggers(struct power_supply *psy)
-+{
-+      int rc = 0;
-+
-+      psy->online_trig_name = kmalloc(strlen(psy->name) + sizeof("-online"),
-+                                      GFP_KERNEL);
-+      if (!psy->online_trig_name)
-+              goto online_failed;
-+
-+      strcpy(psy->online_trig_name, psy->name);
-+      strcat(psy->online_trig_name, "-online");
-+
-+      led_trigger_register_simple(psy->online_trig_name, &psy->online_trig);
-+
-+      goto success;
-+
-+online_failed:
-+      rc = -ENOMEM;
-+success:
-+      return rc;
-+}
-+
-+static void power_supply_remove_gen_triggers(struct power_supply *psy)
-+{
-+      led_trigger_unregister_simple(psy->online_trig);
-+      kfree(psy->online_trig_name);
-+      return;
-+}
-+
-+/* Choice what triggers to create&update. */
-+
-+void power_supply_update_leds(struct power_supply *psy)
-+{
-+      if (psy->type == POWER_SUPPLY_TYPE_BATTERY)
-+              power_supply_update_bat_leds(psy);
-+      else
-+              power_supply_update_gen_leds(psy);
-+      return;
-+}
-+
-+int power_supply_create_triggers(struct power_supply *psy)
-+{
-+      if (psy->type == POWER_SUPPLY_TYPE_BATTERY)
-+              return power_supply_create_bat_triggers(psy);
-+      return power_supply_create_gen_triggers(psy);
-+}
-+
-+void power_supply_remove_triggers(struct power_supply *psy)
-+{
-+      if (psy->type == POWER_SUPPLY_TYPE_BATTERY)
-+              power_supply_remove_bat_triggers(psy);
-+      else
-+              power_supply_remove_gen_triggers(psy);
-+      return;
-+}
-Index: linux-2.6.22/drivers/power/power_supply_sysfs.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/power_supply_sysfs.c    2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,289 @@
-+/*
-+ *  Sysfs interface for the universal power supply monitor class
-+ *
-+ *  Copyright Â©  2007  David Woodhouse <dwmw2@infradead.org>
-+ *  Copyright (c) 2007  Anton Vorontsov <cbou@mail.ru>
-+ *  Copyright (c) 2004  Szabolcs Gyurko
-+ *  Copyright (c) 2003  Ian Molton <spyro@f2s.com>
-+ *
-+ *  Modified: 2004, Oct     Szabolcs Gyurko
-+ *
-+ *  You may use this code as per GPL version 2
-+ */
-+
-+#include <linux/ctype.h>
-+#include <linux/power_supply.h>
-+
-+/*
-+ * This is because the name "current" breaks the device attr macro.
-+ * The "current" word resolvs to "(get_current())" so instead of
-+ * "current" "(get_current())" appears in the sysfs.
-+ *
-+ * The source of this definition is the device.h which calls __ATTR
-+ * macro in sysfs.h which calls the __stringify macro.
-+ *
-+ * Only modification that the name is not tried to be resolved
-+ * (as a macro let's say).
-+ */
-+
-+#define POWER_SUPPLY_ATTR(_name)                                        \
-+{                                                                       \
-+      .attr = { .name = #_name, .mode = 0444, .owner = THIS_MODULE }, \
-+      .show = power_supply_show_property,                             \
-+      .store = NULL,                                                  \
-+}
-+
-+static struct device_attribute power_supply_attrs[];
-+
-+static ssize_t power_supply_show_property(struct device *dev,
-+                                          struct device_attribute *attr,
-+                                          char *buf) {
-+      static char *status_text[] = {
-+              "Unknown", "Charging", "Discharging", "Not charging", "Full"
-+      };
-+      static char *health_text[] = {
-+              "Unknown", "Good", "Overheat", "Dead"
-+      };
-+      static char *technology_text[] = {
-+              "Unknown", "NiMH", "Li-ion", "Li-poly"
-+      };
-+      static char *capacity_level_text[] = {
-+              "Unknown", "Critical", "Low", "Normal", "High", "Full"
-+      };
-+      ssize_t ret;
-+      struct power_supply *psy = dev_get_drvdata(dev);
-+      const ptrdiff_t off = attr - power_supply_attrs;
-+      union power_supply_propval value;
-+
-+      ret = psy->get_property(psy, off, &value);
-+
-+      if (ret < 0) {
-+              dev_err(dev, "driver failed to report `%s' property\n",
-+                      attr->attr.name);
-+              return ret;
-+      }
-+
-+      if (off == POWER_SUPPLY_PROP_STATUS)
-+              return sprintf(buf, "%s\n", status_text[value.intval]);
-+      else if (off == POWER_SUPPLY_PROP_HEALTH)
-+              return sprintf(buf, "%s\n", health_text[value.intval]);
-+      else if (off == POWER_SUPPLY_PROP_TECHNOLOGY)
-+              return sprintf(buf, "%s\n", technology_text[value.intval]);
-+      else if (off == POWER_SUPPLY_PROP_CAPACITY_LEVEL)
-+              return sprintf(buf, "%s\n",
-+                             capacity_level_text[value.intval]);
-+      else if (off == POWER_SUPPLY_PROP_MODEL_NAME)
-+              return sprintf(buf, "%s\n", value.strval);
-+
-+      return sprintf(buf, "%d\n", value.intval);
-+}
-+
-+/* Must be in the same order as POWER_SUPPLY_PROP_* */
-+static struct device_attribute power_supply_attrs[] = {
-+      /* Properties of type `int' */
-+      POWER_SUPPLY_ATTR(status),
-+      POWER_SUPPLY_ATTR(health),
-+      POWER_SUPPLY_ATTR(present),
-+      POWER_SUPPLY_ATTR(online),
-+      POWER_SUPPLY_ATTR(technology),
-+      POWER_SUPPLY_ATTR(voltage_max_design),
-+      POWER_SUPPLY_ATTR(voltage_min_design),
-+      POWER_SUPPLY_ATTR(voltage_now),
-+      POWER_SUPPLY_ATTR(voltage_avg),
-+      POWER_SUPPLY_ATTR(current_now),
-+      POWER_SUPPLY_ATTR(current_avg),
-+      POWER_SUPPLY_ATTR(charge_full_design),
-+      POWER_SUPPLY_ATTR(charge_empty_design),
-+      POWER_SUPPLY_ATTR(charge_full),
-+      POWER_SUPPLY_ATTR(charge_empty),
-+      POWER_SUPPLY_ATTR(charge_now),
-+      POWER_SUPPLY_ATTR(charge_avg),
-+      POWER_SUPPLY_ATTR(energy_full_design),
-+      POWER_SUPPLY_ATTR(energy_empty_design),
-+      POWER_SUPPLY_ATTR(energy_full),
-+      POWER_SUPPLY_ATTR(energy_empty),
-+      POWER_SUPPLY_ATTR(energy_now),
-+      POWER_SUPPLY_ATTR(energy_avg),
-+      POWER_SUPPLY_ATTR(capacity),
-+      POWER_SUPPLY_ATTR(capacity_level),
-+      POWER_SUPPLY_ATTR(temp),
-+      POWER_SUPPLY_ATTR(temp_ambient),
-+      POWER_SUPPLY_ATTR(time_to_empty_now),
-+      POWER_SUPPLY_ATTR(time_to_empty_avg),
-+      POWER_SUPPLY_ATTR(time_to_full_now),
-+      POWER_SUPPLY_ATTR(time_to_full_avg),
-+      /* Properties of type `const char *' */
-+      POWER_SUPPLY_ATTR(model_name),
-+};
-+
-+static ssize_t power_supply_show_static_attrs(struct device *dev,
-+                                              struct device_attribute *attr,
-+                                              char *buf) {
-+      static char *type_text[] = { "Battery", "UPS", "Mains", "USB" };
-+      struct power_supply *psy = dev_get_drvdata(dev);
-+
-+      return sprintf(buf, "%s\n", type_text[psy->type]);
-+}
-+
-+static struct device_attribute power_supply_static_attrs[] = {
-+      __ATTR(type, 0444, power_supply_show_static_attrs, NULL),
-+};
-+
-+int power_supply_create_attrs(struct power_supply *psy)
-+{
-+      int rc = 0;
-+      int i, j;
-+
-+      for (i = 0; i < ARRAY_SIZE(power_supply_static_attrs); i++) {
-+              rc = device_create_file(psy->dev,
-+                          &power_supply_static_attrs[i]);
-+              if (rc)
-+                      goto statics_failed;
-+      }
-+
-+      for (j = 0; j < psy->num_properties; j++) {
-+              rc = device_create_file(psy->dev,
-+                          &power_supply_attrs[psy->properties[j]]);
-+              if (rc)
-+                      goto dynamics_failed;
-+      }
-+
-+      goto succeed;
-+
-+dynamics_failed:
-+      while (j--)
-+              device_remove_file(psy->dev,
-+                         &power_supply_attrs[psy->properties[j]]);
-+statics_failed:
-+      while (i--)
-+              device_remove_file(psy->dev,
-+                         &power_supply_static_attrs[psy->properties[i]]);
-+succeed:
-+      return rc;
-+}
-+
-+void power_supply_remove_attrs(struct power_supply *psy)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(power_supply_static_attrs); i++)
-+              device_remove_file(psy->dev,
-+                          &power_supply_static_attrs[i]);
-+
-+      for (i = 0; i < psy->num_properties; i++)
-+              device_remove_file(psy->dev,
-+                          &power_supply_attrs[psy->properties[i]]);
-+
-+      return;
-+}
-+
-+static char *kstruprdup(const char *str, gfp_t gfp)
-+{
-+      char *ret, *ustr;
-+
-+      ustr = ret = kmalloc(strlen(str) + 1, gfp);
-+
-+      if (!ret)
-+              return NULL;
-+
-+      while (*str)
-+              *ustr++ = toupper(*str++);
-+
-+      *ustr = 0;
-+
-+      return ret;
-+}
-+
-+int power_supply_uevent(struct device *dev, char **envp, int num_envp,
-+                        char *buffer, int buffer_size)
-+{
-+      struct power_supply *psy = dev_get_drvdata(dev);
-+      int i = 0, length = 0, ret = 0, j;
-+      char *prop_buf;
-+      char *attrname;
-+
-+      dev_dbg(dev, "uevent\n");
-+
-+      if (!psy) {
-+              dev_dbg(dev, "No power supply yet\n");
-+              return ret;
-+      }
-+
-+      dev_dbg(dev, "POWER_SUPPLY_NAME=%s\n", psy->name);
-+
-+      ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size,
-+                           &length, "POWER_SUPPLY_NAME=%s", psy->name);
-+      if (ret)
-+              return ret;
-+
-+      prop_buf = (char *)get_zeroed_page(GFP_KERNEL);
-+      if (!prop_buf)
-+              return -ENOMEM;
-+
-+      for (j = 0; j < ARRAY_SIZE(power_supply_static_attrs); j++) {
-+              struct device_attribute *attr;
-+              char *line;
-+
-+              attr = &power_supply_static_attrs[j];
-+
-+              ret = power_supply_show_static_attrs(dev, attr, prop_buf);
-+              if (ret < 0)
-+                      goto out;
-+
-+              line = strchr(prop_buf, '\n');
-+              if (line)
-+                      *line = 0;
-+
-+              attrname = kstruprdup(attr->attr.name, GFP_KERNEL);
-+              if (!attrname) {
-+                      ret = -ENOMEM;
-+                      goto out;
-+              }
-+
-+              dev_dbg(dev, "Static prop %s=%s\n", attrname, prop_buf);
-+
-+              ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size,
-+                                   &length, "POWER_SUPPLY_%s=%s",
-+                                   attrname, prop_buf);
-+              kfree(attrname);
-+              if (ret)
-+                      goto out;
-+      }
-+
-+      dev_dbg(dev, "%zd dynamic props\n", psy->num_properties);
-+
-+      for (j = 0; j < psy->num_properties; j++) {
-+              struct device_attribute *attr;
-+              char *line;
-+
-+              attr = &power_supply_attrs[psy->properties[j]];
-+
-+              ret = power_supply_show_property(dev, attr, prop_buf);
-+              if (ret < 0)
-+                      goto out;
-+
-+              line = strchr(prop_buf, '\n');
-+              if (line)
-+                      *line = 0;
-+
-+              attrname = kstruprdup(attr->attr.name, GFP_KERNEL);
-+              if (!attrname) {
-+                      ret = -ENOMEM;
-+                      goto out;
-+              }
-+
-+              dev_dbg(dev, "prop %s=%s\n", attrname, prop_buf);
-+
-+              ret = add_uevent_var(envp, num_envp, &i, buffer, buffer_size,
-+                                   &length, "POWER_SUPPLY_%s=%s",
-+                                   attrname, prop_buf);
-+              kfree(attrname);
-+              if (ret)
-+                      goto out;
-+      }
-+
-+out:
-+      free_page((unsigned long)prop_buf);
-+
-+      return ret;
-+}
-Index: linux-2.6.22/drivers/power/simpad-battery.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/drivers/power/simpad-battery.c        2007-08-23 12:13:52.000000000 +0200
-@@ -0,0 +1,242 @@
-+/*
-+ *  linux/drivers/misc/simpad-battery.c
-+ *
-+ *  Copyright (C) 2005 Holger Hans Peter Freyther
-+ *  Copyright (C) 2001 Juergen Messerer
-+ *
-+ * 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.
-+ *
-+ * Read the Battery Level through the UCB1x00 chip. T-Sinuspad is
-+ * unsupported for now.
-+ *
-+ */
-+
-+#include <linux/battery.h>
-+#include <asm/dma.h>
-+#include "ucb1x00.h"
-+
-+
-+/*
-+ * Conversion from AD -> mV
-+ * 7.5V = 1023   7.3313mV/Digit
-+ *
-+ * 400 Units == 9.7V
-+ * a     = ADC value
-+ * 21    = ADC error
-+ * 12600 = Divident to get 2*7.3242
-+ * 860   = Divider to get 2*7.3242
-+ * 170   = Voltagedrop over
-+ */
-+#define CALIBRATE_BATTERY(a)   ((((a + 21)*12600)/860) + 170)
-+
-+/*
-+ * We have two types of batteries a small and a large one
-+ * To get the right value we to distinguish between those two
-+ * 450 Units == 15 V
-+ */
-+#define CALIBRATE_SUPPLY(a)   (((a) * 1500) / 45)
-+#define MIN_SUPPLY            12000 /* Less then 12V means no powersupply */
-+
-+/*
-+ * Charging Current
-+ * if value is >= 50 then charging is on
-+ */
-+#define CALIBRATE_CHARGING(a)    (((a)* 1000)/(152/4)))
-+
-+struct simpad_battery_t {
-+      struct battery  battery;
-+      struct ucb1x00* ucb;
-+
-+        /*
-+       * Variables for the values to one time support
-+       * T-Sinuspad as well
-+       */
-+      int min_voltage;
-+      int min_current;
-+      int min_charge;
-+
-+      int max_voltage;
-+      int max_current;
-+      int max_charge;
-+
-+      int min_supply;
-+      int charging_led_label;
-+      int charging_max_label;
-+      int batt_full;
-+      int batt_low;
-+      int batt_critical;
-+      int batt_empty;
-+};
-+
-+static int simpad_get_min_voltage(struct battery* _battery )
-+{
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)_battery;
-+      return  battery->min_voltage;
-+}
-+
-+static int simpad_get_min_current(struct battery* _battery)
-+{
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)_battery;
-+      return battery->min_current;
-+}
-+
-+static int simpad_get_min_charge(struct battery* _battery)
-+{
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)_battery;
-+      return battery->min_charge;
-+}
-+
-+static int simpad_get_max_voltage(struct battery* _battery)
-+{
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)_battery;
-+      return battery->max_voltage;
-+}
-+
-+static int simpad_get_max_current(struct battery* _battery)
-+{
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)_battery;
-+      return battery->max_current;
-+}
-+
-+static int simpad_get_max_charge(struct battery* _battery)
-+{
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)_battery;
-+      return battery->max_charge;
-+}
-+
-+static int simpad_get_temp(struct battery* _battery)
-+{
-+      return 0;
-+}
-+
-+static int simpad_get_voltage(struct battery* _battery)
-+{
-+      int val;
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)_battery;
-+
-+
-+      ucb1x00_adc_enable(battery->ucb);
-+      val = ucb1x00_adc_read(battery->ucb, UCB_ADC_INP_AD1, UCB_NOSYNC);
-+      ucb1x00_adc_disable(battery->ucb);
-+
-+      return CALIBRATE_BATTERY(val);
-+}
-+
-+static int simpad_get_current(struct battery* _battery)
-+{
-+      int val;
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)_battery;
-+
-+      ucb1x00_adc_enable(battery->ucb);
-+      val = ucb1x00_adc_read(battery->ucb, UCB_ADC_INP_AD3, UCB_NOSYNC);
-+      ucb1x00_adc_disable(battery->ucb);
-+
-+      return val;
-+}
-+
-+static int simpad_get_charge(struct battery* _battery)
-+{
-+      int val;
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)_battery;
-+
-+      ucb1x00_adc_enable(battery->ucb);
-+      val = ucb1x00_adc_read(battery->ucb, UCB_ADC_INP_AD2, UCB_NOSYNC);
-+      ucb1x00_adc_disable(battery->ucb);
-+
-+      return CALIBRATE_SUPPLY(val);
-+
-+}
-+
-+static int simpad_get_status(struct battery* _battery)
-+{
-+      struct simpad_battery_t* battery = (struct simpad_battery_t*)(_battery);
-+      int vcharger = simpad_get_voltage(_battery);
-+      int icharger = simpad_get_current(_battery);
-+
-+      int status = BATTERY_STATUS_UNKNOWN;
-+      if(icharger > battery->charging_led_label)
-+              status = BATTERY_STATUS_CHARGING;
-+      else if(vcharger > battery->min_supply)
-+              status = BATTERY_STATUS_NOT_CHARGING;
-+      else
-+              status = BATTERY_STATUS_DISCHARGING;
-+
-+      return status;
-+}
-+
-+static struct simpad_battery_t simpad_battery  = {
-+      .battery = {
-+              .get_min_voltage = simpad_get_min_voltage,
-+              .get_min_current = simpad_get_min_current,
-+              .get_min_charge  = simpad_get_min_charge,
-+              .get_max_voltage = simpad_get_max_voltage,
-+              .get_max_current = simpad_get_max_current,
-+              .get_max_charge  = simpad_get_max_charge,
-+              .get_temp        = simpad_get_temp,
-+              .get_voltage     = simpad_get_voltage,
-+              .get_current     = simpad_get_current,
-+              .get_charge      = simpad_get_charge,
-+              .get_status      = simpad_get_status,
-+      },
-+      .min_voltage = 0,
-+      .min_current = 0,
-+      .min_charge  = 0,
-+      .max_voltage = 0,
-+      .max_current = 0,
-+      .max_charge  = 0,
-+
-+      .min_supply         = 1200,
-+      .charging_led_label = 18,
-+      .charging_max_label = 265,
-+      .batt_full          = 8300,
-+      .batt_low           = 7300,
-+      .batt_critical      = 6800,
-+      .batt_empty         = 6500,
-+};
-+
-+
-+
-+/*
-+ * UCB glue code
-+ */
-+static int ucb1x00_battery_add(struct class_device *dev)
-+{
-+      struct ucb1x00 *ucb = classdev_to_ucb1x00(dev);
-+      simpad_battery.ucb  = ucb;
-+
-+      battery_class_register(&simpad_battery.battery);
-+
-+      return 0;
-+}
-+
-+static void ucb1x00_battery_remove(struct class_device *dev)
-+{
-+      return battery_class_unregister(&simpad_battery.battery);
-+}
-+
-+
-+static struct ucb1x00_class_interface ucb1x00_battery_interface = {
-+      .interface   = {
-+              .add    = ucb1x00_battery_add,
-+              .remove = ucb1x00_battery_remove,
-+      },
-+};
-+
-+
-+static int __init battery_register(void)
-+{
-+      return ucb1x00_register_interface(&ucb1x00_battery_interface);
-+}
-+
-+static void __exit battery_unregister(void)
-+{
-+      ucb1x00_unregister_interface(&ucb1x00_battery_interface);
-+}
-+
-+module_init(battery_register);
-+module_exit(battery_unregister);
-+
-+MODULE_AUTHOR("Holger Hans Peter Freyther");
-+MODULE_LICENSE("GPL");
-Index: linux-2.6.22/arch/arm/Kconfig
-===================================================================
---- linux-2.6.22.orig/arch/arm/Kconfig 2007-08-23 12:17:42.000000000 +0200
-+++ linux-2.6.22/arch/arm/Kconfig      2007-08-23 12:22:28.000000000 +0200
-@@ -1016,6 +1016,8 @@
- source "drivers/w1/Kconfig"
-+source "drivers/power/Kconfig"
-+
- source "drivers/hwmon/Kconfig"
- #source "drivers/l3/Kconfig"
-Index: linux-2.6.22/drivers/Kconfig
-===================================================================
---- linux-2.6.22.orig/drivers/Kconfig  2007-08-23 12:21:27.000000000 +0200
-+++ linux-2.6.22/drivers/Kconfig       2007-08-23 12:22:03.000000000 +0200
-@@ -54,6 +54,8 @@
- source "drivers/w1/Kconfig"
-+source "drivers/power/Kconfig"
-+
- source "drivers/hwmon/Kconfig"
- source "drivers/mfd/Kconfig"
-Index: linux-2.6.22/drivers/Makefile
-===================================================================
---- linux-2.6.22.orig/drivers/Makefile 2007-08-23 12:33:58.000000000 +0200
-+++ linux-2.6.22/drivers/Makefile      2007-08-23 12:34:34.000000000 +0200
-@@ -61,6 +61,7 @@
- obj-$(CONFIG_RTC_LIB)         += rtc/
- obj-y                         += i2c/
- obj-$(CONFIG_W1)              += w1/
-+obj-$(CONFIG_POWER_SUPPLY)    += power/
- obj-$(CONFIG_HWMON)           += hwmon/
- obj-$(CONFIG_PHONE)           += telephony/
- obj-$(CONFIG_MD)              += md/
-Index: linux-2.6.22/include/linux/power_supply.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.22/include/linux/power_supply.h  2007-08-23 12:37:10.000000000 +0200
-@@ -0,0 +1,175 @@
-+/*
-+ *  Universal power supply monitor class
-+ *
-+ *  Copyright (c) 2007  Anton Vorontsov <cbou@mail.ru>
-+ *  Copyright (c) 2004  Szabolcs Gyurko
-+ *  Copyright (c) 2003  Ian Molton <spyro@f2s.com>
-+ *
-+ *  Modified: 2004, Oct     Szabolcs Gyurko
-+ *
-+ *  You may use this code as per GPL version 2
-+ */
-+
-+#ifndef __LINUX_POWER_SUPPLY_H__
-+#define __LINUX_POWER_SUPPLY_H__
-+
-+#include <linux/device.h>
-+#include <linux/workqueue.h>
-+#include <linux/leds.h>
-+
-+/*
-+ * All voltages, currents, charges, energies, time and temperatures in uV,
-+ * uA, uAh, uWh, seconds and tenths of degree Celsius unless otherwise
-+ * stated. It's driver's job to convert its raw values to units in which
-+ * this class operates.
-+ */
-+
-+/*
-+ * For systems where the charger determines the maximum battery capacity
-+ * the min and max fields should be used to present these values to user
-+ * space. Unused/unknown fields will not appear in sysfs.
-+ */
-+
-+enum {
-+      POWER_SUPPLY_STATUS_UNKNOWN = 0,
-+      POWER_SUPPLY_STATUS_CHARGING,
-+      POWER_SUPPLY_STATUS_DISCHARGING,
-+      POWER_SUPPLY_STATUS_NOT_CHARGING,
-+      POWER_SUPPLY_STATUS_FULL,
-+};
-+
-+enum {
-+      POWER_SUPPLY_HEALTH_UNKNOWN = 0,
-+      POWER_SUPPLY_HEALTH_GOOD,
-+      POWER_SUPPLY_HEALTH_OVERHEAT,
-+      POWER_SUPPLY_HEALTH_DEAD,
-+};
-+
-+enum {
-+      POWER_SUPPLY_TECHNOLOGY_UNKNOWN = 0,
-+      POWER_SUPPLY_TECHNOLOGY_NIMH,
-+      POWER_SUPPLY_TECHNOLOGY_LION,
-+      POWER_SUPPLY_TECHNOLOGY_LIPO,
-+};
-+
-+enum {
-+      POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN = 0,
-+      POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL,
-+      POWER_SUPPLY_CAPACITY_LEVEL_LOW,
-+      POWER_SUPPLY_CAPACITY_LEVEL_NORMAL,
-+      POWER_SUPPLY_CAPACITY_LEVEL_HIGH,
-+      POWER_SUPPLY_CAPACITY_LEVEL_FULL,
-+};
-+
-+enum power_supply_property {
-+      /* Properties of type `int' */
-+      POWER_SUPPLY_PROP_STATUS = 0,
-+      POWER_SUPPLY_PROP_HEALTH,
-+      POWER_SUPPLY_PROP_PRESENT,
-+      POWER_SUPPLY_PROP_ONLINE,
-+      POWER_SUPPLY_PROP_TECHNOLOGY,
-+      POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
-+      POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
-+      POWER_SUPPLY_PROP_VOLTAGE_NOW,
-+      POWER_SUPPLY_PROP_VOLTAGE_AVG,
-+      POWER_SUPPLY_PROP_CURRENT_NOW,
-+      POWER_SUPPLY_PROP_CURRENT_AVG,
-+      POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
-+      POWER_SUPPLY_PROP_CHARGE_EMPTY_DESIGN,
-+      POWER_SUPPLY_PROP_CHARGE_FULL,
-+      POWER_SUPPLY_PROP_CHARGE_EMPTY,
-+      POWER_SUPPLY_PROP_CHARGE_NOW,
-+      POWER_SUPPLY_PROP_CHARGE_AVG,
-+      POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
-+      POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN,
-+      POWER_SUPPLY_PROP_ENERGY_FULL,
-+      POWER_SUPPLY_PROP_ENERGY_EMPTY,
-+      POWER_SUPPLY_PROP_ENERGY_NOW,
-+      POWER_SUPPLY_PROP_ENERGY_AVG,
-+      POWER_SUPPLY_PROP_CAPACITY, /* in percents! */
-+      POWER_SUPPLY_PROP_CAPACITY_LEVEL,
-+      POWER_SUPPLY_PROP_TEMP,
-+      POWER_SUPPLY_PROP_TEMP_AMBIENT,
-+      POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
-+      POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG,
-+      POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
-+      POWER_SUPPLY_PROP_TIME_TO_FULL_AVG,
-+      /* Properties of type `const char *' */
-+      POWER_SUPPLY_PROP_MODEL_NAME,
-+};
-+
-+enum power_supply_type {
-+      POWER_SUPPLY_TYPE_BATTERY = 0,
-+      POWER_SUPPLY_TYPE_UPS,
-+      POWER_SUPPLY_TYPE_MAINS,
-+      POWER_SUPPLY_TYPE_USB,
-+};
-+
-+union power_supply_propval {
-+      int intval;
-+      const char *strval;
-+};
-+
-+struct power_supply {
-+      const char *name;
-+      enum power_supply_type type;
-+      enum power_supply_property *properties;
-+      size_t num_properties;
-+
-+      char **supplied_to;
-+      size_t num_supplicants;
-+
-+      int (*get_property)(struct power_supply *psy,
-+                          enum power_supply_property psp,
-+                          union power_supply_propval *val);
-+      void (*external_power_changed)(struct power_supply *psy);
-+
-+      /* For APM emulation, think legacy userspace. */
-+      int use_for_apm;
-+
-+      /* private */
-+      struct device *dev;
-+      struct work_struct changed_work;
-+
-+#ifdef CONFIG_LEDS_TRIGGERS
-+      struct led_trigger *charging_full_trig;
-+      char *charging_full_trig_name;
-+      struct led_trigger *charging_trig;
-+      char *charging_trig_name;
-+      struct led_trigger *full_trig;
-+      char *full_trig_name;
-+      struct led_trigger *online_trig;
-+      char *online_trig_name;
-+#endif
-+};
-+
-+/*
-+ * This is recommended structure to specify static power supply parameters.
-+ * Generic one, parametrizable for different power supplies. Power supply
-+ * class itself does not use it, but that's what implementing most platform
-+ * drivers, should try reuse for consistency.
-+ */
-+
-+struct power_supply_info {
-+      const char *name;
-+      int technology;
-+      int voltage_max_design;
-+      int voltage_min_design;
-+      int charge_full_design;
-+      int charge_empty_design;
-+      int energy_full_design;
-+      int energy_empty_design;
-+      int use_for_apm;
-+};
-+
-+extern void power_supply_changed(struct power_supply *psy);
-+extern int power_supply_am_i_supplied(struct power_supply *psy);
-+
-+extern int power_supply_register(struct device *parent,
-+                                 struct power_supply *psy);
-+extern void power_supply_unregister(struct power_supply *psy);
-+
-+/* For APM emulation, think legacy userspace. */
-+extern struct class *power_supply_class;
-+
-+#endif /* __LINUX_POWER_SUPPLY_H__ */
diff --git a/meta/packages/linux/linux-rp-2.6.22/pxa-serial-hack.patch b/meta/packages/linux/linux-rp-2.6.22/pxa-serial-hack.patch
deleted file mode 100644 (file)
index bf20f46..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
----
- drivers/serial/8250.c        |    5 +++++
- drivers/serial/serial_core.c |    1 +
- drivers/serial/serial_cs.c   |   12 +++++++++---
- include/linux/serial_core.h  |    1 +
- 4 files changed, 16 insertions(+), 3 deletions(-)
-
-Index: linux-2.6.20/drivers/serial/8250.c
-===================================================================
---- linux-2.6.20.orig/drivers/serial/8250.c    2007-04-27 13:37:26.000000000 +0100
-+++ linux-2.6.20/drivers/serial/8250.c 2007-04-27 13:38:16.000000000 +0100
-@@ -2429,7 +2429,12 @@
-       .driver_name            = "serial",
-       .dev_name               = "ttyS",
-       .major                  = TTY_MAJOR,
-+#ifdef CONFIG_SERIAL_PXA
-+      .minor                  = 64 + 4,
-+      .name_base              = 4,
-+#else
-       .minor                  = 64,
-+#endif
-       .nr                     = UART_NR,
-       .cons                   = SERIAL8250_CONSOLE,
- };
-Index: linux-2.6.20/drivers/serial/serial_core.c
-===================================================================
---- linux-2.6.20.orig/drivers/serial/serial_core.c     2007-02-04 18:44:54.000000000 +0000
-+++ linux-2.6.20/drivers/serial/serial_core.c  2007-04-27 13:39:39.000000000 +0100
-@@ -2068,7 +2068,8 @@
-       printk(KERN_INFO "%s%s%s%d at %s (irq = %d) is a %s\n",
-              port->dev ? port->dev->bus_id : "",
-              port->dev ? ": " : "",
--             drv->dev_name, port->line, address, port->irq, uart_type(port));
-+             drv->dev_name, port->line + drv->name_base, address, port->irq,
-+             uart_type(port));
- }
- static void
-@@ -2183,6 +2184,7 @@
-       normal->owner           = drv->owner;
-       normal->driver_name     = drv->driver_name;
-       normal->name            = drv->dev_name;
-+      normal->name_base       = drv->name_base;
-       normal->major           = drv->major;
-       normal->minor_start     = drv->minor;
-       normal->type            = TTY_DRIVER_TYPE_SERIAL;
-Index: linux-2.6.20/include/linux/serial_core.h
-===================================================================
---- linux-2.6.20.orig/include/linux/serial_core.h      2007-02-04 18:44:54.000000000 +0000
-+++ linux-2.6.20/include/linux/serial_core.h   2007-04-27 13:37:27.000000000 +0100
-@@ -341,6 +341,7 @@
-       struct module           *owner;
-       const char              *driver_name;
-       const char              *dev_name;
-+      int                      name_base;
-       int                      major;
-       int                      minor;
-       int                      nr;
-Index: linux-2.6.20/drivers/serial/serial_cs.c
-===================================================================
---- linux-2.6.20.orig/drivers/serial/serial_cs.c       2007-02-04 18:44:54.000000000 +0000
-+++ linux-2.6.20/drivers/serial/serial_cs.c    2007-04-27 13:40:34.000000000 +0100
-@@ -390,7 +390,7 @@
-                       kio_addr_t iobase, int irq)
- {
-       struct uart_port port;
--      int line;
-+      int line, linestart;
-       memset(&port, 0, sizeof (struct uart_port));
-       port.iobase = iobase;
-@@ -411,10 +411,16 @@
-               return -EINVAL;
-       }
-+#if CONFIG_SERIAL_PXA
-+      linestart = 4;
-+#else
-+      linestart = 0;
-+#endif
-+
-       info->line[info->ndev] = line;
--      sprintf(info->node[info->ndev].dev_name, "ttyS%d", line);
-+      sprintf(info->node[info->ndev].dev_name, "ttyS%d", line+linestart);
-       info->node[info->ndev].major = TTY_MAJOR;
--      info->node[info->ndev].minor = 0x40 + line;
-+      info->node[info->ndev].minor = 0x40 + line + linestart;
-       if (info->ndev > 0)
-               info->node[info->ndev - 1].next = &info->node[info->ndev];
-       info->ndev++;
diff --git a/meta/packages/linux/linux-rp-2.6.22/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch b/meta/packages/linux/linux-rp-2.6.22/serial-add-support-for-non-standard-xtals-to-16c950-driver.patch
deleted file mode 100644 (file)
index b513ba1..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-
-From: Petr Vandrovec <vandrove@vc.cvut.cz>
-
-Patch below adds support for using different prescaler than 16 for 16c950
-chips.  This is needed for using Fujitsu-Siemens Connect2Air compact-flash
-card, which comes (apparently) with 806kHz clocks, and so you have to
-program prescaler for division by 7, and DLAB to 1, to get 115200Bd.  
-
-To get card properly running you also have to add lines below to
-/etc/pcmcia/serial.opts so kernel knows that base speed is not 115200 but
-50400 (50400 * 16 = 806400; 806400 / 7 = 115200).  As I've found no code
-specifying baud_rate in serial_cs, I assume that specifying it in
-serial.opts is right way to do this type of things.
-
-Patch also fixes problem that for UPF_MAGIC_MULTIPLIER maximum possible
-baud rate passed to uart code was uartclk / 16 while correct value for
-these devices (and for 16c950) is uartclk / 4.
-
-Patch also fixes problem that for UPF_MAGIC_MULTIPLIER devices with
-baud_rate 19200 or 9600 spd_cust did not work correctly.  Not that such
-devices exist, but we should not ignore spd_cust, user probably knows why
-he asked for spd_cust.
-
-serial.opts:
-
-case "$MANFID-$FUNCID-$PRODID_1-$PRODID_2-$PRODID_3-$PRODID_4" in
-'0279,950b-2-GPRS Modem---')
-    SERIAL_OPTS="baud_base 50400"
-    ;;
-esac
-
-Cc: David Woodhouse <dwmw2@infradead.org>
-Signed-off-by: Andrew Morton <akpm@osdl.org>
----
-
- drivers/serial/8250.c |   82 +++++++++++++++++++++++++++++++++++++++-----------
- 1 file changed, 64 insertions(+), 18 deletions(-)
-
-Index: linux-2.6.21/drivers/serial/8250.c
-===================================================================
---- linux-2.6.21.orig/drivers/serial/8250.c    2007-07-01 16:59:52.000000000 +0100
-+++ linux-2.6.21/drivers/serial/8250.c 2007-07-01 17:01:21.000000000 +0100
-@@ -1964,24 +1964,58 @@ static void serial8250_shutdown(struct u
-               serial_unlink_irq_chain(up);
- }
--static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud)
-+static unsigned int serial8250_get_divisor(struct uart_port *port, unsigned int baud,
-+                                         unsigned int *prescaler)
- {
--      unsigned int quot;
--
--      /*
--       * Handle magic divisors for baud rates above baud_base on
--       * SMSC SuperIO chips.
-+        /*
-+       * Use special handling only if user did not supply its own divider.
-+       * spd_cust is defined in terms of baud_base, so always use default
-+       * prescaler when spd_cust is requested.
-        */
--      if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
--          baud == (port->uartclk/4))
--              quot = 0x8001;
--      else if ((port->flags & UPF_MAGIC_MULTIPLIER) &&
--               baud == (port->uartclk/8))
--              quot = 0x8002;
--      else
--              quot = uart_get_divisor(port, baud);
--      return quot;
-+      *prescaler = 16;
-+        if (baud != 38400 || (port->flags & UPF_SPD_MASK) != UPF_SPD_CUST) {
-+              unsigned int quot = port->uartclk / baud;
-+
-+              /*
-+               * Handle magic divisors for baud rates above baud_base on
-+               * SMSC SuperIO chips.
-+               */
-+              if (port->flags & UPF_MAGIC_MULTIPLIER) {
-+                      if (quot == 4) {
-+                              return 0x8001;
-+                      } else if (quot == 8) {
-+                              return 0x8002;
-+                      }
-+              }
-+              if (port->type == PORT_16C950) {
-+                      /*
-+                       * This computes TCR value (4 to 16), not CPR value (which can
-+                       * be between 1.000 and 31.875) - chip I have uses XTAL of
-+                       * 806400Hz, and so a division by 7 is required to get 115200Bd.
-+                       * I'm leaving CPR disabled for now, until someone will
-+                       * hit even more exotic XTAL (it is needed to get 500kbps
-+                       * or 1000kbps from 18.432MHz XTAL, but I have no device
-+                       * which would benefit from doing that).
-+                       *
-+                       * If we can use divide by 16, use it.  Otherwise look for
-+                       * better prescaler, from 15 to 4.  If quotient cannot
-+                       * be divided by any integer value between 4 and 15, use 4.
-+                       */
-+                      if (quot & 0x0F) {
-+                              unsigned int div;
-+
-+                              for (div = 15; div > 4; div--) {
-+                                      if (quot % div == 0) {
-+                                              break;
-+                                      }
-+                              }
-+                              *prescaler = div;
-+                              return quot / div;
-+                      }
-+              }
-+      }
-+      return uart_get_divisor(port, baud);
- }
- static void
-@@ -1991,7 +2025,7 @@ serial8250_set_termios(struct uart_port 
-       struct uart_8250_port *up = (struct uart_8250_port *)port;
-       unsigned char cval, fcr = 0;
-       unsigned long flags;
--      unsigned int baud, quot;
-+      unsigned int baud, quot, prescaler;
-       switch (termios->c_cflag & CSIZE) {
-       case CS5:
-@@ -2023,8 +2057,13 @@ serial8250_set_termios(struct uart_port 
-       /*
-        * Ask the core to calculate the divisor for us.
-        */
--      baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
--      quot = serial8250_get_divisor(port, baud);
-+      if (port->type == PORT_16C950 || (port->flags & UPF_MAGIC_MULTIPLIER)) {
-+              baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/4);
-+      } else {
-+              baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
-+      }
-+      quot = serial8250_get_divisor(port, baud, &prescaler);
-+
-       /*
-        * Oxford Semi 952 rev B workaround
-@@ -2139,6 +2178,13 @@ serial8250_set_termios(struct uart_port 
-       serial_dl_write(up, quot);
-       /*
-+       * Program prescaler for 16C950 chips.
-+       */
-+      if (up->port.type == PORT_16C950) {
-+              serial_icr_write(up, UART_TCR, prescaler == 16 ? 0 : prescaler);
-+      }
-+
-+      /*
-        * LCR DLAB must be set to enable 64-byte FIFO mode. If the FCR
-        * is written without DLAB set, this mode will be disabled.
-        */
diff --git a/meta/packages/linux/linux-rp-2.6.22/squashfs3.0-2.6.15.patch b/meta/packages/linux/linux-rp-2.6.22/squashfs3.0-2.6.15.patch
deleted file mode 100644 (file)
index 6312efe..0000000
+++ /dev/null
@@ -1,4189 +0,0 @@
- fs/Kconfig                     |   65 +
- fs/Makefile                    |    1 
- fs/squashfs/Makefile           |    7 
- fs/squashfs/inode.c            | 2122 +++++++++++++++++++++++++++++++++++++++++
- fs/squashfs/squashfs.h         |   86 +
- fs/squashfs/squashfs2_0.c      |  757 ++++++++++++++
- include/linux/squashfs_fs.h    |  911 +++++++++++++++++
- include/linux/squashfs_fs_i.h  |   45 
- include/linux/squashfs_fs_sb.h |   74 +
- init/do_mounts_rd.c            |   13 
- 10 files changed, 4081 insertions(+)
-
-Index: linux-2.6.21/fs/Kconfig
-===================================================================
---- linux-2.6.21.orig/fs/Kconfig       2007-07-01 17:09:49.000000000 +0100
-+++ linux-2.6.21/fs/Kconfig    2007-07-01 17:09:57.000000000 +0100
-@@ -1393,6 +1393,71 @@ config CRAMFS
-         If unsure, say N.
-+config SQUASHFS
-+      tristate "SquashFS 3.0 - Squashed file system support"
-+      select ZLIB_INFLATE
-+      help
-+        Saying Y here includes support for SquashFS 3.0 (a Compressed Read-Only File
-+        System).  Squashfs is a highly compressed read-only filesystem for Linux.
-+        It uses zlib compression to compress both files, inodes and directories.
-+        Inodes in the system are very small and all blocks are packed to minimise
-+        data overhead. Block sizes greater than 4K are supported up to a maximum of 64K.
-+        SquashFS 3.0 supports 64 bit filesystems and files (larger than 4GB), full
-+        uid/gid information, hard links and timestamps.
-+
-+        Squashfs is intended for general read-only filesystem use, for archival
-+        use (i.e. in cases where a .tar.gz file may be used), and in embedded
-+        systems where low overhead is needed.  Further information and filesystem tools
-+        are available from http://squashfs.sourceforge.net.
-+
-+        If you want to compile this as a module ( = code which can be
-+        inserted in and removed from the running kernel whenever you want),
-+        say M here and read <file:Documentation/modules.txt>.  The module
-+        will be called squashfs.  Note that the root file system (the one
-+        containing the directory /) cannot be compiled as a module.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_EMBEDDED
-+
-+      bool "Additional options for memory-constrained systems" 
-+      depends on SQUASHFS
-+      default n
-+      help
-+        Saying Y here allows you to specify cache sizes and how Squashfs
-+        allocates memory.  This is only intended for memory constrained
-+        systems.
-+
-+        If unsure, say N.
-+
-+config SQUASHFS_FRAGMENT_CACHE_SIZE
-+      int "Number of fragments cached" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default "3"
-+      help
-+        By default SquashFS caches the last 3 fragments read from
-+        the filesystem.  Increasing this amount may mean SquashFS
-+        has to re-read fragments less often from disk, at the expense
-+        of extra system memory.  Decreasing this amount will mean
-+        SquashFS uses less memory at the expense of extra reads from disk.
-+
-+        Note there must be at least one cached fragment.  Anything
-+        much more than three will probably not make much difference.
-+
-+config SQUASHFS_VMALLOC
-+      bool "Use Vmalloc rather than Kmalloc" if SQUASHFS_EMBEDDED
-+      depends on SQUASHFS
-+      default n
-+      help
-+        By default SquashFS uses kmalloc to obtain fragment cache memory.
-+        Kmalloc memory is the standard kernel allocator, but it can fail
-+        on memory constrained systems.  Because of the way Vmalloc works,
-+        Vmalloc can succeed when kmalloc fails.  Specifying this option
-+        will make SquashFS always use Vmalloc to allocate the
-+        fragment cache memory.
-+
-+        If unsure, say N.
-+
- config VXFS_FS
-       tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)"
-       depends on BLOCK
-Index: linux-2.6.21/fs/Makefile
-===================================================================
---- linux-2.6.21.orig/fs/Makefile      2007-07-01 17:09:46.000000000 +0100
-+++ linux-2.6.21/fs/Makefile   2007-07-01 17:09:57.000000000 +0100
-@@ -72,6 +72,7 @@ obj-$(CONFIG_JBD)            += jbd/
- obj-$(CONFIG_JBD2)            += jbd2/
- obj-$(CONFIG_EXT2_FS)         += ext2/
- obj-$(CONFIG_CRAMFS)          += cramfs/
-+obj-$(CONFIG_SQUASHFS)                += squashfs/
- obj-$(CONFIG_RAMFS)           += ramfs/
- obj-$(CONFIG_HUGETLBFS)               += hugetlbfs/
- obj-$(CONFIG_CODA_FS)         += coda/
-Index: linux-2.6.21/fs/squashfs/inode.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/fs/squashfs/inode.c   2007-07-01 17:54:23.000000000 +0100
-@@ -0,0 +1,2122 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * inode.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+
-+static void squashfs_put_super(struct super_block *);
-+static int squashfs_statfs(struct dentry *, struct kstatfs *);
-+static int squashfs_symlink_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage(struct file *file, struct page *page);
-+static int squashfs_readpage4K(struct file *file, struct page *page);
-+static int squashfs_readdir(struct file *, void *, filldir_t);
-+static struct inode *squashfs_alloc_inode(struct super_block *sb);
-+static void squashfs_destroy_inode(struct inode *inode);
-+static int init_inodecache(void);
-+static void destroy_inodecache(void);
-+static struct dentry *squashfs_lookup(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode);
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize);
-+static int squashfs_get_sb(struct file_system_type *, int,
-+                              const char *, void *, struct vfsmount *);
-+
-+
-+static z_stream stream;
-+
-+static struct file_system_type squashfs_fs_type = {
-+      .owner = THIS_MODULE,
-+      .name = "squashfs",
-+      .get_sb = squashfs_get_sb,
-+      .kill_sb = kill_block_super,
-+      .fs_flags = FS_REQUIRES_DEV
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static struct super_operations squashfs_ops = {
-+      .alloc_inode = squashfs_alloc_inode,
-+      .destroy_inode = squashfs_destroy_inode,
-+      .statfs = squashfs_statfs,
-+      .put_super = squashfs_put_super,
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = {
-+      .readpage = squashfs_symlink_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops = {
-+      .readpage = squashfs_readpage
-+};
-+
-+SQSH_EXTERN struct address_space_operations squashfs_aops_4K = {
-+      .readpage = squashfs_readpage4K
-+};
-+
-+static struct file_operations squashfs_dir_ops = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir
-+};
-+
-+SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = {
-+      .lookup = squashfs_lookup
-+};
-+
-+
-+static struct buffer_head *get_block_length(struct super_block *s,
-+                              int *cur_index, int *offset, int *c_byte)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned short temp;
-+      struct buffer_head *bh;
-+
-+      if (!(bh = sb_bread(s, *cur_index)))
-+              goto out;
-+
-+      if (msblk->devblksize - *offset == 1) {
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              else
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+              brelse(bh);
-+              if (!(bh = sb_bread(s, ++(*cur_index))))
-+                      goto out;
-+              if (msblk->swap)
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              bh->b_data); 
-+              else
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              bh->b_data); 
-+              *c_byte = temp;
-+              *offset = 1;
-+      } else {
-+              if (msblk->swap) {
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1)); 
-+              } else {
-+                      ((unsigned char *) &temp)[0] = *((unsigned char *)
-+                              (bh->b_data + *offset));
-+                      ((unsigned char *) &temp)[1] = *((unsigned char *)
-+                              (bh->b_data + *offset + 1)); 
-+              }
-+              *c_byte = temp;
-+              *offset += 2;
-+      }
-+
-+      if (SQUASHFS_CHECK_DATA(msblk->sblk.flags)) {
-+              if (*offset == msblk->devblksize) {
-+                      brelse(bh);
-+                      if (!(bh = sb_bread(s, ++(*cur_index))))
-+                              goto out;
-+                      *offset = 0;
-+              }
-+              if (*((unsigned char *) (bh->b_data + *offset)) !=
-+                                              SQUASHFS_MARKER_BYTE) {
-+                      ERROR("Metadata block marker corrupt @ %x\n",
-+                                              *cur_index);
-+                      brelse(bh);
-+                      goto out;
-+              }
-+              (*offset)++;
-+      }
-+      return bh;
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+SQSH_EXTERN unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                      long long index, unsigned int length,
-+                      long long *next_index)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct buffer_head *bh[((SQUASHFS_FILE_MAX_SIZE - 1) >>
-+                      msblk->devblksize_log2) + 2];
-+      unsigned int offset = index & ((1 << msblk->devblksize_log2) - 1);
-+      unsigned int cur_index = index >> msblk->devblksize_log2;
-+      int bytes, avail_bytes, b = 0, k;
-+      char *c_buffer;
-+      unsigned int compressed;
-+      unsigned int c_byte = length;
-+
-+      if (c_byte) {
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED_BLOCK(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              if (!(bh[0] = sb_getblk(s, cur_index)))
-+                      goto block_release;
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b, bh);
-+      } else {
-+              if (!(bh[0] = get_block_length(s, &cur_index, &offset,
-+                                                              &c_byte)))
-+                      goto read_failure;
-+
-+              bytes = msblk->devblksize - offset;
-+              compressed = SQUASHFS_COMPRESSED(c_byte);
-+              c_buffer = compressed ? msblk->read_data : buffer;
-+              c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte);
-+
-+              TRACE("Block @ 0x%llx, %scompressed size %d\n", index, compressed
-+                                      ? "" : "un", (unsigned int) c_byte);
-+
-+              for (b = 1; bytes < c_byte; b++) {
-+                      if (!(bh[b] = sb_getblk(s, ++cur_index)))
-+                              goto block_release;
-+                      bytes += msblk->devblksize;
-+              }
-+              ll_rw_block(READ, b - 1, bh + 1);
-+      }
-+
-+      if (compressed)
-+              down(&msblk->read_data_mutex);
-+
-+      for (bytes = 0, k = 0; k < b; k++) {
-+              avail_bytes = (c_byte - bytes) > (msblk->devblksize - offset) ?
-+                                      msblk->devblksize - offset :
-+                                      c_byte - bytes;
-+              wait_on_buffer(bh[k]);
-+              if (!buffer_uptodate(bh[k]))
-+                      goto block_release;
-+              memcpy(c_buffer + bytes, bh[k]->b_data + offset, avail_bytes);
-+              bytes += avail_bytes;
-+              offset = 0;
-+              brelse(bh[k]);
-+      }
-+
-+      /*
-+       * uncompress block
-+       */
-+      if (compressed) {
-+              int zlib_err;
-+
-+              stream.next_in = c_buffer;
-+              stream.avail_in = c_byte;
-+              stream.next_out = buffer;
-+              stream.avail_out = msblk->read_size;
-+
-+              if (((zlib_err = zlib_inflateInit(&stream)) != Z_OK) ||
-+                              ((zlib_err = zlib_inflate(&stream, Z_FINISH))
-+                               != Z_STREAM_END) || ((zlib_err =
-+                              zlib_inflateEnd(&stream)) != Z_OK)) {
-+                      ERROR("zlib_fs returned unexpected result 0x%x\n",
-+                              zlib_err);
-+                      bytes = 0;
-+              } else
-+                      bytes = stream.total_out;
-+              
-+              up(&msblk->read_data_mutex);
-+      }
-+
-+      if (next_index)
-+              *next_index = index + c_byte + (length ? 0 :
-+                              (SQUASHFS_CHECK_DATA(msblk->sblk.flags)
-+                               ? 3 : 2));
-+      return bytes;
-+
-+block_release:
-+      while (--b >= 0)
-+              brelse(bh[b]);
-+
-+read_failure:
-+      ERROR("sb_bread failed reading block 0x%x\n", cur_index);
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      int n, i, bytes, return_length = length;
-+      long long next_index;
-+
-+      TRACE("Entered squashfs_get_cached_block [%llx:%x]\n", block, offset);
-+
-+      while ( 1 ) {
-+              for (i = 0; i < SQUASHFS_CACHED_BLKS; i++) 
-+                      if (msblk->block_cache[i].block == block)
-+                              break; 
-+              
-+              down(&msblk->block_cache_mutex);
-+
-+              if (i == SQUASHFS_CACHED_BLKS) {
-+                      /* read inode header block */
-+                      for (i = msblk->next_cache, n = SQUASHFS_CACHED_BLKS;
-+                                      n ; n --, i = (i + 1) %
-+                                      SQUASHFS_CACHED_BLKS)
-+                              if (msblk->block_cache[i].block !=
-+                                                      SQUASHFS_USED_BLK)
-+                                      break;
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->waitq, &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->block_cache_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->waitq, &wait);
-+                              continue;
-+                      }
-+                      msblk->next_cache = (i + 1) % SQUASHFS_CACHED_BLKS;
-+
-+                      if (msblk->block_cache[i].block ==
-+                                                      SQUASHFS_INVALID_BLK) {
-+                              if (!(msblk->block_cache[i].data =
-+                                              kmalloc(SQUASHFS_METADATA_SIZE,
-+                                              GFP_KERNEL))) {
-+                                      ERROR("Failed to allocate cache"
-+                                                      "block\n");
-+                                      up(&msblk->block_cache_mutex);
-+                                      goto out;
-+                              }
-+                      }
-+      
-+                      msblk->block_cache[i].block = SQUASHFS_USED_BLK;
-+                      up(&msblk->block_cache_mutex);
-+
-+                      if (!(msblk->block_cache[i].length =
-+                                              squashfs_read_data(s,
-+                                              msblk->block_cache[i].data,
-+                                              block, 0, &next_index))) {
-+                              ERROR("Unable to read cache block [%llx:%x]\n",
-+                                              block, offset);
-+                              goto out;
-+                      }
-+
-+                      down(&msblk->block_cache_mutex);
-+                      wake_up(&msblk->waitq);
-+                      msblk->block_cache[i].block = block;
-+                      msblk->block_cache[i].next_index = next_index;
-+                      TRACE("Read cache block [%llx:%x]\n", block, offset);
-+              }
-+
-+              if (msblk->block_cache[i].block != block) {
-+                      up(&msblk->block_cache_mutex);
-+                      continue;
-+              }
-+
-+              if ((bytes = msblk->block_cache[i].length - offset) >= length) {
-+                      if (buffer)
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, length);
-+                      if (msblk->block_cache[i].length - offset == length) {
-+                              *next_block = msblk->block_cache[i].next_index;
-+                              *next_offset = 0;
-+                      } else {
-+                              *next_block = block;
-+                              *next_offset = offset + length;
-+                      }
-+                      up(&msblk->block_cache_mutex);
-+                      goto finish;
-+              } else {
-+                      if (buffer) {
-+                              memcpy(buffer, msblk->block_cache[i].data +
-+                                              offset, bytes);
-+                              buffer += bytes;
-+                      }
-+                      block = msblk->block_cache[i].next_index;
-+                      up(&msblk->block_cache_mutex);
-+                      length -= bytes;
-+                      offset = 0;
-+              }
-+      }
-+
-+finish:
-+      return return_length;
-+out:
-+      return 0;
-+}
-+
-+
-+static int get_fragment_location(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index[SQUASHFS_FRAGMENT_INDEX(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET(fragment);
-+      struct squashfs_fragment_entry fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+SQSH_EXTERN void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment)
-+{
-+      down(&msblk->fragment_mutex);
-+      fragment->locked --;
-+      wake_up(&msblk->fragment_wait_queue);
-+      up(&msblk->fragment_mutex);
-+}
-+
-+
-+SQSH_EXTERN struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length)
-+{
-+      int i, n, nf;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+
-+      while ( 1 ) {
-+              down(&msblk->fragment_mutex);
-+
-+              for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS &&
-+                              msblk->fragment[i].block != start_block; i++);
-+
-+              if (i == SQUASHFS_CACHED_FRAGMENTS) {
-+                      nf = (msblk->next_fragment + 1) % 
-+                              SQUASHFS_CACHED_FRAGMENTS;
-+                      for (i = msblk->next_fragment, n =
-+                              SQUASHFS_CACHED_FRAGMENTS; n &&
-+                              msblk->fragment[i].locked; n--, i = (i + 1) %
-+                              SQUASHFS_CACHED_FRAGMENTS);
-+
-+                      if (n == 0) {
-+                              wait_queue_t wait;
-+
-+                              init_waitqueue_entry(&wait, current);
-+                              add_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              set_current_state(TASK_UNINTERRUPTIBLE);
-+                              up(&msblk->fragment_mutex);
-+                              schedule();
-+                              set_current_state(TASK_RUNNING);
-+                              remove_wait_queue(&msblk->fragment_wait_queue,
-+                                                                      &wait);
-+                              continue;
-+                      }
-+                      msblk->next_fragment = nf;
-+                      
-+                      if (msblk->fragment[i].data == NULL)
-+                              if (!(msblk->fragment[i].data = SQUASHFS_ALLOC
-+                                              (SQUASHFS_FILE_MAX_SIZE))) {
-+                                      ERROR("Failed to allocate fragment "
-+                                                      "cache block\n");
-+                                      up(&msblk->fragment_mutex);
-+                                      goto out;
-+                              }
-+
-+                      msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+                      msblk->fragment[i].locked = 1;
-+                      up(&msblk->fragment_mutex);
-+
-+                      if (!(msblk->fragment[i].length = squashfs_read_data(s,
-+                                              msblk->fragment[i].data,
-+                                              start_block, length, NULL))) {
-+                              ERROR("Unable to read fragment cache block "
-+                                                      "[%llx]\n", start_block);
-+                              msblk->fragment[i].locked = 0;
-+                              goto out;
-+                      }
-+
-+                      msblk->fragment[i].block = start_block;
-+                      TRACE("New fragment %d, start block %lld, locked %d\n",
-+                                              i, msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+                      break;
-+              }
-+
-+              msblk->fragment[i].locked++;
-+              up(&msblk->fragment_mutex);
-+              TRACE("Got fragment %d, start block %lld, locked %d\n", i,
-+                                              msblk->fragment[i].block,
-+                                              msblk->fragment[i].locked);
-+              break;
-+      }
-+
-+      return &msblk->fragment[i];
-+
-+out:
-+      return NULL;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header *inodeb)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = inodeb->inode_number;
-+              i->i_mtime.tv_sec = inodeb->mtime;
-+              i->i_atime.tv_sec = inodeb->mtime;
-+              i->i_ctime.tv_sec = inodeb->mtime;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header id, sid;
-+      struct squashfs_base_inode_header *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_reg_inode_header *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header *sinodep = &sid.reg;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = 1;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_LREG_TYPE: {
-+                      unsigned int frag_size;
-+                      long long frag_blk;
-+                      struct squashfs_lreg_inode_header *inodep = &id.lreg;
-+                      struct squashfs_lreg_inode_header *sinodep = &sid.lreg;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LREG_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %llx, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops;
-+                      i->i_fop = &squashfs_dir_ops;
-+                      i->i_mode |= S_IFDIR;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = inodep->parent_inode;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header *sinodep =
-+                                                              &sid.symlink;
-+      
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      struct squashfs_ipc_inode_header *inodep = &id.ipc;
-+                      struct squashfs_ipc_inode_header *sinodep = &sid.ipc;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_IPC_INODE_HEADER(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_nlink = inodep->nlink;
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+      
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%llx:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int read_fragment_index_table(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      /* Allocate fragment index table */
-+      if (!(msblk->fragment_index = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+   
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              long long fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES((&fragment),
-+                                              &msblk->fragment_index[i], 1);
-+                      msblk->fragment_index[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int supported_squashfs_filesystem(struct squashfs_sb_info *msblk, int silent)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget;
-+      msblk->read_blocklist = read_blocklist;
-+      msblk->read_fragment_index_table = read_fragment_index_table;
-+
-+      if (sblk->s_major == 1) {
-+              if (!squashfs_1_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 1.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 1.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if (sblk->s_major == 2) {
-+              if (!squashfs_2_0_supported(msblk)) {
-+                      SERROR("Major/Minor mismatch, Squashfs 2.0 filesystems "
-+                              "are unsupported\n");
-+                      SERROR("Please recompile with "
-+                              "Squashfs 2.0 support enabled\n");
-+                      return 0;
-+              }
-+      } else if(sblk->s_major != SQUASHFS_MAJOR || sblk->s_minor >
-+                      SQUASHFS_MINOR) {
-+              SERROR("Major/Minor mismatch, trying to mount newer %d.%d "
-+                              "filesystem\n", sblk->s_major, sblk->s_minor);
-+              SERROR("Please update your kernel\n");
-+              return 0;
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int squashfs_fill_super(struct super_block *s, void *data, int silent)
-+{
-+      struct squashfs_sb_info *msblk;
-+      struct squashfs_super_block *sblk;
-+      int i;
-+      char b[BDEVNAME_SIZE];
-+      struct inode *root;
-+
-+      TRACE("Entered squashfs_read_superblock\n");
-+
-+      if (!(s->s_fs_info = kmalloc(sizeof(struct squashfs_sb_info),
-+                                              GFP_KERNEL))) {
-+              ERROR("Failed to allocate superblock\n");
-+              goto failure;
-+      }
-+      memset(s->s_fs_info, 0, sizeof(struct squashfs_sb_info));
-+      msblk = s->s_fs_info;
-+      sblk = &msblk->sblk;
-+      
-+      msblk->devblksize = sb_min_blocksize(s, BLOCK_SIZE);
-+      msblk->devblksize_log2 = ffz(~msblk->devblksize);
-+
-+      init_MUTEX(&msblk->read_data_mutex);
-+      init_MUTEX(&msblk->read_page_mutex);
-+      init_MUTEX(&msblk->block_cache_mutex);
-+      init_MUTEX(&msblk->fragment_mutex);
-+      init_MUTEX(&msblk->meta_index_mutex);
-+      
-+      init_waitqueue_head(&msblk->waitq);
-+      init_waitqueue_head(&msblk->fragment_wait_queue);
-+
-+      if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START,
-+                                      sizeof(struct squashfs_super_block) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              SERROR("unable to read superblock\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Check it is a SQUASHFS superblock */
-+      msblk->swap = 0;
-+      if ((s->s_magic = sblk->s_magic) != SQUASHFS_MAGIC) {
-+              if (sblk->s_magic == SQUASHFS_MAGIC_SWAP) {
-+                      struct squashfs_super_block ssblk;
-+
-+                      WARNING("Mounting a different endian SQUASHFS "
-+                              "filesystem on %s\n", bdevname(s->s_bdev, b));
-+
-+                      SQUASHFS_SWAP_SUPER_BLOCK(&ssblk, sblk);
-+                      memcpy(sblk, &ssblk, sizeof(struct squashfs_super_block));
-+                      msblk->swap = 1;
-+              } else  {
-+                      SERROR("Can't find a SQUASHFS superblock on %s\n",
-+                                                      bdevname(s->s_bdev, b));
-+                      goto failed_mount;
-+              }
-+      }
-+
-+      /* Check the MAJOR & MINOR versions */
-+      if(!supported_squashfs_filesystem(msblk, silent))
-+              goto failed_mount;
-+
-+      TRACE("Found valid superblock on %s\n", bdevname(s->s_bdev, b));
-+      TRACE("Inodes are %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_INODES
-+                                      (sblk->flags) ? "un" : "");
-+      TRACE("Data is %scompressed\n",
-+                                      SQUASHFS_UNCOMPRESSED_DATA(sblk->flags)
-+                                      ? "un" : "");
-+      TRACE("Check data is %s present in the filesystem\n",
-+                                      SQUASHFS_CHECK_DATA(sblk->flags) ?
-+                                      "" : "not");
-+      TRACE("Filesystem size %lld bytes\n", sblk->bytes_used);
-+      TRACE("Block size %d\n", sblk->block_size);
-+      TRACE("Number of inodes %d\n", sblk->inodes);
-+      if (sblk->s_major > 1)
-+              TRACE("Number of fragments %d\n", sblk->fragments);
-+      TRACE("Number of uids %d\n", sblk->no_uids);
-+      TRACE("Number of gids %d\n", sblk->no_guids);
-+      TRACE("sblk->inode_table_start %llx\n", sblk->inode_table_start);
-+      TRACE("sblk->directory_table_start %llx\n", sblk->directory_table_start);
-+      if (sblk->s_major > 1)
-+              TRACE("sblk->fragment_table_start %llx\n",
-+                                      sblk->fragment_table_start);
-+      TRACE("sblk->uid_start %llx\n", sblk->uid_start);
-+
-+      s->s_flags |= MS_RDONLY;
-+      s->s_op = &squashfs_ops;
-+
-+      /* Init inode_table block pointer array */
-+      if (!(msblk->block_cache = kmalloc(sizeof(struct squashfs_cache) *
-+                                      SQUASHFS_CACHED_BLKS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+              msblk->block_cache[i].block = SQUASHFS_INVALID_BLK;
-+
-+      msblk->next_cache = 0;
-+
-+      /* Allocate read_data block */
-+      msblk->read_size = (sblk->block_size < SQUASHFS_METADATA_SIZE) ?
-+                                      SQUASHFS_METADATA_SIZE :
-+                                      sblk->block_size;
-+
-+      if (!(msblk->read_data = kmalloc(msblk->read_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_data block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate read_page block */
-+      if (!(msblk->read_page = kmalloc(sblk->block_size, GFP_KERNEL))) {
-+              ERROR("Failed to allocate read_page block\n");
-+              goto failed_mount;
-+      }
-+
-+      /* Allocate uid and gid tables */
-+      if (!(msblk->uid = kmalloc((sblk->no_uids + sblk->no_guids) *
-+                                      sizeof(unsigned int), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              goto failed_mount;
-+      }
-+      msblk->guid = msblk->uid + sblk->no_uids;
-+   
-+      if (msblk->swap) {
-+              unsigned int suid[sblk->no_uids + sblk->no_guids];
-+
-+              if (!squashfs_read_data(s, (char *) &suid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+              SQUASHFS_SWAP_DATA(msblk->uid, suid, (sblk->no_uids +
-+                      sblk->no_guids), (sizeof(unsigned int) * 8));
-+      } else
-+              if (!squashfs_read_data(s, (char *) msblk->uid, sblk->uid_start,
-+                                      ((sblk->no_uids + sblk->no_guids) *
-+                                       sizeof(unsigned int)) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+                      ERROR("unable to read uid/gid table\n");
-+                      goto failed_mount;
-+              }
-+
-+
-+      if (sblk->s_major == 1 && squashfs_1_0_supported(msblk))
-+              goto allocate_root;
-+
-+      if (!(msblk->fragment = kmalloc(sizeof(struct squashfs_fragment_cache) *
-+                              SQUASHFS_CACHED_FRAGMENTS, GFP_KERNEL))) {
-+              ERROR("Failed to allocate fragment block cache\n");
-+              goto failed_mount;
-+      }
-+
-+      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) {
-+              msblk->fragment[i].locked = 0;
-+              msblk->fragment[i].block = SQUASHFS_INVALID_BLK;
-+              msblk->fragment[i].data = NULL;
-+      }
-+
-+      msblk->next_fragment = 0;
-+
-+      /* Allocate fragment index table */
-+      if (msblk->read_fragment_index_table(s) == 0)
-+              goto failed_mount;
-+
-+allocate_root:
-+      if ((root = (msblk->iget)(s, sblk->root_inode)) == NULL)
-+              goto failed_mount;
-+
-+      if ((s->s_root = d_alloc_root(root)) == NULL) {
-+              ERROR("Root inode create failed\n");
-+              iput(root);
-+              goto failed_mount;
-+      }
-+
-+      TRACE("Leaving squashfs_read_super\n");
-+      return 0;
-+
-+failed_mount:
-+      kfree(msblk->fragment_index);
-+      kfree(msblk->fragment);
-+      kfree(msblk->uid);
-+      kfree(msblk->read_page);
-+      kfree(msblk->read_data);
-+      kfree(msblk->block_cache);
-+      kfree(msblk->fragment_index_2);
-+      kfree(s->s_fs_info);
-+      s->s_fs_info = NULL;
-+      return -EINVAL;
-+
-+failure:
-+      return -ENOMEM;
-+}
-+
-+
-+static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf)
-+{
-+      struct super_block *s = dentry->d_sb;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      TRACE("Entered squashfs_statfs\n");
-+
-+      buf->f_type = SQUASHFS_MAGIC;
-+      buf->f_bsize = sblk->block_size;
-+      buf->f_blocks = ((sblk->bytes_used - 1) >> sblk->block_log) + 1;
-+      buf->f_bfree = buf->f_bavail = 0;
-+      buf->f_files = sblk->inodes;
-+      buf->f_ffree = 0;
-+      buf->f_namelen = SQUASHFS_NAME_LEN;
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_symlink_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      int index = page->index << PAGE_CACHE_SHIFT, length, bytes;
-+      long long block = SQUASHFS_I(inode)->start_block;
-+      int offset = SQUASHFS_I(inode)->offset;
-+      void *pageaddr = kmap(page);
-+
-+      TRACE("Entered squashfs_symlink_readpage, page index %ld, start block "
-+                              "%llx, offset %x\n", page->index,
-+                              SQUASHFS_I(inode)->start_block,
-+                              SQUASHFS_I(inode)->offset);
-+
-+      for (length = 0; length < index; length += bytes) {
-+              if (!(bytes = squashfs_get_cached_block(inode->i_sb, NULL,
-+                              block, offset, PAGE_CACHE_SIZE, &block,
-+                              &offset))) {
-+                      ERROR("Unable to read symbolic link [%llx:%x]\n", block,
-+                                      offset);
-+                      goto skip_read;
-+              }
-+      }
-+
-+      if (length != index) {
-+              ERROR("(squashfs_symlink_readpage) length != index\n");
-+              bytes = 0;
-+              goto skip_read;
-+      }
-+
-+      bytes = (i_size_read(inode) - length) > PAGE_CACHE_SIZE ? PAGE_CACHE_SIZE :
-+                                      i_size_read(inode) - length;
-+
-+      if (!(bytes = squashfs_get_cached_block(inode->i_sb, pageaddr, block,
-+                                      offset, bytes, &block, &offset)))
-+              ERROR("Unable to read symbolic link [%llx:%x]\n", block, offset);
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+struct meta_index *locate_meta_index(struct inode *inode, int index, int offset)
-+{
-+      struct meta_index *meta = NULL;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("locate_meta_index: index %d, offset %d\n", index, offset);
-+
-+      if(msblk->meta_index == NULL)
-+              goto not_allocated;
-+
-+      for (i = 0; i < SQUASHFS_META_NUMBER; i ++)
-+              if (msblk->meta_index[i].inode_number == inode->i_ino &&
-+                              msblk->meta_index[i].offset >= offset &&
-+                              msblk->meta_index[i].offset <= index &&
-+                              msblk->meta_index[i].locked == 0) {
-+                      TRACE("locate_meta_index: entry %d, offset %d\n", i,
-+                                      msblk->meta_index[i].offset);
-+                      meta = &msblk->meta_index[i];
-+                      offset = meta->offset;
-+              }
-+
-+      if (meta)
-+              meta->locked = 1;
-+
-+not_allocated:
-+      up(&msblk->meta_index_mutex);
-+
-+      return meta;
-+}
-+
-+
-+struct meta_index *empty_meta_index(struct inode *inode, int offset, int skip)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct meta_index *meta = NULL;
-+      int i;
-+
-+      down(&msblk->meta_index_mutex);
-+
-+      TRACE("empty_meta_index: offset %d, skip %d\n", offset, skip);
-+
-+      if(msblk->meta_index == NULL) {
-+              if (!(msblk->meta_index = kmalloc(sizeof(struct meta_index) *
-+                                      SQUASHFS_META_NUMBER, GFP_KERNEL))) {
-+                      ERROR("Failed to allocate meta_index\n");
-+                      goto failed;
-+              }
-+              for(i = 0; i < SQUASHFS_META_NUMBER; i++) {
-+                      msblk->meta_index[i].inode_number = 0;
-+                      msblk->meta_index[i].locked = 0;
-+              }
-+              msblk->next_meta_index = 0;
-+      }
-+
-+      for(i = SQUASHFS_META_NUMBER; i &&
-+                      msblk->meta_index[msblk->next_meta_index].locked; i --)
-+              msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      if(i == 0) {
-+              TRACE("empty_meta_index: failed!\n");
-+              goto failed;
-+      }
-+
-+      TRACE("empty_meta_index: returned meta entry %d, %p\n",
-+                      msblk->next_meta_index,
-+                      &msblk->meta_index[msblk->next_meta_index]);
-+
-+      meta = &msblk->meta_index[msblk->next_meta_index];
-+      msblk->next_meta_index = (msblk->next_meta_index + 1) %
-+                      SQUASHFS_META_NUMBER;
-+
-+      meta->inode_number = inode->i_ino;
-+      meta->offset = offset;
-+      meta->skip = skip;
-+      meta->entries = 0;
-+      meta->locked = 1;
-+
-+failed:
-+      up(&msblk->meta_index_mutex);
-+      return meta;
-+}
-+
-+
-+void release_meta_index(struct inode *inode, struct meta_index *meta)
-+{
-+      meta->locked = 0;
-+}
-+
-+
-+static int read_block_index(struct super_block *s, int blocks, char *block_list,
-+              long long *start_block, int *offset)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      unsigned int *block_listp;
-+      int block = 0;
-+      
-+      if (msblk->swap) {
-+              char sblock_list[blocks << 2];
-+
-+              if (!squashfs_get_cached_block(s, sblock_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+              SQUASHFS_SWAP_INTS(((unsigned int *)block_list),
-+                              ((unsigned int *)sblock_list), blocks);
-+      } else
-+              if (!squashfs_get_cached_block(s, block_list, *start_block,
-+                              *offset, blocks << 2, start_block, offset)) {
-+                      ERROR("Unable to read block list [%llx:%x]\n",
-+                              *start_block, *offset);
-+                      goto failure;
-+              }
-+
-+      for (block_listp = (unsigned int *) block_list; blocks;
-+                              block_listp++, blocks --)
-+              block += SQUASHFS_COMPRESSED_SIZE_BLOCK(*block_listp);
-+
-+      return block;
-+
-+failure:
-+      return -1;
-+}
-+
-+
-+#define SIZE 256
-+
-+static inline int calculate_skip(int blocks) {
-+      int skip = (blocks - 1) / ((SQUASHFS_SLOTS * SQUASHFS_META_ENTRIES + 1) * SQUASHFS_META_INDEXES);
-+      return skip >= 7 ? 7 : skip + 1;
-+}
-+
-+
-+static int get_meta_index(struct inode *inode, int index,
-+              long long *index_block, int *index_offset,
-+              long long *data_block, char *block_list)
-+{
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int skip = calculate_skip(i_size_read(inode) >> sblk->block_log);
-+      int offset = 0;
-+      struct meta_index *meta;
-+      struct meta_entry *meta_entry;
-+      long long cur_index_block = SQUASHFS_I(inode)->u.s1.block_list_start;
-+      int cur_offset = SQUASHFS_I(inode)->offset;
-+      long long cur_data_block = SQUASHFS_I(inode)->start_block;
-+      int i;
-+ 
-+      index /= SQUASHFS_META_INDEXES * skip;
-+
-+      while ( offset < index ) {
-+              meta = locate_meta_index(inode, index, offset + 1);
-+
-+              if (meta == NULL) {
-+                      if ((meta = empty_meta_index(inode, offset + 1,
-+                                                      skip)) == NULL)
-+                              goto all_done;
-+              } else {
-+                      offset = index < meta->offset + meta->entries ? index :
-+                              meta->offset + meta->entries - 1;
-+                      meta_entry = &meta->meta_entry[offset - meta->offset];
-+                      cur_index_block = meta_entry->index_block + sblk->inode_table_start;
-+                      cur_offset = meta_entry->offset;
-+                      cur_data_block = meta_entry->data_block;
-+                      TRACE("get_meta_index: offset %d, meta->offset %d, "
-+                              "meta->entries %d\n", offset, meta->offset,
-+                              meta->entries);
-+                      TRACE("get_meta_index: index_block 0x%llx, offset 0x%x"
-+                              " data_block 0x%llx\n", cur_index_block,
-+                              cur_offset, cur_data_block);
-+              }
-+
-+              for (i = meta->offset + meta->entries; i <= index &&
-+                              i < meta->offset + SQUASHFS_META_ENTRIES; i++) {
-+                      int blocks = skip * SQUASHFS_META_INDEXES;
-+
-+                      while (blocks) {
-+                              int block = blocks > (SIZE >> 2) ? (SIZE >> 2) :
-+                                      blocks;
-+                              int res = read_block_index(inode->i_sb, block,
-+                                      block_list, &cur_index_block,
-+                                      &cur_offset);
-+
-+                              if (res == -1)
-+                                      goto failed;
-+
-+                              cur_data_block += res;
-+                              blocks -= block;
-+                      }
-+
-+                      meta_entry = &meta->meta_entry[i - meta->offset];
-+                      meta_entry->index_block = cur_index_block - sblk->inode_table_start;
-+                      meta_entry->offset = cur_offset;
-+                      meta_entry->data_block = cur_data_block;
-+                      meta->entries ++;
-+                      offset ++;
-+              }
-+
-+              TRACE("get_meta_index: meta->offset %d, meta->entries %d\n",
-+                              meta->offset, meta->entries);
-+
-+              release_meta_index(inode, meta);
-+      }
-+
-+all_done:
-+      *index_block = cur_index_block;
-+      *index_offset = cur_offset;
-+      *data_block = cur_data_block;
-+
-+      return offset * SQUASHFS_META_INDEXES * skip;
-+
-+failed:
-+      release_meta_index(inode, meta);
-+      return -1;
-+}
-+
-+
-+static long long read_blocklist(struct inode *inode, int index,
-+                              int readahead_blks, char *block_list,
-+                              unsigned short **block_p, unsigned int *bsize)
-+{
-+      long long block_ptr;
-+      int offset;
-+      long long block;
-+      int res = get_meta_index(inode, index, &block_ptr, &offset, &block,
-+              block_list);
-+
-+      TRACE("read_blocklist: res %d, index %d, block_ptr 0x%llx, offset"
-+                     " 0x%x, block 0x%llx\n", res, index, block_ptr, offset,
-+                     block);
-+
-+      if(res == -1)
-+              goto failure;
-+
-+      index -= res;
-+
-+      while ( index ) {
-+              int blocks = index > (SIZE >> 2) ? (SIZE >> 2) : index;
-+              int res = read_block_index(inode->i_sb, blocks, block_list,
-+                      &block_ptr, &offset);
-+              if (res == -1)
-+                      goto failure;
-+              block += res;
-+              index -= blocks;
-+      }
-+
-+      if (read_block_index(inode->i_sb, 1, block_list,
-+                      &block_ptr, &offset) == -1)
-+              goto failure;
-+      *bsize = *((unsigned int *) block_list);
-+
-+      return block;
-+
-+failure:
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, i = 0, bytes = 0, byte_offset = 0;
-+      int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT);
-+      void *pageaddr;
-+      struct squashfs_fragment_cache *fragment = NULL;
-+      char *data_ptr = msblk->read_page;
-+      
-+      int mask = (1 << (sblk->block_log - PAGE_CACHE_SHIFT)) - 1;
-+      int start_index = page->index & ~mask;
-+      int end_index = start_index | mask;
-+
-+      TRACE("Entered squashfs_readpage, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT))
-+              goto skip_read;
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              if ((block = (msblk->read_blocklist)(inode, index, 1,
-+                                      block_list, NULL, &bsize)) == 0)
-+                      goto skip_read;
-+
-+              down(&msblk->read_page_mutex);
-+              
-+              if (!(bytes = squashfs_read_data(inode->i_sb, msblk->read_page,
-+                                      block, bsize, NULL))) {
-+                      ERROR("Unable to read page, block %llx, size %x\n", block,
-+                                      bsize);
-+                      up(&msblk->read_page_mutex);
-+                      goto skip_read;
-+              }
-+      } else {
-+              if ((fragment = get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)->u.s1.fragment_size))
-+                                      == NULL) {
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      (int) SQUASHFS_I(inode)->
-+                                      u.s1.fragment_size);
-+                      goto skip_read;
-+              }
-+              bytes = SQUASHFS_I(inode)->u.s1.fragment_offset +
-+                                      (i_size_read(inode) & (sblk->block_size
-+                                      - 1));
-+              byte_offset = SQUASHFS_I(inode)->u.s1.fragment_offset;
-+              data_ptr = fragment->data;
-+      }
-+
-+      for (i = start_index; i <= end_index && byte_offset < bytes;
-+                                      i++, byte_offset += PAGE_CACHE_SIZE) {
-+              struct page *push_page;
-+              int available_bytes = (bytes - byte_offset) > PAGE_CACHE_SIZE ?
-+                                      PAGE_CACHE_SIZE : bytes - byte_offset;
-+
-+              TRACE("bytes %d, i %d, byte_offset %d, available_bytes %d\n",
-+                                      bytes, i, byte_offset, available_bytes);
-+
-+              if (i == page->index)  {
-+                      pageaddr = kmap_atomic(page, KM_USER0);
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(page);
-+                      SetPageUptodate(page);
-+                      unlock_page(page);
-+              } else if ((push_page =
-+                              grab_cache_page_nowait(page->mapping, i))) {
-+                      pageaddr = kmap_atomic(push_page, KM_USER0);
-+
-+                      memcpy(pageaddr, data_ptr + byte_offset,
-+                                      available_bytes);
-+                      memset(pageaddr + available_bytes, 0,
-+                                      PAGE_CACHE_SIZE - available_bytes);
-+                      kunmap_atomic(pageaddr, KM_USER0);
-+                      flush_dcache_page(push_page);
-+                      SetPageUptodate(push_page);
-+                      unlock_page(push_page);
-+                      page_cache_release(push_page);
-+              }
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || index < (i_size_read(inode) >>
-+                                      sblk->block_log))
-+              up(&msblk->read_page_mutex);
-+      else
-+              release_cached_fragment(msblk, fragment);
-+
-+      return 0;
-+
-+skip_read:
-+      pageaddr = kmap_atomic(page, KM_USER0);
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int squashfs_readpage4K(struct file *file, struct page *page)
-+{
-+      struct inode *inode = page->mapping->host;
-+      struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned char block_list[SIZE];
-+      long long block;
-+      unsigned int bsize, bytes = 0;
-+      void *pageaddr;
-+      
-+      TRACE("Entered squashfs_readpage4K, page index %lx, start block %llx\n",
-+                                      page->index,
-+                                      SQUASHFS_I(inode)->start_block);
-+
-+      if (page->index >= ((i_size_read(inode) + PAGE_CACHE_SIZE - 1) >>
-+                                      PAGE_CACHE_SHIFT)) {
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              goto skip_read;
-+      }
-+
-+      if (SQUASHFS_I(inode)->u.s1.fragment_start_block == SQUASHFS_INVALID_BLK
-+                                      || page->index < (i_size_read(inode) >>
-+                                      sblk->block_log)) {
-+              block = (msblk->read_blocklist)(inode, page->index, 1,
-+                                      block_list, NULL, &bsize);
-+
-+              down(&msblk->read_page_mutex);
-+              bytes = squashfs_read_data(inode->i_sb, msblk->read_page, block,
-+                                      bsize, NULL);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (bytes)
-+                      memcpy(pageaddr, msblk->read_page, bytes);
-+              else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      block, bsize);
-+              up(&msblk->read_page_mutex);
-+      } else {
-+              struct squashfs_fragment_cache *fragment =
-+                      get_cached_fragment(inode->i_sb,
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block,
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+              pageaddr = kmap_atomic(page, KM_USER0);
-+              if (fragment) {
-+                      bytes = i_size_read(inode) & (sblk->block_size - 1);
-+                      memcpy(pageaddr, fragment->data + SQUASHFS_I(inode)->
-+                                      u.s1.fragment_offset, bytes);
-+                      release_cached_fragment(msblk, fragment);
-+              } else
-+                      ERROR("Unable to read page, block %llx, size %x\n",
-+                                      SQUASHFS_I(inode)->
-+                                      u.s1.fragment_start_block, (int)
-+                                      SQUASHFS_I(inode)-> u.s1.fragment_size);
-+      }
-+
-+skip_read:
-+      memset(pageaddr + bytes, 0, PAGE_CACHE_SIZE - bytes);
-+      kunmap_atomic(pageaddr, KM_USER0);
-+      flush_dcache_page(page);
-+      SetPageUptodate(page);
-+      unlock_page(page);
-+
-+      return 0;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long 
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      f_pos =- 3;
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length + 3;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index *index = (struct squashfs_dir_index *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length + 3;
-+}
-+
-+              
-+static int squashfs_readdir(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_readdir [%llx:%x]\n", next_block, next_offset);
-+
-+      while(file->f_pos < 3) {
-+              char *name;
-+              int size, i_ino;
-+
-+              if(file->f_pos == 0) {
-+                      name = ".";
-+                      size = 1;
-+                      i_ino = i->i_ino;
-+              } else {
-+                      name = "..";
-+                      size = 2;
-+                      i_ino = SQUASHFS_I(i)->u.s2.parent_inode;
-+              }
-+              TRACE("Calling filldir(%x, %s, %d, %d, %d, %d)\n",
-+                              (unsigned int) dirent, name, size, (int)
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]);
-+
-+              if (filldir(dirent, name, size,
-+                              file->f_pos, i_ino,
-+                              squashfs_filetype_table[1]) < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+              }
-+              file->f_pos += size;
-+              dirs_read++;
-+      }
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+                      
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos,
-+                                      dirh.inode_number + dire->inode_number,
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry *dire = (struct squashfs_dir_entry *) buffer;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %d\n", name,
-+                                      dirh.start_block, dire->offset,
-+                                      dirh.inode_number + dire->inode_number);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+static void squashfs_put_super(struct super_block *s)
-+{
-+      int i;
-+
-+      if (s->s_fs_info) {
-+              struct squashfs_sb_info *sbi = s->s_fs_info;
-+              if (sbi->block_cache)
-+                      for (i = 0; i < SQUASHFS_CACHED_BLKS; i++)
-+                              if (sbi->block_cache[i].block !=
-+                                                      SQUASHFS_INVALID_BLK)
-+                                      kfree(sbi->block_cache[i].data);
-+              if (sbi->fragment)
-+                      for (i = 0; i < SQUASHFS_CACHED_FRAGMENTS; i++) 
-+                              SQUASHFS_FREE(sbi->fragment[i].data);
-+              kfree(sbi->fragment);
-+              kfree(sbi->block_cache);
-+              kfree(sbi->read_data);
-+              kfree(sbi->read_page);
-+              kfree(sbi->uid);
-+              kfree(sbi->fragment_index);
-+              kfree(sbi->fragment_index_2);
-+              kfree(sbi->meta_index);
-+              kfree(s->s_fs_info);
-+              s->s_fs_info = NULL;
-+      }
-+}
-+
-+
-+static int squashfs_get_sb(struct file_system_type *fs_type,
-+                              int flags, const char *dev_name, void *data, struct vfsmount *mnt)
-+{
-+      return get_sb_bdev(fs_type, flags, dev_name, data, squashfs_fill_super, mnt);
-+}
-+
-+
-+static int __init init_squashfs_fs(void)
-+{
-+      int err = init_inodecache();
-+      if (err)
-+              goto out;
-+
-+      printk(KERN_INFO "squashfs: version 3.0 (2006/03/15) "
-+              "Phillip Lougher\n");
-+
-+      if (!(stream.workspace = vmalloc(zlib_inflate_workspacesize()))) {
-+              ERROR("Failed to allocate zlib workspace\n");
-+              destroy_inodecache();
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      if ((err = register_filesystem(&squashfs_fs_type))) {
-+              vfree(stream.workspace);
-+              destroy_inodecache();
-+      }
-+
-+out:
-+      return err;
-+}
-+
-+
-+static void __exit exit_squashfs_fs(void)
-+{
-+      vfree(stream.workspace);
-+      unregister_filesystem(&squashfs_fs_type);
-+      destroy_inodecache();
-+}
-+
-+
-+static kmem_cache_t * squashfs_inode_cachep;
-+
-+
-+static struct inode *squashfs_alloc_inode(struct super_block *sb)
-+{
-+      struct squashfs_inode_info *ei;
-+      ei = kmem_cache_alloc(squashfs_inode_cachep, GFP_KERNEL);
-+      if (!ei)
-+              return NULL;
-+      return &ei->vfs_inode;
-+}
-+
-+
-+static void squashfs_destroy_inode(struct inode *inode)
-+{
-+      kmem_cache_free(squashfs_inode_cachep, SQUASHFS_I(inode));
-+}
-+
-+
-+static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags)
-+{
-+      struct squashfs_inode_info *ei = foo;
-+
-+      inode_init_once(&ei->vfs_inode);
-+}
-+ 
-+
-+static int __init init_inodecache(void)
-+{
-+      squashfs_inode_cachep = kmem_cache_create("squashfs_inode_cache",
-+           sizeof(struct squashfs_inode_info),
-+           0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT,
-+           init_once, NULL);
-+      if (squashfs_inode_cachep == NULL)
-+              return -ENOMEM;
-+      return 0;
-+}
-+
-+
-+static void destroy_inodecache(void)
-+{
-+      kmem_cache_destroy(squashfs_inode_cachep);
-+}
-+
-+
-+module_init(init_squashfs_fs);
-+module_exit(exit_squashfs_fs);
-+MODULE_DESCRIPTION("squashfs, a compressed read-only filesystem");
-+MODULE_AUTHOR("Phillip Lougher <phillip@lougher.org.uk>");
-Index: linux-2.6.21/fs/squashfs/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/fs/squashfs/Makefile  2007-07-01 17:09:57.000000000 +0100
-@@ -0,0 +1,7 @@
-+#
-+# Makefile for the linux squashfs routines.
-+#
-+
-+obj-$(CONFIG_SQUASHFS) += squashfs.o
-+squashfs-y += inode.o
-+squashfs-y += squashfs2_0.o
-Index: linux-2.6.21/fs/squashfs/squashfs2_0.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/fs/squashfs/squashfs2_0.c     2007-07-01 17:09:57.000000000 +0100
-@@ -0,0 +1,757 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs2_0.c
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/squashfs_fs.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/slab.h>
-+#include <linux/fs.h>
-+#include <linux/smp_lock.h>
-+#include <linux/slab.h>
-+#include <linux/squashfs_fs_sb.h>
-+#include <linux/squashfs_fs_i.h>
-+#include <linux/buffer_head.h>
-+#include <linux/vfs.h>
-+#include <linux/init.h>
-+#include <linux/dcache.h>
-+#include <linux/wait.h>
-+#include <linux/zlib.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+
-+#include "squashfs.h"
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir);
-+static struct dentry *squashfs_lookup_2(struct inode *, struct dentry *,
-+                              struct nameidata *);
-+
-+static struct file_operations squashfs_dir_ops_2 = {
-+      .read = generic_read_dir,
-+      .readdir = squashfs_readdir_2
-+};
-+
-+static struct inode_operations squashfs_dir_inode_ops_2 = {
-+      .lookup = squashfs_lookup_2
-+};
-+
-+static unsigned char squashfs_filetype_table[] = {
-+      DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK
-+};
-+
-+static int read_fragment_index_table_2(struct super_block *s)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      if (!(msblk->fragment_index_2 = kmalloc(SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments), GFP_KERNEL))) {
-+              ERROR("Failed to allocate uid/gid table\n");
-+              return 0;
-+      }
-+   
-+      if (SQUASHFS_FRAGMENT_INDEX_BYTES_2(sblk->fragments) &&
-+                                      !squashfs_read_data(s, (char *)
-+                                      msblk->fragment_index_2,
-+                                      sblk->fragment_table_start,
-+                                      SQUASHFS_FRAGMENT_INDEX_BYTES_2
-+                                      (sblk->fragments) |
-+                                      SQUASHFS_COMPRESSED_BIT_BLOCK, NULL)) {
-+              ERROR("unable to read fragment index table\n");
-+              return 0;
-+      }
-+
-+      if (msblk->swap) {
-+              int i;
-+              unsigned int fragment;
-+
-+              for (i = 0; i < SQUASHFS_FRAGMENT_INDEXES_2(sblk->fragments);
-+                                                                      i++) {
-+                      SQUASHFS_SWAP_FRAGMENT_INDEXES_2((&fragment),
-+                                              &msblk->fragment_index_2[i], 1);
-+                      msblk->fragment_index_2[i] = fragment;
-+              }
-+      }
-+
-+      return 1;
-+}
-+
-+
-+static int get_fragment_location_2(struct super_block *s, unsigned int fragment,
-+                              long long *fragment_start_block,
-+                              unsigned int *fragment_size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      long long start_block =
-+              msblk->fragment_index_2[SQUASHFS_FRAGMENT_INDEX_2(fragment)];
-+      int offset = SQUASHFS_FRAGMENT_INDEX_OFFSET_2(fragment);
-+      struct squashfs_fragment_entry_2 fragment_entry;
-+
-+      if (msblk->swap) {
-+              struct squashfs_fragment_entry_2 sfragment_entry;
-+
-+              if (!squashfs_get_cached_block(s, (char *) &sfragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(sfragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+              SQUASHFS_SWAP_FRAGMENT_ENTRY_2(&fragment_entry, &sfragment_entry);
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) &fragment_entry,
-+                                      start_block, offset,
-+                                      sizeof(fragment_entry), &start_block,
-+                                      &offset))
-+                      goto out;
-+
-+      *fragment_start_block = fragment_entry.start_block;
-+      *fragment_size = fragment_entry.size;
-+
-+      return 1;
-+
-+out:
-+      return 0;
-+}
-+
-+
-+static struct inode *squashfs_new_inode(struct super_block *s,
-+              struct squashfs_base_inode_header_2 *inodeb, unsigned int ino)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      struct inode *i = new_inode(s);
-+
-+      if (i) {
-+              i->i_ino = ino;
-+              i->i_mtime.tv_sec = sblk->mkfs_time;
-+              i->i_atime.tv_sec = sblk->mkfs_time;
-+              i->i_ctime.tv_sec = sblk->mkfs_time;
-+              i->i_uid = msblk->uid[inodeb->uid];
-+              i->i_mode = inodeb->mode;
-+              i->i_nlink = 1;
-+              i->i_size = 0;
-+              if (inodeb->guid == SQUASHFS_GUIDS)
-+                      i->i_gid = i->i_uid;
-+              else
-+                      i->i_gid = msblk->guid[inodeb->guid];
-+      }
-+
-+      return i;
-+}
-+
-+
-+static struct inode *squashfs_iget_2(struct super_block *s, squashfs_inode_t inode)
-+{
-+      struct inode *i;
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      unsigned int block = SQUASHFS_INODE_BLK(inode) +
-+              sblk->inode_table_start;
-+      unsigned int offset = SQUASHFS_INODE_OFFSET(inode);
-+      unsigned int ino = SQUASHFS_MK_VFS_INODE(block
-+              - sblk->inode_table_start, offset);
-+      long long next_block;
-+      unsigned int next_offset;
-+      union squashfs_inode_header_2 id, sid;
-+      struct squashfs_base_inode_header_2 *inodeb = &id.base,
-+                                        *sinodeb = &sid.base;
-+
-+      TRACE("Entered squashfs_iget\n");
-+
-+      if (msblk->swap) {
-+              if (!squashfs_get_cached_block(s, (char *) sinodeb, block,
-+                                      offset, sizeof(*sinodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+              SQUASHFS_SWAP_BASE_INODE_HEADER_2(inodeb, sinodeb,
-+                                      sizeof(*sinodeb));
-+      } else
-+              if (!squashfs_get_cached_block(s, (char *) inodeb, block,
-+                                      offset, sizeof(*inodeb), &next_block,
-+                                      &next_offset))
-+                      goto failed_read;
-+
-+      switch(inodeb->inode_type) {
-+              case SQUASHFS_FILE_TYPE: {
-+                      struct squashfs_reg_inode_header_2 *inodep = &id.reg;
-+                      struct squashfs_reg_inode_header_2 *sinodep = &sid.reg;
-+                      long long frag_blk;
-+                      unsigned int frag_size;
-+                              
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_REG_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      frag_blk = SQUASHFS_INVALID_BLK;
-+                      if (inodep->fragment != SQUASHFS_INVALID_FRAG &&
-+                                      !get_fragment_location_2(s,
-+                                      inodep->fragment, &frag_blk, &frag_size))
-+                              goto failed_read;
-+                              
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_fop = &generic_ro_fops;
-+                      i->i_mode |= S_IFREG;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      i->i_blocks = ((i->i_size - 1) >> 9) + 1;
-+                      SQUASHFS_I(i)->u.s1.fragment_start_block = frag_blk;
-+                      SQUASHFS_I(i)->u.s1.fragment_size = frag_size;
-+                      SQUASHFS_I(i)->u.s1.fragment_offset = inodep->offset;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->u.s1.block_list_start = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+                      if (sblk->block_size > 4096)
-+                              i->i_data.a_ops = &squashfs_aops;
-+                      else
-+                              i->i_data.a_ops = &squashfs_aops_4K;
-+
-+                      TRACE("File inode %x:%x, start_block %x, "
-+                                      "block_list_start %llx, offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, next_block,
-+                                      next_offset);
-+                      break;
-+              }
-+              case SQUASHFS_DIR_TYPE: {
-+                      struct squashfs_dir_inode_header_2 *inodep = &id.dir;
-+                      struct squashfs_dir_inode_header_2 *sinodep = &sid.dir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DIR_INODE_HEADER_2(inodep, sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count = 0;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Directory inode %x:%x, start_block %x, offset "
-+                                      "%x\n", SQUASHFS_INODE_BLK(inode),
-+                                      offset, inodep->start_block,
-+                                      inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_LDIR_TYPE: {
-+                      struct squashfs_ldir_inode_header_2 *inodep = &id.ldir;
-+                      struct squashfs_ldir_inode_header_2 *sinodep = &sid.ldir;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_LDIR_INODE_HEADER_2(inodep,
-+                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->file_size;
-+                      i->i_op = &squashfs_dir_inode_ops_2;
-+                      i->i_fop = &squashfs_dir_ops_2;
-+                      i->i_mode |= S_IFDIR;
-+                      i->i_mtime.tv_sec = inodep->mtime;
-+                      i->i_atime.tv_sec = inodep->mtime;
-+                      i->i_ctime.tv_sec = inodep->mtime;
-+                      SQUASHFS_I(i)->start_block = inodep->start_block;
-+                      SQUASHFS_I(i)->offset = inodep->offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_start = next_block;
-+                      SQUASHFS_I(i)->u.s2.directory_index_offset =
-+                                                              next_offset;
-+                      SQUASHFS_I(i)->u.s2.directory_index_count =
-+                                                              inodep->i_count;
-+                      SQUASHFS_I(i)->u.s2.parent_inode = 0;
-+
-+                      TRACE("Long directory inode %x:%x, start_block %x, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->start_block, inodep->offset);
-+                      break;
-+              }
-+              case SQUASHFS_SYMLINK_TYPE: {
-+                      struct squashfs_symlink_inode_header_2 *inodep =
-+                                                              &id.symlink;
-+                      struct squashfs_symlink_inode_header_2 *sinodep =
-+                                                              &sid.symlink;
-+      
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(inodep,
-+                                                              sinodep);
-+                      } else
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_size = inodep->symlink_size;
-+                      i->i_op = &page_symlink_inode_operations;
-+                      i->i_data.a_ops = &squashfs_symlink_aops;
-+                      i->i_mode |= S_IFLNK;
-+                      SQUASHFS_I(i)->start_block = next_block;
-+                      SQUASHFS_I(i)->offset = next_offset;
-+
-+                      TRACE("Symbolic link inode %x:%x, start_block %llx, "
-+                                      "offset %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      next_block, next_offset);
-+                      break;
-+               }
-+               case SQUASHFS_BLKDEV_TYPE:
-+               case SQUASHFS_CHRDEV_TYPE: {
-+                      struct squashfs_dev_inode_header_2 *inodep = &id.dev;
-+                      struct squashfs_dev_inode_header_2 *sinodep = &sid.dev;
-+
-+                      if (msblk->swap) {
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              sinodep, block, offset,
-+                                              sizeof(*sinodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              SQUASHFS_SWAP_DEV_INODE_HEADER_2(inodep, sinodep);
-+                      } else  
-+                              if (!squashfs_get_cached_block(s, (char *)
-+                                              inodep, block, offset,
-+                                              sizeof(*inodep), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type ==
-+                                      SQUASHFS_CHRDEV_TYPE) ?  S_IFCHR :
-+                                      S_IFBLK;
-+                      init_special_inode(i, i->i_mode,
-+                                      old_decode_dev(inodep->rdev));
-+
-+                      TRACE("Device inode %x:%x, rdev %x\n",
-+                                      SQUASHFS_INODE_BLK(inode), offset,
-+                                      inodep->rdev);
-+                      break;
-+               }
-+               case SQUASHFS_FIFO_TYPE:
-+               case SQUASHFS_SOCKET_TYPE: {
-+                      if ((i = squashfs_new_inode(s, inodeb, ino)) == NULL)
-+                              goto failed_read1;
-+
-+                      i->i_mode |= (inodeb->inode_type == SQUASHFS_FIFO_TYPE)
-+                                                      ? S_IFIFO : S_IFSOCK;
-+                      init_special_inode(i, i->i_mode, 0);
-+                      break;
-+               }
-+               default:
-+                      ERROR("Unknown inode type %d in squashfs_iget!\n",
-+                                      inodeb->inode_type);
-+                      goto failed_read1;
-+      }
-+      
-+      insert_inode_hash(i);
-+      return i;
-+
-+failed_read:
-+      ERROR("Unable to read inode [%x:%x]\n", block, offset);
-+
-+failed_read1:
-+      return NULL;
-+}
-+
-+
-+static int get_dir_index_using_offset(struct super_block *s, long long 
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              long long f_pos)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      struct squashfs_dir_index_2 index;
-+
-+      TRACE("Entered get_dir_index_using_offset, i_count %d, f_pos %d\n",
-+                                      i_count, (unsigned int) f_pos);
-+
-+      if (f_pos == 0)
-+              goto finish;
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(&index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) &index,
-+                                      index_start, index_offset,
-+                                      sizeof(index), &index_start,
-+                                      &index_offset);
-+
-+              if (index.index > f_pos)
-+                      break;
-+
-+              squashfs_get_cached_block(s, NULL, index_start, index_offset,
-+                                      index.size + 1, &index_start,
-+                                      &index_offset);
-+
-+              length = index.index;
-+              *next_block = index.start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+
-+finish:
-+      return length;
-+}
-+
-+
-+static int get_dir_index_using_name(struct super_block *s, long long
-+                              *next_block, unsigned int *next_offset,
-+                              long long index_start,
-+                              unsigned int index_offset, int i_count,
-+                              const char *name, int size)
-+{
-+      struct squashfs_sb_info *msblk = s->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      int i, length = 0;
-+      char buffer[sizeof(struct squashfs_dir_index_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_index_2 *index = (struct squashfs_dir_index_2 *) buffer;
-+      char str[SQUASHFS_NAME_LEN + 1];
-+
-+      TRACE("Entered get_dir_index_using_name, i_count %d\n", i_count);
-+
-+      strncpy(str, name, size);
-+      str[size] = '\0';
-+
-+      for (i = 0; i < i_count; i++) {
-+              if (msblk->swap) {
-+                      struct squashfs_dir_index_2 sindex;
-+                      squashfs_get_cached_block(s, (char *) &sindex,
-+                                      index_start, index_offset,
-+                                      sizeof(sindex), &index_start,
-+                                      &index_offset);
-+                      SQUASHFS_SWAP_DIR_INDEX_2(index, &sindex);
-+              } else
-+                      squashfs_get_cached_block(s, (char *) index,
-+                                      index_start, index_offset,
-+                                      sizeof(struct squashfs_dir_index_2),
-+                                      &index_start, &index_offset);
-+
-+              squashfs_get_cached_block(s, index->name, index_start,
-+                                      index_offset, index->size + 1,
-+                                      &index_start, &index_offset);
-+
-+              index->name[index->size + 1] = '\0';
-+
-+              if (strcmp(index->name, str) > 0)
-+                      break;
-+
-+              length = index->index;
-+              *next_block = index->start_block + sblk->directory_table_start;
-+      }
-+
-+      *next_offset = (length + *next_offset) % SQUASHFS_METADATA_SIZE;
-+      return length;
-+}
-+
-+              
-+static int squashfs_readdir_2(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct inode *i = file->f_dentry->d_inode;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0, dirs_read = 0,
-+              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN + 1];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+
-+      TRACE("Entered squashfs_readdir_2 [%llx:%x]\n", next_block, next_offset);
-+
-+      length = get_dir_index_using_offset(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count,
-+                              file->f_pos);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+                      
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block, next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block, next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                              next_block, next_offset,
-+                                              dire->size + 1, &next_block,
-+                                              &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (file->f_pos >= length)
-+                              continue;
-+
-+                      dire->name[dire->size + 1] = '\0';
-+
-+                      TRACE("Calling filldir(%x, %s, %d, %d, %x:%x, %d)\n",
-+                                      (unsigned int) dirent, dire->name,
-+                                      dire->size + 1, (int) file->f_pos,
-+                                      dirh.start_block, dire->offset,
-+                                      squashfs_filetype_table[dire->type]);
-+
-+                      if (filldir(dirent, dire->name, dire->size + 1,
-+                                      file->f_pos, SQUASHFS_MK_VFS_INODE(
-+                                      dirh.start_block, dire->offset),
-+                                      squashfs_filetype_table[dire->type])
-+                                      < 0) {
-+                              TRACE("Filldir returned less than 0\n");
-+                              goto finish;
-+                      }
-+                      file->f_pos = length;
-+                      dirs_read++;
-+              }
-+      }
-+
-+finish:
-+      return dirs_read;
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      return 0;
-+}
-+
-+
-+static struct dentry *squashfs_lookup_2(struct inode *i, struct dentry *dentry,
-+                              struct nameidata *nd)
-+{
-+      const unsigned char *name = dentry->d_name.name;
-+      int len = dentry->d_name.len;
-+      struct inode *inode = NULL;
-+      struct squashfs_sb_info *msblk = i->i_sb->s_fs_info;
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+      long long next_block = SQUASHFS_I(i)->start_block +
-+                              sblk->directory_table_start;
-+      int next_offset = SQUASHFS_I(i)->offset, length = 0,
-+                              dir_count;
-+      struct squashfs_dir_header_2 dirh;
-+      char buffer[sizeof(struct squashfs_dir_entry_2) + SQUASHFS_NAME_LEN];
-+      struct squashfs_dir_entry_2 *dire = (struct squashfs_dir_entry_2 *) buffer;
-+      int sorted = sblk->s_major == 2 && sblk->s_minor >= 1;
-+
-+      TRACE("Entered squashfs_lookup [%llx:%x]\n", next_block, next_offset);
-+
-+      if (len > SQUASHFS_NAME_LEN)
-+              goto exit_loop;
-+
-+      length = get_dir_index_using_name(i->i_sb, &next_block, &next_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_start,
-+                              SQUASHFS_I(i)->u.s2.directory_index_offset,
-+                              SQUASHFS_I(i)->u.s2.directory_index_count, name,
-+                              len);
-+
-+      while (length < i_size_read(i)) {
-+              /* read directory header */
-+              if (msblk->swap) {
-+                      struct squashfs_dir_header_2 sdirh;
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &sdirh,
-+                                      next_block, next_offset, sizeof(sdirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(sdirh);
-+                      SQUASHFS_SWAP_DIR_HEADER_2(&dirh, &sdirh);
-+              } else {
-+                      if (!squashfs_get_cached_block(i->i_sb, (char *) &dirh,
-+                                      next_block, next_offset, sizeof(dirh),
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += sizeof(dirh);
-+              }
-+
-+              dir_count = dirh.count + 1;
-+              while (dir_count--) {
-+                      if (msblk->swap) {
-+                              struct squashfs_dir_entry_2 sdire;
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              &sdire, next_block,next_offset,
-+                                              sizeof(sdire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+                              
-+                              length += sizeof(sdire);
-+                              SQUASHFS_SWAP_DIR_ENTRY_2(dire, &sdire);
-+                      } else {
-+                              if (!squashfs_get_cached_block(i->i_sb, (char *)
-+                                              dire, next_block,next_offset,
-+                                              sizeof(*dire), &next_block,
-+                                              &next_offset))
-+                                      goto failed_read;
-+
-+                              length += sizeof(*dire);
-+                      }
-+
-+                      if (!squashfs_get_cached_block(i->i_sb, dire->name,
-+                                      next_block, next_offset, dire->size + 1,
-+                                      &next_block, &next_offset))
-+                              goto failed_read;
-+
-+                      length += dire->size + 1;
-+
-+                      if (sorted && name[0] < dire->name[0])
-+                              goto exit_loop;
-+
-+                      if ((len == dire->size + 1) && !strncmp(name,
-+                                              dire->name, len)) {
-+                              squashfs_inode_t ino =
-+                                      SQUASHFS_MKINODE(dirh.start_block,
-+                                      dire->offset);
-+
-+                              TRACE("calling squashfs_iget for directory "
-+                                      "entry %s, inode %x:%x, %lld\n", name,
-+                                      dirh.start_block, dire->offset, ino);
-+
-+                              inode = (msblk->iget)(i->i_sb, ino);
-+
-+                              goto exit_loop;
-+                      }
-+              }
-+      }
-+
-+exit_loop:
-+      d_add(dentry, inode);
-+      return ERR_PTR(0);
-+
-+failed_read:
-+      ERROR("Unable to read directory block [%llx:%x]\n", next_block,
-+              next_offset);
-+      goto exit_loop;
-+}
-+
-+
-+int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      struct squashfs_super_block *sblk = &msblk->sblk;
-+
-+      msblk->iget = squashfs_iget_2;
-+      msblk->read_fragment_index_table = read_fragment_index_table_2;
-+
-+      sblk->bytes_used = sblk->bytes_used_2;
-+      sblk->uid_start = sblk->uid_start_2;
-+      sblk->guid_start = sblk->guid_start_2;
-+      sblk->inode_table_start = sblk->inode_table_start_2;
-+      sblk->directory_table_start = sblk->directory_table_start_2;
-+      sblk->fragment_table_start = sblk->fragment_table_start_2;
-+
-+      return 1;
-+}
-Index: linux-2.6.21/fs/squashfs/squashfs.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/fs/squashfs/squashfs.h        2007-07-01 17:09:57.000000000 +0100
-@@ -0,0 +1,86 @@
-+/*
-+ * Squashfs - a compressed read only filesystem for Linux
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs.h
-+ */
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#undef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+#endif
-+
-+#ifdef SQUASHFS_TRACE
-+#define TRACE(s, args...)     printk(KERN_NOTICE "SQUASHFS: "s, ## args)
-+#else
-+#define TRACE(s, args...)     {}
-+#endif
-+
-+#define ERROR(s, args...)     printk(KERN_ERR "SQUASHFS error: "s, ## args)
-+
-+#define SERROR(s, args...)    do { \
-+                              if (!silent) \
-+                              printk(KERN_ERR "SQUASHFS error: "s, ## args);\
-+                              } while(0)
-+
-+#define WARNING(s, args...)   printk(KERN_WARNING "SQUASHFS: "s, ## args)
-+
-+static inline struct squashfs_inode_info *SQUASHFS_I(struct inode *inode)
-+{
-+      return list_entry(inode, struct squashfs_inode_info, vfs_inode);
-+}
-+
-+#if defined(CONFIG_SQUASHFS_1_0_COMPATIBILITY ) || defined(CONFIG_SQUASHFS_2_0_COMPATIBILITY)
-+#define SQSH_EXTERN
-+extern unsigned int squashfs_read_data(struct super_block *s, char *buffer,
-+                              long long index, unsigned int length,
-+                              long long *next_index);
-+extern int squashfs_get_cached_block(struct super_block *s, char *buffer,
-+                              long long block, unsigned int offset,
-+                              int length, long long *next_block,
-+                              unsigned int *next_offset);
-+extern void release_cached_fragment(struct squashfs_sb_info *msblk, struct
-+                                      squashfs_fragment_cache *fragment);
-+extern struct squashfs_fragment_cache *get_cached_fragment(struct super_block
-+                                      *s, long long start_block,
-+                                      int length);
-+extern struct address_space_operations squashfs_symlink_aops;
-+extern struct address_space_operations squashfs_aops;
-+extern struct address_space_operations squashfs_aops_4K;
-+extern struct inode_operations squashfs_dir_inode_ops;
-+#else
-+#define SQSH_EXTERN static
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+extern int squashfs_1_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_1_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+extern int squashfs_2_0_supported(struct squashfs_sb_info *msblk);
-+#else
-+static inline int squashfs_2_0_supported(struct squashfs_sb_info *msblk)
-+{
-+      return 0;
-+}
-+#endif
-Index: linux-2.6.21/include/linux/squashfs_fs.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/include/linux/squashfs_fs.h   2007-07-01 17:09:57.000000000 +0100
-@@ -0,0 +1,911 @@
-+#ifndef SQUASHFS_FS
-+#define SQUASHFS_FS
-+
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs.h
-+ */
-+
-+#ifndef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#define CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+#endif
-+
-+#ifdef        CONFIG_SQUASHFS_VMALLOC
-+#define SQUASHFS_ALLOC(a)             vmalloc(a)
-+#define SQUASHFS_FREE(a)              vfree(a)
-+#else
-+#define SQUASHFS_ALLOC(a)             kmalloc(a, GFP_KERNEL)
-+#define SQUASHFS_FREE(a)              kfree(a)
-+#endif
-+#define SQUASHFS_CACHED_FRAGMENTS     CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE     
-+#define SQUASHFS_MAJOR                        3
-+#define SQUASHFS_MINOR                        0
-+#define SQUASHFS_MAGIC                        0x73717368
-+#define SQUASHFS_MAGIC_SWAP           0x68737173
-+#define SQUASHFS_START                        0
-+
-+/* size of metadata (inode and directory) blocks */
-+#define SQUASHFS_METADATA_SIZE                8192
-+#define SQUASHFS_METADATA_LOG         13
-+
-+/* default size of data blocks */
-+#define SQUASHFS_FILE_SIZE            65536
-+#define SQUASHFS_FILE_LOG             16
-+
-+#define SQUASHFS_FILE_MAX_SIZE                65536
-+
-+/* Max number of uids and gids */
-+#define SQUASHFS_UIDS                 256
-+#define SQUASHFS_GUIDS                        255
-+
-+/* Max length of filename (not 255) */
-+#define SQUASHFS_NAME_LEN             256
-+
-+#define SQUASHFS_INVALID              ((long long) 0xffffffffffff)
-+#define SQUASHFS_INVALID_FRAG         ((unsigned int) 0xffffffff)
-+#define SQUASHFS_INVALID_BLK          ((long long) -1)
-+#define SQUASHFS_USED_BLK             ((long long) -2)
-+
-+/* Filesystem flags */
-+#define SQUASHFS_NOI                  0
-+#define SQUASHFS_NOD                  1
-+#define SQUASHFS_CHECK                        2
-+#define SQUASHFS_NOF                  3
-+#define SQUASHFS_NO_FRAG              4
-+#define SQUASHFS_ALWAYS_FRAG          5
-+#define SQUASHFS_DUPLICATE            6
-+
-+#define SQUASHFS_BIT(flag, bit)               ((flag >> bit) & 1)
-+
-+#define SQUASHFS_UNCOMPRESSED_INODES(flags)   SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOI)
-+
-+#define SQUASHFS_UNCOMPRESSED_DATA(flags)     SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOD)
-+
-+#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags)        SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NOF)
-+
-+#define SQUASHFS_NO_FRAGMENTS(flags)          SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_NO_FRAG)
-+
-+#define SQUASHFS_ALWAYS_FRAGMENTS(flags)      SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_ALWAYS_FRAG)
-+
-+#define SQUASHFS_DUPLICATES(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_DUPLICATE)
-+
-+#define SQUASHFS_CHECK_DATA(flags)            SQUASHFS_BIT(flags, \
-+                                              SQUASHFS_CHECK)
-+
-+#define SQUASHFS_MKFLAGS(noi, nod, check_data, nof, no_frag, always_frag, \
-+              duplicate_checking)     (noi | (nod << 1) | (check_data << 2) \
-+              | (nof << 3) | (no_frag << 4) | (always_frag << 5) | \
-+              (duplicate_checking << 6))
-+
-+/* Max number of types and file types */
-+#define SQUASHFS_DIR_TYPE             1
-+#define SQUASHFS_FILE_TYPE            2
-+#define SQUASHFS_SYMLINK_TYPE         3
-+#define SQUASHFS_BLKDEV_TYPE          4
-+#define SQUASHFS_CHRDEV_TYPE          5
-+#define SQUASHFS_FIFO_TYPE            6
-+#define SQUASHFS_SOCKET_TYPE          7
-+#define SQUASHFS_LDIR_TYPE            8
-+#define SQUASHFS_LREG_TYPE            9
-+
-+/* 1.0 filesystem type definitions */
-+#define SQUASHFS_TYPES                        5
-+#define SQUASHFS_IPC_TYPE             0
-+
-+/* Flag whether block is compressed or uncompressed, bit is set if block is
-+ * uncompressed */
-+#define SQUASHFS_COMPRESSED_BIT               (1 << 15)
-+
-+#define SQUASHFS_COMPRESSED_SIZE(B)   (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \
-+              (B) & ~SQUASHFS_COMPRESSED_BIT :  SQUASHFS_COMPRESSED_BIT)
-+
-+#define SQUASHFS_COMPRESSED(B)                (!((B) & SQUASHFS_COMPRESSED_BIT))
-+
-+#define SQUASHFS_COMPRESSED_BIT_BLOCK         (1 << 24)
-+
-+#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B)     (((B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK) ? (B) & \
-+      ~SQUASHFS_COMPRESSED_BIT_BLOCK : SQUASHFS_COMPRESSED_BIT_BLOCK)
-+
-+#define SQUASHFS_COMPRESSED_BLOCK(B)  (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))
-+
-+/*
-+ * Inode number ops.  Inodes consist of a compressed block number, and an
-+ * uncompressed  offset within that block
-+ */
-+#define SQUASHFS_INODE_BLK(a)         ((unsigned int) ((a) >> 16))
-+
-+#define SQUASHFS_INODE_OFFSET(a)      ((unsigned int) ((a) & 0xffff))
-+
-+#define SQUASHFS_MKINODE(A, B)                ((squashfs_inode_t)(((squashfs_inode_t) (A)\
-+                                      << 16) + (B)))
-+
-+/* Compute 32 bit VFS inode number from squashfs inode number */
-+#define SQUASHFS_MK_VFS_INODE(a, b)   ((unsigned int) (((a) << 8) + \
-+                                      ((b) >> 2) + 1))
-+/* XXX */
-+
-+/* Translate between VFS mode and squashfs mode */
-+#define SQUASHFS_MODE(a)              ((a) & 0xfff)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES(A)    (A * sizeof(struct squashfs_fragment_entry))
-+
-+#define SQUASHFS_FRAGMENT_INDEX(A)    (SQUASHFS_FRAGMENT_BYTES(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A)     (SQUASHFS_FRAGMENT_BYTES(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES(A)  ((SQUASHFS_FRAGMENT_BYTES(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES(A)      (SQUASHFS_FRAGMENT_INDEXES(A) *\
-+                                              sizeof(long long))
-+
-+/* cached data constants for filesystem */
-+#define SQUASHFS_CACHED_BLKS          8
-+
-+#define SQUASHFS_MAX_FILE_SIZE_LOG    64
-+
-+#define SQUASHFS_MAX_FILE_SIZE                ((long long) 1 << \
-+                                      (SQUASHFS_MAX_FILE_SIZE_LOG - 2))
-+
-+#define SQUASHFS_MARKER_BYTE          0xff
-+
-+/* meta index cache */
-+#define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int))
-+#define SQUASHFS_META_ENTRIES 31
-+#define SQUASHFS_META_NUMBER  8
-+#define SQUASHFS_SLOTS                4
-+
-+struct meta_entry {
-+      long long               data_block;
-+      unsigned int            index_block;
-+      unsigned short          offset;
-+      unsigned short          pad;
-+};
-+
-+struct meta_index {
-+      unsigned int            inode_number;
-+      unsigned int            offset;
-+      unsigned short          entries;
-+      unsigned short          skip;
-+      unsigned short          locked;
-+      unsigned short          pad;
-+      struct meta_entry       meta_entry[SQUASHFS_META_ENTRIES];
-+};
-+
-+
-+/*
-+ * definitions for structures on disk
-+ */
-+
-+typedef long long             squashfs_block_t;
-+typedef long long             squashfs_inode_t;
-+
-+struct squashfs_super_block {
-+      unsigned int            s_magic;
-+      unsigned int            inodes;
-+      unsigned int            bytes_used_2;
-+      unsigned int            uid_start_2;
-+      unsigned int            guid_start_2;
-+      unsigned int            inode_table_start_2;
-+      unsigned int            directory_table_start_2;
-+      unsigned int            s_major:16;
-+      unsigned int            s_minor:16;
-+      unsigned int            block_size_1:16;
-+      unsigned int            block_log:16;
-+      unsigned int            flags:8;
-+      unsigned int            no_uids:8;
-+      unsigned int            no_guids:8;
-+      unsigned int            mkfs_time /* time of filesystem creation */;
-+      squashfs_inode_t        root_inode;
-+      unsigned int            block_size;
-+      unsigned int            fragments;
-+      unsigned int            fragment_table_start_2;
-+      long long               bytes_used;
-+      long long               uid_start;
-+      long long               guid_start;
-+      long long               inode_table_start;
-+      long long               directory_table_start;
-+      long long               fragment_table_start;
-+      long long               unused;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_index {
-+      unsigned int            index;
-+      unsigned int            start_block;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_BASE_INODE_HEADER            \
-+      unsigned int            inode_type:4;   \
-+      unsigned int            mode:12;        \
-+      unsigned int            uid:8;          \
-+      unsigned int            guid:8;         \
-+      unsigned int            mtime;          \
-+      unsigned int            inode_number;
-+
-+struct squashfs_base_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_lreg_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      squashfs_block_t        start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      long long               file_size;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            parent_inode;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header {
-+      SQUASHFS_BASE_INODE_HEADER;
-+      unsigned int            nlink;
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            start_block;
-+      unsigned int            i_count:16;
-+      unsigned int            parent_inode;
-+      struct squashfs_dir_index       index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header {
-+      struct squashfs_base_inode_header       base;
-+      struct squashfs_dev_inode_header        dev;
-+      struct squashfs_symlink_inode_header    symlink;
-+      struct squashfs_reg_inode_header        reg;
-+      struct squashfs_lreg_inode_header       lreg;
-+      struct squashfs_dir_inode_header        dir;
-+      struct squashfs_ldir_inode_header       ldir;
-+      struct squashfs_ipc_inode_header        ipc;
-+};
-+      
-+struct squashfs_dir_entry {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      int                     inode_number:16;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_header {
-+      unsigned int            count:8;
-+      unsigned int            start_block;
-+      unsigned int            inode_number;
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry {
-+      long long               start_block;
-+      unsigned int            size;
-+      unsigned int            unused;
-+} __attribute__ ((packed));
-+
-+extern int squashfs_uncompress_block(void *d, int dstlen, void *s, int srclen);
-+extern int squashfs_uncompress_init(void);
-+extern int squashfs_uncompress_exit(void);
-+
-+/*
-+ * macros to convert each packed bitfield structure from little endian to big
-+ * endian and vice versa.  These are needed when creating or using a filesystem
-+ * on a machine with different byte ordering to the target architecture.
-+ *
-+ */
-+
-+#define SQUASHFS_SWAP_START \
-+      int bits;\
-+      int b_pos;\
-+      unsigned long long val;\
-+      unsigned char *s;\
-+      unsigned char *d;
-+
-+#define SQUASHFS_SWAP_SUPER_BLOCK(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_super_block));\
-+      SQUASHFS_SWAP((s)->s_magic, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->inodes, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used_2, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->uid_start_2, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->guid_start_2, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->inode_table_start_2, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->directory_table_start_2, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->s_major, d, 224, 16);\
-+      SQUASHFS_SWAP((s)->s_minor, d, 240, 16);\
-+      SQUASHFS_SWAP((s)->block_size_1, d, 256, 16);\
-+      SQUASHFS_SWAP((s)->block_log, d, 272, 16);\
-+      SQUASHFS_SWAP((s)->flags, d, 288, 8);\
-+      SQUASHFS_SWAP((s)->no_uids, d, 296, 8);\
-+      SQUASHFS_SWAP((s)->no_guids, d, 304, 8);\
-+      SQUASHFS_SWAP((s)->mkfs_time, d, 312, 32);\
-+      SQUASHFS_SWAP((s)->root_inode, d, 344, 64);\
-+      SQUASHFS_SWAP((s)->block_size, d, 408, 32);\
-+      SQUASHFS_SWAP((s)->fragments, d, 440, 32);\
-+      SQUASHFS_SWAP((s)->fragment_table_start_2, d, 472, 32);\
-+      SQUASHFS_SWAP((s)->bytes_used, d, 504, 64);\
-+      SQUASHFS_SWAP((s)->uid_start, d, 568, 64);\
-+      SQUASHFS_SWAP((s)->guid_start, d, 632, 64);\
-+      SQUASHFS_SWAP((s)->inode_table_start, d, 696, 64);\
-+      SQUASHFS_SWAP((s)->directory_table_start, d, 760, 64);\
-+      SQUASHFS_SWAP((s)->fragment_table_start, d, 824, 64);\
-+      SQUASHFS_SWAP((s)->unused, d, 888, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 64, 32);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header))\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header)); \
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->rdev, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header));\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 224, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LREG_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_lreg_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 128, 64);\
-+      SQUASHFS_SWAP((s)->fragment, d, 192, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 224, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 256, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 147, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 160, 32);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 192, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header));\
-+      SQUASHFS_SWAP((s)->nlink, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 128, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 155, 13);\
-+      SQUASHFS_SWAP((s)->start_block, d, 168, 32);\
-+      SQUASHFS_SWAP((s)->i_count, d, 200, 16);\
-+      SQUASHFS_SWAP((s)->parent_inode, d, 216, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_HEADER(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 32);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 40, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->inode_number, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 64);\
-+      SQUASHFS_SWAP((s)->size, d, 64, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_SHORTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 2);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      16)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_INTS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 4);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      32)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_LONG_LONGS(s, d, n) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      64)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, 64);\
-+}
-+
-+#define SQUASHFS_SWAP_DATA(s, d, n, bits) {\
-+      int entry;\
-+      int bit_position;\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, n * bits / 8);\
-+      for(entry = 0, bit_position = 0; entry < n; entry++, bit_position += \
-+                      bits)\
-+              SQUASHFS_SWAP(s[entry], d, bit_position, bits);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES(s, d, n) SQUASHFS_SWAP_LONG_LONGS(s, d, n)
-+
-+#ifdef CONFIG_SQUASHFS_1_0_COMPATIBILITY
-+
-+struct squashfs_base_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            type:4;
-+      unsigned int            offset:4;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_1 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:4; /* index into uid table */
-+      unsigned int            guid:4; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n) \
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 4);\
-+      SQUASHFS_SWAP((s)->guid, d, 20, 4);
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_1(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_ipc_inode_header_1));\
-+      SQUASHFS_SWAP((s)->type, d, 24, 4);\
-+      SQUASHFS_SWAP((s)->offset, d, 28, 4);\
-+}
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_1));\
-+      SQUASHFS_SWAP((s)->rdev, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_1));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 24, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_1));\
-+      SQUASHFS_SWAP((s)->mtime, d, 24, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 88, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_1(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_1(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_1));\
-+      SQUASHFS_SWAP((s)->file_size, d, 24, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 43, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 56, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 88, 24);\
-+}
-+
-+#endif
-+
-+#ifdef CONFIG_SQUASHFS_2_0_COMPATIBILITY
-+
-+struct squashfs_dir_index_2 {
-+      unsigned int            index:27;
-+      unsigned int            start_block:29;
-+      unsigned char           size;
-+      unsigned char           name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_base_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_ipc_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+} __attribute__ ((packed));
-+
-+struct squashfs_dev_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          rdev;
-+} __attribute__ ((packed));
-+      
-+struct squashfs_symlink_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned short          symlink_size;
-+      char                    symlink[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_reg_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            mtime;
-+      unsigned int            start_block;
-+      unsigned int            fragment;
-+      unsigned int            offset;
-+      unsigned int            file_size:32;
-+      unsigned short          block_list[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:19;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+} __attribute__  ((packed));
-+
-+struct squashfs_ldir_inode_header_2 {
-+      unsigned int            inode_type:4;
-+      unsigned int            mode:12; /* protection */
-+      unsigned int            uid:8; /* index into uid table */
-+      unsigned int            guid:8; /* index into guid table */
-+      unsigned int            file_size:27;
-+      unsigned int            offset:13;
-+      unsigned int            mtime;
-+      unsigned int            start_block:24;
-+      unsigned int            i_count:16;
-+      struct squashfs_dir_index_2     index[0];
-+} __attribute__  ((packed));
-+
-+union squashfs_inode_header_2 {
-+      struct squashfs_base_inode_header_2     base;
-+      struct squashfs_dev_inode_header_2      dev;
-+      struct squashfs_symlink_inode_header_2  symlink;
-+      struct squashfs_reg_inode_header_2      reg;
-+      struct squashfs_dir_inode_header_2      dir;
-+      struct squashfs_ldir_inode_header_2     ldir;
-+      struct squashfs_ipc_inode_header_2      ipc;
-+};
-+      
-+struct squashfs_dir_header_2 {
-+      unsigned int            count:8;
-+      unsigned int            start_block:24;
-+} __attribute__ ((packed));
-+
-+struct squashfs_dir_entry_2 {
-+      unsigned int            offset:13;
-+      unsigned int            type:3;
-+      unsigned int            size:8;
-+      char                    name[0];
-+} __attribute__ ((packed));
-+
-+struct squashfs_fragment_entry_2 {
-+      unsigned int            start_block;
-+      unsigned int            size;
-+} __attribute__ ((packed));
-+
-+#define SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+      SQUASHFS_MEMSET(s, d, n);\
-+      SQUASHFS_SWAP((s)->inode_type, d, 0, 4);\
-+      SQUASHFS_SWAP((s)->mode, d, 4, 12);\
-+      SQUASHFS_SWAP((s)->uid, d, 16, 8);\
-+      SQUASHFS_SWAP((s)->guid, d, 24, 8);\
-+
-+#define SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, n) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, n)\
-+}
-+
-+#define SQUASHFS_SWAP_IPC_INODE_HEADER_2(s, d) \
-+      SQUASHFS_SWAP_BASE_INODE_HEADER_2(s, d, sizeof(struct squashfs_ipc_inode_header_2))
-+
-+#define SQUASHFS_SWAP_DEV_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dev_inode_header_2)); \
-+      SQUASHFS_SWAP((s)->rdev, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_SYMLINK_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_symlink_inode_header_2));\
-+      SQUASHFS_SWAP((s)->symlink_size, d, 32, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_REG_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_reg_inode_header_2));\
-+      SQUASHFS_SWAP((s)->mtime, d, 32, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->fragment, d, 96, 32);\
-+      SQUASHFS_SWAP((s)->offset, d, 128, 32);\
-+      SQUASHFS_SWAP((s)->file_size, d, 160, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_dir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 19);\
-+      SQUASHFS_SWAP((s)->offset, d, 51, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 64, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 96, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_LDIR_INODE_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_SWAP_BASE_INODE_CORE_2(s, d, \
-+                      sizeof(struct squashfs_ldir_inode_header_2));\
-+      SQUASHFS_SWAP((s)->file_size, d, 32, 27);\
-+      SQUASHFS_SWAP((s)->offset, d, 59, 13);\
-+      SQUASHFS_SWAP((s)->mtime, d, 72, 32);\
-+      SQUASHFS_SWAP((s)->start_block, d, 104, 24);\
-+      SQUASHFS_SWAP((s)->i_count, d, 128, 16);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_INDEX_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_index_2));\
-+      SQUASHFS_SWAP((s)->index, d, 0, 27);\
-+      SQUASHFS_SWAP((s)->start_block, d, 27, 29);\
-+      SQUASHFS_SWAP((s)->size, d, 56, 8);\
-+}
-+#define SQUASHFS_SWAP_DIR_HEADER_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_header_2));\
-+      SQUASHFS_SWAP((s)->count, d, 0, 8);\
-+      SQUASHFS_SWAP((s)->start_block, d, 8, 24);\
-+}
-+
-+#define SQUASHFS_SWAP_DIR_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_dir_entry_2));\
-+      SQUASHFS_SWAP((s)->offset, d, 0, 13);\
-+      SQUASHFS_SWAP((s)->type, d, 13, 3);\
-+      SQUASHFS_SWAP((s)->size, d, 16, 8);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_ENTRY_2(s, d) {\
-+      SQUASHFS_SWAP_START\
-+      SQUASHFS_MEMSET(s, d, sizeof(struct squashfs_fragment_entry_2));\
-+      SQUASHFS_SWAP((s)->start_block, d, 0, 32);\
-+      SQUASHFS_SWAP((s)->size, d, 32, 32);\
-+}
-+
-+#define SQUASHFS_SWAP_FRAGMENT_INDEXES_2(s, d, n) SQUASHFS_SWAP_INTS(s, d, n)
-+
-+/* fragment and fragment table defines */
-+#define SQUASHFS_FRAGMENT_BYTES_2(A)  (A * sizeof(struct squashfs_fragment_entry_2))
-+
-+#define SQUASHFS_FRAGMENT_INDEX_2(A)  (SQUASHFS_FRAGMENT_BYTES_2(A) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_OFFSET_2(A)   (SQUASHFS_FRAGMENT_BYTES_2(A) % \
-+                                              SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEXES_2(A)        ((SQUASHFS_FRAGMENT_BYTES_2(A) + \
-+                                      SQUASHFS_METADATA_SIZE - 1) / \
-+                                      SQUASHFS_METADATA_SIZE)
-+
-+#define SQUASHFS_FRAGMENT_INDEX_BYTES_2(A)    (SQUASHFS_FRAGMENT_INDEXES_2(A) *\
-+                                              sizeof(int))
-+
-+#endif
-+
-+#ifdef __KERNEL__
-+
-+/*
-+ * macros used to swap each structure entry, taking into account
-+ * bitfields and different bitfield placing conventions on differing
-+ * architectures
-+ */
-+
-+#include <asm/byteorder.h>
-+
-+#ifdef __BIG_ENDIAN
-+      /* convert from little endian to big endian */
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, b_pos)
-+#else
-+      /* convert from big endian to little endian */ 
-+#define SQUASHFS_SWAP(value, p, pos, tbits) _SQUASHFS_SWAP(value, p, pos, \
-+              tbits, 64 - tbits - b_pos)
-+#endif
-+
-+#define _SQUASHFS_SWAP(value, p, pos, tbits, SHIFT) {\
-+      b_pos = pos % 8;\
-+      val = 0;\
-+      s = (unsigned char *)p + (pos / 8);\
-+      d = ((unsigned char *) &val) + 7;\
-+      for(bits = 0; bits < (tbits + b_pos); bits += 8) \
-+              *d-- = *s++;\
-+      value = (val >> (SHIFT))/* & ((1 << tbits) - 1)*/;\
-+}
-+
-+#define SQUASHFS_MEMSET(s, d, n)      memset(s, 0, n);
-+
-+#endif
-+#endif
-Index: linux-2.6.21/include/linux/squashfs_fs_i.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/include/linux/squashfs_fs_i.h 2007-07-01 17:09:57.000000000 +0100
-@@ -0,0 +1,45 @@
-+#ifndef SQUASHFS_FS_I
-+#define SQUASHFS_FS_I
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_i.h
-+ */
-+
-+struct squashfs_inode_info {
-+      long long       start_block;
-+      unsigned int    offset;
-+      union {
-+              struct {
-+                      long long       fragment_start_block;
-+                      unsigned int    fragment_size;
-+                      unsigned int    fragment_offset;
-+                      long long       block_list_start;
-+              } s1;
-+              struct {
-+                      long long       directory_index_start;
-+                      unsigned int    directory_index_offset;
-+                      unsigned int    directory_index_count;
-+                      unsigned int    parent_inode;
-+              } s2;
-+      } u;
-+      struct inode    vfs_inode;
-+};
-+#endif
-Index: linux-2.6.21/include/linux/squashfs_fs_sb.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ linux-2.6.21/include/linux/squashfs_fs_sb.h        2007-07-01 17:09:57.000000000 +0100
-@@ -0,0 +1,74 @@
-+#ifndef SQUASHFS_FS_SB
-+#define SQUASHFS_FS_SB
-+/*
-+ * Squashfs
-+ *
-+ * Copyright (c) 2002, 2003, 2004, 2005, 2006
-+ * Phillip Lougher <phillip@lougher.org.uk>
-+ *
-+ * 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.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ * squashfs_fs_sb.h
-+ */
-+
-+#include <linux/squashfs_fs.h>
-+
-+struct squashfs_cache {
-+      long long       block;
-+      int             length;
-+      long long       next_index;
-+      char            *data;
-+};
-+
-+struct squashfs_fragment_cache {
-+      long long       block;
-+      int             length;
-+      unsigned int    locked;
-+      char            *data;
-+};
-+
-+struct squashfs_sb_info {
-+      struct squashfs_super_block     sblk;
-+      int                     devblksize;
-+      int                     devblksize_log2;
-+      int                     swap;
-+      struct squashfs_cache   *block_cache;
-+      struct squashfs_fragment_cache  *fragment;
-+      int                     next_cache;
-+      int                     next_fragment;
-+      int                     next_meta_index;
-+      unsigned int            *uid;
-+      unsigned int            *guid;
-+      long long               *fragment_index;
-+      unsigned int            *fragment_index_2;
-+      unsigned int            read_size;
-+      char                    *read_data;
-+      char                    *read_page;
-+      struct semaphore        read_data_mutex;
-+      struct semaphore        read_page_mutex;
-+      struct semaphore        block_cache_mutex;
-+      struct semaphore        fragment_mutex;
-+      struct semaphore        meta_index_mutex;
-+      wait_queue_head_t       waitq;
-+      wait_queue_head_t       fragment_wait_queue;
-+      struct meta_index       *meta_index;
-+      struct inode            *(*iget)(struct super_block *s,  squashfs_inode_t \
-+                              inode);
-+      long long               (*read_blocklist)(struct inode *inode, int \
-+                              index, int readahead_blks, char *block_list, \
-+                              unsigned short **block_p, unsigned int *bsize);
-+      int                     (*read_fragment_index_table)(struct super_block *s);
-+};
-+#endif
-Index: linux-2.6.21/init/do_mounts_rd.c
-===================================================================
---- linux-2.6.21.orig/init/do_mounts_rd.c      2007-04-26 04:08:32.000000000 +0100
-+++ linux-2.6.21/init/do_mounts_rd.c   2007-07-01 17:09:57.000000000 +0100
-@@ -5,6 +5,7 @@
- #include <linux/ext2_fs.h>
- #include <linux/romfs_fs.h>
- #include <linux/cramfs_fs.h>
-+#include <linux/squashfs_fs.h>
- #include <linux/initrd.h>
- #include <linux/string.h>
-@@ -39,6 +40,7 @@ static int __init crd_load(int in_fd, in
-  * numbers could not be found.
-  *
-  * We currently check for the following magic numbers:
-+ *      squashfs
-  *    minix
-  *    ext2
-  *    romfs
-@@ -53,6 +55,7 @@ identify_ramdisk_image(int fd, int start
-       struct ext2_super_block *ext2sb;
-       struct romfs_super_block *romfsb;
-       struct cramfs_super *cramfsb;
-+      struct squashfs_super_block *squashfsb;
-       int nblocks = -1;
-       unsigned char *buf;
-@@ -64,6 +67,7 @@ identify_ramdisk_image(int fd, int start
-       ext2sb = (struct ext2_super_block *) buf;
-       romfsb = (struct romfs_super_block *) buf;
-       cramfsb = (struct cramfs_super *) buf;
-+      squashfsb = (struct squashfs_super_block *) buf;
-       memset(buf, 0xe5, size);
-       /*
-@@ -101,6 +105,15 @@ identify_ramdisk_image(int fd, int start
-               goto done;
-       }
-+      /* squashfs is at block zero too */
-+      if (squashfsb->s_magic == SQUASHFS_MAGIC) {
-+              printk(KERN_NOTICE
-+                     "RAMDISK: squashfs filesystem found at block %d\n",
-+                     start_block);
-+              nblocks = (squashfsb->bytes_used+BLOCK_SIZE-1)>>BLOCK_SIZE_BITS;
-+              goto done;
-+      }
-+
-       /*
-        * Read block 1 to test for minix and ext2 superblock
-        */
diff --git a/meta/packages/linux/linux-rp-2.6.22/vesafb-tng-1.0-rc2-2.6.20-rc2.patch b/meta/packages/linux/linux-rp-2.6.22/vesafb-tng-1.0-rc2-2.6.20-rc2.patch
deleted file mode 100644 (file)
index b1b0fc3..0000000
+++ /dev/null
@@ -1,3141 +0,0 @@
-diff --git a/Documentation/fb/vesafb.txt b/Documentation/fb/vesafb.txt
-index ee277dd..93d6e6e 100644
---- a/Documentation/fb/vesafb.txt
-+++ b/Documentation/fb/vesafb.txt
-@@ -2,16 +2,18 @@
- What is vesafb?
- ===============
--This is a generic driver for a graphic framebuffer on intel boxes.
-+Vesafb is a generic framebuffer driver for x86 and x86_64 boxes.
--The idea is simple:  Turn on graphics mode at boot time with the help
--of the BIOS, and use this as framebuffer device /dev/fb0, like the m68k
--(and other) ports do.
-+VESA BIOS Extensions Version 2.0 are required, because we need access to
-+a linear frame buffer. VBE 3.0 is required if you want to use modes with a
-+higher (than the standard 60 Hz) refresh rate.
--This means we decide at boot time whenever we want to run in text or
--graphics mode.  Switching mode later on (in protected mode) is
--impossible; BIOS calls work in real mode only.  VESA BIOS Extensions
--Version 2.0 are required, because we need a linear frame buffer.
-+The VESA framebuffer driver comes in two flavors - the standard 'vesafb'
-+and 'vesafb-tng'. Vesafb-tng is available only on 32-bit x86 due to the
-+technology it uses (vm86). Vesafb-tng has more features than vesafb
-+(adjusting the refresh rate on VBE 3.0 compliant boards, switching the
-+video mode without rebooting, selecting a mode by providing its
-+modedb name, and more).
- Advantages:
-@@ -29,26 +31,35 @@ Disadvantages:
- How to use it?
- ==============
--Switching modes is done using the vga=... boot parameter.  Read
--Documentation/svga.txt for details.
-+If you are running a 32-bit x86 system and you decide to use vesafb-tng,
-+you can either compile the driver into the kernel or use it as a module.
-+The graphics mode you want to use is in both cases specified using the
-+standard modedb format.
--You should compile in both vgacon (for text mode) and vesafb (for
--graphics mode). Which of them takes over the console depends on
--whenever the specified mode is text or graphics.
-+If your system doesn't support vm86 calls, things get a little more tricky.
-+Since on such systems you can't do BIOS calls from protected mode in which
-+kernel runs, you have to decide at boot time whenever you want to run in text
-+or in graphics mode. Switching mode later on is impossible. Switching modes
-+is done using the vga=... boot parameter.  Read Documentation/svga.txt for
-+details. Below is a more detailed description of what to do on systems using
-+the standard vesafb driver.
--The graphic modes are NOT in the list which you get if you boot with
--vga=ask and hit return. The mode you wish to use is derived from the
--VESA mode number. Here are those VESA mode numbers:
-+You should compile in both vgacon (for text mode) and vesafb (for graphics
-+mode). Which of them takes over the console depends on whenever the
-+specified mode is text or graphics.
-+
-+The graphic modes are NOT in the list which you get if you boot with vga=ask
-+and hit return. The mode you wish to use is derived from the VESA mode number.
-+Here are those VESA mode numbers:
-     | 640x480  800x600  1024x768 1280x1024
- ----+-------------------------------------
--256 |  0x101    0x103    0x105    0x107   
--32k |  0x110    0x113    0x116    0x119   
--64k |  0x111    0x114    0x117    0x11A   
--16M |  0x112    0x115    0x118    0x11B   
-+256 |  0x101    0x103    0x105    0x107
-+32k |  0x110    0x113    0x116    0x119
-+64k |  0x111    0x114    0x117    0x11A
-+16M |  0x112    0x115    0x118    0x11B
--The video mode number of the Linux kernel is the VESA mode number plus
--0x200.
-+The video mode number of the Linux kernel is the VESA mode number plus 0x200.
-  
-  Linux_kernel_mode_number = VESA_mode_number + 0x200
-@@ -56,15 +67,15 @@ So the table for the Kernel mode numbers are:
-     | 640x480  800x600  1024x768 1280x1024
- ----+-------------------------------------
--256 |  0x301    0x303    0x305    0x307   
--32k |  0x310    0x313    0x316    0x319   
--64k |  0x311    0x314    0x317    0x31A   
--16M |  0x312    0x315    0x318    0x31B   
-+256 |  0x301    0x303    0x305    0x307
-+32k |  0x310    0x313    0x316    0x319
-+64k |  0x311    0x314    0x317    0x31A
-+16M |  0x312    0x315    0x318    0x31B
--To enable one of those modes you have to specify "vga=ask" in the
--lilo.conf file and rerun LILO. Then you can type in the desired
--mode at the "vga=ask" prompt. For example if you like to use 
--1024x768x256 colors you have to say "305" at this prompt.
-+To enable one of those modes you have to specify "vga=ask" in the lilo.conf
-+file and rerun LILO. Then you can type in the desired mode at the "vga=ask"
-+prompt. For example if you like to use 1024x768x256 colors you have to say
-+"305" at this prompt.
- If this does not work, this might be because your BIOS does not support
- linear framebuffers or because it does not support this mode at all.
-@@ -72,11 +83,12 @@ Even if your board does, it might be the BIOS which does not.  VESA BIOS
- Extensions v2.0 are required, 1.2 is NOT sufficient.  You will get a
- "bad mode number" message if something goes wrong.
--1. Note: LILO cannot handle hex, for booting directly with 
-+1. Note: LILO cannot handle hex, for booting directly with
-          "vga=mode-number" you have to transform the numbers to decimal.
- 2. Note: Some newer versions of LILO appear to work with those hex values,
-          if you set the 0x in front of the numbers.
-+
- X11
- ===
-@@ -84,98 +96,164 @@ XF68_FBDev should work just fine, but it is non-accelerated.  Running
- another (accelerated) X-Server like XF86_SVGA might or might not work.
- It depends on X-Server and graphics board.
--The X-Server must restore the video mode correctly, else you end up
-+The X-Server must restore the video mode correctly, or else you end up
- with a broken console (and vesafb cannot do anything about this).
-+With vesafb-tng chances are that the console will be restored properly
-+even if the X server messes up the video mode.
- Refresh rates
- =============
--There is no way to change the vesafb video mode and/or timings after
--booting linux.  If you are not happy with the 60 Hz refresh rate, you
--have these options:
-+With VBE 3.0 compatible BIOSes and vesafb-tng it is possible to change
-+the refresh rate either at boot time (by specifying the @<rr> part of
-+the mode name) or later, using the fbset utility.
-+
-+If you want to use the default BIOS refresh rate while switching modes
-+on a running system, set pixclock to 0.
-- * configure and load the DOS-Tools for your the graphics board (if
--   available) and boot linux with loadlin.
-- * use a native driver (matroxfb/atyfb) instead if vesafb.  If none
-+With VBE 2.0 there is no way to change the mode timings after booting
-+Linux. If you are not happy with the 60 Hz refresh rate, you have
-+the following options:
-+
-+ * Configure and load the DOS tools for your the graphics board (if
-+   available) and boot Linux with loadlin.
-+ * Use a native driver (matroxfb/atyfb) instead of vesafb.  If none
-    is available, write a new one!
-- * VBE 3.0 might work too.  I have neither a gfx board with VBE 3.0
--   support nor the specs, so I have not checked this yet.
-+ * Use a BIOS editor to change the default refresh rate (such an
-+   editor does exist at least for ATI Radeon BIOSes).
-+ * If you're running a non-vm86 and VBE 3.0 compatible system, you can
-+   use a kernel patch (vesafb-rrc) to hard-code some mode timings in
-+   the kernel and use these while setting the video mode at boot time.
-+
-+Note that there are some boards (nVidia 59**, 57** and newer models)
-+claiming that their Video BIOS is VBE 3.0 compliant, while ignoring the
-+CRTC values provided by software such as vesafb-tng. You'll not be able
-+to adjust the refresh rate if you're using one of these boards.
- Configuration
- =============
--The VESA BIOS provides protected mode interface for changing
--some parameters.  vesafb can use it for palette changes and
--to pan the display.  It is turned off by default because it
--seems not to work with some BIOS versions, but there are options
--to turn it on.
--
--You can pass options to vesafb using "video=vesafb:option" on
--the kernel command line.  Multiple options should be separated
--by comma, like this: "video=vesafb:ypan,invers"
--
--Accepted options:
--
--invers        no comment...
--
--ypan  enable display panning using the VESA protected mode 
--      interface.  The visible screen is just a window of the
--      video memory, console scrolling is done by changing the
--      start of the window.
--      pro:    * scrolling (fullscreen) is fast, because there is
--                no need to copy around data.
--              * You'll get scrollback (the Shift-PgUp thing),
--                the video memory can be used as scrollback buffer
--      kontra: * scrolling only parts of the screen causes some
--                ugly flicker effects (boot logo flickers for
--                example).
--
--ywrap Same as ypan, but assumes your gfx board can wrap-around 
--      the video memory (i.e. starts reading from top if it
--      reaches the end of video memory).  Faster than ypan.
--
--redraw        scroll by redrawing the affected part of the screen, this
--      is the safe (and slow) default.
--
--
--vgapal        Use the standard vga registers for palette changes.
--      This is the default.
--pmipal        Use the protected mode interface for palette changes.
--
--mtrr:n        setup memory type range registers for the vesafb framebuffer
--      where n:
--            0 - disabled (equivalent to nomtrr) (default)
--            1 - uncachable
--            2 - write-back
--            3 - write-combining
--            4 - write-through
--
--      If you see the following in dmesg, choose the type that matches the
--      old one. In this example, use "mtrr:2".
-+The VESA BIOS provides protected mode interface for changing some parameters.
-+vesafb can use it for palette changes and to pan the display. It is turned
-+off by default because it seems not to work with some BIOS versions, but
-+there are options to turn it on.
-+
-+You can pass options to vesafb using "video=vesafb:option" on the kernel
-+command line. Multiple options should be separated by a comma, like this:
-+"video=vesafb:ypan,1024x768-32@85"
-+
-+Note that vesafb-tng still uses the "video=vesafb:option" format of the
-+kernel command line video parameter. "video=vesafb-tng:xxx" is incorrect.
-+
-+Accepted options (both vesafb and vesafb-tng):
-+
-+ypan    Enable display panning using the VESA protected mode interface
-+        The visible screen is just a window of the video memory,
-+        console scrolling is done by changing the start of the window.
-+        pro:    * scrolling (fullscreen) is fast, because there is
-+                  no need to copy around data.
-+                * you'll get scrollback (the Shift-PgUp thing),
-+                  the video memory can be used as scrollback buffer
-+        con:    * scrolling only parts of the screen causes some
-+                  ugly flicker effects (boot logo flickers for
-+                  example).
-+
-+ywrap   Same as ypan, but assumes your gfx board can wrap-around the video
-+        memory (i.e. starts reading from top if it reaches the end of
-+        video memory). Faster than ypan.
-+
-+redraw  Scroll by redrawing the affected part of the screen, this is the
-+        safe (and slow) default.
-+
-+vgapal  Use the standard VGA registers for palette changes.
-+
-+pmipal  Use the protected mode interface for palette changes.
-+        This is the default is the protected mode interface is available.
-+
-+mtrr:n  Setup memory type range registers for the vesafb framebuffer
-+        where n:
-+              0 - disabled (equivalent to nomtrr) (default)
-+              1 - uncachable
-+              2 - write-back
-+              3 - write-combining
-+              4 - write-through
-+
-+        If you see the following in dmesg, choose the type that matches
-+        the old one. In this example, use "mtrr:2".
- ...
- mtrr: type mismatch for e0000000,8000000 old: write-back new: write-combining
- ...
--nomtrr  disable mtrr
-+nomtrr  Do not use memory type range registers for vesafb.
- vremap:n
-         remap 'n' MiB of video RAM. If 0 or not specified, remap memory
--      according to video mode. (2.5.66 patch/idea by Antonino Daplas
--      reversed to give override possibility (allocate more fb memory
--      than the kernel would) to 2.4 by tmb@iki.fi)
-+        according to video mode. (2.5.66 patch/idea by Antonino Daplas
-+        reversed to give override possibility (allocate more fb memory
-+        than the kernel would) to 2.4 by tmb@iki.fi)
- vtotal:n
-         if the video BIOS of your card incorrectly determines the total
-         amount of video RAM, use this option to override the BIOS (in MiB).
--Have fun!
-+Options accepted only by vesafb-tng:
-+
-+<mode>  The mode you want to set, in the standard modedb format. Refer to
-+        modedb.txt for a detailed description. If you specify a mode that is
-+        not supported by your board's BIOS, vesafb-tng will attempt to set a
-+        similar mode. The list of supported modes can be found in
-+        /proc/fbx/modes, where x is the framebuffer number (usually 0).
-+        When vesafb-tng is compiled as a module, the mode string should be
-+        provided as a value of the parameter 'mode'.
-+
-+vbemode:x
-+        Force the use of VBE mode x. The mode will only be set if it's
-+        found in the VBE-provided list of supported modes.
-+        NOTE: The mode number 'x' should be specified in VESA mode number
-+        notation, not the Linux kernel one (eg. 257 instead of 769).
-+        HINT: If you use this option because normal <mode> parameter does
-+        not work for you and you use a X server, you'll probably want to
-+        set the 'nocrtc' option to ensure that the video mode is properly
-+        restored after console <-> X switches.
-+
-+nocrtc  Do not use CRTC timings while setting the video mode. This option
-+        makes sence only with VBE 3.0 compliant systems. Use it if you have
-+        problems with modes set in the standard way. Note that using this
-+              option means that any refresh rate adjustments will be ignored
-+              and the refresh rate will stay at your BIOS default (60 Hz).
-+
-+noedid  Do not try to fetch and use EDID-provided modes.
-+
-+noblank Disable hardware blanking.
-+
-+gtf     Force the use of VESA's GTF (Generalized Timing Formula). Specifying
-+        this will cause vesafb to skip its internal modedb and EDID-modedb
-+        and jump straight to the GTF part of the code (normally used only if
-+        everything else failed). This can be useful if you want to get as
-+        much as possible from your graphics board but your BIOS doesn't
-+        support modes with the refresh rates you require. Note that you may 
-+              need to specify the maxhf, maxvf and maxclk parameters if they are not
-+        provided by the EDID block.
-+
-+Additionally, the following parameters may be provided. They all override the
-+EDID-provided values and BIOS defaults. Refer to your monitor's specs to get
-+the correct values for maxhf, maxvf and maxclk for your hardware.
-+
-+maxhf:n     Maximum horizontal frequency (in kHz).
-+maxvf:n     Maximum vertical frequency (in Hz).
-+maxclk:n    Maximum pixel clock (in MHz).
--  Gerd
-+Have fun!
- --
-+Original document for the vesafb driver by
- Gerd Knorr <kraxel@goldbach.in-berlin.de>
--Minor (mostly typo) changes 
--by Nico Schmoigl <schmoigl@rumms.uni-mannheim.de>
-+Minor (mostly typo) changes by
-+Nico Schmoigl <schmoigl@rumms.uni-mannheim.de>
-+
-+Extended documentation for vm86, VBE 3.0 and vesafb-tng by
-+Michal Januszewski <spock@gentoo.org>
-+
-diff --git a/arch/i386/boot/video.S b/arch/i386/boot/video.S
-index 2c5b5cc..2c2d4b5 100644
---- a/arch/i386/boot/video.S
-+++ b/arch/i386/boot/video.S
-@@ -163,10 +163,12 @@ basret:  ret
- # parameters in the default 80x25 mode -- these are set directly,
- # because some very obscure BIOSes supply insane values.
- mode_params:
-+#ifdef CONFIG_FB_VESA_STD
- #ifdef CONFIG_VIDEO_SELECT
-       cmpb    $0, graphic_mode
-       jnz     mopar_gr
- #endif
-+#endif
-       movb    $0x03, %ah                      # Read cursor position
-       xorb    %bh, %bh
-       int     $0x10
-@@ -199,6 +201,7 @@ mopar2: movb       %al, %fs:(PARAM_VIDEO_LINES)
-       ret
- #ifdef CONFIG_VIDEO_SELECT
-+#ifdef CONFIG_FB_VESA_STD
- # Fetching of VESA frame buffer parameters
- mopar_gr:
-       leaw    modelist+1024, %di
-@@ -281,6 +284,7 @@ dac_done:
-       movw    %es, %fs:(PARAM_VESAPM_SEG)
-       movw    %di, %fs:(PARAM_VESAPM_OFF)
- no_pm:        ret
-+#endif
- # The video mode menu
- mode_menu:
-@@ -495,10 +499,12 @@ mode_set:
-       
-       cmpb    $VIDEO_FIRST_V7>>8, %ah
-       jz      setv7
--      
-+
-+#ifdef CONFIG_FB_VESA_STD
-       cmpb    $VIDEO_FIRST_VESA>>8, %ah
-       jnc     check_vesa
--      
-+#endif        
-+
-       orb     %ah, %ah
-       jz      setmenu
-       
-@@ -570,6 +576,7 @@ setr1:     lodsw
-       movw    -4(%si), %ax                    # Fetch mode ID
-       jmp     _m_s
-+#ifdef CONFIG_FB_VESA_STD
- check_vesa:
-       leaw    modelist+1024, %di
-       subb    $VIDEO_FIRST_VESA>>8, %bh
-@@ -603,6 +610,7 @@ check_vesa:
-       ret
- _setbad:      jmp     setbad                  # Ugly...
-+#endif
- # Recalculate vertical display end registers -- this fixes various
- # inconsistencies of extended modes on many adapters. Called when
-diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c
-index 1393523..8a05f95 100644
---- a/drivers/char/sysrq.c
-+++ b/drivers/char/sysrq.c
-@@ -240,7 +240,7 @@ static void send_sig_all(int sig)
-       struct task_struct *p;
-       for_each_process(p) {
--              if (p->mm && !is_init(p))
-+              if (p->mm && !is_init(p) && !(p->flags & PF_BORROWED_MM))
-                       /* Not swapper, init nor kernel thread */
-                       force_sig(sig, p);
-       }
-diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
-index 4e83f01..ae122fd 100644
---- a/drivers/video/Kconfig
-+++ b/drivers/video/Kconfig
-@@ -547,8 +547,22 @@ config FB_TGA
-         cards. Say Y if you have one of those.
- config FB_VESA
--      bool "VESA VGA graphics support"
--      depends on (FB = y) && X86
-+      tristate "VESA VGA graphics support"
-+      depends on (FB = y) && (X86 || X86_64)
-+      help
-+        This is the frame buffer device driver for generic VESA 2.0
-+        compliant graphic cards. The older VESA 1.2 cards are not supported.
-+        You will get a boot time penguin logo at no additional cost. Please
-+        read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-+
-+choice 
-+      prompt "VESA driver type"
-+      depends on FB_VESA
-+      default FB_VESA_STD if X86_64
-+      default FB_VESA_TNG if X86
-+
-+config FB_VESA_STD
-+      bool "vesafb"
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-@@ -557,7 +571,43 @@ config FB_VESA
-         This is the frame buffer device driver for generic VESA 2.0
-         compliant graphic cards. The older VESA 1.2 cards are not supported.
-         You will get a boot time penguin logo at no additional cost. Please
--        read <file:Documentation/fb/vesafb.txt>. If unsure, say Y.
-+        read <file:Documentation/fb/vesafb.txt>. Choose this driver if you
-+        are experiencing problems with vesafb-tng or if you own a 64-bit system.
-+
-+        Note that this driver cannot be compiled as a module.
-+
-+config FB_VESA_TNG
-+      bool "vesafb-tng"
-+      depends on !X86_64
-+      select FB_MODE_HELPERS
-+      select FB_CFB_FILLRECT
-+      select FB_CFB_COPYAREA
-+      select FB_CFB_IMAGEBLIT
-+      help
-+        This is an enhanced generic frame buffer device driver for
-+        VBE 2.0 compliant graphic cards. It can take advantage of VBE 3.0
-+        features (refresh rate adjustment) when these are available.
-+        The driver also makes it possible to change the video mode
-+        on the fly and to switch back to text mode when it's unloaded.
-+
-+        If the driver is compiled as a module, the module will be called
-+        vesafb-tng.
-+
-+endchoice
-+
-+config FB_VESA_DEFAULT_MODE
-+      string "VESA default mode"
-+      depends on FB_VESA_TNG
-+      default "640x480@60"
-+      help 
-+        This option is used to determine the default mode vesafb is
-+        supposed to switch to in case no mode is provided as a kernel
-+        command line parameter.
-+
-+config VIDEO_SELECT
-+      bool
-+      depends on FB_VESA
-+      default y
- config FB_IMAC
-       bool "Intel-based Macintosh Framebuffer Support"
-diff --git a/drivers/video/Makefile b/drivers/video/Makefile
-index 309a26d..e57b0e7 100644
---- a/drivers/video/Makefile
-+++ b/drivers/video/Makefile
-@@ -102,7 +102,11 @@ obj-$(CONFIG_FB_PNX4008_DUM_RGB)  += pnx4008/
- obj-$(CONFIG_FB_IBM_GXT4500)    += gxt4500.o
- # Platform or fallback drivers go here
--obj-$(CONFIG_FB_VESA)             += vesafb.o
-+ifeq ($(CONFIG_FB_VESA_STD),y)
-+  obj-y                                 += vesafb.o
-+else
-+  obj-$(CONFIG_FB_VESA)                 += vesafb-thread.o vesafb-tng.o
-+endif
- obj-$(CONFIG_FB_IMAC)             += imacfb.o
- obj-$(CONFIG_FB_VGA16)            += vga16fb.o vgastate.o
- obj-$(CONFIG_FB_OF)               += offb.o
-diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
-index 3cfea31..bfb39cc 100644
---- a/drivers/video/fbmem.c
-+++ b/drivers/video/fbmem.c
-@@ -1408,6 +1408,7 @@ fbmem_init(void)
-               printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
-               fb_class = NULL;
-       }
-+
-       return 0;
- }
-diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
-index 5df41f6..f838a53 100644
---- a/drivers/video/modedb.c
-+++ b/drivers/video/modedb.c
-@@ -674,6 +674,7 @@ void fb_var_to_videomode(struct fb_videomode *mode,
- {
-       u32 pixclock, hfreq, htotal, vtotal;
-+      mode->refresh = 0;
-       mode->name = NULL;
-       mode->xres = var->xres;
-       mode->yres = var->yres;
-@@ -1025,3 +1026,4 @@ EXPORT_SYMBOL(fb_find_best_mode);
- EXPORT_SYMBOL(fb_find_nearest_mode);
- EXPORT_SYMBOL(fb_videomode_to_modelist);
- EXPORT_SYMBOL(fb_find_mode);
-+EXPORT_SYMBOL(fb_destroy_modelist);
-diff --git a/drivers/video/vesafb-thread.c b/drivers/video/vesafb-thread.c
-new file mode 100644
-index 0000000..543e202
---- /dev/null
-+++ b/drivers/video/vesafb-thread.c
-@@ -0,0 +1,751 @@
-+/*
-+ * Framebuffer driver for VBE 2.0+ compliant graphic boards.
-+ * Kernel thread and vm86 routines.
-+ *
-+ * (c) 2004-2006 Michal Januszewski <spock@gentoo.org>
-+ *
-+ */
-+
-+#include <linux/workqueue.h>
-+#include <linux/completion.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/delay.h>
-+#include <linux/signal.h>
-+#include <linux/freezer.h>
-+#include <linux/suspend.h>
-+#include <linux/unistd.h>
-+#include <video/vesa.h>
-+#include <video/edid.h>
-+#include <asm/mman.h>
-+#include <asm/page.h>
-+#include <asm/vm86.h>
-+#include <asm/thread_info.h>
-+#include <asm/uaccess.h>
-+#include <asm/mmu_context.h>
-+#include "edid.h"
-+
-+static int errno;
-+
-+static DECLARE_COMPLETION(vesafb_th_completion);
-+static DECLARE_MUTEX(vesafb_task_list_sem);
-+static LIST_HEAD(vesafb_task_list);
-+static DECLARE_WAIT_QUEUE_HEAD(vesafb_wait);
-+
-+static struct vm86_struct vm86;
-+static int vesafb_pid = 0;
-+
-+#define DEFAULT_VM86_FLAGS (IF_MASK | IOPL_MASK)
-+#define VM86_PUSHW(x)                                 \
-+do {                                                  \
-+      vm86.regs.esp -= 2;                             \
-+      *(u16*)(STACK_ADDR + vm86.regs.esp) = x;        \
-+} while(0);
-+
-+/* Stack, the return code and buffers will be put into
-+ * one contiguous memory chunk:
-+ *
-+ * [ STACK | RET_CODE | BUFFER ]
-+ *
-+ * Some video BIOSes (sis6326) try to store data somewhere
-+ * in 0x7000-0x7fff, so we zeromap more memory to be safe.
-+ */
-+#define IVTBDA_SIZE   PAGE_SIZE
-+#define RET_CODE_SIZE 0x0010
-+#define STACK_SIZE    0x0500
-+#define BUFFER_SIZE   0x10000
-+
-+/* The amount of memory that will be allocated should be a multiple
-+ * of PAGE_SIZE. */
-+#define __MEM_SIZE    (RET_CODE_SIZE + STACK_SIZE + BUFFER_SIZE)
-+#define REAL_MEM_SIZE (((__MEM_SIZE / PAGE_SIZE) + 1) * PAGE_SIZE)
-+
-+#define IVTBDA_ADDR   0x00000
-+#define STACK_ADDR    (IVTBDA_ADDR + IVTBDA_SIZE)
-+#define RET_CODE_ADDR (STACK_ADDR + STACK_SIZE)
-+#define BUF_ADDR      (RET_CODE_ADDR + RET_CODE_SIZE)
-+
-+#define FLAG_D                (1 << 10)
-+
-+/* Syscalls used by the vesafb thread */
-+static int vm86old(struct vm86_struct __user* v86)
-+{
-+      long res;
-+      __asm__ volatile ("push %%ebx; movl %2, %%ebx ; int $0x80 ; pop %%ebx"
-+                      : "=a" (res)
-+                      : "0" (__NR_vm86old), "ri" ((long)(v86)) : "memory");
-+
-+      if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) {
-+              errno = -res;
-+              res = -1;
-+      }
-+      return (int)res;
-+}
-+
-+static int ioperm(unsigned long a, unsigned long b, unsigned long c)
-+{
-+      long res;
-+      __asm__ volatile ("push %%ebx; movl %2, %%ebx ; int $0x80 ; pop %%ebx"
-+                      : "=a" (res)
-+                      : "0" (__NR_ioperm), "ri" ((long)(a)), "c" ((long)(b)),
-+                        "d" ((long)(c)) : "memory");
-+
-+      if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) {
-+              errno = -res;
-+              res = -1;
-+      }
-+      return (int)res;
-+}
-+
-+/* Segment prefix opcodes */
-+enum {
-+      P_CS = 0x2e,
-+      P_SS = 0x36,
-+      P_DS = 0x3e,
-+      P_ES = 0x26,
-+      P_FS = 0x64,
-+      P_GS = 0x65
-+};
-+
-+/* Emulated vm86 ins instruction */
-+static void vm86_ins(int size)
-+{
-+      u32 edx, edi;
-+      edx = vm86.regs.edx & 0xffff;
-+      edi = (vm86.regs.edi & 0xffff) + (u32)(vm86.regs.es << 4);
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("std\n");
-+      else
-+              asm volatile ("cld\n");
-+
-+      switch (size) {
-+      case 4:
-+              asm volatile ("insl\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      case 2:
-+              asm volatile ("insw\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      case 1:
-+              asm volatile ("insb\n" : "=D" (edi) : "d" (edx), "0" (edi));
-+              break;
-+      }
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("cld\n");
-+
-+      edi -= (u32)(vm86.regs.es << 4);
-+
-+      vm86.regs.edi &= 0xffff0000;
-+      vm86.regs.edi |= edi & 0xffff;
-+}
-+
-+static void vm86_rep_ins(int size)
-+{
-+      u16 cx = vm86.regs.ecx;
-+      while (cx--)
-+              vm86_ins(size);
-+
-+      vm86.regs.ecx &= 0xffff0000;
-+}
-+
-+/* Emulated vm86 outs instruction */
-+static void vm86_outs(int size, int segment)
-+{
-+      u32 edx, esi, base;
-+
-+      edx = vm86.regs.edx & 0xffff;
-+      esi = vm86.regs.esi & 0xffff;
-+
-+      switch (segment) {
-+      case P_CS: base = vm86.regs.cs; break;
-+      case P_SS: base = vm86.regs.ss; break;
-+      case P_ES: base = vm86.regs.es; break;
-+      case P_FS: base = vm86.regs.fs; break;
-+      case P_GS: base = vm86.regs.gs; break;
-+      default:   base = vm86.regs.ds; break;
-+      }
-+
-+      esi += base << 4;
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("std\n");
-+      else
-+              asm volatile ("cld\n");
-+
-+      switch (size) {
-+      case 4:
-+              asm volatile ("outsl\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      case 2:
-+              asm volatile ("outsw\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      case 1:
-+              asm volatile ("outsb\n" : "=S" (esi) : "d" (edx), "0" (esi));
-+              break;
-+      }
-+
-+      if (vm86.regs.eflags & FLAG_D)
-+              asm volatile ("cld");
-+
-+      esi -= base << 4;
-+      vm86.regs.esi &= 0xffff0000;
-+      vm86.regs.esi |= (esi & 0xffff);
-+}
-+
-+static void vm86_rep_outs(int size, int segment)
-+{
-+      u16 cx = vm86.regs.ecx;
-+      while (cx--)
-+              vm86_outs(size, segment);
-+
-+      vm86.regs.ecx &= 0xffff0000;
-+}
-+
-+static int vm86_do_unknown(void)
-+{
-+      u8 data32 = 0, segment = P_DS, rep = 0;
-+      u8 *instr;
-+      int ret = 0, i = 0;
-+
-+      instr = (u8*)((vm86.regs.cs << 4) + vm86.regs.eip);
-+
-+      while (1) {
-+              switch(instr[i]) {
-+              case 0x66:      /* operand size prefix */
-+                      data32 = 1 - data32;
-+                      i++;
-+                      break;
-+              case 0xf2:      /* repnz */
-+              case 0xf3:      /* rep */
-+                      rep = 1;
-+                      i++;
-+                      break;
-+              case P_CS:      /* segment prefix */
-+              case P_SS:
-+              case P_DS:
-+              case P_ES:
-+              case P_FS:
-+              case P_GS:
-+                      segment = instr[i];
-+                      i++;
-+                      break;
-+              case 0xf0:      /* LOCK - ignored */
-+              case 0x67:      /* address size prefix - ignored */
-+                      i++;
-+                      break;
-+              case 0x6c:      /* insb */
-+                      if (rep)
-+                              vm86_rep_ins(1);
-+                      else
-+                              vm86_ins(1);
-+                      i++;
-+                      goto out;
-+              case 0x6d:      /* insw / insd */
-+                      if (rep) {
-+                              if (data32)
-+                                      vm86_rep_ins(4);
-+                              else
-+                                      vm86_rep_ins(2);
-+                      } else {
-+                              if (data32)
-+                                      vm86_ins(4);
-+                              else
-+                                      vm86_ins(2);
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0x6e:      /* outsb */
-+                      if (rep)
-+                              vm86_rep_outs(1, segment);
-+                      else
-+                              vm86_outs(1, segment);
-+                      i++;
-+                      goto out;
-+              case 0x6f:      /* outsw / outsd */
-+                      if (rep) {
-+                              if (data32)
-+                                      vm86_rep_outs(4, segment);
-+                              else
-+                                      vm86_rep_outs(2, segment);
-+                      } else {
-+                              if (data32)
-+                                      vm86_outs(4, segment);
-+                              else
-+                                      vm86_outs(2, segment);
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0xe4:      /* inb xx */
-+                      asm volatile (
-+                              "inb %w1, %b0"
-+                              : "=a" (vm86.regs.eax)
-+                              : "d" (instr[i+1]), "0" (vm86.regs.eax));
-+                      i += 2;
-+                      goto out;
-+              case 0xe5:      /* inw xx / ind xx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "inl %w1, %0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (instr[i+1]),
-+                                        "0" (vm86.regs.eax));
-+                      } else {
-+                              asm volatile (
-+                                      "inw %w1, %w0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (instr[i+1]),
-+                                        "0" (vm86.regs.eax));
-+                      }
-+                      i += 2;
-+                      goto out;
-+
-+              case 0xec:      /* inb dx */
-+                      asm volatile (
-+                              "inb %w1, %b0"
-+                              : "=a" (vm86.regs.eax)
-+                              : "d" (vm86.regs.edx), "0" (vm86.regs.eax));
-+                      i++;
-+                      goto out;
-+              case 0xed:      /* inw dx / ind dx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "inl %w1, %0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (vm86.regs.edx));
-+                      } else {
-+                              asm volatile (
-+                                      "inw %w1, %w0"
-+                                      : "=a" (vm86.regs.eax)
-+                                      : "d" (vm86.regs.edx));
-+                      }
-+                      i++;
-+                      goto out;
-+              case 0xe6:      /* outb xx */
-+                      asm volatile (
-+                              "outb %b0, %w1"
-+                              : /* no return value */
-+                              : "a" (vm86.regs.eax), "d" (instr[i+1]));
-+                      i += 2;
-+                      goto out;
-+              case 0xe7:      /* outw xx / outd xx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "outl %0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (instr[i+1]));
-+                      } else {
-+                              asm volatile (
-+                                      "outw %w0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (instr[i+1]));
-+                      }
-+                      i += 2;
-+                      goto out;
-+              case 0xee:      /* outb dx */
-+                      asm volatile (
-+                              "outb %b0, %w1"
-+                              : /* no return value */
-+                              : "a" (vm86.regs.eax), "d" (vm86.regs.edx));
-+                      i++;
-+                      goto out;
-+              case 0xef:      /* outw dx / outd dx */
-+                      if (data32) {
-+                              asm volatile (
-+                                      "outl %0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (vm86.regs.edx));
-+                      } else {
-+                              asm volatile (
-+                                      "outw %w0, %w1"
-+                                      : /* no return value */
-+                                      : "a" (vm86.regs.eax),
-+                                        "d" (vm86.regs.edx));
-+                      }
-+                      i++;
-+                      goto out;
-+              default:
-+                      printk(KERN_ERR "vesafb: BUG, opcode 0x%x emulation "
-+                                      "not supported (EIP: 0x%lx)\n",
-+                                      instr[i], (u32)(vm86.regs.cs << 4) +
-+                                      vm86.regs.eip);
-+                      ret = 1;
-+                      goto out;
-+              }
-+      }
-+out:  vm86.regs.eip += i;
-+      return ret;
-+}
-+
-+void vesafb_do_vm86(struct vm86_regs *regs)
-+{
-+      unsigned int ret;
-+      u8 *retcode = (void*)RET_CODE_ADDR;
-+
-+      memset(&vm86,0,sizeof(vm86));
-+      memcpy(&vm86.regs, regs, sizeof(struct vm86_regs));
-+
-+      /* The return code */
-+      retcode[0] = 0xcd;              /* int opcode */
-+      retcode[1] = 0xff;              /* int number (255) */
-+
-+        /* We use int 0xff to get back to protected mode */
-+      memset(&vm86.int_revectored, 0, sizeof(vm86.int_revectored));
-+        ((unsigned char *)&vm86.int_revectored)[0xff / 8] |= (1 << (0xff % 8));
-+
-+      /*
-+       * We want to call int 0x10, so we set:
-+       *   CS = 0x42 = 0x10 * 4 + 2
-+       *   IP = 0x40 = 0x10 * 4
-+       * and SS:ESP. It's up to the caller to set the rest of the registers.
-+       */
-+      vm86.regs.eflags = DEFAULT_VM86_FLAGS;
-+      vm86.regs.cs = *(unsigned short *)0x42;
-+      vm86.regs.eip = *(unsigned short *)0x40;
-+      vm86.regs.ss = (STACK_ADDR >> 4);
-+      vm86.regs.esp = ((STACK_ADDR & 0x0000f) + STACK_SIZE);
-+
-+      /* These will be fetched off the stack when we come to an iret in the
-+       * int's 0x10 code. */
-+      VM86_PUSHW(DEFAULT_VM86_FLAGS);
-+      VM86_PUSHW((RET_CODE_ADDR >> 4));       /* return code segment */
-+      VM86_PUSHW((RET_CODE_ADDR & 0x0000f));  /* return code offset */
-+
-+      while(1) {
-+              ret = vm86old(&vm86);
-+
-+              if (VM86_TYPE(ret) == VM86_INTx) {
-+                      int vint = VM86_ARG(ret);
-+
-+                      /* If exit from vm86 was caused by int 0xff, then
-+                       * we're done.. */
-+                      if (vint == 0xff)
-+                              goto out;
-+
-+                      /* .. otherwise, we have to call the int handler
-+                       * manually */
-+                      VM86_PUSHW(vm86.regs.eflags);
-+                      VM86_PUSHW(vm86.regs.cs);
-+                      VM86_PUSHW(vm86.regs.eip);
-+
-+                      vm86.regs.cs = *(u16 *)((vint << 2) + 2);
-+                      vm86.regs.eip = *(u16 *)(vint << 2);
-+                      vm86.regs.eflags &= ~(VIF_MASK | TF_MASK);
-+              } else if (VM86_TYPE(ret) == VM86_UNKNOWN) {
-+                      if (vm86_do_unknown())
-+                              goto out;
-+              } else {
-+                      printk(KERN_ERR "vesafb: BUG, returned from "
-+                                      "vm86 with %x (EIP: 0x%lx)\n",
-+                                      ret, (u32)(vm86.regs.cs << 4) +
-+                                      vm86.regs.eip);
-+                      goto out;
-+              }
-+      }
-+
-+out:  /* copy the registers' state back to the caller's struct */
-+      memcpy(regs, &vm86.regs, sizeof(struct vm86_regs));
-+}
-+
-+static int vesafb_remap_pfn_range(unsigned long start, unsigned long end,
-+                                unsigned long pgoff, unsigned long prot,
-+                                int type)
-+{
-+      struct vm_area_struct *vma;
-+      struct mm_struct *mm = current->mm;
-+      int ret = 0;
-+
-+      vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
-+      if (!vma)
-+              return -ENOMEM;
-+      memset(vma, 0, sizeof(*vma));
-+      down_write(&mm->mmap_sem);
-+      vma->vm_mm = mm;
-+      vma->vm_start = start;
-+      vma->vm_end = end;
-+      vma->vm_flags = VM_READ | VM_WRITE | VM_EXEC;
-+      vma->vm_flags |= mm->def_flags;
-+      vma->vm_page_prot.pgprot = prot;
-+      vma->vm_pgoff = pgoff;
-+
-+      if ((ret = insert_vm_struct(mm, vma))) {
-+              up_write(&mm->mmap_sem);
-+              kmem_cache_free(vm_area_cachep, vma);
-+              return ret;
-+      }
-+
-+      if (type) {
-+              ret = zeromap_page_range(vma,
-+                                       vma->vm_start,
-+                                       vma->vm_end - vma->vm_start,
-+                                       vma->vm_page_prot);
-+      } else {
-+              vma->vm_flags |= VM_SHARED;
-+              ret = remap_pfn_range(vma,
-+                                    vma->vm_start,
-+                                    vma->vm_pgoff,
-+                                    vma->vm_end - vma->vm_start,
-+                                    vma->vm_page_prot);
-+      }
-+      up_write(&mm->mmap_sem);
-+      return ret;
-+}
-+
-+static inline int vesafb_init_mem(void)
-+{
-+      int ret = 0;
-+
-+      /* The memory chunks we're remapping here should be multiples
-+       * of PAGE_SIZE. */
-+      ret += vesafb_remap_pfn_range(0x00000, IVTBDA_SIZE, 0,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 0);
-+      ret += vesafb_remap_pfn_range(IVTBDA_SIZE, REAL_MEM_SIZE, 0,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 1);
-+      ret += vesafb_remap_pfn_range(0x9f000, 0x100000, 
-+                                    0x9f000 >> PAGE_SHIFT,
-+                                    PROT_READ | PROT_EXEC | PROT_WRITE, 0);
-+      if (ret)
-+              printk(KERN_ERR "vesafb thread: memory remapping failed\n");
-+
-+      return ret;
-+}
-+
-+#define vesafb_get_string(str) \
-+{                                                                     \
-+      /* The address is in the form ssssoooo, where oooo = offset,    \
-+       * ssss = segment */                                            \
-+      addr = ((p_vbe(tsk->buf)->str & 0xffff0000) >> 12) +            \
-+              (p_vbe(tsk->buf)->str & 0x0000ffff);                    \
-+                                                                      \
-+      /* The data is in ROM which is shared between processes, so we  \
-+       * just translate the real mode address into one visible from   \
-+       * kernel space */                                              \
-+      if (addr >= 0xa0000) {                                          \
-+              p_vbe(tsk->buf)->str = (u32) __va(addr);                \
-+                                                                      \
-+      /* The data is in the buffer, we just have to convert the       \
-+       * address so that it points into the buffer user provided. */  \
-+      } else if (addr > BUF_ADDR && addr < BUF_ADDR +                 \
-+                 sizeof(struct vesafb_vbe_ib)) {                      \
-+              addr -= BUF_ADDR;                                       \
-+              p_vbe(tsk->buf)->str = (u32) (tsk->buf + addr);         \
-+                                                                      \
-+      /* This should never happen: someone was insane enough to put   \
-+       * the data somewhere in RAM.. */                               \
-+      } else {                                                        \
-+              p_vbe(tsk->buf)->str = (u32) "";                        \
-+      }                                                               \
-+}
-+
-+void vesafb_handle_getvbeib(struct vesafb_task *tsk)
-+{
-+      int addr, res;
-+
-+      tsk->regs.es  = (BUF_ADDR >> 4);
-+      tsk->regs.edi = (BUF_ADDR & 0x000f);
-+      strncpy(p_vbe(BUF_ADDR)->vbe_signature, "VBE2", 4);
-+
-+      vesafb_do_vm86(&tsk->regs);
-+      memcpy(tsk->buf, (void*)(BUF_ADDR), sizeof(struct vesafb_vbe_ib));
-+
-+      /* The OEM fields were not defined prior to VBE 2.0 */
-+      if (p_vbe(tsk->buf)->vbe_version >= 0x200) {
-+              vesafb_get_string(oem_string_ptr);
-+              vesafb_get_string(oem_vendor_name_ptr);
-+              vesafb_get_string(oem_product_name_ptr);
-+              vesafb_get_string(oem_product_rev_ptr);
-+      }
-+
-+      /* This is basically the same as vesafb_get_string() */
-+      addr = ((p_vbe(tsk->buf)->mode_list_ptr & 0xffff0000) >> 12) +
-+              (p_vbe(tsk->buf)->mode_list_ptr & 0x0000ffff);
-+
-+      if (addr >= 0xa0000) {
-+              p_vbe(tsk->buf)->mode_list_ptr = (u32) __va(addr);
-+      } else if (addr > BUF_ADDR && addr < BUF_ADDR +
-+                 sizeof(struct vesafb_vbe_ib)) {
-+              addr -= BUF_ADDR;
-+              p_vbe(tsk->buf)->mode_list_ptr = (u32) (tsk->buf + addr);
-+      } else {
-+              res = 0;
-+              printk(KERN_WARNING "vesafb: warning, copying modelist "
-+                                  "from somewhere in RAM!\n");
-+              while (*(u16*)(addr+res) != 0xffff &&
-+                     res < (sizeof(p_vbe(tsk->buf)->reserved) - 2)) {
-+                      *(u16*) ((u32)&(p_vbe(tsk->buf)->reserved) + res) =
-+                              *(u16*)(addr+res);
-+                      res += 2;
-+              }
-+              *(u16*) ((u32)&(p_vbe(tsk->buf)->reserved) + res) = 0xffff;
-+      }
-+}
-+
-+int vesafb_handle_tasks(void)
-+{
-+      struct vesafb_task *tsk;
-+      struct list_head *curr, *next;
-+      int ret = 0;
-+
-+      down(&vesafb_task_list_sem);
-+      list_for_each_safe(curr, next, &vesafb_task_list) {
-+              tsk = list_entry(curr, struct vesafb_task, node);
-+
-+              if (tsk->flags & TF_EXIT) {
-+                      ret = 1;
-+                      goto task_done;
-+              }
-+              if (tsk->flags & TF_GETVBEIB) {
-+                      vesafb_handle_getvbeib(tsk);
-+                      goto task_done;
-+              }
-+              /* Do we need to store a pointer to the buffer in ES:EDI? */
-+              if (tsk->flags & TF_BUF_DI) {
-+                      tsk->regs.es  = (BUF_ADDR >> 4);
-+                      tsk->regs.edi = (BUF_ADDR & 0x000f);
-+              }
-+              /* Sometimes the pointer has to be in ES:EBX. */
-+              if (tsk->flags & TF_BUF_BX) {
-+                      tsk->regs.es  = (BUF_ADDR >> 4);
-+                      tsk->regs.ebx = (BUF_ADDR & 0x000f);
-+              }
-+              if (tsk->flags & (TF_BUF_DI | TF_BUF_BX))
-+                      memcpy((void*)BUF_ADDR, tsk->buf, tsk->buf_len);
-+
-+              vesafb_do_vm86(&tsk->regs);
-+
-+              if (tsk->flags & TF_RETURN_BUF)
-+                      memcpy(tsk->buf, (void*)BUF_ADDR, tsk->buf_len);
-+
-+task_done:    list_del(curr);
-+              complete(&tsk->done);
-+      }
-+
-+      /* If we're going to kill this thread, don't allow any elements
-+       * to be added to the task list. */
-+      if (!ret)
-+              up(&vesafb_task_list_sem);
-+
-+      return ret;
-+}
-+
-+/*
-+ * This 'hybrid' thread serves as a backend for vesafb-tng, handling all vm86
-+ * calls. It is started as a kernel thread. It then creates its own mm struct,
-+ * thus separating itself from any userspace processes. At this moment, it
-+ * stops being a kernel thread (kernel threads have mm = NULL) and becomes
-+ * a 'hybrid' thread -- one that has full access to kernel space, yet runs
-+ * with its own address space.
-+ *
-+ * This is necessary because in order to make vm86 calls some parts of the
-+ * first 1MB of RAM have to be setup to mimic the real mode. These are:
-+ *  - interrupt vector table  [0x00000-0x003ff]
-+ *  - BIOS data area          [0x00400-0x004ff]
-+ *  - Extended BIOS data area [0x9fc00-0x9ffff]
-+ *  - the video RAM           [0xa0000-0xbffff]
-+ *  - video BIOS              [0xc0000-0xcffff]
-+ *  - motherboard BIOS                [0xf0000-0xfffff]
-+ */
-+int vesafb_thread(void *unused)
-+{
-+      int err = 0;
-+
-+      set_fs(KERNEL_DS);
-+      daemonize("vesafb");
-+
-+      if (set_new_mm()) {
-+              err = -ENOMEM;
-+              goto thr_end;
-+      }
-+      if (vesafb_init_mem()) {
-+              err = -ENOMEM;
-+              goto thr_end;
-+      }
-+
-+      DPRINTK("started vesafb thread\n");
-+
-+      /* Having an IO bitmap makes things faster as we avoid GPFs
-+       * when running vm86 code. We can live if it fails, though,
-+       * so don't bother checking for errors. */
-+      ioperm(0,1024,1);
-+      set_user_nice(current, -10);
-+
-+      complete(&vesafb_th_completion);
-+
-+      while (1) {
-+              if (vesafb_handle_tasks())
-+                      break;
-+              wait_event_interruptible(vesafb_wait,
-+                                       !list_empty(&vesafb_task_list));
-+              try_to_freeze();
-+      }
-+
-+out:  DPRINTK("exiting the vesafb thread\n");
-+      vesafb_pid = -1;
-+
-+      /* Now that all callers know this thread is no longer running
-+       * (pid < 0), allow them to continue. */
-+      up(&vesafb_task_list_sem);
-+      return err;
-+thr_end:
-+      down(&vesafb_task_list_sem);
-+      complete(&vesafb_th_completion);
-+      goto out;       
-+}
-+
-+int vesafb_queue_task(struct vesafb_task *tsk)
-+{
-+      down(&vesafb_task_list_sem);
-+      if (vesafb_pid < 0)
-+              return -1;
-+      list_add_tail(&tsk->node, &vesafb_task_list);
-+      up(&vesafb_task_list_sem);
-+      wake_up(&vesafb_wait);
-+      return 0;
-+}
-+
-+int vesafb_wait_for_thread(void)
-+{
-+      /* PID 0 means that the thread is still initializing. */
-+      if (vesafb_pid < 0)
-+              return -1;
-+      wait_for_completion(&vesafb_th_completion);
-+      return 0;
-+}
-+
-+int __init vesafb_init_thread(void)
-+{
-+      vesafb_pid = kernel_thread(vesafb_thread,NULL,0);
-+      return 0;
-+}
-+
-+#ifdef MODULE
-+void __exit vesafb_kill_thread(void)
-+{
-+      struct vesafb_task *tsk;
-+      if (vesafb_pid <= 0)
-+              return;
-+
-+      vesafb_create_task(tsk);
-+      if (!tsk)
-+              return;
-+      tsk->flags |= TF_EXIT;
-+      vesafb_queue_task(tsk);
-+      vesafb_wait_for_task(tsk);
-+      kfree(tsk);
-+      return;
-+}
-+module_exit(vesafb_kill_thread);
-+#endif
-+module_init(vesafb_init_thread);
-+
-+EXPORT_SYMBOL_GPL(vesafb_queue_task);
-+EXPORT_SYMBOL_GPL(vesafb_wait_for_thread);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Michal Januszewski");
-+
-diff --git a/drivers/video/vesafb-tng.c b/drivers/video/vesafb-tng.c
-new file mode 100644
-index 0000000..b4d4394
---- /dev/null
-+++ b/drivers/video/vesafb-tng.c
-@@ -0,0 +1,1586 @@
-+/*
-+ * Framebuffer driver for VBE 2.0+ compliant graphic boards
-+ *
-+ * (c) 2004-2006 Michal Januszewski <spock@gentoo.org>
-+ *     Based upon vesafb code by Gerd Knorr <kraxel@goldbach.in-berlin.de>
-+ *
-+ */
-+
-+#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/delay.h>
-+#include <linux/fb.h>
-+#include <linux/ioport.h>
-+#include <linux/init.h>
-+#include <linux/proc_fs.h>
-+#include <linux/completion.h>
-+#include <linux/platform_device.h>
-+#include <video/edid.h>
-+#include <video/vesa.h>
-+#include <video/vga.h>
-+#include <asm/io.h>
-+#include <asm/mtrr.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include "edid.h"
-+
-+#define dac_reg       (0x3c8)
-+#define dac_val       (0x3c9)
-+
-+#define VESAFB_NEED_EXACT_RES         1
-+#define VESAFB_NEED_EXACT_DEPTH 2
-+
-+/* --------------------------------------------------------------------- */
-+
-+static struct fb_var_screeninfo vesafb_defined __initdata = {
-+      .activate       = FB_ACTIVATE_NOW,
-+      .height         = 0,
-+      .width          = 0,
-+      .right_margin   = 32,
-+      .upper_margin   = 16,
-+      .lower_margin   = 4,
-+      .vsync_len      = 4,
-+      .vmode          = FB_VMODE_NONINTERLACED,
-+};
-+
-+static struct fb_fix_screeninfo vesafb_fix __initdata = {
-+      .id     = "VESA VGA",
-+      .type   = FB_TYPE_PACKED_PIXELS,
-+      .accel  = FB_ACCEL_NONE,
-+};
-+
-+static int  mtrr       = 0;   /* disable mtrr by default */
-+static int  blank      = 1;     /* enable blanking by default */
-+static int  ypan       = 0;   /* 0 - nothing, 1 - ypan, 2 - ywrap */
-+static int  pmi_setpal = 1;   /* pmi for palette changes */
-+static u16  *pmi_base  = NULL;  /* protected mode interface location */
-+static void (*pmi_start)(void) = NULL;
-+static void (*pmi_pal)(void)   = NULL;
-+static struct vesafb_vbe_ib  vbe_ib;
-+static struct vesafb_mode_ib *vbe_modes;
-+static int                   vbe_modes_cnt = 0;
-+static struct fb_info      *vesafb_info = NULL;
-+static int  nocrtc                = 0; /* ignore CRTC settings */
-+static int  noedid       __initdata = 0; /* don't try DDC transfers */
-+static int  vram_remap   __initdata = 0; /* set amount of memory to be used */
-+static int  vram_total   __initdata = 0; /* set total amount of memory */
-+static u16  maxclk       __initdata = 0; /* maximum pixel clock */
-+static u16  maxvf        __initdata = 0; /* maximum vertical frequency */
-+static u16  maxhf        __initdata = 0; /* maximum horizontal frequency */
-+static int  gtf          __initdata = 0; /* forces use of the GTF */
-+static char *mode_option __initdata = NULL;
-+static u16  vbemode      __initdata = 0;
-+
-+/* --------------------------------------------------------------------- */
-+
-+static int vesafb_find_vbe_mode(int xres, int yres, int depth,
-+                              unsigned char flags)
-+{
-+      int i, match = -1, h = 0, d = 0x7fffffff;
-+
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              h = abs(vbe_modes[i].x_res - xres) +
-+                  abs(vbe_modes[i].y_res - yres) +
-+                  abs(depth - vbe_modes[i].depth);
-+              if (h == 0)
-+                      return i;
-+              if (h < d || (h == d && vbe_modes[i].depth > depth)) {
-+                      d = h;
-+                      match = i;
-+              }
-+      }
-+      i = 1;
-+
-+      if (flags & VESAFB_NEED_EXACT_DEPTH && vbe_modes[match].depth != depth)
-+              i = 0;
-+      if (flags & VESAFB_NEED_EXACT_RES && d > 24)
-+              i = 0;
-+      if (i != 0)
-+              return match;
-+      else
-+              return -1;
-+}
-+
-+static int vesafb_pan_display(struct fb_var_screeninfo *var,
-+                              struct fb_info *info)
-+{
-+      int offset;
-+
-+      offset = (var->yoffset * info->fix.line_length + var->xoffset) / 4;
-+
-+      /* It turns out it's not the best idea to do panning via vm86,
-+       * so we only allow it if we have a PMI. */
-+      if (pmi_start) {
-+              __asm__ __volatile__(
-+                      "call *(%%edi)"
-+                      : /* no return value */
-+                      : "a" (0x4f07),         /* EAX */
-+                        "b" (0),              /* EBX */
-+                        "c" (offset),         /* ECX */
-+                        "d" (offset >> 16),   /* EDX */
-+                        "D" (&pmi_start));    /* EDI */
-+      }
-+      return 0;
-+}
-+
-+static int vesafb_blank(int blank, struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int err = 1;
-+
-+      if (vbe_ib.capabilities & VBE_CAP_VGACOMPAT) {
-+              int loop = 10000;
-+              u8 seq = 0, crtc17 = 0;
-+
-+              if (blank == FB_BLANK_POWERDOWN) {
-+                      seq = 0x20;
-+                      crtc17 = 0x00;
-+                      err = 0;
-+              } else {
-+                      seq = 0x00;
-+                      crtc17 = 0x80;
-+                      err = (blank == FB_BLANK_UNBLANK) ? 0 : -EINVAL;
-+              }
-+
-+              vga_wseq(NULL, 0x00, 0x01);
-+              seq |= vga_rseq(NULL, 0x01) & ~0x20;
-+              vga_wseq(NULL, 0x00, seq);
-+
-+              crtc17 |= vga_rcrt(NULL, 0x17) & ~0x80;
-+              while (loop--);
-+              vga_wcrt(NULL, 0x17, crtc17);
-+              vga_wseq(NULL, 0x00, 0x03);
-+      } else {
-+              vesafb_create_task (tsk);
-+              if (!tsk)
-+                      return -ENOMEM;
-+              tsk->regs.eax = 0x4f10;
-+              switch (blank) {
-+              case FB_BLANK_UNBLANK:
-+                      tsk->regs.ebx = 0x0001;
-+                      break;
-+              case FB_BLANK_NORMAL:
-+                      tsk->regs.ebx = 0x0101; /* standby */
-+                      break;
-+              case FB_BLANK_POWERDOWN:
-+                      tsk->regs.ebx = 0x0401; /* powerdown */
-+                      break;
-+              default:
-+                      goto out;
-+              }
-+              tsk->flags = TF_CALL;
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) == 0x004f)
-+                      err = 0;
-+out:          kfree(tsk);
-+      }
-+      return err;
-+}
-+
-+static int vesafb_setpalette(struct vesafb_pal_entry *entries, int count,
-+                           int start, struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int i = ((struct vesafb_par*)info->par)->mode_idx;
-+      int ret = 0;
-+
-+      /* We support palette modifications for 8 bpp modes only, so
-+       * there can never be more than 256 entries. */
-+      if (start + count > 256)
-+              return -EINVAL;
-+
-+      /* Use VGA registers if mode is VGA-compatible. */
-+      if (i >= 0 && i < vbe_modes_cnt &&
-+          vbe_modes[i].mode_attr & VBE_MODE_VGACOMPAT) {
-+              for (i = 0; i < count; i++) {
-+                      outb_p(start + i,        dac_reg);
-+                      outb_p(entries[i].red,   dac_val);
-+                      outb_p(entries[i].green, dac_val);
-+                      outb_p(entries[i].blue,  dac_val);
-+              }
-+      } else if (pmi_setpal) {
-+              __asm__ __volatile__(
-+              "call *(%%esi)"
-+              : /* no return value */
-+              : "a" (0x4f09),         /* EAX */
-+                "b" (0),              /* EBX */
-+                "c" (count),          /* ECX */
-+                "d" (start),          /* EDX */
-+                "D" (entries),        /* EDI */
-+                "S" (&pmi_pal));      /* ESI */
-+      } else {
-+              vesafb_create_task (tsk);
-+              if (!tsk)
-+                      return -ENOMEM;
-+              tsk->regs.eax = 0x4f09;
-+              tsk->regs.ebx = 0x0;
-+              tsk->regs.ecx = count;
-+              tsk->regs.edx = start;
-+              tsk->buf = entries;
-+              tsk->buf_len = sizeof(struct vesafb_pal_entry) * count;
-+              tsk->flags = TF_CALL | TF_BUF_DI;
-+
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+              if ((tsk->regs.eax & 0xffff) != 0x004f)
-+                      ret = 1;
-+              kfree(tsk);
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_setcolreg(unsigned regno, unsigned red, unsigned green,
-+                          unsigned blue, unsigned transp,
-+                          struct fb_info *info)
-+{
-+      struct vesafb_pal_entry entry;
-+      int shift = 16 - info->var.green.length;
-+      int ret = 0;
-+
-+      if (regno >= info->cmap.len)
-+              return -EINVAL;
-+
-+      if (info->var.bits_per_pixel == 8) {
-+              entry.red   = red   >> shift;
-+              entry.green = green >> shift;
-+              entry.blue  = blue  >> shift;
-+              entry.pad   = 0;
-+
-+              ret = vesafb_setpalette(&entry, 1, regno, info);
-+      } else if (regno < 16) {
-+              switch (info->var.bits_per_pixel) {
-+              case 16:
-+                      if (info->var.red.offset == 10) {
-+                              /* 1:5:5:5 */
-+                              ((u32*) (info->pseudo_palette))[regno] =
-+                                              ((red   & 0xf800) >>  1) |
-+                                              ((green & 0xf800) >>  6) |
-+                                              ((blue  & 0xf800) >> 11);
-+                      } else {
-+                              /* 0:5:6:5 */
-+                              ((u32*) (info->pseudo_palette))[regno] =
-+                                              ((red   & 0xf800)      ) |
-+                                              ((green & 0xfc00) >>  5) |
-+                                              ((blue  & 0xf800) >> 11);
-+                      }
-+                      break;
-+
-+              case 24:
-+              case 32:
-+                      red   >>= 8;
-+                      green >>= 8;
-+                      blue  >>= 8;
-+                      ((u32 *)(info->pseudo_palette))[regno] =
-+                              (red   << info->var.red.offset)   |
-+                              (green << info->var.green.offset) |
-+                              (blue  << info->var.blue.offset);
-+                      break;
-+              }
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_setcmap(struct fb_cmap *cmap, struct fb_info *info)
-+{
-+      struct vesafb_pal_entry *entries;
-+      int shift = 16 - info->var.green.length;
-+      int i, ret = 0;
-+
-+      if (info->var.bits_per_pixel == 8) {
-+              if (cmap->start + cmap->len > info->cmap.start +
-+                  info->cmap.len || cmap->start < info->cmap.start)
-+                      return -EINVAL;
-+
-+              entries = vmalloc(sizeof(struct vesafb_pal_entry) * cmap->len);
-+              if (!entries)
-+                      return -ENOMEM;
-+              for (i = 0; i < cmap->len; i++) {
-+                      entries[i].red   = cmap->red[i]   >> shift;
-+                      entries[i].green = cmap->green[i] >> shift;
-+                      entries[i].blue  = cmap->blue[i]  >> shift;
-+                      entries[i].pad   = 0;
-+              }
-+              ret = vesafb_setpalette(entries, cmap->len, cmap->start, info);
-+              vfree(entries);
-+      } else {
-+              /* For modes with bpp > 8, we only set the pseudo palette in
-+               * the fb_info struct. We rely on vesafb_setcolreg to do all
-+               * sanity checking. */
-+              for (i = 0; i < cmap->len; i++) {
-+                      ret += vesafb_setcolreg(cmap->start + i, cmap->red[i],
-+                                              cmap->green[i], cmap->blue[i],
-+                                              0, info);
-+              }
-+      }
-+      return ret;
-+}
-+
-+static int vesafb_set_par(struct fb_info *info)
-+{
-+      struct vesafb_par *par = (struct vesafb_par *) info->par;
-+      struct vesafb_task *tsk;
-+      struct vesafb_crtc_ib *crtc = NULL;
-+      struct vesafb_mode_ib *mode = NULL;
-+      int i, err = 0, depth = info->var.bits_per_pixel;
-+
-+      if (depth > 8 && depth != 32)
-+              depth = info->var.red.length + info->var.green.length +
-+                      info->var.blue.length;
-+
-+      i = vesafb_find_vbe_mode(info->var.xres, info->var.yres, depth,
-+                               VESAFB_NEED_EXACT_RES |
-+                               VESAFB_NEED_EXACT_DEPTH);
-+      if (i >= 0)
-+              mode = &vbe_modes[i];
-+      else
-+              return -EINVAL;
-+
-+      vesafb_create_task (tsk);
-+      if (!tsk)
-+              return -ENOMEM;
-+      tsk->regs.eax = 0x4f02;
-+      tsk->regs.ebx = mode->mode_id | 0x4000;         /* use LFB */
-+      tsk->flags = TF_CALL;
-+
-+      if (vbe_ib.vbe_version >= 0x0300 && !nocrtc &&
-+          info->var.pixclock != 0) {
-+              tsk->regs.ebx |= 0x0800;                /* use CRTC data */
-+              tsk->flags |= TF_BUF_DI;
-+              crtc = kmalloc(sizeof(struct vesafb_crtc_ib), GFP_KERNEL);
-+              if (!crtc) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+              crtc->horiz_start = info->var.xres + info->var.right_margin;
-+              crtc->horiz_end   = crtc->horiz_start + info->var.hsync_len;
-+              crtc->horiz_total = crtc->horiz_end + info->var.left_margin;
-+
-+              crtc->vert_start  = info->var.yres + info->var.lower_margin;
-+              crtc->vert_end    = crtc->vert_start + info->var.vsync_len;
-+              crtc->vert_total  = crtc->vert_end + info->var.upper_margin;
-+
-+              crtc->pixel_clock = PICOS2KHZ(info->var.pixclock) * 1000;
-+              crtc->refresh_rate = (u16)(100 * (crtc->pixel_clock /
-+                                   (crtc->vert_total * crtc->horiz_total)));
-+              crtc->flags = 0;
-+
-+              if (info->var.vmode & FB_VMODE_DOUBLE)
-+                      crtc->flags |= 0x1;
-+              if (info->var.vmode & FB_VMODE_INTERLACED)
-+                      crtc->flags |= 0x2;
-+              if (!(info->var.sync & FB_SYNC_HOR_HIGH_ACT))
-+                      crtc->flags |= 0x4;
-+              if (!(info->var.sync & FB_SYNC_VERT_HIGH_ACT))
-+                      crtc->flags |= 0x8;
-+              memcpy(&par->crtc, crtc, sizeof(struct vesafb_crtc_ib));
-+      } else
-+              memset(&par->crtc, 0, sizeof(struct vesafb_crtc_ib));
-+
-+      tsk->buf = (void*)crtc;
-+      tsk->buf_len = sizeof(struct vesafb_crtc_ib);
-+
-+      if (vesafb_queue_task (tsk)) {
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+              printk(KERN_ERR "vesafb: mode switch failed (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+              err = -EINVAL;
-+              goto out;
-+      }
-+      par->mode_idx = i;
-+
-+      /* For 8bpp modes, always try to set the DAC to 8 bits. */
-+      if (vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC &&
-+          mode->bits_per_pixel <= 8) {
-+              vesafb_reset_task(tsk);
-+              tsk->flags = TF_CALL;
-+              tsk->regs.eax = 0x4f08;
-+              tsk->regs.ebx = 0x0800;
-+
-+              if (!vesafb_queue_task (tsk))
-+                      vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f ||
-+                  ((tsk->regs.ebx & 0xff00) >> 8) != 8) {
-+                      /* We've failed to set the DAC palette format -
-+                       * time to correct var. */
-+                      info->var.red.length    = 6;
-+                      info->var.green.length  = 6;
-+                      info->var.blue.length   = 6;
-+              }
-+      }
-+
-+      info->fix.visual = (info->var.bits_per_pixel == 8) ?
-+                         FB_VISUAL_PSEUDOCOLOR : FB_VISUAL_TRUECOLOR;
-+      info->fix.line_length = mode->bytes_per_scan_line;
-+
-+      DPRINTK("set new mode %dx%d-%d (0x%x)\n",
-+              info->var.xres, info->var.yres, info->var.bits_per_pixel,
-+              mode->mode_id);
-+
-+out:  if (crtc != NULL)
-+              kfree(crtc);
-+      kfree(tsk);
-+
-+      return err;
-+}
-+
-+static void vesafb_setup_var(struct fb_var_screeninfo *var, struct fb_info *info,
-+                           struct vesafb_mode_ib *mode)
-+{
-+      var->xres = mode->x_res;
-+      var->yres = mode->y_res;
-+      var->xres_virtual = mode->x_res;
-+      var->yres_virtual = (ypan) ?
-+                            info->fix.smem_len / mode->bytes_per_scan_line :
-+                            mode->y_res;
-+      var->xoffset = 0;
-+      var->yoffset = 0;
-+      var->bits_per_pixel = mode->bits_per_pixel;
-+
-+      if (var->bits_per_pixel == 15)
-+              var->bits_per_pixel = 16;
-+
-+      if (var->bits_per_pixel > 8) {
-+              var->red.offset    = mode->red_off;
-+              var->red.length    = mode->red_len;
-+              var->green.offset  = mode->green_off;
-+              var->green.length  = mode->green_len;
-+              var->blue.offset   = mode->blue_off;
-+              var->blue.length   = mode->blue_len;
-+              var->transp.offset = mode->rsvd_off;
-+              var->transp.length = mode->rsvd_len;
-+
-+              DPRINTK("directcolor: size=%d:%d:%d:%d, shift=%d:%d:%d:%d\n",
-+                      mode->rsvd_len,
-+                      mode->red_len,
-+                      mode->green_len,
-+                      mode->blue_len,
-+                      mode->rsvd_off,
-+                      mode->red_off,
-+                      mode->green_off,
-+                      mode->blue_off);
-+      } else {
-+              var->red.offset    = 0;
-+              var->green.offset  = 0;
-+              var->blue.offset   = 0;
-+              var->transp.offset = 0;
-+
-+              /* We're assuming that we can switch the DAC to 8 bits. If
-+               * this proves to be incorrect, we'll update the fields
-+               * later in set_par(). */
-+              if (vbe_ib.capabilities & VBE_CAP_CAN_SWITCH_DAC) {
-+                      var->red.length    = 8;
-+                      var->green.length  = 8;
-+                      var->blue.length   = 8;
-+                      var->transp.length = 0;
-+              } else {
-+                      var->red.length    = 6;
-+                      var->green.length  = 6;
-+                      var->blue.length   = 6;
-+                      var->transp.length = 0;
-+              }
-+      }
-+}
-+
-+static void inline vesafb_check_limits(struct fb_var_screeninfo *var,
-+                                     struct fb_info *info)
-+{
-+      struct fb_videomode *mode;
-+
-+      if (!var->pixclock)
-+              return;
-+      if (vbe_ib.vbe_version < 0x0300) {
-+              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60, var, info);
-+              return;
-+      }
-+      if (!fb_validate_mode(var, info))
-+              return;
-+      mode = fb_find_best_mode(var, &info->modelist);
-+      if (mode) {
-+              DPRINTK("find_best_mode: %d %d @ %d (vmode: %d)\n",
-+                      mode->xres, mode->yres, mode->refresh, mode->vmode);
-+              if (mode->xres == var->xres && mode->yres == var->yres &&
-+                  !(mode->vmode & (FB_VMODE_INTERLACED | FB_VMODE_DOUBLE))) {
-+                      fb_videomode_to_var(var, mode);
-+                      return;
-+              }
-+      }
-+      if (info->monspecs.gtf && !fb_get_mode(FB_MAXTIMINGS, 0, var, info))
-+              return;
-+      /* Use default refresh rate */
-+      var->pixclock = 0;
-+}
-+
-+static int vesafb_check_var(struct fb_var_screeninfo *var,
-+                          struct fb_info *info)
-+{
-+      int match = -1;
-+      int depth = var->red.length + var->green.length + var->blue.length;
-+
-+      /* Various apps will use bits_per_pixel to set the color depth,
-+       * which is theoretically incorrect, but which we'll try to handle
-+       * here. */
-+      if (depth == 0 || abs(depth - var->bits_per_pixel) >= 8)
-+              depth = var->bits_per_pixel;
-+      match = vesafb_find_vbe_mode(var->xres, var->yres, depth,
-+                                   VESAFB_NEED_EXACT_RES);
-+
-+      if (match == -1) {
-+              DPRINTK("vesafb: mode %dx%d-%d not found\n", var->xres,
-+                      var->yres, depth);
-+              return -EINVAL;
-+      }
-+
-+      vesafb_setup_var(var, info, &vbe_modes[match]);
-+      DPRINTK("found mode 0x%x (%dx%d-%dbpp)\n",
-+              vbe_modes[match].mode_id, vbe_modes[match].x_res,
-+              vbe_modes[match].y_res, vbe_modes[match].depth);
-+
-+      /* Check whether we have remapped enough memory for this mode. */
-+      if (var->yres * vbe_modes[match].bytes_per_scan_line >
-+          info->fix.smem_len) {
-+              return -EINVAL;
-+      }
-+
-+      if ((var->vmode & FB_VMODE_DOUBLE) &&
-+          !(vbe_modes[match].mode_attr & 0x100))
-+              var->vmode &= ~FB_VMODE_DOUBLE;
-+      if ((var->vmode & FB_VMODE_INTERLACED) &&
-+          !(vbe_modes[match].mode_attr & 0x200))
-+              var->vmode &= ~FB_VMODE_INTERLACED;
-+      vesafb_check_limits(var, info);
-+      return 0;
-+}
-+
-+static int vesafb_open(struct fb_info *info, int user)
-+{
-+      struct vesafb_task *tsk = NULL;
-+      struct vesafb_par *par = info->par;
-+      int cnt = atomic_read(&par->ref_count);
-+
-+      if (!cnt) {
-+              vesafb_create_task(tsk);
-+              if (!tsk)
-+                      goto out;
-+
-+              /* Get the VBE state buffer size. We want all available
-+               * hardware state data (CL = 0x0f). */
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0000;
-+              tsk->flags = TF_CALL;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+              
-+              if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+                      printk(KERN_WARNING "vesafb: VBE state buffer size "
-+                              "cannot be determined (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+                      goto out;
-+              }
-+
-+              par->vbe_state_size = 64 * (tsk->regs.ebx & 0xffff);
-+              par->vbe_state = kzalloc(par->vbe_state_size, GFP_KERNEL);
-+              if (!par->vbe_state) 
-+                      goto out;
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0001;
-+              tsk->flags = TF_CALL | TF_BUF_BX | TF_RETURN_BUF;
-+              tsk->buf = (void*)(par->vbe_state);
-+              tsk->buf_len = par->vbe_state_size;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto getstate_failed;
-+              vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+                      printk(KERN_WARNING "vesafb: VBE get state call "
-+                              "failed (eax: 0x%lx)\n", tsk->regs.eax);
-+                      goto getstate_failed;
-+              }
-+      }
-+out:
-+      atomic_inc(&par->ref_count);
-+      if (tsk)
-+              kfree(tsk);
-+      return 0;
-+
-+getstate_failed:
-+      kfree(par->vbe_state);
-+      par->vbe_state = NULL;
-+      par->vbe_state_size = 0;
-+      goto out;
-+}
-+
-+static int vesafb_release(struct fb_info *info, int user)
-+{
-+      struct vesafb_task *tsk = NULL;
-+      struct vesafb_par *par = info->par;
-+      int cnt = atomic_read(&par->ref_count);
-+
-+      if (!cnt)
-+              return -EINVAL;
-+      
-+      if (cnt == 1 && par->vbe_state && par->vbe_state_size) {
-+              vesafb_create_task(tsk);
-+              if (!tsk)
-+                      goto out;
-+
-+              tsk->regs.eax = 0x0003;
-+              tsk->regs.ebx = 0x0000;
-+              tsk->flags = TF_CALL;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f04;
-+              tsk->regs.ecx = 0x000f;
-+              tsk->regs.edx = 0x0002;
-+              tsk->buf = (void*)(par->vbe_state);
-+              tsk->buf_len = par->vbe_state_size;
-+              tsk->flags = TF_CALL | TF_BUF_BX;
-+
-+              if (vesafb_queue_task(tsk))
-+                      goto out;
-+      
-+              vesafb_wait_for_task(tsk);
-+
-+              if ((tsk->regs.eax & 0xffff) != 0x004f)
-+                      printk(KERN_WARNING "vesafb: VBE state restore call "
-+                              "failed (eax: 0x%lx)\n",
-+                              tsk->regs.eax);
-+      }
-+out:
-+      atomic_dec(&par->ref_count);
-+      if (tsk)
-+              kfree(tsk);
-+      return 0;
-+}
-+
-+static int __init vesafb_probe(struct platform_device *device);
-+
-+static struct fb_ops vesafb_ops = {
-+      .owner          = THIS_MODULE,
-+      .fb_open        = vesafb_open,
-+      .fb_release     = vesafb_release,
-+      .fb_setcolreg   = vesafb_setcolreg,
-+      .fb_setcmap     = vesafb_setcmap,
-+      .fb_pan_display = vesafb_pan_display,
-+      .fb_blank       = vesafb_blank,
-+      .fb_fillrect    = cfb_fillrect,
-+      .fb_copyarea    = cfb_copyarea,
-+      .fb_imageblit   = cfb_imageblit,
-+      .fb_check_var   = vesafb_check_var,
-+      .fb_set_par     = vesafb_set_par
-+};
-+
-+static struct platform_driver vesafb_driver = {
-+      .probe  = vesafb_probe,
-+      .driver = {
-+              .name   = "vesafb",
-+      },
-+};
-+
-+static struct platform_device *vesafb_device;
-+ 
-+#ifndef MODULE
-+int __init vesafb_setup(char *options)
-+{
-+      char *this_opt;
-+
-+      if (!options || !*options)
-+              return 0;
-+
-+      DPRINTK("options %s\n",options);
-+
-+      while ((this_opt = strsep(&options, ",")) != NULL) {
-+              if (!*this_opt) continue;
-+
-+              DPRINTK("this_opt: %s\n",this_opt);
-+
-+              if (! strcmp(this_opt, "redraw"))
-+                      ypan=0;
-+              else if (! strcmp(this_opt, "ypan"))
-+                      ypan=1;
-+              else if (! strcmp(this_opt, "ywrap"))
-+                      ypan=2;
-+              else if (! strcmp(this_opt, "vgapal"))
-+                      pmi_setpal=0;
-+              else if (! strcmp(this_opt, "pmipal"))
-+                      pmi_setpal=1;
-+              else if (! strncmp(this_opt, "mtrr:", 5))
-+                      mtrr = simple_strtoul(this_opt+5, NULL, 0);
-+              else if (! strcmp(this_opt, "nomtrr"))
-+                      mtrr=0;
-+              else if (! strcmp(this_opt, "nocrtc"))
-+                      nocrtc=1;
-+              else if (! strcmp(this_opt, "noedid"))
-+                      noedid=1;
-+              else if (! strcmp(this_opt, "noblank"))
-+                      blank=0;
-+              else if (! strcmp(this_opt, "gtf"))
-+                      gtf=1;
-+              else if (! strncmp(this_opt, "vtotal:", 7))
-+                      vram_total = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "vremap:", 7))
-+                      vram_remap = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "maxhf:", 6))
-+                      maxhf = simple_strtoul(this_opt + 6, NULL, 0);
-+              else if (! strncmp(this_opt, "maxvf:", 6))
-+                      maxvf = simple_strtoul(this_opt + 6, NULL, 0);
-+              else if (! strncmp(this_opt, "maxclk:", 7))
-+                      maxclk = simple_strtoul(this_opt + 7, NULL, 0);
-+              else if (! strncmp(this_opt, "vbemode:", 8))
-+                      vbemode = simple_strtoul(this_opt + 8, NULL,0);
-+              else if (this_opt[0] >= '0' && this_opt[0] <= '9') {
-+                      DPRINTK("mode_option: %s\n",this_opt);
-+                      mode_option = this_opt;
-+              } else {
-+                      printk(KERN_WARNING
-+                             "vesafb: unrecognized option %s\n", this_opt);
-+              }
-+      }
-+
-+      return 0;
-+}
-+#endif /* !MODULE */
-+
-+static int vesafb_read_proc_modes(char *buf, char **start, off_t offset,
-+                                int len, int *eof, void *private)
-+{
-+      int clen = 0, i;
-+
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              clen += min(snprintf(buf + clen, len - clen, "%dx%d-%d\n", vbe_modes[i].x_res,
-+                              vbe_modes[i].y_res, vbe_modes[i].depth), len - clen);
-+      }
-+      *eof = 1;
-+      return clen;
-+}
-+
-+static int vesafb_read_proc_vbe_info(char *buf, char **start, off_t offset,
-+                                   int len, int *eof, void *private)
-+{
-+      int clen = 0;
-+
-+      clen += min(snprintf(buf + clen, len, "Version:    %d.%d\n",
-+                      ((vbe_ib.vbe_version & 0xff00) >> 8),
-+                      vbe_ib.vbe_version & 0xff), len);
-+      clen += min(snprintf(buf + clen, len - clen, "Vendor:     %s\n",
-+                      (char*)vbe_ib.oem_vendor_name_ptr), len - clen);
-+      clen += min(snprintf(buf + clen, len - clen, "Product:    %s\n",
-+                      (char*)vbe_ib.oem_product_name_ptr), len - clen);
-+      clen += min(snprintf(buf + clen, len - clen, "OEM rev:    %s\n",
-+                      (char*)vbe_ib.oem_product_rev_ptr), len - clen);
-+      clen += min(snprintf(buf + clen, len - clen, "OEM string: %s\n",
-+                      (char*)vbe_ib.oem_string_ptr), len - clen);
-+
-+      *eof = 1;
-+      return clen;
-+}
-+
-+static int __init inline vesafb_vbe_getinfo(struct vesafb_task *tsk)
-+{
-+      tsk->regs.eax = 0x4f00;
-+      tsk->flags = TF_CALL | TF_GETVBEIB;
-+      tsk->buf = &vbe_ib;
-+      tsk->buf_len = sizeof(vbe_ib);
-+      if (vesafb_queue_task (tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if (vbe_ib.vbe_version < 0x0200) {
-+              printk(KERN_ERR "vesafb: Sorry, pre-VBE 2.0 cards are "
-+                              "not supported.\n");
-+              return -EINVAL;
-+      }
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f) {
-+              printk(KERN_ERR "vesafb: Getting mode info block failed "
-+                              "(eax=0x%x)\n", (u32)tsk->regs.eax);
-+              return -EINVAL;
-+      }
-+
-+      printk(KERN_INFO "vesafb: %s, %s, %s (OEM: %s)\n",
-+              (char*)vbe_ib.oem_vendor_name_ptr,
-+              (char*)vbe_ib.oem_product_name_ptr,
-+              (char*)vbe_ib.oem_product_rev_ptr,
-+              (char*)vbe_ib.oem_string_ptr);
-+
-+      printk(KERN_INFO "vesafb: VBE version: %d.%d\n",
-+                       ((vbe_ib.vbe_version & 0xff00) >> 8),
-+                       vbe_ib.vbe_version & 0xff);
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getmodes(struct vesafb_task *tsk)
-+{
-+      u16 *mode = 0;
-+      int off = 0;
-+
-+      /* Count available modes. */
-+      mode = (u16*)vbe_ib.mode_list_ptr;
-+      while (*mode != 0xffff) {
-+              vbe_modes_cnt++;
-+              mode++;
-+      }
-+
-+      vbe_modes = kmalloc(sizeof(struct vesafb_mode_ib)*
-+                          vbe_modes_cnt, GFP_KERNEL);
-+      if (!vbe_modes)
-+              return -ENOMEM;
-+
-+      /* Get mode info for all available modes. */
-+      mode = (u16*)vbe_ib.mode_list_ptr;
-+
-+      while (*mode != 0xffff) {
-+              struct vesafb_mode_ib *mib;
-+
-+              vesafb_reset_task(tsk);
-+              tsk->regs.eax = 0x4f01;
-+              tsk->regs.ecx = (u32) *mode;
-+              tsk->flags = TF_CALL | TF_RETURN_BUF | TF_BUF_DI;
-+              tsk->buf = vbe_modes+off;
-+              tsk->buf_len = sizeof(struct vesafb_mode_ib);
-+              if (vesafb_queue_task(tsk))
-+                      return -EINVAL;
-+              vesafb_wait_for_task(tsk);
-+              mib = p_mode(tsk->buf);
-+              mib->mode_id = *mode;
-+
-+              /* We only want modes that are supported with the currennt
-+               * hardware configuration (D0), color (D3), graphics (D4)
-+               * and that have support for the LFB (D7). */
-+              if ((mib->mode_attr & 0x99) == 0x99 &&
-+                  mib->bits_per_pixel >= 8) {
-+                      off++;
-+              } else {
-+                      vbe_modes_cnt--;
-+              }
-+              mode++;
-+              mib->depth = mib->red_len + mib->green_len + mib->blue_len;
-+              /* Handle 8bpp modes and modes with broken color component
-+               * lengths. */
-+              if (mib->depth == 0 ||
-+                  (mib->depth == 24 && mib->bits_per_pixel == 32))
-+                      mib->depth = mib->bits_per_pixel;
-+      }
-+
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getpmi(struct vesafb_task *tsk)
-+{
-+      int i;
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f0a;
-+      tsk->regs.ebx = 0x0;
-+      tsk->flags = TF_CALL;
-+      if (vesafb_queue_task(tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f || tsk->regs.es < 0xc000) {
-+              pmi_setpal = ypan = 0;
-+      } else {
-+              pmi_base  = (u16*)phys_to_virt(((u32)tsk->regs.es << 4) +
-+                           tsk->regs.edi);
-+              pmi_start = (void*)((char*)pmi_base + pmi_base[1]);
-+              pmi_pal   = (void*)((char*)pmi_base + pmi_base[2]);
-+              printk(KERN_INFO "vesafb: protected mode interface info at "
-+                               "%04x:%04x\n",
-+                               (u16)tsk->regs.es, (u16)tsk->regs.edi);
-+              printk(KERN_INFO "vesafb: pmi: set display start = %p, "
-+                               "set palette = %p\n", pmi_start, pmi_pal);
-+
-+              if (pmi_base[3]) {
-+                      printk(KERN_INFO "vesafb: pmi: ports = ");
-+                      for (i = pmi_base[3]/2; pmi_base[i] != 0xffff; i++)
-+                              printk("%x ",pmi_base[i]);
-+                      printk("\n");
-+
-+                      /*
-+                       * memory areas not supported (yet?)
-+                       *
-+                       * Rules are: we have to set up a descriptor for the
-+                       * requested memory area and pass it in the ES register
-+                       * to the BIOS function.
-+                       */
-+                      if (pmi_base[i] != 0xffff) {
-+                              printk(KERN_INFO "vesafb: can't handle memory "
-+                                               "requests, pmi disabled\n");
-+                              ypan = pmi_setpal = 0;
-+                      }
-+              }
-+      }
-+      return 0;
-+}
-+
-+static int __init inline vesafb_vbe_getedid(struct vesafb_task *tsk,
-+                                          struct fb_info *info)
-+{
-+      int res = 0;
-+
-+      if (noedid || vbe_ib.vbe_version < 0x0300)
-+              return -EINVAL;
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f15;
-+      tsk->regs.ebx = 0;
-+      tsk->regs.ecx = 0;
-+      if (vesafb_queue_task(tsk))
-+              return -EINVAL;
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) != 0x004f)
-+              return -EINVAL;
-+
-+      if ((tsk->regs.ebx & 0x3) == 3) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports both "
-+                               "DDC1 and DDC2 transfers\n");
-+      } else if ((tsk->regs.ebx & 0x3) == 2) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports DDC2 "
-+                               "transfers\n");
-+      } else if ((tsk->regs.ebx & 0x3) == 1) {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware supports DDC1 "
-+                               "transfers\n");
-+      } else {
-+              printk(KERN_INFO "vesafb: VBIOS/hardware doesn't support "
-+                               "DDC transfers\n");
-+              return -EINVAL;
-+      }
-+
-+      vesafb_reset_task(tsk);
-+      tsk->regs.eax = 0x4f15;
-+      tsk->regs.ebx = 1;
-+      tsk->regs.ecx = tsk->regs.edx = 0;
-+      tsk->flags = TF_CALL | TF_RETURN_BUF | TF_BUF_DI;
-+      tsk->buf = kmalloc(EDID_LENGTH, GFP_KERNEL);
-+      tsk->buf_len = EDID_LENGTH;
-+
-+      if (vesafb_queue_task(tsk)) {
-+              res = -EINVAL;
-+              goto out;
-+      }
-+      vesafb_wait_for_task(tsk);
-+
-+      if ((tsk->regs.eax & 0xffff) == 0x004f) {
-+              fb_edid_to_monspecs(tsk->buf, &info->monspecs);
-+              fb_videomode_to_modelist(info->monspecs.modedb,
-+                              info->monspecs.modedb_len, &info->modelist);
-+              if (info->monspecs.vfmax && info->monspecs.hfmax) {
-+                      /* If the maximum pixel clock wasn't specified in
-+                       * the EDID block, set it to 300 MHz. */
-+                      if (info->monspecs.dclkmax == 0)
-+                              info->monspecs.dclkmax = 300 * 1000000;
-+                      info->monspecs.gtf = 1;
-+              } else {
-+                      res = -EINVAL;
-+              }
-+      }
-+
-+out:  kfree(tsk->buf);
-+      return res;
-+}
-+
-+static void __init inline vesafb_vbe_getmonspecs(struct vesafb_task *tsk,
-+                                               struct fb_info *info)
-+{
-+      struct fb_var_screeninfo var;
-+      int i;
-+      memset(&info->monspecs, 0, sizeof(struct fb_monspecs));
-+
-+      /* If we didn't get all necessary data from the EDID block,
-+       * mark it as incompatible with the GTF. */
-+      if (vesafb_vbe_getedid(tsk, info))
-+              info->monspecs.gtf = 0;
-+
-+      /* Kernel command line overrides. */
-+      if (maxclk)
-+              info->monspecs.dclkmax = maxclk * 1000000;
-+      if (maxvf)
-+              info->monspecs.vfmax = maxvf;
-+      if (maxhf)
-+              info->monspecs.hfmax = maxhf * 1000;
-+
-+      /* In case DDC transfers are not supported the user can provide
-+       * monitor limits manually. Lower limits are set to "safe" values. */
-+      if (info->monspecs.gtf == 0 && maxclk && maxvf && maxhf) {
-+              info->monspecs.dclkmin = 0;
-+              info->monspecs.vfmin = 60;
-+              info->monspecs.hfmin = 29000;
-+              info->monspecs.gtf = 1;
-+      }
-+
-+      if (info->monspecs.gtf) {
-+              printk(KERN_INFO
-+                      "vesafb: monitor limits: vf = %d Hz, hf = %d kHz, "
-+                      "clk = %d MHz\n", info->monspecs.vfmax,
-+                      (int)(info->monspecs.hfmax / 1000),
-+                      (int)(info->monspecs.dclkmax / 1000000));
-+              /* Add valid VESA video modes to our modelist. */
-+              for (i = 0; i < VESA_MODEDB_SIZE; i++) {
-+                      fb_videomode_to_var(&var, (struct fb_videomode *)
-+                                          &vesa_modes[i]);
-+                      if (!fb_validate_mode(&var, info))
-+                              fb_add_videomode((struct fb_videomode *)
-+                                               &vesa_modes[i],
-+                                               &info->modelist);
-+              }
-+      } else {
-+              /* Add all VESA video modes to our modelist. */
-+              fb_videomode_to_modelist((struct fb_videomode *)vesa_modes,
-+                                       VESA_MODEDB_SIZE, &info->modelist);
-+              printk(KERN_INFO "vesafb: no monitor limits have been set\n");
-+      }
-+      return;
-+}
-+
-+static int __init inline vesafb_vbe_init(struct fb_info *info)
-+{
-+      struct vesafb_task *tsk;
-+      int res = 0;
-+
-+      vesafb_create_task(tsk);
-+      if (!tsk)
-+              return -EINVAL;
-+      if ((res = vesafb_vbe_getinfo(tsk)) != 0)
-+              goto out;
-+      if ((res = vesafb_vbe_getmodes(tsk)) != 0)
-+              goto out;
-+      if (pmi_setpal || ypan)
-+              vesafb_vbe_getpmi(tsk);
-+
-+      INIT_LIST_HEAD(&info->modelist);
-+      vesafb_vbe_getmonspecs(tsk, info);
-+
-+out:  kfree(tsk);
-+      return res;
-+}
-+
-+static int __init decode_mode(u32 *xres, u32 *yres, u32 *bpp, u32 *refresh)
-+{
-+      int len = strlen(mode_option), i, err = 0;
-+      u8 res_specified = 0, bpp_specified = 0, refresh_specified = 0,
-+         yres_specified = 0;
-+
-+      for (i = len-1; i >= 0; i--) {
-+              switch (mode_option[i]) {
-+              case '@':
-+                      len = i;
-+                      if (!refresh_specified && !bpp_specified &&
-+                          !yres_specified) {
-+                              *refresh = simple_strtoul(&mode_option[i+1],
-+                                                        NULL, 0);
-+                              refresh_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case '-':
-+                      len = i;
-+                      if (!bpp_specified && !yres_specified) {
-+                              *bpp = simple_strtoul(&mode_option[i+1],
-+                                                    NULL, 0);
-+                              bpp_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case 'x':
-+                      if (!yres_specified) {
-+                              *yres = simple_strtoul(&mode_option[i+1],
-+                                                     NULL, 0);
-+                              yres_specified = 1;
-+                      } else
-+                              goto out;
-+                      break;
-+              case '0'...'9':
-+                      break;
-+              default:
-+                      goto out;
-+              }
-+      }
-+
-+      if (i < 0 && yres_specified) {
-+              *xres = simple_strtoul(mode_option, NULL, 0);
-+              res_specified = 1;
-+      }
-+
-+out:  if (!res_specified || !yres_specified) {
-+              printk(KERN_ERR "vesafb: invalid resolution, "
-+                              "%s not specified\n",
-+                              (!res_specified) ? "width" : "height");
-+              err = -EINVAL;
-+      }
-+
-+      return err;
-+}
-+
-+static int __init vesafb_init_set_mode(struct fb_info *info)
-+{
-+      struct fb_videomode *fbmode;
-+      struct fb_videomode mode;
-+      int i, modeid, refresh = 0;
-+      u8 refresh_specified = 0;
-+
-+      if (!mode_option)
-+              mode_option = CONFIG_FB_VESA_DEFAULT_MODE;
-+
-+      if (vbemode > 0) {
-+              for (i = 0; i < vbe_modes_cnt; i++) {
-+                      if (vbe_modes[i].mode_id == vbemode) {
-+                              info->var.vmode = FB_VMODE_NONINTERLACED;
-+                              info->var.sync = FB_SYNC_VERT_HIGH_ACT;
-+                              vesafb_setup_var(&info->var, info,
-+                                               &vbe_modes[i]);
-+                              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON,
-+                                          60, &info->var, info);
-+                              /* With pixclock set to 0, the default BIOS
-+                               * timings will be used in set_par(). */
-+                              info->var.pixclock = 0;
-+                              modeid = i;
-+                              goto out;
-+                      }
-+              }
-+              printk(KERN_INFO "specified VBE mode %d not found\n",
-+                               vbemode);
-+              vbemode = 0;
-+      }
-+
-+      /* Decode the mode specified on the kernel command line. We save
-+       * the depth into bits_per_pixel, which is wrong, but will work
-+       * anyway. */
-+      if (decode_mode(&info->var.xres, &info->var.yres,
-+                      &info->var.bits_per_pixel, &refresh))
-+              return -EINVAL;
-+      if (refresh)
-+              refresh_specified = 1;
-+      else
-+              refresh = 60;
-+
-+      /* Look for a matching VBE mode. We can live if an exact match
-+       * cannot be found. */
-+      modeid = vesafb_find_vbe_mode(info->var.xres, info->var.yres,
-+                                    info->var.bits_per_pixel, 0);
-+
-+      if (modeid == -1) {
-+              return -EINVAL;
-+      } else {
-+              info->var.vmode = FB_VMODE_NONINTERLACED;
-+              info->var.sync = FB_SYNC_VERT_HIGH_ACT;
-+              vesafb_setup_var(&info->var, info, &vbe_modes[modeid]);
-+      }
-+      if (vbe_ib.vbe_version < 0x0300) {
-+              fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 60,
-+                          &info->var, info);
-+              goto out;
-+      }
-+      if (!gtf) {
-+              struct fb_videomode tmode;
-+
-+              if (refresh_specified) {
-+                      fb_var_to_videomode(&tmode, &info->var);
-+                      tmode.refresh = refresh;
-+                      fbmode = fb_find_nearest_mode(&tmode, 
-+                                                    &info->modelist);
-+              } else
-+                      fbmode = fb_find_best_mode(&info->var, 
-+                                                 &info->modelist);
-+
-+              if (fbmode->xres == info->var.xres &&
-+                  fbmode->yres == info->var.yres &&
-+                  !(fbmode->vmode & (FB_VMODE_INTERLACED | FB_VMODE_DOUBLE))
-+                  && (!refresh_specified || 
-+                  abs(refresh - fbmode->refresh) <= 5)) {
-+                      fb_videomode_to_var(&info->var, fbmode);
-+                      return modeid;
-+              }
-+      }
-+      i = FB_MAXTIMINGS;
-+      if (!info->monspecs.gtf)
-+              i = FB_IGNOREMON | FB_VSYNCTIMINGS;
-+      else if (refresh_specified)
-+              i = FB_VSYNCTIMINGS;
-+      if (!fb_get_mode(i, refresh, &info->var, info))
-+              goto out;
-+      if (info->monspecs.gtf &&
-+          !fb_get_mode(FB_MAXTIMINGS, 0, &info->var, info))
-+              goto out;
-+      /* Use default refresh rate */
-+      printk(KERN_WARNING "vesafb: using default BIOS refresh rate\n");
-+      info->var.pixclock = 0;
-+
-+out:
-+      fb_var_to_videomode(&mode, &info->var);
-+      fb_add_videomode(&mode, &info->modelist);
-+      return modeid;
-+}
-+
-+static int __init vesafb_probe(struct platform_device *dev)
-+{
-+      char entry[16];
-+      struct fb_info *info;
-+      struct vesafb_mode_ib *mode = NULL;
-+      int err = 0, i, h;
-+      unsigned int size_vmode;
-+      unsigned int size_remap;
-+      unsigned int size_total;
-+
-+      vesafb_info = info = framebuffer_alloc(sizeof(struct vesafb_par) +
-+                                             sizeof(u32) * 256, &dev->dev);
-+      if (!info)
-+              return -ENOMEM;
-+
-+      if (vesafb_wait_for_thread()) {
-+              printk(KERN_ERR "vesafb: vesafb thread not running\n");
-+              framebuffer_release(info);
-+              return -EINVAL;
-+      }
-+
-+      if (vesafb_vbe_init(info)) {
-+              printk(KERN_ERR "vesafb: vbe_init failed\n");
-+              err = -EINVAL;
-+              goto out;
-+      }
-+
-+      vesafb_fix.ypanstep  = ypan     ? 1 : 0;
-+      vesafb_fix.ywrapstep = (ypan>1) ? 1 : 0;
-+
-+      info->pseudo_palette = ((u8*)info->par + sizeof(struct vesafb_par));
-+      info->fbops = &vesafb_ops;
-+      info->var = vesafb_defined;
-+      info->fix = vesafb_fix;
-+
-+      if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
-+              err = -ENXIO;
-+              goto out;
-+      }
-+
-+      i = vesafb_init_set_mode(info);
-+      if (i < 0) {
-+              err = -EINVAL;
-+              goto out_cmap;
-+      } else
-+              mode = &vbe_modes[i];
-+
-+      /* Disable blanking if the user requested so. */
-+      if (!blank) {
-+              info->fbops->fb_blank = NULL;
-+      }
-+
-+      /* Find out how much IO memory is required for the mode with
-+       * the highest resolution. */
-+      size_remap = 0;
-+      for (i = 0; i < vbe_modes_cnt; i++) {
-+              h = vbe_modes[i].bytes_per_scan_line * vbe_modes[i].y_res;
-+              if (h > size_remap)
-+                      size_remap = h;
-+      }
-+      size_remap *= 2;
-+
-+      /*   size_vmode -- that is the amount of memory needed for the
-+       *                 used video mode, i.e. the minimum amount of
-+       *                 memory we need. */
-+      if (mode != NULL) {
-+              size_vmode = info->var.yres * mode->bytes_per_scan_line;
-+      } else {
-+              size_vmode = info->var.yres * info->var.xres *
-+                           ((info->var.bits_per_pixel + 7) >> 3);
-+      }
-+
-+      /*   size_total -- all video memory we have. Used for mtrr
-+       *                 entries, ressource allocation and bounds
-+       *                 checking. */
-+      size_total = vbe_ib.total_memory * 65536;
-+      if (vram_total)
-+              size_total = vram_total * 1024 * 1024;
-+      if (size_total < size_vmode)
-+              size_total = size_vmode;
-+      ((struct vesafb_par*)(info->par))->mem_total = size_total;
-+
-+      /*   size_remap -- the amount of video memory we are going to
-+       *                 use for vesafb.  With modern cards it is no
-+       *                 option to simply use size_total as th
-+       *                 wastes plenty of kernel address space. */
-+      if (vram_remap)
-+              size_remap = vram_remap * 1024 * 1024;
-+      if (size_remap < size_vmode)
-+              size_remap = size_vmode;
-+      if (size_remap > size_total)
-+              size_remap = size_total;
-+
-+      info->fix.smem_len = size_remap;
-+      info->fix.smem_start = mode->phys_base_ptr;
-+
-+      /* We have to set it here, because when setup_var() was called,
-+       * smem_len wasn't defined yet. */
-+      info->var.yres_virtual = info->fix.smem_len /
-+                               mode->bytes_per_scan_line;
-+
-+      if (ypan && info->var.yres_virtual > info->var.yres) {
-+              printk(KERN_INFO "vesafb: scrolling: %s "
-+                     "using protected mode interface, "
-+                     "yres_virtual=%d\n",
-+                     (ypan > 1) ? "ywrap" : "ypan",info->var.yres_virtual);
-+      } else {
-+              printk(KERN_INFO "vesafb: scrolling: redraw\n");
-+              info->var.yres_virtual = info->var.yres;
-+              ypan = 0;
-+      }
-+
-+      info->flags = FBINFO_FLAG_DEFAULT |
-+              (ypan) ? FBINFO_HWACCEL_YPAN : 0;
-+
-+      if (!ypan)
-+              info->fbops->fb_pan_display = NULL;
-+
-+      if (!request_mem_region(info->fix.smem_start, size_total, "vesafb")) {
-+              printk(KERN_WARNING "vesafb: cannot reserve video memory at "
-+                     "0x%lx\n", info->fix.smem_start);
-+              /* We cannot make this fatal. Sometimes this comes from magic
-+                 spaces our resource handlers simply don't know about. */
-+      }
-+
-+      info->screen_base = ioremap(info->fix.smem_start, info->fix.smem_len);
-+
-+      if (!info->screen_base) {
-+              printk(KERN_ERR
-+                     "vesafb: abort, cannot ioremap video memory "
-+                     "0x%x @ 0x%lx\n",
-+                     info->fix.smem_len, info->fix.smem_start);
-+              err = -EIO;
-+              goto out_mem;
-+      }
-+
-+      /* Request failure does not faze us, as vgacon probably has this
-+         region already (FIXME) */
-+      request_region(0x3c0, 32, "vesafb");
-+
-+#ifdef CONFIG_MTRR
-+      if (mtrr && !(info->fix.smem_start & (PAGE_SIZE - 1))) {
-+              int temp_size = size_total;
-+              unsigned int type = 0;
-+
-+              switch (mtrr) {
-+              case 1:
-+                      type = MTRR_TYPE_UNCACHABLE;
-+                      break;
-+              case 2:
-+                      type = MTRR_TYPE_WRBACK;
-+                      break;
-+              case 3:
-+                      type = MTRR_TYPE_WRCOMB;
-+                      break;
-+              case 4:
-+                      type = MTRR_TYPE_WRTHROUGH;
-+                      break;
-+              default:
-+                      type = 0;
-+                      break;
-+              }
-+
-+              if (type) {
-+                      int rc;
-+
-+                      /* Find the largest power-of-two */
-+                      while (temp_size & (temp_size - 1))
-+                              temp_size &= (temp_size - 1);
-+
-+                      /* Try and find a power of two to add */
-+                      do {
-+                              rc = mtrr_add(info->fix.smem_start,
-+                                            temp_size, type, 1);
-+                              temp_size >>= 1;
-+                      } while (temp_size >= PAGE_SIZE && rc == -EINVAL);
-+              }
-+      }
-+#endif /* CONFIG_MTRR */
-+
-+      if (register_framebuffer(info) < 0) {
-+              printk(KERN_ERR
-+                     "vesafb: failed to register framebuffer device\n");
-+              err = -EINVAL;
-+              goto out_mem;
-+      }
-+
-+      printk(KERN_INFO "vesafb: framebuffer at 0x%lx, mapped to 0x%p, "
-+             "using %dk, total %dk\n", info->fix.smem_start,
-+             info->screen_base, size_remap/1024, size_total/1024);
-+      printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node,
-+             info->fix.id);
-+
-+      sprintf(entry, "fb%d", info->node);
-+      proc_mkdir(entry, 0);
-+
-+      sprintf(entry, "fb%d/modes", info->node);
-+      create_proc_read_entry(entry, 0, 0, vesafb_read_proc_modes, NULL);
-+
-+      sprintf(entry, "fb%d/vbe_info", info->node);
-+      create_proc_read_entry(entry, 0, 0, vesafb_read_proc_vbe_info, NULL);
-+      return 0;
-+
-+out_mem:
-+      release_mem_region(info->fix.smem_start, size_total);
-+      if (!list_empty(&info->modelist))
-+              fb_destroy_modelist(&info->modelist);
-+      fb_destroy_modedb(info->monspecs.modedb);
-+out_cmap:
-+      fb_dealloc_cmap(&info->cmap);
-+out:
-+      framebuffer_release(info);
-+      vesafb_info = NULL;
-+      kfree(vbe_modes);
-+      vbe_modes = NULL;
-+      return err;
-+}
-+
-+int __init vesafb_init(void)
-+{
-+      int ret;
-+#ifndef MODULE
-+      char *option = NULL;
-+
-+      if (fb_get_options("vesafb", &option))
-+              return -ENODEV;
-+      vesafb_setup(option);
-+#endif
-+      ret = platform_driver_register(&vesafb_driver);
-+
-+      if (!ret) {
-+              vesafb_device = platform_device_alloc("vesafb", 0);
-+
-+              if (vesafb_device)
-+                      ret = platform_device_add(vesafb_device);
-+              else
-+                      ret = -ENOMEM;
-+
-+              if (ret) {
-+                      platform_device_put(vesafb_device);
-+                      platform_driver_unregister(&vesafb_driver);
-+              }
-+      }
-+      return ret;
-+}
-+
-+module_init(vesafb_init);
-+
-+#ifdef MODULE
-+void __exit vesafb_exit(void)
-+{
-+      char entry[16];
-+
-+      if (vesafb_info)
-+              unregister_framebuffer(vesafb_info);
-+
-+      platform_device_unregister(vesafb_device);
-+      platform_driver_unregister(&vesafb_driver);
-+
-+      if (vesafb_info) {
-+              struct vesafb_par *par = (struct vesafb_par*)vesafb_info->par;
-+
-+              sprintf(entry, "fb%d/modes", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              sprintf(entry, "fb%d/vbe_info", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              sprintf(entry, "fb%d", vesafb_info->node);
-+              remove_proc_entry(entry, NULL);
-+
-+              iounmap(vesafb_info->screen_base);
-+              release_mem_region(vesafb_info->fix.smem_start,
-+                                 par->mem_total);
-+              fb_dealloc_cmap(&vesafb_info->cmap);
-+              if (!list_empty(&vesafb_info->modelist))
-+                      fb_destroy_modelist(&vesafb_info->modelist);
-+              fb_destroy_modedb(vesafb_info->monspecs.modedb);
-+              framebuffer_release(vesafb_info);
-+      }
-+
-+      if (vbe_modes != NULL)
-+              kfree(vbe_modes);
-+}
-+
-+module_exit(vesafb_exit);
-+
-+static inline int param_get_scroll(char *buffer, struct kernel_param *kp)
-+{
-+      return 0;
-+}
-+static inline int param_set_scroll(const char *val, struct kernel_param *kp)
-+{
-+      ypan = 0;
-+
-+      if (! strcmp(val, "redraw"))
-+              ypan = 0;
-+      else if (! strcmp(val, "ypan"))
-+              ypan = 1;
-+      else if (! strcmp(val, "ywrap"))
-+              ypan = 2;
-+
-+      return 0;
-+}
-+
-+#define param_check_scroll(name, p) __param_check(name, p, void);
-+
-+module_param_named(scroll, ypan, scroll, 0);
-+MODULE_PARM_DESC(scroll,"Scrolling mode, set to 'redraw', 'ypan' or 'ywrap'");
-+module_param_named(vgapal, pmi_setpal, invbool, 0);
-+MODULE_PARM_DESC(vgapal,"bool: set palette using VGA registers");
-+module_param_named(pmipal, pmi_setpal, bool, 0);
-+MODULE_PARM_DESC(pmipal,"bool: set palette using PMI calls");
-+module_param(mtrr, uint, 0);
-+MODULE_PARM_DESC(mtrr,"Memory Type Range Registers setting. Use 0 to disable.");
-+module_param(blank, bool, 1);
-+MODULE_PARM_DESC(blank,"bool: enable hardware blanking");
-+module_param(nocrtc, bool, 0);
-+MODULE_PARM_DESC(nocrtc,"bool: ignore CRTC timings when setting modes");
-+module_param(noedid, bool, 0);
-+MODULE_PARM_DESC(noedid,"bool: ignore EDID-provided monitor limits "
-+                      "when setting modes");
-+module_param(gtf, bool, 0);
-+MODULE_PARM_DESC(gtf,"bool: force use of VESA GTF to calculate mode timings");
-+module_param(vram_remap, uint, 0);
-+MODULE_PARM_DESC(vram_remap,"Set amount of video memory to be used [MiB]");
-+module_param(vram_total, uint, 0);
-+MODULE_PARM_DESC(vram_total,"Set total amount of video memoery [MiB]");
-+module_param(maxclk, ushort, 0);
-+MODULE_PARM_DESC(maxclk,"Maximum pixelclock [MHz], overrides EDID data");
-+module_param(maxhf, ushort, 0);
-+MODULE_PARM_DESC(maxhf,"Maximum horizontal frequency [kHz], "
-+                     "overrides EDID data");
-+module_param(maxvf, ushort, 0);
-+MODULE_PARM_DESC(maxvf,"Maximum vertical frequency [Hz], "
-+                     "overrides EDID data");
-+module_param_named(mode, mode_option, charp, 0);
-+MODULE_PARM_DESC(mode, "Specify resolution as "
-+                     "\"<xres>x<yres>[-<bpp>][@<refresh>]\"");
-+module_param(vbemode, ushort, 0);
-+MODULE_PARM_DESC(vbemode,"VBE mode number to set, overrides 'mode' setting");
-+
-+#endif /* MODULE */
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Michal Januszewski");
-+MODULE_DESCRIPTION("Framebuffer driver for VBE2.0+ compliant graphics boards");
-+
-diff --git a/include/linux/sched.h b/include/linux/sched.h
-index 4463735..7283e48 100644
---- a/include/linux/sched.h
-+++ b/include/linux/sched.h
-@@ -1390,6 +1390,8 @@ extern void mmput(struct mm_struct *);
- extern struct mm_struct *get_task_mm(struct task_struct *task);
- /* Remove the current tasks stale references to the old mm_struct */
- extern void mm_release(struct task_struct *, struct mm_struct *);
-+/* Create a new mm for a kernel thread */
-+extern int set_new_mm(void);
- extern int  copy_thread(int, unsigned long, unsigned long, unsigned long, struct task_struct *, struct pt_regs *);
- extern void flush_thread(void);
-diff --git a/include/video/vesa.h b/include/video/vesa.h
-new file mode 100644
-index 0000000..bb5abcf
---- /dev/null
-+++ b/include/video/vesa.h
-@@ -0,0 +1,150 @@
-+#if 0
-+#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , \
-+                                                ## args)
-+#else
-+#define DPRINTK(fmt, args...)
-+#endif
-+
-+#define p_crtc(arg) ((struct vesafb_crtc_ib*)(arg))
-+#define p_vbe(arg)  ((struct vesafb_vbe_ib*)(arg))
-+#define p_mode(arg) ((struct vesafb_mode_ib*)(arg))
-+
-+struct vesafb_task {
-+      u8 flags;
-+      void *buf;
-+      int buf_len;
-+      struct vm86_regs regs;
-+      struct list_head node;
-+      struct completion done;
-+};
-+
-+/* Vesafb task flags and masks */
-+#define TF_CALL               0x00
-+#define TF_EXIT               0x01
-+#define TF_GETVBEIB   0x02
-+#define TF_BUF_DI     0x04
-+#define TF_BUF_BX     0x08
-+#define TF_RETURN_BUF 0x10
-+
-+/* Macros and functions for manipulating vesafb tasks */
-+#define vesafb_create_task(task)                              \
-+do {                                                          \
-+      task = kmalloc(sizeof(struct vesafb_task), GFP_ATOMIC); \
-+      if (task)                                               \
-+              memset(task, 0, sizeof(struct vesafb_task));    \
-+      init_completion(&task->done);                           \
-+} while (0)
-+
-+#define vesafb_wait_for_task(task)    wait_for_completion(&task->done);
-+#define vesafb_reset_task(task)               init_completion(&task->done);
-+int vesafb_queue_task(struct vesafb_task *task);
-+
-+/* Functions for controlling the vesafb thread */
-+int vesafb_wait_for_thread(void);
-+
-+#define VBE_CAP_CAN_SWITCH_DAC        0x01
-+#define VBE_CAP_VGACOMPAT     0x02
-+
-+/* This struct is 512 bytes long */
-+struct vesafb_vbe_ib {
-+      char vbe_signature[4];
-+      u16  vbe_version;
-+      u32  oem_string_ptr;
-+      u32  capabilities;
-+      u32  mode_list_ptr;
-+      u16  total_memory;
-+      u16  oem_software_rev;
-+      u32  oem_vendor_name_ptr;
-+      u32  oem_product_name_ptr;
-+      u32  oem_product_rev_ptr;
-+      u8   reserved[222];
-+      char oem_data[256];
-+} __attribute__ ((packed));
-+
-+struct vesafb_crtc_ib {
-+      u16 horiz_total;
-+      u16 horiz_start;
-+      u16 horiz_end;
-+      u16 vert_total;
-+      u16 vert_start;
-+      u16 vert_end;
-+      u8  flags;
-+      u32 pixel_clock;
-+      u16 refresh_rate;
-+      u8  reserved[40];
-+} __attribute__ ((packed));
-+
-+#define VBE_MODE_VGACOMPAT    0x20
-+
-+struct vesafb_mode_ib {
-+      /* for all VBE revisions */
-+      u16 mode_attr;
-+      u8  winA_attr;
-+      u8  winB_attr;
-+      u16 win_granularity;
-+      u16 win_size;
-+      u16 winA_seg;
-+      u16 winB_seg;
-+      u32 win_func_ptr;
-+      u16 bytes_per_scan_line;
-+
-+      /* for VBE 1.2+ */
-+      u16 x_res;
-+      u16 y_res;
-+      u8  x_char_size;
-+      u8  y_char_size;
-+      u8  planes;
-+      u8  bits_per_pixel;
-+      u8  banks;
-+      u8  memory_model;
-+      u8  bank_size;
-+      u8  image_pages;
-+      u8  reserved1;
-+
-+      /* Direct color fields for direct/6 and YUV/7 memory models. */
-+      /* Offsets are bit positions of lsb in the mask. */
-+      u8  red_len;
-+      u8  red_off;
-+      u8  green_len;
-+      u8  green_off;
-+      u8  blue_len;
-+      u8  blue_off;
-+      u8  rsvd_len;
-+      u8  rsvd_off;
-+      u8  direct_color_info;  /* direct color mode attributes */
-+
-+      /* for VBE 2.0+ */
-+      u32 phys_base_ptr;
-+      u8  reserved2[6];
-+
-+      /* for VBE 3.0+ */
-+      u16 lin_bytes_per_scan_line;
-+      u8  bnk_image_pages;
-+      u8  lin_image_pages;
-+      u8  lin_red_len;
-+      u8  lin_red_off;
-+      u8  lin_green_len;
-+      u8  lin_green_off;
-+      u8  lin_blue_len;
-+      u8  lin_blue_off;
-+      u8  lin_rsvd_len;
-+      u8  lin_rsvd_off;
-+      u32 max_pixel_clock;
-+      u16 mode_id;
-+      u8  depth;
-+} __attribute__ ((packed));
-+
-+struct vesafb_pal_entry {
-+      u_char blue, green, red, pad;
-+} __attribute__ ((packed));
-+
-+struct vesafb_par {
-+      u8 *vbe_state;
-+      int vbe_state_size;
-+      atomic_t ref_count;
-+      
-+      u32 mem_total;
-+      int mode_idx;
-+      struct vesafb_crtc_ib crtc;
-+};
-+
-diff --git a/kernel/fork.c b/kernel/fork.c
-index fc723e5..dc8f93b 100644
---- a/kernel/fork.c
-+++ b/kernel/fork.c
-@@ -100,6 +100,7 @@ struct kmem_cache *fs_cachep;
- /* SLAB cache for vm_area_struct structures */
- struct kmem_cache *vm_area_cachep;
-+EXPORT_SYMBOL_GPL(vm_area_cachep);
- /* SLAB cache for mm_struct structures (tsk->mm) */
- static struct kmem_cache *mm_cachep;
-@@ -399,6 +400,40 @@ void mmput(struct mm_struct *mm)
- EXPORT_SYMBOL_GPL(mmput);
- /**
-+ * set_new_mm - allocate, init and activate a new mm for a kernel thread
-+ */
-+int set_new_mm(void)
-+{
-+      struct mm_struct *mm;
-+      struct task_struct *tsk = current;
-+      struct mm_struct *active_mm;
-+
-+      mm = mm_alloc();
-+      if (!mm)
-+              goto fail_nomem;
-+      if (init_new_context(current,mm))
-+              goto fail_nocontext;
-+
-+      task_lock(tsk);
-+      tsk->flags |= PF_BORROWED_MM;   
-+      active_mm = tsk->active_mm;
-+      current->mm = mm;
-+      current->active_mm = mm;
-+      activate_mm(active_mm, mm);
-+      task_unlock(current);
-+
-+      /* Drop the previous active_mm */
-+      mmdrop(active_mm);
-+      return 0;
-+      
-+fail_nocontext:
-+      mmdrop(mm);
-+fail_nomem:
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL_GPL(set_new_mm);
-+
-+/**
-  * get_task_mm - acquire a reference to the task's mm
-  *
-  * Returns %NULL if the task has no mm.  Checks PF_BORROWED_MM (meaning
-diff --git a/mm/memory.c b/mm/memory.c
-index 563792f..a9519ea 100644
---- a/mm/memory.c
-+++ b/mm/memory.c
-@@ -1193,6 +1193,7 @@ int zeromap_page_range(struct vm_area_struct *vma,
-       } while (pgd++, addr = next, addr != end);
-       return err;
- }
-+EXPORT_SYMBOL_GPL(zeromap_page_range);
- pte_t * fastcall get_locked_pte(struct mm_struct *mm, unsigned long addr, spinlock_t **ptl)
- {
-diff --git a/mm/mmap.c b/mm/mmap.c
-index 9717337..6fa5b1c 100644
---- a/mm/mmap.c
-+++ b/mm/mmap.c
-@@ -2024,6 +2024,7 @@ int insert_vm_struct(struct mm_struct * mm, struct vm_area_struct * vma)
-       vma_link(mm, vma, prev, rb_link, rb_parent);
-       return 0;
- }
-+EXPORT_SYMBOL_GPL(insert_vm_struct);
- /*
-  * Copy the vma structure to a new location in the same mm,
diff --git a/meta/packages/linux/linux-rp-2.6.22/wm97xx-lcdnoise-r0.patch b/meta/packages/linux/linux-rp-2.6.22/wm97xx-lcdnoise-r0.patch
deleted file mode 100644 (file)
index 191de3a..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-Index: linux-tosa/drivers/input/touchscreen/wm9712.c
-===================================================================
---- linux-tosa.orig/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/drivers/input/touchscreen/wm9712.c      2006-08-29 16:52:50.923275896 +0100
-@@ -1,7 +1,7 @@
- /*
-  * wm9712.c  --  Codec driver for Wolfson WM9712 AC97 Codecs.
-  *
-- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC.
-  * Author: Liam Girdwood
-  *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-  * Parts Copyright : Ian Molton <spyro@f2s.com>
-@@ -13,6 +13,12 @@
-  *  Free Software Foundation;  either version 2 of the  License, or (at your
-  *  option) any later version.
-  *
-+ *  Revision history
-+ *     4th Jul 2005  Initial version.
-+ *    29th Aug 2006  Mike Arthur <mike@mikearthur.co.uk>
-+ *                   Added fixes for Sharp SL-6000 (Tosa) LCD noise causing
-+ *                   touchscreen interference.
-+ *
-  */
- #include <linux/module.h>
-@@ -28,6 +34,10 @@
- #define WM9705_VERSION                "0.60"
- #define DEFAULT_PRESSURE      0xb0c0
-+#define CCNT(a)     asm volatile ("mrc p14, 0, %0, C1, C1, 0" : "=r"(a))
-+#define CCNT_ON()   asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1))
-+#define CCNT_OFF()  asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1))
-+
- /*
-  * Debug
-  */
-@@ -243,6 +253,36 @@
-       return wm->dig[2] & WM9712_PDEN;
- }
-+
-+#ifdef CONFIG_MACH_TOSA
-+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait
-+ * before sampling the Y axis of the touchscreen */
-+static inline void wm9712_lcd_sync_on(struct wm97xx* wm, int adcsel) {
-+    unsigned long timer1 = 0, timer2 = 0, wait_time = 0;
-+    if (adcsel == WM97XX_ADCSEL_Y) {
-+        wait_time = wm97xx_calc_lcd_waittime(wm);
-+
-+        CCNT_ON();
-+
-+        if (wait_time) {
-+            /* wait for LCD rising edge */
-+            wm_machinfo->wait_hsync();
-+            /* get clock */
-+            CCNT(timer1);
-+            CCNT(timer2);
-+
-+            while ((timer2 - timer1) < wait_time) {
-+                CCNT(timer2);
-+            }
-+        }
-+    }
-+}
-+
-+static inline void wm9712_lcd_sync_off(void) {
-+    CCNT_OFF();
-+}
-+#endif
-+
- /*
-  * Read a sample from the WM9712 adc in polling mode.
-  */
-@@ -260,6 +300,9 @@
-       /* set up digitiser */
-       if (adcsel & 0x8000)
-               adcsel = ((adcsel & 0x7fff) + 3) << 12;
-+    #ifdef CONFIG_MACH_TOSA
-+    wm9712_lcd_sync_on(wm, adcsel);
-+    #endif
-       wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay));
-       
-       /* wait 3 AC97 time slots + delay for conversion */
-@@ -282,6 +325,10 @@
-       
-       *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD);
-       
-+    #ifdef CONFIG_MACH_TOSA
-+    wm9712_lcd_sync_off();
-+    #endif
-+
-       /* check we have correct sample */
-       if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) {
-               dbg ("adc wrong sample, read %x got %x", adcsel,
-@@ -303,11 +350,12 @@
- static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data)
- {
-       int rc;
--      
-       if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID)
-               return rc;
-+
-       if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID)
-               return rc;
-+
-       if (pil && !five_wire) {
-               if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID)
-                       return rc;
-Index: linux-tosa/drivers/input/touchscreen/wm97xx-core.c
-===================================================================
---- linux-tosa.orig/drivers/input/touchscreen/wm97xx-core.c    2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:50.924275744 +0100
-@@ -2,7 +2,7 @@
-  * wm97xx-core.c  --  Touch screen driver core for Wolfson WM9705, WM9712
-  *                           and WM9713 AC97 Codecs.
-  *
-- * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC.
-+ * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC.
-  * Author: Liam Girdwood
-  *         liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com
-  * Parts Copyright : Ian Molton <spyro@f2s.com>
-@@ -67,6 +67,9 @@
-  *                   GPIOs) and 2.6 power management. 
-  *    29th Nov 2004  Added WM9713 support.
-  *     4th Jul 2005  Moved codec specific code out to seperate files.
-+ *    29th Aug 2006  Mike Arthur <mike@mikearthur.co.uk>
-+ *                   Added fixes for Sharp SL-6000 (Tosa) LCD noise causing
-+ *                   touchscreen interference.
-  */  
-     
- #include <linux/module.h>
-@@ -94,6 +97,7 @@
- static DECLARE_MUTEX(gpio_sem);
- static LIST_HEAD(wm97xx_misc_list);
- static struct wm97xx* wm_codec = NULL;
-+struct wm97xx_machinfo *wm_machinfo;
- /*
-  * WM97xx - enable/disable AUX ADC sysfs 
-@@ -832,6 +836,23 @@
-               mdev->remove(wm_codec);
- }
-+#ifdef CONFIG_MACH_TOSA
-+/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait
-+ * before sampling the Y axis of the touchscreen */
-+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm) {
-+    unsigned long hsync_time = wm_machinfo->get_hsync_time();
-+    return hsync_time;
-+}
-+
-+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo) {
-+    wm_machinfo = machinfo;
-+}
-+
-+void wm97xx_unset_machinfo() {
-+    wm_machinfo = NULL;
-+}
-+#endif
-+
- static struct device_driver wm97xx_driver = {
-       .name =         "ac97", 
-       .bus =          &ac97_bus_type, 
-@@ -861,6 +882,9 @@
- EXPORT_SYMBOL_GPL(wm97xx_reg_write);
- EXPORT_SYMBOL_GPL(wm97xx_register_misc_dev);
- EXPORT_SYMBOL_GPL(wm97xx_unregister_misc_dev);
-+EXPORT_SYMBOL_GPL(wm97xx_calc_lcd_waittime);
-+EXPORT_SYMBOL_GPL(wm97xx_set_machinfo);
-+EXPORT_SYMBOL_GPL(wm97xx_unset_machinfo);
- module_init(wm97xx_init); 
- module_exit(wm97xx_exit);
-Index: linux-tosa/include/linux/wm97xx.h
-===================================================================
---- linux-tosa.orig/include/linux/wm97xx.h     2006-08-29 16:52:36.008543280 +0100
-+++ linux-tosa/include/linux/wm97xx.h  2006-08-29 16:52:50.924275744 +0100
-@@ -207,6 +207,7 @@
- struct wm97xx;
- extern struct wm97xx_codec_drv wm97xx_codec;
-+extern struct wm97xx_machinfo *wm_machinfo;
- /*
-  * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs
-@@ -253,6 +254,11 @@
-       struct list_head list;
- };
-+struct wm97xx_machinfo {
-+    unsigned long (*get_hsync_time)(void);
-+    void (*wait_hsync)(void);
-+};
-+
- int wm97xx_register_misc_dev(struct wm97xx_misc_dev* mdev);
- void wm97xx_unregister_misc_dev(struct wm97xx_misc_dev* mdev);
-@@ -281,4 +287,9 @@
- int wm97xx_acc_startup(struct wm97xx* wm);
- void wm97xx_acc_shutdown(struct wm97xx* wm);
-+
-+unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm);
-+void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo);
-+void wm97xx_unset_machinfo(void);
-+
- #endif
diff --git a/meta/packages/linux/linux-rp_2.6.17.bb b/meta/packages/linux/linux-rp_2.6.17.bb
deleted file mode 100644 (file)
index 5bc97f3..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-require linux-rp.inc
-
-PR = "r37"
-
-# Handy URLs
-# git://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git \
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2 \
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/patch-2.6.15-rc1.bz2;patch=1 \
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/snapshots/patch-2.6.15-rc2-git1.bz2;patch=1 \
-# ${KERNELORG_MIRROR}pub/linux/kernel/people/alan/linux-2.6/2.6.10/patch-2.6.10-ac8.gz;patch=1 \
-# ${KERNELORG_MIRROR}pub/linux/kernel/people/akpm/patches/2.6/2.6.14-rc2/2.6.14-rc2-mm1/2.6.14-rc2-mm1.bz2;patch=1 \
-
-# Patches submitted upstream are towards top of this list
-# Hacks should clearly named and at the bottom
-SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.17.tar.bz2 \
-           ${RPSRC}/poodle_partsize-r0.patch;patch=1;status=merged \
-           ${RPSRC}/jffs2_longfilename-r1.patch;patch=1;status=merged \
-           ${RPSRC}/locomo_led_default_trigger-r0.patch;patch=1;status=merged \
-           ${RPSRC}/zaurus_reboot-r3.patch;patch=1;status=merged \
-           ${RPSRC}/poodle_mmcsd_fix-r0.patch;patch=1;status=merged \
-           ${RPSRC}/poodle_ssp-r1.patch;patch=1;status=merged \
-           ${RPSRC}/sharpsl_pm-do-r2.patch;patch=1;status=merged \
-           ${RPSRC}/zlib_inflate-r3.patch;patch=1;status=merged \
-           ${RPSRC}/logo_rotate_fix-r1.patch;patch=1;status=merged \
-           ${RPSRC}/collie_frontlight-r6.patch;patch=1;status=merged \
-           ${RPSRC}/input_modalias_fix-r0.patch;patch=1;status=merged \
-           ${RPSRC}/spectrumcs_fix-r0.patch;patch=1 \
-           file://00-hostap.patch;patch=1;status=merged \
-           file://10-pcnet.patch;patch=1;status=merged \
-           file://asoc-v0.12.4_2.6.17.patch;patch=1 \
-           ${RPSRC}/hx2750_base-r27.patch;patch=1 \
-           ${RPSRC}/hx2750_bl-r7.patch;patch=1 \
-           ${RPSRC}/hx2750_pcmcia-r2.patch;patch=1 \
-           ${RPSRC}/pxa_keys-r5.patch;patch=1 \
-           ${RPSRC}/tsc2101-r12.patch;patch=1 \
-           ${RPSRC}/hx2750_test1-r4.patch;patch=1 \
-           ${RPSRC}/pxa_timerfix-r0.patch;patch=1 \
-           ${RPSRC}/input_power-r5.patch;patch=1 \
-           ${RPSRC}/pxa25x_cpufreq-r0.patch;patch=1 \
-           ${RPSRC}/sharpsl_pm_fixes1-r0.patch;patch=1 \
-           ${RPSRC}/pm_changes-r1.patch;patch=1 \
-           ${RPSRC}/usb_pxa27x_udc-r0.patch;patch=1 \
-           ${RPSRC}/usb_add_epalloc-r1.patch;patch=1 \
-           ${RPSRC}/kexec-arm-r3a.patch;patch=1 \
-           ${RPSRC}/locomo_kbd_tweak-r1.patch;patch=1 \
-           ${RPSRC}/poodle_pm-r3.patch;patch=1 \
-           ${RPSRC}/pxafb_changeres-r0.patch;patch=1 \
-           ${RPSRC}/poodle_audio-r7.patch;patch=1 \
-           ${RPSRC}/pxa27x_overlay-r2.patch;patch=1 \
-           ${RPSRC}/w100_extaccel-r0.patch;patch=1 \
-           ${RPSRC}/xscale_cache_workaround-r1.patch;patch=1 \
-           file://serial-add-support-for-non-standard-xtals-to-16c950-driver.patch;patch=1 \
-           file://hrw-pcmcia-ids-r5.patch;patch=1 \
-           ${RPSRC}/logo_oh-r0.patch.bz2;patch=1;status=unmergable \
-           ${RPSRC}/logo_oz-r2.patch.bz2;patch=1;status=unmergable \
-           ${RPSRC}/pxa-linking-bug.patch;patch=1;status=unmergable \
-           file://add-oz-release-string.patch;patch=1;status=unmergable \
-           ${RPSRC}/mmcsd_large_cards-r0.patch;patch=1;status=hack \
-           ${RPSRC}/mmcsd_no_scr_check-r0.patch;patch=1;status=hack \
-           ${RPSRC}/integrator_rgb-r1.patch;patch=1;status=hack \
-           ${RPSRC}/pxa_cf_initorder_hack-r1.patch;patch=1;status=hack \
-           file://pxa-serial-hack.patch;patch=1;status=hack \
-           file://connectplus-remove-ide-HACK.patch;patch=1;status=hack \
-           file://orinoco-remove-all-which-are-in-hostap-HACK.patch;patch=1;status=unmergable-hack \
-           file://squashfs3.0-2.6.15.patch;patch=1;status=external \
-           file://vesafb-tng-1.0-rc2-git-20060629.patch;patch=1;status=external \
-           file://defconfig-c7x0 \
-           file://defconfig-hx2000 \
-           file://defconfig-collie \
-           file://defconfig-poodle \
-           file://defconfig-akita \
-           file://defconfig-spitz \
-           file://defconfig-qemuarm \
-           file://defconfig-qemux86 \
-           file://defconfig-tosa "
-
-# Add this to enable pm debug code (useful with a serial lead)
-#  ${RPSRC}/sharpsl_pm_debug-r0.patch;patch=1
-
-# Disabled until I find the reason this gives issues with cdc_subset
-#            ${RPSRC}/usb_rndis_tweaks-r0.patch;patch=1 \
-
-#           http://tglx.de/projects/armirq/2.6.17-rc3/patch-2.6.17-rc3-armirq4.patch;patch=1 \
-#           ${RPSRC}/../pxa27x_overlay-r0.patch;patch=1 \
-
-# Is anything out of this still needed? Parts were commited to mainline by rmk (drivers/mfd/)
-# (Pavel Machek's git tree has updated versions of this?)
-#  ${JLSRC}/zaurus-lcd-2.6.11.diff.gz;patch=1
-
-# These patches are extracted from Pavel Machek's git tree
-# (diff against vanilla kernel)
-SRC_URI_append_collie = "\
-          ${DOSRC}/collie/mtd-sharp-flash-hack-r0.patch;patch=1 \
-          ${DOSRC}/collie/collie-r0.patch;patch=1 \
-          ${DOSRC}/collie/locomolcd-backlight-r0.patch;patch=1 \
-          ${DOSRC}/collie/ucb1x00-touch-audio-r0.patch;patch=1 \
-          ${DOSRC}/collie/collie-mcp-r0.patch;patch=1 \
-          ${DOSRC}/collie/sa1100-udc-r0.patch;patch=1 \
-#         ${DOSRC}/collie/collie-pm-r1.patch;patch=1 \
-          "
-
-SRC_URI_append_tosa = "\
-          ${CHSRC}/usb-ohci-hooks-r1.patch;patch=1 \
-          ${CHSRC}/tmio-core-r4.patch;patch=1 \
-          ${DOSRC}/temp/tmio-tc6393-r6.patch;patch=1 \
-          ${CHSRC}/tmio-nand-r5.patch;patch=1 \
-          ${DOSRC}/temp/tmio-ohci-r4.patch;patch=1 \
-          ${CHSRC}/tmio-fb-r6.patch;patch=1 \
-          ${DOSRC}/tosa-keyboard-r17.patch;patch=1 \
-          ${DOSRC}/tosa-pxaac97-r6.patch;patch=1 \
-          ${DOSRC}/tosa-tmio-r6.patch;patch=1 \
-          ${DOSRC}/tosa-power-r17.patch;patch=1 \
-          ${DOSRC}/tosa-tmio-lcd-r8.patch;patch=1 \
-          ${DOSRC}/tosa-bluetooth-r8.patch;patch=1 \
-          ${DOSRC}/wm97xx-lg7-r0.patch;patch=1 \
-          file://wm9712-suspend-cold-res-r2.patch;patch=1 \
-          ${DOSRC}/sharpsl-pm-postresume-r0.patch;patch=1 \
-          ${DOSRC}/wm97xx-dig-restore-r0.patch;patch=1 \
-          ${DOSRC}/wm97xx-miscdevs-resume-r0.patch;patch=1 \
-          file://wm9712-reset-loop-r2.patch;patch=1 \
-          file://tosa-lcdnoise-r0.patch;patch=1 \
-          file://wm97xx-lcdnoise-r0.patch;patch=1 "
-#         ${DOSRC}/tosa-asoc-r1.patch;patch=1 "
-
-S = "${WORKDIR}/linux-2.6.17"
diff --git a/meta/packages/linux/linux-rp_2.6.20.bb b/meta/packages/linux/linux-rp_2.6.20.bb
deleted file mode 100644 (file)
index e92aed6..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-require linux-rp.inc
-
-PR = "r20"
-
-# Handy URLs
-# git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git;protocol=git;tag=ef7d1b244fa6c94fb76d5f787b8629df64ea4046
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/linux-2.6.20-rc4.tar.bz2
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/patch-2.6.18-rc6.bz2;patch=1
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/snapshots/patch-2.6.18-rc2-git1.bz2;patch=1
-# ${KERNELORG_MIRROR}pub/linux/kernel/people/alan/linux-2.6/2.6.10/patch-2.6.10-ac8.gz;patch=1
-# ${KERNELORG_MIRROR}pub/linux/kernel/people/akpm/patches/2.6/2.6.14-rc2/2.6.14-rc2-mm1/2.6.14-rc2-mm1.bz2;patch=1
-
-# Patches submitted upstream are towards top of this list 
-# Hacks should clearly named and at the bottom
-SRC_URI = "${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.20.tar.bz2 \
-           ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/patch-2.6.20.6.bz2;patch=1 \
-           http://opensource.wolfsonmicro.com/~lg/asoc/asoc-v0.13.3.patch;patch=1;status=merged \
-           ${RPSRC}/oprofile_always_bt_arm-r0.patch;patch=1 \
-           ${RPSRC}/lzo_kernel-r0.patch;patch=1 \
-           ${RPSRC}/lzo_jffs2-r0.patch;patch=1 \
-           ${RPSRC}/lzo_crypto-r0a.patch;patch=1 \
-           ${RPSRC}/lzo_jffs2_lzomode-r0.patch;patch=1 \
-           ${RPSRC}/lzo_jffs2_sysfs-r0.patch;patch=1 \
-           ${RPSRC}/hx2750_base-r28.patch;patch=1 \
-           ${RPSRC}/hx2750_bl-r8.patch;patch=1 \
-           ${RPSRC}/hx2750_pcmcia-r2.patch;patch=1 \
-           ${RPSRC}/pxa_keys-r7.patch;patch=1 \
-           ${RPSRC}/tsc2101-r16.patch;patch=1 \
-           ${RPSRC}/hx2750_test1-r6.patch;patch=1 \
-           ${RPSRC}/pxa_timerfix-r0.patch;patch=1 \
-           ${RPSRC}/input_power-r6.patch;patch=1 \
-           ${RPSRC}/pxa25x_cpufreq-r2.patch;patch=1 \
-           ${RPSRC}/sharpsl_pm_fixes1-r0.patch;patch=1 \
-           ${RPSRC}/pm_changes-r1.patch;patch=1 \
-           ${RPSRC}/usb_add_epalloc-r3.patch;patch=1 \
-           ${RPSRC}/usb_pxa27x_udc-r3.patch;patch=1 \
-           ${RPSRC}/kexec-arm-r4a.patch;patch=1 \
-           ${RPSRC}/locomo_kbd_tweak-r1.patch;patch=1 \
-           ${RPSRC}/poodle_pm-r3.patch;patch=1 \
-           ${RPSRC}/pxa27x_overlay-r5.patch;patch=1 \
-           ${RPSRC}/w100_extaccel-r0.patch;patch=1 \
-           ${RPSRC}/w100_extmem-r0.patch;patch=1 \
-           file://hostap-monitor-mode.patch;patch=1 \
-           file://serial-add-support-for-non-standard-xtals-to-16c950-driver.patch;patch=1 \
-           ${RPSRC}/logo_oh-r0.patch.bz2;patch=1;status=unmergable \
-           ${RPSRC}/logo_oz-r2.patch.bz2;patch=1;status=unmergable \
-           ${RPSRC}/pxa-linking-bug.patch;patch=1;status=unmergable \
-           ${RPSRC}/mmcsd_large_cards-r0.patch;patch=1;status=hack \
-           ${RPSRC}/mmcsd_no_scr_check-r0.patch;patch=1;status=hack \
-           ${RPSRC}/integrator_rgb-r1.patch;patch=1;status=hack \
-           ${RPSRC}/pxa_cf_initorder_hack-r1.patch;patch=1;status=hack \
-           file://pxa-serial-hack.patch;patch=1;status=hack \
-           file://connectplus-remove-ide-HACK.patch;patch=1;status=hack \
-           file://squashfs3.0-2.6.15.patch;patch=1;status=external \
-           file://vesafb-tng-1.0-rc2-2.6.20-rc2.patch;patch=1;status=external \
-           file://sharpsl-rc-r1.patch;patch=1 \
-           file://defconfig-c7x0 \
-           file://defconfig-hx2000 \
-           file://defconfig-collie \
-           file://defconfig-poodle \
-           file://defconfig-akita \
-           file://defconfig-spitz* \
-           file://defconfig-qemuarm \
-           file://defconfig-qemux86 \
-           file://defconfig-tosa "
-
-# Add this to enable pm debug code (useful with a serial lead)
-#  ${RPSRC}/sharpsl_pm_debug-r0.patch;patch=1
-
-# Disabled until I find the reason this gives issues with cdc_subset
-#            ${RPSRC}/usb_rndis_tweaks-r0.patch;patch=1 \
-
-# Is anything out of this still needed? Parts were commited to mainline by rmk (drivers/mfd/)
-# (Pavel Machek's git tree has updated versions of this?)
-#  ${JLSRC}/zaurus-lcd-2.6.11.diff.gz;patch=1
-
-# These patches are extracted from Pavel Machek's git tree
-# (diff against vanilla kernel)
-
-SRC_URI_append_collie = "\
-          ${TKSRC}/mtd-sharp-flash-hack-r2.patch;patch=1 \
-           ${TKSRC}/ucb1x00-touch-audio-r1.patch;patch=1 \
-          ${TKSRC}/mcp-sa11x0-r0.patch;patch=1 \
-          ${TKSRC}/sa1100-udc-r2.patch;patch=1 \
-          ${TKSRC}/mmc_spi-r4.patch;patch=1 \
-          ${TKSRC}/locomo-r0.patch;patch=1 \
-          ${TKSRC}/collie-kexec.patch;patch=1 \
-          ${TKSRC}/locomo_spi-r3.patch;patch=1 \
-          ${TKSRC}/sharpsl_pm.patch;patch=1 \
-          ${TKSRC}/collie_pm-2.patch;patch=1 \
-          ${TKSRC}/locomokeyb_suspendkey.patch;patch=1 \
-          ${TKSRC}/pcmcia_suspend.patch;patch=1 \
-          ${TKSRC}/ucb1x00_suspend.patch;patch=1 \
-"
-
-SRC_URI_append_tosa = "\
-           ${CHSRC}/usb-ohci-hooks-r1.patch;patch=1 \
-           ${CHSRC}/tmio-core-r4.patch;patch=1 \
-           file://tmio-tc6393-r8.patch;patch=1 \
-           file://tmio-nand-r7.patch;patch=1 \
-           file://tmio-ohci-r6.patch;patch=1 \
-           ${CHSRC}/tmio-fb-r6.patch;patch=1 \
-           file://tosa-keyboard-r18.patch;patch=1 \
-           ${DOSRC}/tosa-pxaac97-r6.patch;patch=1 \
-           ${DOSRC}/tosa-tmio-r6.patch;patch=1 \
-           ${DOSRC}/tosa-power-r17.patch;patch=1 \
-           file://tosa-tmio-lcd-r10.patch;patch=1 \
-           ${DOSRC}/tosa-bluetooth-r8.patch;patch=1 \
-           ${DOSRC}/wm97xx-lg7-r0.patch;patch=1 \
-           file://wm9712-suspend-cold-res-r2.patch;patch=1 \
-           file://sharpsl-pm-postresume-r1.patch;patch=1 \
-           ${DOSRC}/wm97xx-dig-restore-r0.patch;patch=1 \
-           ${DOSRC}/wm97xx-miscdevs-resume-r0.patch;patch=1 \
-           file://wm9712-reset-loop-r2.patch;patch=1 \
-           file://tosa-lcdnoise-r1.patch;patch=1 \
-           file://wm97xx-lcdnoise-r0.patch;patch=1 "
-#          ${DOSRC}/tosa-asoc-r1.patch;patch=1 "
-
-S = "${WORKDIR}/linux-2.6.20"
diff --git a/meta/packages/linux/linux-rp_2.6.21.bb b/meta/packages/linux/linux-rp_2.6.21.bb
deleted file mode 100644 (file)
index 77511d6..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-require linux-rp.inc
-
-PR = "r10"
-
-DEFAULT_PREFERENCE_collie = "1"
-
-# Handy URLs
-# git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git;protocol=git;tag=ef7d1b244fa6c94fb76d5f787b8629df64ea4046
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/linux-2.6.20-rc4.tar.bz2
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/patch-2.6.18-rc6.bz2;patch=1
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/snapshots/patch-2.6.18-rc2-git1.bz2;patch=1
-# ${KERNELORG_MIRROR}pub/linux/kernel/people/alan/linux-2.6/2.6.10/patch-2.6.10-ac8.gz;patch=1
-# ${KERNELORG_MIRROR}pub/linux/kernel/people/akpm/patches/2.6/2.6.14-rc2/2.6.14-rc2-mm1/2.6.14-rc2-mm1.bz2;patch=1
-
-# Patches submitted upstream are towards top of this list 
-# Hacks should clearly named and at the bottom
-SRC_URI = "${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2 \
-           ${RPSRC}/lzo_kernel-r0.patch;patch=1 \
-           ${RPSRC}/lzo_jffs2-r0.patch;patch=1 \
-           ${RPSRC}/lzo_crypto-r1.patch;patch=1 \
-           ${RPSRC}/lzo_jffs2_lzomode-r0.patch;patch=1 \
-           ${RPSRC}/lzo_jffs2_sysfs-r0.patch;patch=1 \
-           ${RPSRC}/hx2750_base-r28.patch;patch=1 \
-           ${RPSRC}/hx2750_bl-r9.patch;patch=1 \
-           ${RPSRC}/hx2750_pcmcia-r2.patch;patch=1 \
-           ${RPSRC}/pxa_keys-r7.patch;patch=1 \
-           ${RPSRC}/tsc2101-r16.patch;patch=1 \
-           ${RPSRC}/hx2750_test1-r6.patch;patch=1 \
-           ${RPSRC}/pxa_timerfix-r0.patch;patch=1 \
-           ${RPSRC}/input_power-r7.patch;patch=1 \
-           ${RPSRC}/pxa25x_cpufreq-r2.patch;patch=1 \
-           ${RPSRC}/sharpsl_pm_fixes1-r0.patch;patch=1 \
-           ${RPSRC}/pm_changes-r1.patch;patch=1 \
-           ${RPSRC}/usb_add_epalloc-r3.patch;patch=1 \
-           ${RPSRC}/usb_pxa27x_udc-r4.patch;patch=1 \
-           ${RPSRC}/locomo_kbd_tweak-r1.patch;patch=1 \
-           ${RPSRC}/poodle_pm-r4.patch;patch=1 \
-           ${RPSRC}/pxa27x_overlay-r5.patch;patch=1 \
-           ${RPSRC}/w100_extaccel-r0.patch;patch=1 \
-           ${RPSRC}/asoc_fix_typo-r0.patch;patch=1 \
-           ${RPSRC}/qemuarm_scsi_fix-r0.patch;patch=1 \
-           file://hostap-monitor-mode.patch;patch=1 \
-           file://serial-add-support-for-non-standard-xtals-to-16c950-driver.patch;patch=1 \
-           ${RPSRC}/logo_oh-r0.patch.bz2;patch=1;status=unmergable \
-           ${RPSRC}/logo_oz-r2.patch.bz2;patch=1;status=unmergable \
-           ${RPSRC}/pxa-linking-bug.patch;patch=1;status=unmergable \
-           ${RPSRC}/mmcsd_large_cards-r0.patch;patch=1;status=hack \
-           ${RPSRC}/mmcsd_no_scr_check-r0.patch;patch=1;status=hack \
-           ${RPSRC}/integrator_rgb-r1.patch;patch=1;status=hack \
-           ${RPSRC}/pxa_cf_initorder_hack-r1.patch;patch=1;status=hack \
-           file://pxa-serial-hack.patch;patch=1;status=hack \
-           file://connectplus-remove-ide-HACK.patch;patch=1;status=hack \
-          file://connectplus-prevent-oops-HACK.patch;patch=1;status=hack \
-           file://squashfs3.0-2.6.15.patch;patch=1;status=external \
-           file://vesafb-tng-1.0-rc2-2.6.20-rc2.patch;patch=1;status=external \
-           file://sharpsl-rc-r1.patch;patch=1 \
-           file://defconfig-c7x0 \
-           file://defconfig-hx2000 \
-           file://defconfig-collie \
-           file://defconfig-poodle \
-           file://defconfig-akita \
-           file://defconfig-spitz \
-           file://defconfig-qemuarm \
-           file://defconfig-qemux86 \
-           file://defconfig-bootcdx86 \
-           file://defconfig-tosa "
-
-# Add this to enable pm debug code (useful with a serial lead)
-#  ${RPSRC}/sharpsl_pm_debug-r0.patch;patch=1
-
-# Disabled until I find the reason this gives issues with cdc_subset
-#            ${RPSRC}/usb_rndis_tweaks-r0.patch;patch=1 \
-
-# Is anything out of this still needed? Parts were commited to mainline by rmk (drivers/mfd/)
-# (Pavel Machek's git tree has updated versions of this?)
-#  ${JLSRC}/zaurus-lcd-2.6.11.diff.gz;patch=1
-
-SRC_URI_append_collie = "\
-          ${TKSRC}/mtd-sharp-flash-hack-r2.patch;patch=1 \
-           ${TKSRC}/ucb1x00-touch-audio-r1.patch;patch=1 \
-          ${TKSRC}/mcp-sa11x0-r0.patch;patch=1 \
-          ${TKSRC}/sa1100-udc-r2.patch;patch=1 \
-          ${TKSRC}/mmc_spi-r4.patch;patch=1 \
-          ${TKSRC}/locomo-r0.patch;patch=1 \
-          ${TKSRC}/collie-kexec.patch;patch=1 \
-          ${TKSRC}/locomo_spi-r4.patch;patch=1 \
-          ${TKSRC}/sharpsl_pm-r2.patch;patch=1 \
-          ${TKSRC}/collie_pm-r2.patch;patch=1 \
-          ${TKSRC}/locomokeyb_suspendkey-2.patch;patch=1 \
-          ${TKSRC}/pcmcia_suspend.patch;patch=1 \
-          ${TKSRC}/ucb1x00_suspend.patch;patch=1 \
-"
-
-SRC_URI_append_tosa = "\
-           ${CHSRC}/usb-ohci-hooks-r1.patch;patch=1 \
-           ${CHSRC}/tmio-core-r4.patch;patch=1 \
-           file://tmio-tc6393-r8.patch;patch=1 \
-           file://tmio-nand-r7.patch;patch=1 \
-           file://tmio-ohci-r6.patch;patch=1 \
-           ${CHSRC}/tmio-fb-r6.patch;patch=1 \
-           file://tosa-keyboard-r18.patch;patch=1 \
-           ${DOSRC}/tosa-pxaac97-r6.patch;patch=1 \
-           ${DOSRC}/tosa-tmio-r6.patch;patch=1 \
-           ${DOSRC}/tosa-power-r17.patch;patch=1 \
-           file://tosa-tmio-lcd-r10.patch;patch=1 \
-           ${DOSRC}/tosa-bluetooth-r8.patch;patch=1 \
-           ${DOSRC}/wm97xx-lg7-r0.patch;patch=1 \
-           file://wm9712-suspend-cold-res-r2.patch;patch=1 \
-           file://sharpsl-pm-postresume-r1.patch;patch=1 \
-           ${DOSRC}/wm97xx-dig-restore-r0.patch;patch=1 \
-           ${DOSRC}/wm97xx-miscdevs-resume-r0.patch;patch=1 \
-           file://wm9712-reset-loop-r2.patch;patch=1 \
-           file://tosa-lcdnoise-r1.patch;patch=1 \
-           file://wm97xx-lcdnoise-r0.patch;patch=1 "
-#          ${DOSRC}/tosa-asoc-r1.patch;patch=1 "
-
-S = "${WORKDIR}/linux-2.6.21"
diff --git a/meta/packages/linux/linux-rp_2.6.22.bb b/meta/packages/linux/linux-rp_2.6.22.bb
deleted file mode 100644 (file)
index ba89a07..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-require linux-rp.inc
-
-PR = "r11"
-
-# Handy URLs
-# git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git;protocol=git;tag=ef7d1b244fa6c94fb76d5f787b8629df64ea4046
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/linux-2.6.20-rc4.tar.bz2
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/testing/patch-2.6.18-rc6.bz2;patch=1
-# ${KERNELORG_MIRROR}pub/linux/kernel/v2.6/snapshots/patch-2.6.18-rc2-git1.bz2;patch=1
-# ${KERNELORG_MIRROR}pub/linux/kernel/people/alan/linux-2.6/2.6.10/patch-2.6.10-ac8.gz;patch=1
-# ${KERNELORG_MIRROR}pub/linux/kernel/people/akpm/patches/2.6/2.6.14-rc2/2.6.14-rc2-mm1/2.6.14-rc2-mm1.bz2;patch=1
-
-# Patches submitted upstream are towards top of this list 
-# Hacks should clearly named and at the bottom
-SRC_URI = "${KERNELORG_MIRROR}pub/linux/kernel/v2.6/linux-2.6.22.tar.bz2 \
-           ${RPSRC}/lzo_kernel-r3.patch;patch=1 \
-           ${RPSRC}/lzo_jffs2-r2.patch;patch=1 \
-           ${RPSRC}/lzo_crypto-r2.patch;patch=1 \
-           ${RPSRC}/lzo_jffs2_lzomode-r1.patch;patch=1 \
-           ${RPSRC}/lzo_jffs2_sysfs-r1.patch;patch=1 \
-           ${RPSRC}/lzo_fix-r0.patch;patch=1 \
-           ${RPSRC}/hx2750_base-r28.patch;patch=1 \
-           ${RPSRC}/hx2750_bl-r9.patch;patch=1 \
-           ${RPSRC}/hx2750_pcmcia-r2.patch;patch=1 \
-           ${RPSRC}/pxa_keys-r7.patch;patch=1 \
-           ${RPSRC}/tsc2101-r16.patch;patch=1 \
-           ${RPSRC}/hx2750_test1-r6.patch;patch=1 \
-           ${RPSRC}/pxa_timerfix-r0.patch;patch=1 \
-           ${RPSRC}/input_power-r9.patch;patch=1 \
-           ${RPSRC}/pxa25x_cpufreq-r2.patch;patch=1 \
-           ${RPSRC}/sharpsl_pm_fixes1-r0.patch;patch=1 \
-           ${RPSRC}/pm_changes-r1.patch;patch=1 \
-           ${RPSRC}/usb_add_epalloc-r3.patch;patch=1 \
-           ${RPSRC}/usb_pxa27x_udc-r5.patch;patch=1 \
-           ${RPSRC}/locomo_kbd_tweak-r1.patch;patch=1 \
-           ${RPSRC}/poodle_pm-r4.patch;patch=1 \
-           ${RPSRC}/pxa27x_overlay-r5.patch;patch=1 \
-           ${RPSRC}/w100_extaccel-r1.patch;patch=1 \
-           ${RPSRC}/w100_extmem-r1.patch;patch=1 \
-           file://hostap-monitor-mode.patch;patch=1 \
-           file://serial-add-support-for-non-standard-xtals-to-16c950-driver.patch;patch=1 \
-           ${RPSRC}/logo_oh-r0.patch.bz2;patch=1;status=unmergable \
-           ${RPSRC}/logo_oz-r2.patch.bz2;patch=1;status=unmergable \
-           ${RPSRC}/pxa-linking-bug.patch;patch=1;status=unmergable \
-           ${RPSRC}/mmcsd_large_cards-r1.patch;patch=1;status=hack \
-           ${RPSRC}/mmcsd_no_scr_check-r1.patch;patch=1;status=hack \
-           ${RPSRC}/integrator_rgb-r1.patch;patch=1;status=hack \
-           ${RPSRC}/pxa_cf_initorder_hack-r1.patch;patch=1;status=hack \
-           file://htcuni.patch;patch=1 \
-           file://pxa-serial-hack.patch;patch=1;status=hack \
-           file://connectplus-remove-ide-HACK.patch;patch=1;status=hack \
-           file://squashfs3.0-2.6.15.patch;patch=1;status=external \
-           file://vesafb-tng-1.0-rc2-2.6.20-rc2.patch;patch=1;status=external \
-          file://pda-power.patch;patch=1 \
-           file://defconfig-c7x0 \
-           file://defconfig-hx2000 \
-           file://defconfig-collie \
-           file://defconfig-poodle \
-           file://defconfig-akita \
-           file://defconfig-spitz \
-           file://defconfig-qemuarm \
-           file://defconfig-qemux86 \
-           file://defconfig-bootcdx86 \
-           file://defconfig-htcuniversal \
-           file://defconfig-tosa "
-
-# Add this to enable pm debug code (useful with a serial lead)
-#  ${RPSRC}/sharpsl_pm_debug-r0.patch;patch=1
-
-# Disabled until I find the reason this gives issues with cdc_subset
-#            ${RPSRC}/usb_rndis_tweaks-r0.patch;patch=1 \
-
-# Is anything out of this still needed? Parts were commited to mainline by rmk (drivers/mfd/)
-# (Pavel Machek's git tree has updated versions of this?)
-#  ${JLSRC}/zaurus-lcd-2.6.11.diff.gz;patch=1
-
-# These patches are extracted from Pavel Machek's git tree
-# (diff against vanilla kernel)
-SRC_URI_append_collie = "\
-           ${DOSRC}/collie/mtd-sharp-flash-hack-r0.patch;patch=1 \
-           ${DOSRC}/collie/collie-r0.patch;patch=1 \
-           ${DOSRC}/collie/locomolcd-backlight-r0.patch;patch=1 \
-           ${DOSRC}/collie/ucb1x00-touch-audio-r0.patch;patch=1 \
-           file://collie-mcp-r1.patch;patch=1 \
-           ${DOSRC}/collie/sa1100-udc-r0.patch;patch=1 \
-#          ${DOSRC}/collie/collie-pm-r1.patch;patch=1 \
-"
-
-SRC_URI_append_tosa = "\
-           ${CHSRC}/usb-ohci-hooks-r1.patch;patch=1 \
-           ${CHSRC}/tmio-core-r4.patch;patch=1 \
-           file://tmio-tc6393-r8.patch;patch=1 \
-           file://tmio-nand-r7.patch;patch=1 \
-           file://tmio-ohci-r6.patch;patch=1 \
-           ${CHSRC}/tmio-fb-r6.patch;patch=1 \
-           file://tosa-keyboard-r18.patch;patch=1 \
-           ${DOSRC}/tosa-pxaac97-r6.patch;patch=1 \
-           ${DOSRC}/tosa-tmio-r6.patch;patch=1 \
-           ${DOSRC}/tosa-power-r17.patch;patch=1 \
-           file://tosa-tmio-lcd-r10.patch;patch=1 \
-           ${DOSRC}/tosa-bluetooth-r8.patch;patch=1 \
-           ${DOSRC}/wm97xx-lg7-r0.patch;patch=1 \
-           file://wm9712-suspend-cold-res-r2.patch;patch=1 \
-           file://sharpsl-pm-postresume-r1.patch;patch=1 \
-           ${DOSRC}/wm97xx-dig-restore-r0.patch;patch=1 \
-           ${DOSRC}/wm97xx-miscdevs-resume-r0.patch;patch=1 \
-           file://wm9712-reset-loop-r2.patch;patch=1 \
-           file://tosa-lcdnoise-r1.patch;patch=1 \
-           file://wm97xx-lcdnoise-r0.patch;patch=1 "
-#          ${DOSRC}/tosa-asoc-r1.patch;patch=1 "
-
-SRC_URI_append_htcuniversal ="file://htcuni-acx.patch;patch=1;status=external"
-
-S = "${WORKDIR}/linux-2.6.22"