Author: nick
Date: 2010-08-22 22:25:46 +0100 (Sun, 22 Aug 2010)
New Revision: 1205
Added:
balloon/branches/menuconfig/kernel/2.6.36-rc1/
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon2-samosa.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-ac97.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-cpufreq.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-ethernet.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-g_ether.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-i2s.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-lmr5428.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-megapug.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-minipug.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-minipugfb.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-nand.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-pcmcia.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-powerfail.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa-podpoint.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa-uart.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-sl40.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-tsl2560.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-vga.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config-CUED
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config-podpoint
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config-tcl-sl40
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config.tcl.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3specs.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/cross-build.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/initrd.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/series-CUED
balloon/branches/menuconfig/kernel/2.6.36-rc1/series-podpoint
balloon/branches/menuconfig/kernel/2.6.36-rc1/series-tcl-sl40
balloon/branches/menuconfig/kernel/2.6.36-rc1/series-tcl-sl90
balloon/branches/menuconfig/kernel/2.6.36-rc1/series-tcl-specs
balloon/branches/menuconfig/kernel/2.6.36-rc1/series.default
balloon/branches/menuconfig/kernel/2.6.36-rc1/yaffsconfig.patch
balloon/branches/menuconfig/kernel/2.6.36-rc1/yaffsrootmode.patch
Log:
add first cut at 2.6.36-rc1 integration. CUED only attempted. yaffs support yet to be fixed
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon2-samosa.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon2-samosa.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon2-samosa.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,186 @@
+Balloon2 Samosa Bus support
+
+Saomsa is a simple 16 bit bus implemented over the nand/smartmedia bus
+by the CPLD on balloon2
+
+from: Nick Bane <nick@cecomputing.co.uk>
+
+Signed-off-by: Wookey <wookey@wookware.org>
+
+Index: linux-2.6.27.5/drivers/char/samosa.c
+===================================================================
+--- linux-2.6.27.5.orig/drivers/char/samosa.c 2008-11-20 12:24:03.000000000 +0000
++++ linux-2.6.27.5/drivers/char/samosa.c 2008-11-20 12:26:11.000000000 +0000
+@@ -101,6 +101,172 @@
+
+ #endif
+
++#ifdef CONFIG_MACH_BALLOON2
++
++/*
++ * samosa bus support - Balloon2
++ * On Balloon2 the samosa bus is a generalised extension of the nand bus
++ * using the original SmartMedia socket address
++ */
++#include <asm/arch/balloon2_cpld.h>
++
++#define SAMOSA_CLE_BIT 0
++#define SAMOSA_ALE_BIT 1
++#define SAMOSA_NCE0_BIT 2
++#define SAMOSA_NCE1_BIT 3
++#define SAMOSA_NCE2_BIT 4
++#define SAMOSA_NCE3_BIT 5
++#define SAMOSA_NSE_BIT 6
++#define SAMOSA_NWP_BIT 7
++#define SAMOSA_SIXTEEN_BIT SAMOSA_CLE_BIT
++#define SAMOSA_PLAIT_BUS_BIT 0
++
++/* samosa bus access */
++unsigned int balloon_samosa_get_data_address(void);
++int balloon_samosa_device_selected(unsigned int d);
++int balloon_samosa_device_select(int d, int plait_bus);
++void balloon_samosa_set_ctrl(u8 mask, u8 value);
++int balloon_samosa_sm_present(void);
++int balloon_samosa_nand_ready(void *device);
++
++#define BALLOON_SAMOSA_IO_ADDR 0xf3000000 /* Common NAND data port */
++#define BALLOON_SAMOSA_CTRL_ADDR 0xf3800000 /* Common NAND ALE CLE and NCEx write-only port */
++#define BALLOON_SAMOSA_CTRL2_ADDR 0xf3600000 /* Second control register */
++
++#define BALLOON_SAMOSA_CE_MASK ((1 << SAMOSA_NCE0_BIT) | \
++ (1 << SAMOSA_NCE1_BIT) | \
++ (1 << SAMOSA_NCE2_BIT) | \
++ (1 << SAMOSA_NCE3_BIT))
++
++/* standby values */
++static u8 balloon_samosa_ctrl_image = (1 << SAMOSA_NWP_BIT) |
++ (1 << SAMOSA_NCE0_BIT) | (1 << SAMOSA_NCE1_BIT) |
++ (1 << SAMOSA_NCE2_BIT) | (1 << SAMOSA_NCE3_BIT);
++static u8 balloon_samosa_ctrl2_image;
++
++unsigned int balloon_samosa_get_data_address(void)
++{
++ return BALLOON_SAMOSA_IO_ADDR;
++}
++EXPORT_SYMBOL(balloon_samosa_get_data_address);
++
++static int balloon_samosa_plait_bus(void)
++{
++ if (balloon_has(BALLOON_SAMOSA_PLAIT_SYS)) {
++ balloon_samosa_ctrl2_image |= (1 << SAMOSA_PLAIT_BUS_BIT);
++ writeb(balloon_samosa_ctrl2_image, BALLOON_SAMOSA_CTRL2_ADDR);
++ }
++ return 0;
++}
++
++static int balloon_samosa_unplait_bus(void)
++{
++ if (balloon_has(BALLOON_SAMOSA_PLAIT_SYS)) {
++ balloon_samosa_ctrl2_image &= ~(1 << SAMOSA_PLAIT_BUS_BIT);
++ writeb(balloon_samosa_ctrl2_image, BALLOON_SAMOSA_CTRL2_ADDR);
++ }
++ return 0;
++}
++
++int balloon_samosa_device_selected(unsigned int d)
++{
++ switch (d) {
++ case 0:
++ return (balloon_samosa_ctrl_image &
++ (1 << SAMOSA_NCE0_BIT)) ? 0 : 1;
++ case 1:
++ return (balloon_samosa_ctrl_image &
++ (1 << SAMOSA_NCE1_BIT)) ? 0 : 1;
++ case 2:
++ return (balloon_samosa_ctrl_image &
++ (1 << SAMOSA_NCE2_BIT)) ? 0 : 1;
++ case 3:
++ return (balloon_samosa_ctrl_image &
++ (1 << SAMOSA_NCE3_BIT)) ? 0 : 1;
++ default:
++ return 0;
++ }
++}
++EXPORT_SYMBOL(balloon_samosa_device_selected);
++
++int balloon_samosa_device_select(int d, int plait_bus)
++{
++ if (balloon_samosa_device_selected(d))
++ return 0;
++
++ switch (d) {
++ case -1:
++ /* Deselect everything */
++ balloon_samosa_ctrl_image |= BALLOON_SAMOSA_CE_MASK;
++ break;
++ case 0:
++ if ((balloon_samosa_ctrl_image & BALLOON_SAMOSA_CE_MASK) !=
++ BALLOON_SAMOSA_CE_MASK) {
++ pr_warn("balloon_samosa_device_select: Trying to select chip %d but balloon_samosa_ctrl_image is 0x%x\n",
++ d, balloon_samosa_ctrl_image);
++ }
++ balloon_samosa_ctrl_image |= BALLOON_SAMOSA_CE_MASK;
++ balloon_samosa_ctrl_image &= ~(1 << SAMOSA_NCE0_BIT);
++ break;
++ case 1:
++ if ((balloon_samosa_ctrl_image & BALLOON_SAMOSA_CE_MASK) !=
++ BALLOON_SAMOSA_CE_MASK) {
++ pr_warn("balloon_samosa_device_select: Trying to select chip %d but balloon_samosa_ctrl_image is 0x%x\n",
++ d, balloon_samosa_ctrl_image);
++ }
++ balloon_samosa_ctrl_image |= BALLOON_SAMOSA_CE_MASK;
++ balloon_samosa_ctrl_image &= ~(1 << SAMOSA_NCE1_BIT);
++ break;
++ case 2:
++ if ((balloon_samosa_ctrl_image & BALLOON_SAMOSA_CE_MASK) !=
++ BALLOON_SAMOSA_CE_MASK) {
++ pr_warn("balloon_samosa_device_select: Trying to select chip %d but balloon_samosa_ctrl_image is 0x%x\n",
++ d, balloon_samosa_ctrl_image);
++ }
++ balloon_samosa_ctrl_image |= BALLOON_SAMOSA_CE_MASK;
++ balloon_samosa_ctrl_image &= ~(1 << SAMOSA_NCE2_BIT);
++ break;
++ case 3:
++ if ((balloon_samosa_ctrl_image & BALLOON_SAMOSA_CE_MASK) !=
++ BALLOON_SAMOSA_CE_MASK) {
++ pr_warn("balloon_samosa_device_select: Trying to select chip %d but balloon_samosa_ctrl_image is 0x%x\n",
++ d, balloon_samosa_ctrl_image);
++ }
++ balloon_samosa_ctrl_image |= BALLOON_SAMOSA_CE_MASK;
++ balloon_samosa_ctrl_image &= ~(1 << SAMOSA_NCE3_BIT);
++ break;
++ default:
++ BUG();
++ }
++ writeb(balloon_samosa_ctrl_image, BALLOON_SAMOSA_CTRL_ADDR);
++
++ /* default is plaited for 8-bit nand access */
++ if (plait_bus)
++ balloon_samosa_plait_bus();
++ else
++ balloon_samosa_unplait_bus();
++
++ return 0;
++}
++EXPORT_SYMBOL(balloon_samosa_device_select);
++
++void balloon_samosa_set_ctrl(u8 mask, u8 value)
++{
++ balloon_samosa_ctrl_image &= ~mask;
++ balloon_samosa_ctrl_image |= value;
++
++ writeb(balloon_samosa_ctrl_image, BALLOON_SAMOSA_CTRL_ADDR);
++}
++EXPORT_SYMBOL(balloon_samosa_set_ctrl);
++
++int balloon_samosa_nand_ready(void *mtd_device)
++{
++ return GPLR & BALLOON_GPIO205_NAND_RNB;
++}
++EXPORT_SYMBOL(balloon_samosa_nand_ready);
++
++#endif /* end of balloon2 version */
++
+ /* samosa bus support */
+
+ #define to_samosa_driver(drv) (container_of((drv), struct samosa_driver, \
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-ac97.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-ac97.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-ac97.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,96 @@
+Index: linux-2.6.34/sound/pci/ac97/ac97_patch.c
+===================================================================
+--- linux-2.6.34.orig/sound/pci/ac97/ac97_patch.c 2010-05-22 19:42:47.000000000 +0100
++++ linux-2.6.34/sound/pci/ac97/ac97_patch.c 2010-05-22 19:51:56.000000000 +0100
+@@ -3905,6 +3905,10 @@
+ static int patch_ucb1400(struct snd_ac97 * ac97)
+ {
+ ac97->build_ops = &patch_ucb1400_ops;
++
++ /* UCB1400 supports powerdown */
++ ac97->scaps |= AC97_SCAP_POWER_SAVE;
++
+ /* enable headphone driver and smart low power mode by default */
+ snd_ac97_write_cache(ac97, 0x6a, 0x0050);
+ snd_ac97_write_cache(ac97, 0x6c, 0x0030);
+Index: linux-2.6.34/sound/pci/ac97/ac97_codec.c
+===================================================================
+--- linux-2.6.34.orig/sound/pci/ac97/ac97_codec.c 2010-05-22 19:42:47.000000000 +0100
++++ linux-2.6.34/sound/pci/ac97/ac97_codec.c 2010-05-23 10:19:05.000000000 +0100
+@@ -273,6 +273,7 @@
+ {
+ if (!snd_ac97_valid_reg(ac97, reg))
+ return;
++ snd_printk(KERN_DEBUG "snd_ac97_write reg %02x: %04x\n", reg,value);
+ if ((ac97->id & 0xffffff00) == AC97_ID_ALC100) {
+ /* Fix H/W bug of ALC100/100P */
+ if (reg == AC97_MASTER || reg == AC97_HEADPHONE)
+@@ -328,6 +329,7 @@
+ if (!snd_ac97_valid_reg(ac97, reg))
+ return;
+ mutex_lock(&ac97->reg_mutex);
++ snd_printk(KERN_DEBUG "snd_ac97_write_cache reg %02x: %04x\n", reg,value);
+ ac97->regs[reg] = value;
+ ac97->bus->ops->write(ac97, reg, value);
+ set_bit(reg, ac97->reg_accessed);
+@@ -354,6 +356,8 @@
+
+ if (!snd_ac97_valid_reg(ac97, reg))
+ return -EINVAL;
++ snd_printk(KERN_DEBUG "snd_ac97_update reg %02x: %04x\n", reg,value);
++
+ mutex_lock(&ac97->reg_mutex);
+ change = ac97->regs[reg] != value;
+ if (change) {
+@@ -386,6 +390,7 @@
+
+ if (!snd_ac97_valid_reg(ac97, reg))
+ return -EINVAL;
++ snd_printk(KERN_DEBUG "snd_ac97_update_bits reg %02x: %04x %04x\n", reg,mask,value);
+ mutex_lock(&ac97->reg_mutex);
+ change = snd_ac97_update_bits_nolock(ac97, reg, mask, value);
+ mutex_unlock(&ac97->reg_mutex);
+@@ -2479,6 +2484,7 @@
+ * are accessed..!
+ */
+ if (test_bit(i, ac97->reg_accessed)) {
++// printk(KERN_NOTICE "Restoring AC97 register %02x: %04x\n",i,ac97->regs[i]);
+ snd_ac97_write(ac97, i, ac97->regs[i]);
+ snd_ac97_read(ac97, i);
+ }
+Index: linux-2.6.34/sound/arm/pxa2xx-ac97-lib.c
+===================================================================
+--- linux-2.6.34.orig/sound/arm/pxa2xx-ac97-lib.c 2010-05-22 19:42:47.000000000 +0100
++++ linux-2.6.34/sound/arm/pxa2xx-ac97-lib.c 2010-05-22 19:51:56.000000000 +0100
+@@ -137,15 +137,17 @@
+ gsr_bits = 0;
+
+ /* warm reset broken on Bulverde, so manually keep AC97 reset high */
+- pxa27x_assert_ac97reset(reset_gpio, 1);
++/* pxa27x_assert_ac97reset(reset_gpio, 1); */
+ udelay(10);
+ GCR |= GCR_WARM_RST;
+- pxa27x_assert_ac97reset(reset_gpio, 0);
++/* pxa27x_assert_ac97reset(reset_gpio, 0); */
+ udelay(500);
+ }
+
+ static inline void pxa_ac97_cold_pxa27x(void)
+ {
++ int timeout = 1000;
++
+ GCR &= GCR_COLD_RST; /* clear everything but nCRST */
+ GCR &= ~GCR_COLD_RST; /* then assert nCRST */
+
+@@ -156,7 +158,10 @@
+ udelay(5);
+ clk_disable(ac97conf_clk);
+ GCR = GCR_COLD_RST;
+- udelay(50);
++
++ /* allow codec time to sort itself out */
++ while (!(GSR & (GSR_PCR | GSR_SCR)) && timeout--)
++ mdelay(10);
+ }
+ #endif
+
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-cpufreq.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-cpufreq.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-cpufreq.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,30 @@
+Index: linux-2.6.34-rc7/arch/arm/mach-pxa/cpufreq-pxa2xx.c
+===================================================================
+--- linux-2.6.34-rc7.orig/arch/arm/mach-pxa/cpufreq-pxa2xx.c 2010-05-10 02:36:28.000000000 +0100
++++ linux-2.6.34-rc7/arch/arm/mach-pxa/cpufreq-pxa2xx.c 2010-05-15 18:19:25.000000000 +0100
+@@ -156,11 +156,11 @@
+ static pxa_freqs_t pxa27x_freqs[] = {
+ {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 },
+ {156000, 104000, PXA27x_CCCR(1, 8, 3), 0, CCLKCFG2(1, 0, 1), 1000000, 1705000 },
+- {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 },
+- {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 },
+- {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 },
+- {520000, 208000, PXA27x_CCCR(1, 16, 5), 1, CCLKCFG2(1, 0, 1), 1450000, 1705000 },
+- {624000, 208000, PXA27x_CCCR(1, 16, 6), 1, CCLKCFG2(1, 0, 1), 1550000, 1705000 }
++ {208000, 208000, PXA27x_CCCR(1, 16, 2), 0, CCLKCFG2(0, 0, 1), 1180000, 1705000 },
++ {312000, 208000, PXA27x_CCCR(1, 16, 3), 0, CCLKCFG2(0, 0, 1), 1250000, 1705000 },
++ {416000, 208000, PXA27x_CCCR(1, 16, 4), 0, CCLKCFG2(0, 0, 1), 1350000, 1705000 },
++ {520000, 208000, PXA27x_CCCR(1, 16, 5), 0, CCLKCFG2(0, 0, 1), 1450000, 1705000 },
++ {624000, 208000, PXA27x_CCCR(1, 16, 6), 0, CCLKCFG2(0, 0, 1), 1550000, 1705000 }
+ };
+
+ #define NUM_PXA27x_FREQS ARRAY_SIZE(pxa27x_freqs)
+@@ -231,7 +231,7 @@
+ static void pxa27x_guess_max_freq(void)
+ {
+ if (!pxa27x_maxfreq) {
+- pxa27x_maxfreq = 416000;
++ pxa27x_maxfreq = 520000;
+ printk(KERN_INFO "PXA CPU 27x max frequency not defined "
+ "(pxa27x_maxfreq), assuming pxa271 with %dkHz maxfreq\n",
+ pxa27x_maxfreq);
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-ethernet.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-ethernet.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-ethernet.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,19 @@
+Enable CS89x0 Ethernet driver to be built for Balloon3
+
+from: Wookey <wookey@wookware.org>
+
+Signed-off-by: Wookey <wookey@wookware.org>
+
+Index: linux-2.6.36-rc1/drivers/net/Kconfig
+===================================================================
+--- linux-2.6.36-rc1.orig/drivers/net/Kconfig 2010-08-16 01:41:37.000000000 +0100
++++ linux-2.6.36-rc1/drivers/net/Kconfig 2010-08-22 17:08:45.000000000 +0100
+@@ -1464,7 +1464,7 @@
+ config CS89x0
+ tristate "CS89x0 support"
+ depends on NET_ETHERNET && (ISA || EISA || MACH_IXDP2351 \
+- || ARCH_IXDP2X01 || MACH_MX31ADS)
++ || ARCH_IXDP2X01 || MACH_MX31ADS || MACH_BALLOON3)
+ ---help---
+ Support for CS89x0 chipset based Ethernet cards. If you have a
+ network (Ethernet) card of this type, say Y and read the
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-g_ether.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-g_ether.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-g_ether.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,43 @@
+Index: linux-2.6.36-rc1/drivers/usb/gadget/Kconfig
+===================================================================
+--- linux-2.6.36-rc1.orig/drivers/usb/gadget/Kconfig 2010-08-16 01:41:37.000000000 +0100
++++ linux-2.6.36-rc1/drivers/usb/gadget/Kconfig 2010-08-22 17:10:06.000000000 +0100
+@@ -679,6 +679,21 @@
+ XP, you'll need to download drivers from Microsoft's website; a URL
+ is given in comments found in that info file.
+
++config USB_ETH_RNDIS_COMPAT
++ bool "RNDIS old kernel compatability support"
++ depends on USB_ETH_RNDIS
++ default n
++ help
++ Kernels prior to 2.6.30.5 have a problem with the host
++ identifying a combined CDC_SUBSET and RNDIS gadget as being
++ CDC_SUBSET because the match is dependent on being identified
++ as coming from SA1110 hardware. This kludge makes the driver appear
++ to be from hardware identifer 0x0203. The kludge is horrid and should
++ go away once the fix in kernel 2.6.30.5 is commonplace.
++
++ If you say "y" here, the Ethernet gadget driver will fake being
++ from hardware device ID 0x203.
++
+ config USB_ETH_EEM
+ bool "Ethernet Emulation Model (EEM) support"
+ depends on USB_ETH
+Index: linux-2.6.36-rc1/drivers/usb/gadget/ether.c
+===================================================================
+--- linux-2.6.36-rc1.orig/drivers/usb/gadget/ether.c 2010-08-16 01:41:37.000000000 +0100
++++ linux-2.6.36-rc1/drivers/usb/gadget/ether.c 2010-08-22 17:10:06.000000000 +0100
+@@ -335,6 +335,12 @@
+ }
+
+ gcnum = usb_gadget_controller_number(gadget);
++#ifdef CONFIG_USB_ETH_RNDIS_COMPAT
++ // kludge for host kernels pre 2.6.30.5 with CDC_SUBSET and RNDIS
++ if ((gcnum >= 0) && has_rndis() && !can_support_ecm(cdev->gadget))
++ device_desc.bcdDevice = cpu_to_le16(0x0203);
++ else
++#endif
+ if (gcnum >= 0)
+ device_desc.bcdDevice = cpu_to_le16(0x0300 | gcnum);
+ else {
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-i2s.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-i2s.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-i2s.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,1024 @@
+Index: linux-2.6.29.1/sound/soc/codecs/Kconfig
+===================================================================
+--- linux-2.6.29.1.orig/sound/soc/codecs/Kconfig 2009-09-07 15:04:01.000000000 +0100
++++ linux-2.6.29.1/sound/soc/codecs/Kconfig 2009-09-07 15:23:12.000000000 +0100
+@@ -36,6 +36,7 @@
+ select SND_SOC_WM8990 if I2C
+ select SND_SOC_WM9712 if SND_SOC_AC97_BUS
+ select SND_SOC_WM9713 if SND_SOC_AC97_BUS
++ select SND_SOC_SL90DSP
+ help
+ Normally ASoC codec drivers are only built if a machine driver which
+ uses them is also built since they are only usable with a machine
+@@ -149,3 +150,6 @@
+
+ config SND_SOC_WM9713
+ tristate
++
++config SND_SOC_SL90DSP
++ tristate
+\ No newline at end of file
+Index: linux-2.6.29.1/sound/soc/codecs/Makefile
+===================================================================
+--- linux-2.6.29.1.orig/sound/soc/codecs/Makefile 2009-09-07 15:04:02.000000000 +0100
++++ linux-2.6.29.1/sound/soc/codecs/Makefile 2009-09-07 15:23:12.000000000 +0100
+@@ -25,6 +25,7 @@
+ snd-soc-wm8990-objs := wm8990.o
+ snd-soc-wm9712-objs := wm9712.o
+ snd-soc-wm9713-objs := wm9713.o
++snd-soc-sl90dsp-objs := sl90dsp.o
+
+ obj-$(CONFIG_SND_SOC_AC97_CODEC) += snd-soc-ac97.o
+ obj-$(CONFIG_SND_SOC_AD1980) += snd-soc-ad1980.o
+@@ -53,3 +54,4 @@
+ obj-$(CONFIG_SND_SOC_WM8990) += snd-soc-wm8990.o
+ obj-$(CONFIG_SND_SOC_WM9712) += snd-soc-wm9712.o
+ obj-$(CONFIG_SND_SOC_WM9713) += snd-soc-wm9713.o
++obj-$(CONFIG_SND_SOC_SL90DSP) += snd-soc-sl90dsp.o
+\ No newline at end of file
+Index: linux-2.6.29.1/sound/soc/pxa/Kconfig
+===================================================================
+--- linux-2.6.29.1.orig/sound/soc/pxa/Kconfig 2009-09-07 15:04:02.000000000 +0100
++++ linux-2.6.29.1/sound/soc/pxa/Kconfig 2009-09-07 15:23:12.000000000 +0100
+@@ -97,3 +97,12 @@
+ help
+ Say Y if you want to add support for SoC audio on the
+ Marvell Zylonite reference platform.
++
++config SND_PXA2XX_SOC_BALLOON3_SL90
++ tristate "SoC Audio support for Balloon 3 SL90"
++ depends on SND_PXA2XX_SOC && MACH_BALLOON3
++ select SND_PXA2XX_SOC_I2S
++ select SND_SOC_SL90DSP
++ help
++ Say Y if you want to add support for SL90 I2S audio
++ on Balloon 3.
+Index: linux-2.6.29.1/sound/soc/pxa/Makefile
+===================================================================
+--- linux-2.6.29.1.orig/sound/soc/pxa/Makefile 2009-09-07 15:04:02.000000000 +0100
++++ linux-2.6.29.1/sound/soc/pxa/Makefile 2009-09-07 15:23:12.000000000 +0100
+@@ -18,6 +18,7 @@
+ snd-soc-em-x270-objs := em-x270.o
+ snd-soc-palm27x-objs := palm27x.o
+ snd-soc-zylonite-objs := zylonite.o
++snd-soc-balloon3-sl90-objs := balloon3-sl90.o
+
+ obj-$(CONFIG_SND_PXA2XX_SOC_CORGI) += snd-soc-corgi.o
+ obj-$(CONFIG_SND_PXA2XX_SOC_POODLE) += snd-soc-poodle.o
+@@ -27,3 +28,4 @@
+ obj-$(CONFIG_SND_PXA2XX_SOC_EM_X270) += snd-soc-em-x270.o
+ obj-$(CONFIG_SND_PXA2XX_SOC_PALM27X) += snd-soc-palm27x.o
+ obj-$(CONFIG_SND_SOC_ZYLONITE) += snd-soc-zylonite.o
++obj-$(CONFIG_SND_PXA2XX_SOC_BALLOON3_SL90) += snd-soc-balloon3-sl90.o
+\ No newline at end of file
+Index: linux-2.6.29.1/sound/soc/pxa/balloon3-sl90.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.29.1/sound/soc/pxa/balloon3-sl90.c 2009-09-07 15:23:12.000000000 +0100
+@@ -0,0 +1,209 @@
++/*
++ * balloon3_sl90.c -- SoC audio for Balloon 3 in SL90
++ *
++ * Copyright 2005 Wolfson Microelectronics PLC.
++ * Copyright 2005 Openedhand Ltd.
++ * Copyright 2009 Martin-Jones Technology ltd
++ *
++ * Authors: Liam Girdwood <lrg@slimlogic.co.uk>
++ * Richard Purdie <richard@openedhand.com>
++ * Chris Jones <chris@martin-jones.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 <linux/gpio.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/soc.h>
++#include <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++#include <mach/pxa-regs.h>
++#include <mach/hardware.h>
++#include <mach/balloon3.h>
++#include <mach/audio.h>
++
++#include "../codecs/sl90dsp.h"
++#include "pxa2xx-pcm.h"
++#include "pxa2xx-i2s.h"
++
++
++static int balloon3_sl90_startup(struct snd_pcm_substream *substream)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_codec *codec = rtd->socdev->codec;
++
++ /* do startup stuff */
++
++ return 0;
++}
++
++static void balloon3_sl90_shutdown(struct snd_pcm_substream *substream)
++{
++ /* do shutdown stuff */
++}
++
++static int balloon3_sl90_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_dai *codec_dai = rtd->dai->codec_dai;
++ struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
++ unsigned int clk = 0;
++ int ret = 0;
++
++ switch (params_rate(params)) {
++ case 8000:
++ case 16000:
++ case 48000:
++ case 96000:
++ clk = 12288000;
++ break;
++ case 11025:
++ case 22050:
++ case 44100:
++ clk = 11289600;
++ break;
++ }
++
++ /* set codec DAI configuration */
++ ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
++ SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFS);
++ if (ret < 0)
++ return ret;
++
++ /* set cpu DAI configuration */
++ ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_I2S |
++ SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBM_CFS);
++ if (ret < 0)
++ return ret;
++
++ /* set the codec system clock for DAC and ADC */
++ /*ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK, clk,
++ SND_SOC_CLOCK_IN); */
++ if (ret < 0)
++ return ret;
++
++ /* set the I2S system clock as input because it's slave */
++ ret = snd_soc_dai_set_sysclk(cpu_dai, PXA2XX_I2S_SYSCLK, 0,
++ SND_SOC_CLOCK_IN);
++ if (ret < 0)
++ return ret;
++
++ return 0;
++}
++
++static struct snd_soc_ops balloon3_sl90_ops = {
++ .startup = balloon3_sl90_startup,
++ .hw_params = balloon3_sl90_hw_params,
++ .shutdown = balloon3_sl90_shutdown,
++};
++
++/* balloon3_sl90 machine dapm widgets */
++static const struct snd_soc_dapm_widget sl90dsp_dapm_widgets[] = {
++SND_SOC_DAPM_LINE("DSP Output", NULL),
++};
++
++/* Corgi machine audio map (connections to the codec pins) */
++static const struct snd_soc_dapm_route audio_map[] = {
++ {"Output to DSP", NULL, "RDSPOUT"},
++ {"Output to DSP", NULL, "LDSPOUT"},
++
++ {"Input from DSP", NULL, "LDSPIN"},
++ {"Input from DSP", NULL, "RDSPIN"},
++
++};
++
++/*
++ * Logic for a sl90dsp
++ */
++static int balloon3_sl90_sl90dsp_init(struct snd_soc_codec *codec)
++{
++ int i, err;
++
++ snd_soc_dapm_nc_pin(codec, "LLINEIN");
++ snd_soc_dapm_nc_pin(codec, "RLINEIN");
++
++ /* Add balloon3_sl90 specific widgets */
++ snd_soc_dapm_new_controls(codec, sl90dsp_dapm_widgets,
++ ARRAY_SIZE(sl90dsp_dapm_widgets));
++
++ /* Set up balloon3_sl90 specific audio path audio_map */
++ snd_soc_dapm_add_routes(codec, audio_map, ARRAY_SIZE(audio_map));
++
++ snd_soc_dapm_sync(codec);
++ return 0;
++}
++
++/* balloon3_sl90 digital audio interface glue - connects codec <--> CPU */
++static struct snd_soc_dai_link balloon3_sl90_dai = {
++ .name = "SL90DSP",
++ .stream_name = "SL90DSP",
++ .cpu_dai = &pxa_i2s_dai,
++ .codec_dai = &sl90dsp_dai,
++ .init = balloon3_sl90_sl90dsp_init,
++ .ops = &balloon3_sl90_ops,
++};
++
++/* balloon3_sl90 audio machine driver */
++static struct snd_soc_card snd_soc_balloon3_sl90 = {
++ .name = "Balloon3 SL90",
++ .platform = &pxa2xx_soc_platform,
++ .dai_link = &balloon3_sl90_dai,
++ .num_links = 1,
++};
++
++/* balloon3_sl90 audio private data */
++static struct sl90dsp_setup_data balloon3_sl90_sl90dsp_setup = {
++ .i2c_bus = 0,
++ .i2c_address = 0x1b,
++};
++
++/* balloon3_sl90 audio subsystem */
++static struct snd_soc_device balloon3_sl90_snd_devdata = {
++ .card = &snd_soc_balloon3_sl90,
++ .codec_dev = &soc_codec_dev_sl90dsp,
++ .codec_data = &balloon3_sl90_sl90dsp_setup,
++};
++
++static struct platform_device *balloon3_sl90_snd_device;
++
++static int __init balloon3_sl90_init(void)
++{
++ int ret;
++
++ balloon3_sl90_snd_device = platform_device_alloc("soc-audio", -1);
++ if (!balloon3_sl90_snd_device)
++ return -ENOMEM;
++
++ platform_set_drvdata(balloon3_sl90_snd_device, &balloon3_sl90_snd_devdata);
++ balloon3_sl90_snd_devdata.dev = &balloon3_sl90_snd_device->dev;
++ ret = platform_device_add(balloon3_sl90_snd_device);
++
++ if (ret)
++ platform_device_put(balloon3_sl90_snd_device);
++
++ return ret;
++}
++
++static void __exit balloon3_sl90_exit(void)
++{
++ platform_device_unregister(balloon3_sl90_snd_device);
++}
++
++module_init(balloon3_sl90_init);
++module_exit(balloon3_sl90_exit);
++
++/* Module information */
++MODULE_AUTHOR("Chris Jones");
++MODULE_DESCRIPTION("ALSA SoC Balloon 3 SL90");
++MODULE_LICENSE("GPL");
+Index: linux-2.6.29.1/sound/soc/codecs/sl90dsp.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.29.1/sound/soc/codecs/sl90dsp.c 2009-08-03 22:23:25.000000000 +0100
+@@ -0,0 +1,690 @@
++/*
++ * sl90dsp.c -- SL90 DSP ALSA SoC Audio driver
++ *
++ * Copyright 2005 Openedhand Ltd.
++ * 2009 Martin-Jones Technology Ltd
++ *
++ * Author: Richard Purdie <richard@openedhand.com>
++ * Chris Jones <chris@martin-jones.com>
++ *
++ * Based on wm8731.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 <linux/spi/spi.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 "sl90dsp.h"
++
++#define SL90DSP_VERSION "0.01"
++
++struct snd_soc_codec_device soc_codec_dev_sl90dsp;
++
++/* codec private data */
++struct sl90dsp_priv {
++ unsigned int sysclk;
++};
++
++/*
++ * SL90 DSP register cache
++ */
++static const u16 sl90dsp_reg[SL90DSP_CACHEREGNUM] = {
++ 0x0000, 0x007f, 0x007f, 0x007f
++};
++
++/*
++ * read SL90DSP register cache
++ */
++static inline unsigned int sl90dsp_read_reg_cache(struct snd_soc_codec *codec,
++ unsigned int reg)
++{
++ u16 *cache = codec->reg_cache;
++ if (reg >= SL90DSP_CACHEREGNUM)
++ return -1;
++ return cache[reg];
++}
++
++/*
++ * write sl90dsp register cache
++ */
++static inline void sl90dsp_write_reg_cache(struct snd_soc_codec *codec,
++ u16 reg, unsigned int value)
++{
++ u16 *cache = codec->reg_cache;
++ if (reg >= SL90DSP_CACHEREGNUM)
++ return;
++ cache[reg] = value;
++}
++
++/*
++ * write to the SL90DSP register space
++ */
++static int sl90dsp_write(struct snd_soc_codec *codec, unsigned int reg,
++ unsigned int value)
++{
++ u8 data[2];
++
++ /* data is
++ * D15..D9 SL90DSP register offset
++ * D8...D0 register data
++ */
++ data[0] = (reg << 1) | ((value >> 8) & 0x0001);
++ data[1] = value & 0x00ff;
++
++ sl90dsp_write_reg_cache(codec, reg, value);
++ if (codec->hw_write(codec->control_data, data, 2) == 2)
++ return 0;
++ else
++ return -EIO;
++}
++
++static const char *sl90dsp_input_select[] = {"Input from DSP"};
++
++static const struct soc_enum sl90dsp_enum[] = {
++ SOC_ENUM_SINGLE(SL90DSP_MISCCONTROL, 1, 1, sl90dsp_input_select),
++};
++
++static const struct snd_kcontrol_new sl90dsp_snd_controls[] = {
++
++SOC_SINGLE("Balloon Volume", SL90DSP_BALLOONVOLUME, 0, 127, 0),
++SOC_SINGLE("GSM Volume", SL90DSP_GSMVOLUME, 0, 127, 0),
++SOC_SINGLE("Ext Volume", SL90DSP_EXTVOLUME, 0, 127, 0),
++
++};
++
++/* add non dapm controls */
++static int sl90dsp_add_controls(struct snd_soc_codec *codec)
++{
++ int err, i;
++
++ for (i = 0; i < ARRAY_SIZE(sl90dsp_snd_controls); i++) {
++ err = snd_ctl_add(codec->card,
++ snd_soc_cnew(&sl90dsp_snd_controls[i],
++ codec, NULL));
++ if (err < 0)
++ return err;
++ }
++
++ return 0;
++}
++
++/* Output Mixer */
++static const struct snd_kcontrol_new sl90dsp_output_mixer_controls[] = {
++SOC_DAPM_SINGLE("Random Switch", SL90DSP_MISCCONTROL, 3, 1, 0),
++};
++
++/* Input mux */
++static const struct snd_kcontrol_new sl90dsp_input_mux_controls =
++SOC_DAPM_ENUM("Input Select", sl90dsp_enum[0]);
++
++static const struct snd_soc_dapm_widget sl90dsp_dapm_widgets[] = {
++SND_SOC_DAPM_MIXER("Output Mixer", SL90DSP_MISCCONTROL, 4, 1,
++ &sl90dsp_output_mixer_controls[0],
++ ARRAY_SIZE(sl90dsp_output_mixer_controls)),
++SND_SOC_DAPM_DAC("DAC", "Output to DSP", SL90DSP_MISCCONTROL, 3, 1),
++SND_SOC_DAPM_OUTPUT("LDSPOUT"),
++SND_SOC_DAPM_OUTPUT("RDSPOUT"),
++SND_SOC_DAPM_ADC("ADC", "Input from DSP", SL90DSP_MISCCONTROL, 2, 1),
++SND_SOC_DAPM_MUX("Input Mux", SND_SOC_NOPM, 0, 0, &sl90dsp_input_mux_controls),
++SND_SOC_DAPM_INPUT("LDSPIN"),
++SND_SOC_DAPM_INPUT("RDSPIN"),
++};
++
++static const struct snd_soc_dapm_route intercon[] = {
++ /* output mixer */
++ {"Output Mixer", "Output to DSP", "DAC"},
++
++ /* outputs */
++ {"RDSPOUT", NULL, "Output Mixer"},
++ {"LDSPOUT", NULL, "Output Mixer"},
++
++ /* input mux */
++ {"Input Mux", "Input from DSP", "Input from DSP"},
++ {"ADC", NULL, "Input Mux"},
++
++ /* inputs */
++ {"Input from DSP", NULL, "LDSPIN"},
++ {"Input from DSP", NULL, "RDSPIN"},
++};
++
++static int sl90dsp_add_widgets(struct snd_soc_codec *codec)
++{
++ snd_soc_dapm_new_controls(codec, sl90dsp_dapm_widgets,
++ ARRAY_SIZE(sl90dsp_dapm_widgets));
++
++ snd_soc_dapm_add_routes(codec, intercon, ARRAY_SIZE(intercon));
++
++ 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},
++ {12000000, 32000, 375, 0x6, 0x0, 0x1},
++
++ /* 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;
++}
++
++static int sl90dsp_hw_params(struct snd_pcm_substream *substream,
++ struct snd_pcm_hw_params *params,
++ struct snd_soc_dai *dai)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_device *socdev = rtd->socdev;
++ struct snd_soc_codec *codec = socdev->codec;
++ struct sl90dsp_priv *sl90dsp = codec->private_data;
++ //u16 iface = sl90dsp_read_reg_cache(codec, SL90DSP_IFACE) & 0xfff3;
++ u16 iface=0;
++ int i = get_coeff(sl90dsp->sysclk, params_rate(params));
++ u16 srate = (coeff_div[i].sr << 2) |
++ (coeff_div[i].bosr << 1) | coeff_div[i].usb;
++
++ /*sl90dsp_write(codec, SL90DSP_SRATE, srate);*/
++
++ /* bit size */
++ switch (params_format(params)) {
++ 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;
++ }
++
++ /*sl90dsp_write(codec, SL90DSP_IFACE, iface);*/
++ return 0;
++}
++
++static int sl90dsp_pcm_prepare(struct snd_pcm_substream *substream,
++ struct snd_soc_dai *dai)
++{
++ struct snd_soc_pcm_runtime *rtd = substream->private_data;
++ struct snd_soc_device *socdev = rtd->socdev;
++ struct snd_soc_codec *codec = socdev->codec;
++
++ /* set active */
++ /*sl90dsp_write(codec, SL90DSP_ACTIVE, 0x0001);*/
++
++ return 0;
++}
++
++static void sl90dsp_shutdown(struct snd_pcm_substream *substream,
++ struct snd_soc_dai *dai)
++{
++ 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);
++ /*sl90dsp_write(codec, SL90DSP_ACTIVE, 0x0);*/
++ }
++}
++
++static int sl90dsp_mute(struct snd_soc_dai *dai, int mute)
++{
++ struct snd_soc_codec *codec = dai->codec;
++ //u16 mute_reg = sl90dsp_read_reg_cache(codec, SL90DSP_APDIGI) & 0xfff7;
++
++// if (mute)
++ /*sl90dsp_write(codec, SL90DSP_APDIGI, mute_reg | 0x8);*/
++ //else
++ //sl90dsp_write(codec, SL90DSP_APDIGI, mute_reg);
++ return 0;
++}
++
++static int sl90dsp_set_dai_sysclk(struct snd_soc_dai *codec_dai,
++ int clk_id, unsigned int freq, int dir)
++{
++ struct snd_soc_codec *codec = codec_dai->codec;
++ struct sl90dsp_priv *sl90dsp = codec->private_data;
++
++ switch (freq) {
++ case 11289600:
++ case 12000000:
++ case 12288000:
++ case 16934400:
++ case 18432000:
++ sl90dsp->sysclk = freq;
++ return 0;
++ }
++ return -EINVAL;
++}
++
++
++static int sl90dsp_set_dai_fmt(struct snd_soc_dai *codec_dai,
++ unsigned int fmt)
++{
++ struct snd_soc_codec *codec = codec_dai->codec;
++ u16 iface = 0;
++
++ /* set master/slave audio interface */
++ switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
++ case SND_SOC_DAIFMT_CBM_CFM:
++ iface |= 0x0040;
++ break;
++ case SND_SOC_DAIFMT_CBS_CFS:
++ break;
++ default:
++ return -EINVAL;
++ }
++
++ /* interface format */
++ switch (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;
++ default:
++ return -EINVAL;
++ }
++
++ /* clock inversion */
++ switch (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;
++ default:
++ return -EINVAL;
++ }
++
++ /* set iface */
++ //sl90dsp_write(codec, SL90DSP_IFACE, iface);
++ return 0;
++}
++
++static int sl90dsp_set_bias_level(struct snd_soc_codec *codec,
++ enum snd_soc_bias_level level)
++{
++ //u16 reg = sl90dsp_read_reg_cache(codec, SL90DSP_PWR) & 0xff7f;
++
++ switch (level) {
++ case SND_SOC_BIAS_ON:
++ /* vref/mid, osc on, dac unmute */
++ //sl90dsp_write(codec, SL90DSP_PWR, reg);
++ break;
++ case SND_SOC_BIAS_PREPARE:
++ break;
++ case SND_SOC_BIAS_STANDBY:
++ /* everything off except vref/vmid, */
++ //sl90dsp_write(codec, SL90DSP_PWR, reg | 0x0040);
++ break;
++ case SND_SOC_BIAS_OFF:
++ /* everything off, dac mute, inactive */
++ //sl90dsp_write(codec, SL90DSP_ACTIVE, 0x0);
++ //sl90dsp_write(codec, SL90DSP_PWR, 0xffff);
++ break;
++ }
++ codec->bias_level = level;
++ return 0;
++}
++
++#define SL90DSP_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
++ SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
++ SNDRV_PCM_RATE_44100)
++
++#define SL90DSP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE )
++
++struct snd_soc_dai sl90dsp_dai = {
++ .name = "SL90DSP",
++ .playback = {
++ .stream_name = "Playback",
++ .channels_min = 1,
++ .channels_max = 2,
++ .rates = SL90DSP_RATES,
++ .formats = SL90DSP_FORMATS,},
++ .capture = {
++ .stream_name = "Capture",
++ .channels_min = 1,
++ .channels_max = 2,
++ .rates = SL90DSP_RATES,
++ .formats = SL90DSP_FORMATS,},
++ .ops = {
++ .prepare = sl90dsp_pcm_prepare,
++ .hw_params = sl90dsp_hw_params,
++ .shutdown = sl90dsp_shutdown,
++ .digital_mute = sl90dsp_mute,
++ .set_sysclk = sl90dsp_set_dai_sysclk,
++ .set_fmt = sl90dsp_set_dai_fmt,
++ }
++};
++EXPORT_SYMBOL_GPL(sl90dsp_dai);
++
++static int sl90dsp_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;
++
++ //sl90dsp_write(codec, SL90DSP_ACTIVE, 0x0);
++ sl90dsp_set_bias_level(codec, SND_SOC_BIAS_OFF);
++ return 0;
++}
++
++static int sl90dsp_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(sl90dsp_reg); i++) {
++ data[0] = (i << 1) | ((cache[i] >> 8) & 0x0001);
++ data[1] = cache[i] & 0x00ff;
++ codec->hw_write(codec->control_data, data, 2);
++ }
++ sl90dsp_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
++ sl90dsp_set_bias_level(codec, codec->suspend_bias_level);
++ return 0;
++}
++
++/*
++ * initialise the SL90DSP driver
++ * register the mixer and dsp interfaces with the kernel
++ */
++static int sl90dsp_init(struct snd_soc_device *socdev)
++{
++ struct snd_soc_codec *codec = socdev->codec;
++ int reg, ret = 0;
++
++ codec->name = "SL90DSP";
++ codec->owner = THIS_MODULE;
++ codec->read = sl90dsp_read_reg_cache;
++ codec->write = sl90dsp_write;
++ codec->set_bias_level = sl90dsp_set_bias_level;
++ codec->dai = &sl90dsp_dai;
++ codec->num_dai = 1;
++ codec->reg_cache_size = ARRAY_SIZE(sl90dsp_reg);
++ codec->reg_cache = kmemdup(sl90dsp_reg, sizeof(sl90dsp_reg), GFP_KERNEL);
++ if (codec->reg_cache == NULL)
++ return -ENOMEM;
++
++ //sl90dsp_reset(codec);
++
++ /* register pcms */
++ ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
++ if (ret < 0) {
++ printk(KERN_ERR "sl90dsp: failed to create pcms\n");
++ goto pcm_err;
++ }
++
++ /* power on device */
++ sl90dsp_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
++
++ sl90dsp_add_controls(codec);
++ sl90dsp_add_widgets(codec);
++ ret = snd_soc_init_card(socdev);
++ if (ret < 0) {
++ printk(KERN_ERR "sl90dsp: failed to register card\n");
++ goto card_err;
++ }
++
++ return ret;
++
++card_err:
++ snd_soc_free_pcms(socdev);
++ snd_soc_dapm_free(socdev);
++pcm_err:
++ kfree(codec->reg_cache);
++ return ret;
++}
++
++static struct snd_soc_device *sl90dsp_socdev;
++
++#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
++
++static int sl90dsp_i2c_probe(struct i2c_client *i2c,
++ const struct i2c_device_id *id)
++{
++ struct snd_soc_device *socdev = sl90dsp_socdev;
++ struct snd_soc_codec *codec = socdev->codec;
++ int ret;
++
++ i2c_set_clientdata(i2c, codec);
++ codec->control_data = i2c;
++
++ ret = sl90dsp_init(socdev);
++ if (ret < 0)
++ pr_err("failed to initialise SL90DSP I2C\n");
++
++ return ret;
++}
++
++static int sl90dsp_i2c_remove(struct i2c_client *client)
++{
++ struct snd_soc_codec *codec = i2c_get_clientdata(client);
++ kfree(codec->reg_cache);
++ return 0;
++}
++
++static const struct i2c_device_id sl90dsp_i2c_id[] = {
++ { "sl90dsp", 0 },
++ { }
++};
++MODULE_DEVICE_TABLE(i2c, sl90dsp_i2c_id);
++
++static struct i2c_driver sl90dsp_i2c_driver = {
++ .driver = {
++ .name = "SL90DSP I2C Codec",
++ .owner = THIS_MODULE,
++ },
++ .probe = sl90dsp_i2c_probe,
++ .remove = sl90dsp_i2c_remove,
++ .id_table = sl90dsp_i2c_id,
++};
++
++static int sl90dsp_add_i2c_device(struct platform_device *pdev,
++ const struct sl90dsp_setup_data *setup)
++{
++ struct i2c_board_info info;
++ struct i2c_adapter *adapter;
++ struct i2c_client *client;
++ int ret;
++
++ ret = i2c_add_driver(&sl90dsp_i2c_driver);
++ if (ret != 0) {
++ dev_err(&pdev->dev, "can't add i2c driver\n");
++ return ret;
++ }
++
++ memset(&info, 0, sizeof(struct i2c_board_info));
++ info.addr = setup->i2c_address;
++ strlcpy(info.type, "sl90dsp", I2C_NAME_SIZE);
++
++ adapter = i2c_get_adapter(setup->i2c_bus);
++ if (!adapter) {
++ dev_err(&pdev->dev, "can't get i2c adapter %d\n",
++ setup->i2c_bus);
++ goto err_driver;
++ }
++
++ client = i2c_new_device(adapter, &info);
++ i2c_put_adapter(adapter);
++ if (!client) {
++ dev_err(&pdev->dev, "can't add i2c device at 0x%x\n",
++ (unsigned int)info.addr);
++ goto err_driver;
++ }
++
++ return 0;
++
++err_driver:
++ i2c_del_driver(&sl90dsp_i2c_driver);
++ return -ENODEV;
++}
++#endif
++
++static int sl90dsp_probe(struct platform_device *pdev)
++{
++ struct snd_soc_device *socdev = platform_get_drvdata(pdev);
++ struct sl90dsp_setup_data *setup;
++ struct snd_soc_codec *codec;
++ struct sl90dsp_priv *sl90dsp;
++ int ret = 0;
++
++ pr_info("SL90DSP Audio Codec %s", SL90DSP_VERSION);
++
++ setup = socdev->codec_data;
++ codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
++ if (codec == NULL)
++ return -ENOMEM;
++
++ sl90dsp = kzalloc(sizeof(struct sl90dsp_priv), GFP_KERNEL);
++ if (sl90dsp == NULL) {
++ kfree(codec);
++ return -ENOMEM;
++ }
++
++ codec->private_data = sl90dsp;
++ socdev->codec = codec;
++ mutex_init(&codec->mutex);
++ INIT_LIST_HEAD(&codec->dapm_widgets);
++ INIT_LIST_HEAD(&codec->dapm_paths);
++
++ sl90dsp_socdev = socdev;
++
++ ret=0;
++#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
++ ret = -ENODEV;
++ if (setup->i2c_address) {
++ codec->hw_write = (hw_write_t)i2c_master_send;
++ ret = sl90dsp_add_i2c_device(pdev, setup);
++ }
++#endif
++
++ if (ret != 0) {
++ kfree(codec->private_data);
++ kfree(codec);
++ }
++ return ret;
++}
++
++/* power down chip */
++static int sl90dsp_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)
++ sl90dsp_set_bias_level(codec, SND_SOC_BIAS_OFF);
++
++ snd_soc_free_pcms(socdev);
++ snd_soc_dapm_free(socdev);
++#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
++ i2c_unregister_device(codec->control_data);
++ i2c_del_driver(&sl90dsp_i2c_driver);
++#endif
++ kfree(codec->private_data);
++ kfree(codec);
++
++ return 0;
++}
++
++struct snd_soc_codec_device soc_codec_dev_sl90dsp = {
++ .probe = sl90dsp_probe,
++ .remove = sl90dsp_remove,
++ .suspend = sl90dsp_suspend,
++ .resume = sl90dsp_resume,
++};
++EXPORT_SYMBOL_GPL(soc_codec_dev_sl90dsp);
++
++static int __init sl90dsp_modinit(void)
++{
++ return snd_soc_register_dai(&sl90dsp_dai);
++}
++module_init(sl90dsp_modinit);
++
++static void __exit sl90dsp_exit(void)
++{
++ snd_soc_unregister_dai(&sl90dsp_dai);
++}
++module_exit(sl90dsp_exit);
++
++MODULE_DESCRIPTION("ASoC SL90DSP driver");
++MODULE_AUTHOR("Chris Jones");
++MODULE_LICENSE("GPL");
+Index: linux-2.6.29.1/sound/soc/codecs/sl90dsp.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.29.1/sound/soc/codecs/sl90dsp.h 2009-08-03 19:13:36.000000000 +0100
+@@ -0,0 +1,37 @@
++/*
++ * sl90dsp.h -- SL90 DSP Soc Audio driver
++ *
++ * Copyright 2005 Openedhand Ltd.
++ * 2009 Martin-Jones Technology Ltd
++ *
++ * Author: Richard Purdie <richard@openedhand.com>
++ * Chris Jones <chris@martin-jones.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 _SL90DSP_H
++#define _Sl90DSP_H
++
++/* SL90DSP register space */
++
++/* none yet */
++#define SL90DSP_MISCCONTROL 0x00
++#define SL90DSP_BALLOONVOLUME 0x01
++#define SL90DSP_GSMVOLUME 0x02
++#define SL90DSP_EXTVOLUME 0x03
++#define SL90DSP_CACHEREGNUM 4
++
++
++struct sl90dsp_setup_data {
++ int i2c_bus;
++ unsigned short i2c_address;
++};
++
++extern struct snd_soc_dai sl90dsp_dai;
++extern struct snd_soc_codec_device soc_codec_dev_sl90dsp;
++
++#endif
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-lmr5428.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-lmr5428.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-lmr5428.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,1043 @@
+Index: linux-2.6.29.1/drivers/char/charset.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.29.1/drivers/char/charset.h 2009-09-03 07:40:25.000000000 +0100
+@@ -0,0 +1,98 @@
++unsigned char charset[]={\
++ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0x20 ' ' */ \
++ 0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00, /* 0x21 '!' */ \
++ 0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00, /* 0x22 '"' */ \
++ 0x14,0x7f,0x14,0x7f,0x14,0x00,0x00,0x00, /* 0x23 '#' */ \
++ 0x26,0x49,0x7f,0x49,0x32,0x00,0x00,0x00, /* 0x24 '$' */ \
++ 0x23,0x13,0x08,0x64,0x62,0x00,0x00,0x00, /* 0x25 '%' */ \
++ 0x36,0x49,0x56,0x20,0x58,0x00,0x00,0x00, /* 0x26 '&' */ \
++ 0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00, /* 0x27 ''' */ \
++ 0x00,0x1c,0x22,0x41,0x00,0x00,0x00,0x00, /* 0x28 '(' */ \
++ 0x00,0x41,0x22,0x1c,0x00,0x00,0x00,0x00, /* 0x29 ')' */ \
++ 0x22,0x14,0x7f,0x14,0x22,0x00,0x00,0x00, /* 0x2a '*' */ \
++ 0x08,0x08,0x3e,0x08,0x08,0x00,0x00,0x00, /* 0x2b '+' */ \
++ 0x00,0x80,0x60,0x00,0x00,0x00,0x00,0x00, /* 0x2c ',' */ \
++ 0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00, /* 0x2d '-' */ \
++ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00, /* 0x2e '.' */ \
++ 0x20,0x10,0x08,0x04,0x02,0x00,0x00,0x00, /* 0x2f '/' */ \
++ 0x1c,0x22,0x41,0x22,0x1c,0x00,0x00,0x00, /* 0x30 '0' */ \
++ 0x00,0x42,0x7f,0x40,0x00,0x00,0x00,0x00, /* 0x31 '1' */ \
++ 0x62,0x51,0x49,0x49,0x46,0x00,0x00,0x00, /* 0x32 '2' */ \
++ 0x21,0x41,0x49,0x4d,0x33,0x00,0x00,0x00, /* 0x33 '3' */ \
++ 0x18,0x14,0x12,0x7f,0x10,0x00,0x00,0x00, /* 0x34 '4' */ \
++ 0x27,0x45,0x45,0x45,0x39,0x00,0x00,0x00, /* 0x35 '5' */ \
++ 0x3c,0x4a,0x49,0x49,0x30,0x00,0x00,0x00, /* 0x36 '6' */ \
++ 0x01,0x71,0x09,0x05,0x03,0x00,0x00,0x00, /* 0x37 '7' */ \
++ 0x36,0x49,0x49,0x49,0x36,0x00,0x00,0x00, /* 0x38 '8' */ \
++ 0x06,0x49,0x49,0x29,0x1e,0x00,0x00,0x00, /* 0x39 '9' */ \
++ 0x00,0x00,0x44,0x00,0x00,0x00,0x00,0x00, /* 0x3a ':' */ \
++ 0x00,0x80,0x64,0x00,0x00,0x00,0x00,0x00, /* 0x3b ';' */ \
++ 0x08,0x14,0x22,0x41,0x00,0x00,0x00,0x00, /* 0x3c '<' */ \
++ 0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00, /* 0x3d '=' */ \
++ 0x00,0x41,0x22,0x14,0x08,0x00,0x00,0x00, /* 0x3e '>' */ \
++ 0x02,0x01,0x59,0x05,0x02,0x00,0x00,0x00, /* 0x3f '?' */ \
++ 0x3e,0x41,0x5d,0x55,0x1e,0x00,0x00,0x00, /* 0x40 '@' */ \
++ 0x7c,0x12,0x11,0x12,0x7c,0x00,0x00,0x00, /* 0x41 'A' */ \
++ 0x7f,0x49,0x49,0x49,0x36,0x00,0x00,0x00, /* 0x42 'B' */ \
++ 0x3e,0x41,0x41,0x41,0x22,0x00,0x00,0x00, /* 0x43 'C' */ \
++ 0x7f,0x41,0x41,0x41,0x3e,0x00,0x00,0x00, /* 0x44 'D' */ \
++ 0x7f,0x49,0x49,0x49,0x41,0x00,0x00,0x00, /* 0x45 'E' */ \
++ 0x7f,0x09,0x09,0x09,0x01,0x00,0x00,0x00, /* 0x46 'F' */ \
++ 0x3e,0x41,0x41,0x51,0x72,0x00,0x00,0x00, /* 0x47 'G' */ \
++ 0x7f,0x08,0x08,0x08,0x7f,0x00,0x00,0x00, /* 0x48 'H' */ \
++ 0x00,0x41,0x7f,0x41,0x00,0x00,0x00,0x00, /* 0x49 'I' */ \
++ 0x20,0x40,0x40,0x40,0x3f,0x00,0x00,0x00, /* 0x4a 'J' */ \
++ 0x7f,0x08,0x14,0x22,0x41,0x00,0x00,0x00, /* 0x4b 'K' */ \
++ 0x7f,0x40,0x40,0x40,0x40,0x00,0x00,0x00, /* 0x4c 'L' */ \
++ 0x7f,0x02,0x0c,0x02,0x7f,0x00,0x00,0x00, /* 0x4d 'M' */ \
++ 0x7f,0x04,0x08,0x10,0x7f,0x00,0x00,0x00, /* 0x4e 'N' */ \
++ 0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,0x00, /* 0x4f 'O' */ \
++ 0x7f,0x09,0x09,0x09,0x06,0x00,0x00,0x00, /* 0x50 'P' */ \
++ 0x3e,0x41,0x51,0x21,0x5e,0x00,0x00,0x00, /* 0x51 'Q' */ \
++ 0x7f,0x09,0x19,0x29,0x46,0x00,0x00,0x00, /* 0x52 'R' */ \
++ 0x26,0x49,0x49,0x49,0x32,0x00,0x00,0x00, /* 0x53 'S' */ \
++ 0x01,0x01,0x7f,0x01,0x01,0x00,0x00,0x00, /* 0x54 'T' */ \
++ 0x3f,0x40,0x40,0x40,0x3f,0x00,0x00,0x00, /* 0x55 'U' */ \
++ 0x07,0x18,0x60,0x18,0x07,0x00,0x00,0x00, /* 0x56 'V' */ \
++ 0x3f,0x40,0x38,0x40,0x3f,0x00,0x00,0x00, /* 0x57 'W' */ \
++ 0x63,0x14,0x08,0x14,0x63,0x00,0x00,0x00, /* 0x58 'X' */ \
++ 0x03,0x04,0x78,0x04,0x03,0x00,0x00,0x00, /* 0x59 'Y' */ \
++ 0x61,0x51,0x49,0x45,0x43,0x00,0x00,0x00, /* 0x5a 'Z' */ \
++ 0x00,0x7f,0x41,0x41,0x00,0x00,0x00,0x00, /* 0x5b '[' */ \
++ 0x15,0x16,0x7c,0x16,0x15,0x00,0x00,0x00, /* 0x5c '\' */ \
++ 0x00,0x41,0x41,0x7f,0x00,0x00,0x00,0x00, /* 0x5d ']' */ \
++ 0x04,0x02,0x01,0x02,0x04,0x00,0x00,0x00, /* 0x5e '^' */ \
++ 0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00, /* 0x5f '_' */ \
++ 0x48,0x7e,0x49,0x41,0x42,0x00,0x00,0x00, /* 0x60 pound sign, should be backquote normally */ \
++ 0x20,0x54,0x54,0x54,0x78,0x00,0x00,0x00, /* 0x61 'a' */ \
++ 0x7f,0x44,0x44,0x44,0x38,0x00,0x00,0x00, /* 0x62 'b' */ \
++ 0x38,0x44,0x44,0x44,0x44,0x00,0x00,0x00, /* 0x63 'c' */ \
++ 0x38,0x44,0x44,0x44,0x7f,0x00,0x00,0x00, /* 0x64 'd' */ \
++ 0x38,0x54,0x54,0x54,0x18,0x00,0x00,0x00, /* 0x65 'e' */ \
++ 0x00,0x08,0x7e,0x09,0x00,0x00,0x00,0x00, /* 0x66 'f' */ \
++ 0x18,0xa4,0xa4,0xa4,0x7c,0x00,0x00,0x00, /* 0x67 'g' */ \
++ 0x7f,0x04,0x04,0x04,0x78,0x00,0x00,0x00, /* 0x68 'h' */ \
++ 0x00,0x44,0x7d,0x40,0x00,0x00,0x00,0x00, /* 0x69 'i' */ \
++ 0x00,0x80,0x7d,0x00,0x00,0x00,0x00,0x00, /* 0x6a 'j' */ \
++ 0x00,0x7f,0x10,0x28,0x44,0x00,0x00,0x00, /* 0x6b 'k' */ \
++ 0x00,0x41,0x7f,0x40,0x00,0x00,0x00,0x00, /* 0x6c 'l' */ \
++ 0x7c,0x04,0x78,0x04,0x78,0x00,0x00,0x00, /* 0x6d 'm' */ \
++ 0x7c,0x04,0x04,0x04,0x78,0x00,0x00,0x00, /* 0x6e 'n' */ \
++ 0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00, /* 0x6f 'o' */ \
++ 0xfc,0x24,0x24,0x24,0x18,0x00,0x00,0x00, /* 0x70 'p' */ \
++ 0x18,0x24,0x24,0x24,0xfc,0x00,0x00,0x00, /* 0x71 'q' */ \
++ 0x00,0x7c,0x08,0x04,0x04,0x00,0x00,0x00, /* 0x72 'r' */ \
++ 0x48,0x54,0x54,0x54,0x24,0x00,0x00,0x00, /* 0x73 's' */ \
++ 0x00,0x04,0x3f,0x44,0x00,0x00,0x00,0x00, /* 0x74 't' */ \
++ 0x3c,0x40,0x40,0x40,0x7c,0x00,0x00,0x00, /* 0x75 'u' */ \
++ 0x0c,0x30,0x40,0x30,0x0c,0x00,0x00,0x00, /* 0x76 'v' */ \
++ 0x3c,0x40,0x30,0x40,0x3c,0x00,0x00,0x00, /* 0x77 'w' */ \
++ 0x44,0x28,0x10,0x28,0x44,0x00,0x00,0x00, /* 0x78 'x' */ \
++ 0x1c,0xa0,0xa0,0xa0,0x7c,0x00,0x00,0x00, /* 0x79 'y' */ \
++ 0x44,0x64,0x54,0x4c,0x44,0x00,0x00,0x00, /* 0x7a 'z' */ \
++ 0x08,0x36,0x41,0x00,0x00,0x00,0x00,0x00, /* 0x7b '{' */ \
++ 0x00,0x00,0x77,0x00,0x00,0x00,0x00,0x00, /* 0x7c '|' */ \
++ 0x00,0x00,0x41,0x36,0x08,0x00,0x00,0x00, /* 0x7d '}' */ \
++ 0x02,0x01,0x02,0x04,0x02,0x00,0x00,0x00, /* 0x7e '~' */ \
++ 0x55,0x2a,0x55,0x2a,0x55,0x00,0x00,0x00, /* 0x7f '' */ \
++ };
+Index: linux-2.6.29.1/drivers/char/lmr5428.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.29.1/drivers/char/lmr5428.c 2009-09-07 14:22:47.000000000 +0100
+@@ -0,0 +1,906 @@
++/*
++ * linux/drivers/char/lmr5428.c
++ *
++ * file interface for Densitron LMR5428 display on the balloon samosa bus
++ * Copyright (c) Chris Jones, Martin-Jones Technology Ltd 2009
++ *
++*/
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <linux/uaccess.h>
++
++#if defined(CONFIG_MACH_BALLOON2)
++#include <mach/balloon2.h>
++#endif
++#if defined(CONFIG_MACH_BALLOON3)
++#include <mach/balloon3.h>
++#endif
++#include <asm/cacheflush.h>
++
++#include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/proc_fs.h>
++#include <linux/vmalloc.h>
++#include <linux/platform_device.h>
++#include <linux/spinlock.h>
++#include "linux/cdev.h"
++#include <linux/samosa.h>
++#include "charset.h"
++
++#define LMR5428_DISPLAYS 1
++#define LMR5428_DATA_ADDRESS 0
++#define LMR5428_CMD_ADDRESS 1
++
++typedef enum {
++ DISPLAY_MODE_TEXT = 0,
++ DISPLAY_MODE_GRAPHICS = 1
++} Display_Block_Mode_t;
++
++typedef enum {
++ VDU_STATE_NORMAL=0,
++ VDU_STATE_SET_TEXT_SIZE=0x16,
++ VDU_STATE_CURSOR_POSITION_X=0x1f,
++ VDU_STATE_CURSOR_POSITION_Y=0x20
++} vdu_state_t;
++
++/* character device start number */
++static dev_t dev;
++static dev_t dev_raw;
++
++static spinlock_t lmr5428_lock;
++
++/* lmr5428 per device data */
++static struct lmr5428_dev {
++ unsigned int display;
++ struct cdev cdev;
++ struct cdev cdevraw;
++ unsigned int cursorx, cursory;
++ unsigned int textsizex, textsizey;
++ Display_Block_Mode_t displaymode;
++ vdu_state_t vdustate;
++} lmr5428[LMR5428_DISPLAYS];
++
++typedef enum {
++ VDU_NOP=0,
++ VDU_CURSOR_LEFT=0x08,
++ VDU_CURSOR_RIGHT=0x09,
++ VDU_CURSOR_DOWN=0x0a,
++ VDU_CURSOR_UP=0x0b,
++ VDU_CLEAR_SCREEN=0x0c,
++ VDU_CARRIAGE_RETURN=0x0d,
++ VDU_SET_TEXT_SIZE=0x16,
++ VDU_HOME=0x1e,
++ VDU_CURSOR_POSITION=0x1f
++} vdu_control_codes_t;
++
++/* ST7529 controller chip manipulation code */
++
++
++/* width, in triplets (3 pixels wide) */
++#define DISPLAY_WIDTH 80
++/* width in characters (6 pixels wide) */
++#define DISPLAY_WIDTH_CHARS 40
++/* height in characters (8 pixels tall) */
++#define DISPLAY_HEIGHT_CHARS 8
++// command table
++typedef enum {
++ ST7529_CMD_EXT_IN = 0x30,
++ ST7529_CMD_EXT_OUT= 0x31,
++
++// ext=0 (after ST7529_CMD_EXT_IN)
++ ST7529_CMD_DISON = 0xaf,
++ ST7529_CMD_DISOFF = 0xae,
++ ST7529_CMD_DISNOR = 0xa6,
++ ST7529_CMD_DISINV = 0xa7,
++ ST7529_CMD_COMSCN = 0xbb,
++ ST7529_CMD_DISCTRL= 0xca,
++ ST7529_CMD_SLPIN = 0x95,
++ ST7529_CMD_SLPOUT = 0x94,
++ ST7529_CMD_LASET = 0x75,
++ ST7529_CMD_CASET = 0x15,
++ ST7529_CMD_DATSDR = 0xbc,
++ ST7529_CMD_RAMWR = 0x5c,
++ ST7529_CMD_RAMRD = 0x5d,
++ ST7529_CMD_PTLIN = 0xa8,
++ ST7529_CMD_PTLOUT = 0xa9,
++ ST7529_CMD_RMWIN = 0xe0,
++ ST7529_CMD_RMWOUT = 0xee,
++ ST7529_CMD_ASCSET = 0xaa,
++ ST7529_CMD_SCSTART= 0xab,
++ ST7529_CMD_OSCON = 0xd1,
++ ST7529_CMD_OSCOFF = 0xd2,
++ ST7529_CMD_PWRCTRL= 0x20,
++ ST7529_CMD_VOLCTRL= 0x81,
++ ST7529_CMD_VOLUP = 0xd6,
++ ST7529_CMD_VOLDOWN= 0xd7,
++ ST7529_CMD_RESERVED= 0x82,
++ ST7529_CMD_EPSRRD1= 0x7c,
++ ST7529_CMD_EPSRRD2= 0x7d,
++ ST7529_CMD_NOP = 0x25,
++ ST7529_CMD_EPINT = 0x07,
++
++// ext=1 (after ST7529_CMD_EXT_OUT)
++ ST7529_CMD_GRAY1SET= 0x20,
++ ST7529_CMD_GRAY2SET= 0x21,
++ ST7529_CMD_ANASET = 0x32,
++ ST7529_CMD_SWINT = 0x34,
++ ST7529_CMD_EPCTIN = 0xcd,
++ ST7529_CMD_EPCOUT = 0xcc,
++ ST7529_CMD_EPMWR = 0xfc,
++ ST7529_CMD_EPMRD = 0xfd
++} ST7529_commands_t;
++
++
++typedef enum {
++ WHITE = 0x00,
++ BLACK = 0xf8
++} ST7529_colours_t;
++
++// masks for locations of adjacent pixels in pleft, pcentre and pright
++// for font smoothing
++#define PIX_DOWN 0x04
++#define PIX_CENTRE 0x02
++#define PIX_UP 0x01
++
++/* Display Size Parameters */
++#define HORIZONTAL_CHAR_SIZE 6
++#define VERTICAL_CHAR_SIZE 8
++#define DISPLAY_PIXEL_WIDTH 240
++#define DISPLAY_PIXEL_HEIGHT 64
++
++unsigned char st7529_grayscale[16]={0x00,0x03,0x06,0x09,0x0b,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x14,0x16,0x18,0x1b,0x1f};
++/* optimised for speed */
++static inline void write_cmd(unsigned char data)
++{ samosa_write8(LMR5428_CMD_ADDRESS,data); }
++static inline void write_data(unsigned char data)
++{ samosa_write8(LMR5428_DATA_ADDRESS,data); }
++static inline void write_data_block(unsigned char *data, unsigned int count)
++{ samosa_write_block8(LMR5428_DATA_ADDRESS,data,count); }
++static inline void write_data_repeat(unsigned char data, unsigned int count)
++{ samosa_write_repeat8(LMR5428_DATA_ADDRESS,data,count); }
++static inline unsigned char read_data()
++{ return samosa_read8(LMR5428_DATA_ADDRESS); }
++static inline unsigned char read_status()
++{ return samosa_read8(LMR5428_CMD_ADDRESS); }
++
++static void st7529_init(unsigned int display);
++static void st7529_block(unsigned int display, int startx, int starty, int endx, int endy, char colour);
++static int st7529_write_bars(unsigned int display);
++static void st7529_write_char(unsigned int display, unsigned char c, int xsize, int ysize, int pixelx, int pixely);
++static void st7529_write_chars(unsigned int display, unsigned char *s, int xsize, int ysize, int pixelx, int pixely);
++static void lmr5428_vdu(unsigned int display, unsigned char c);
++static void lmr5428_setup(unsigned int display);
++
++static void st7529_block(unsigned int display, int startx, int starty, int endx, int endy, char colour) {
++ int x,y;
++
++ write_cmd(ST7529_CMD_EXT_IN);
++ // set line address
++ write_cmd(ST7529_CMD_LASET);
++ // from starty to endy
++ write_data(starty);
++ write_data(endy-1);
++ // set column address
++ write_cmd(ST7529_CMD_CASET);
++ // from startx to endx
++ write_data(startx);
++ write_data(endx-1);
++ write_cmd(ST7529_CMD_RAMWR);
++ for(y=starty;y<endy;y++) {
++ for(x=startx;x<endx;x++) {
++ write_data(colour);
++ write_data(colour);
++ write_data(colour);
++ }
++ }
++}
++
++static int st7529_write_bars(unsigned int display) {
++ int x,y;
++
++ write_cmd(ST7529_CMD_EXT_IN);
++ // set line address
++ write_cmd(ST7529_CMD_LASET);
++ // from 0 to 63
++ write_data(0);
++ write_data(DISPLAY_PIXEL_HEIGHT-1);
++ // set column address
++ write_cmd(ST7529_CMD_CASET);
++ // from 0 to 79
++ write_data(0);
++ write_data(DISPLAY_WIDTH-1);
++ write_cmd(ST7529_CMD_RAMWR);
++ for(y=0;y<DISPLAY_PIXEL_HEIGHT;y++) {
++ for(x=0;x<DISPLAY_PIXEL_WIDTH;x++) {
++ write_data((x%0x20)<<3);
++ }
++ }
++}
++static void st7529_init(unsigned int display) {
++ int n;
++
++ // initialisation procedure from LMR5428 manual
++ // extended command mode off
++ write_cmd(ST7529_CMD_EXT_IN);
++ // exit sleep mode
++ write_cmd(ST7529_CMD_SLPOUT);
++ // oscillator on
++ write_cmd(ST7529_CMD_OSCON);
++ // power control, enable booster
++ write_cmd(ST7529_CMD_PWRCTRL);
++ write_data(0x08);
++ msleep(2);
++ // power control, regulator follower on
++ write_cmd(ST7529_CMD_PWRCTRL);
++ write_data(0x0b);
++ // set initial contrast // to 011010010 = 210 x 0.04v + 3.6V = 12.0V
++ // bottom 6 bits are in first byte
++ // top 3 bits are in second byte
++ write_cmd(ST7529_CMD_VOLCTRL);
++ write_data(18); // set Vop vlcd=12.0V
++ write_data(0x03);
++ // display control
++ write_cmd(ST7529_CMD_DISCTRL);
++ // divide clock by 2
++ write_data(0x04);
++ // duty cycle = 1/64
++ write_data(15);
++ // number of line cycles per frame = 1
++ write_data(0);
++ // COM scan direction
++ write_cmd(ST7529_CMD_COMSCN);
++ // from 0-79 and 80-156 in that order
++ write_data(0x00);
++ // data scan direction
++ write_cmd(ST7529_CMD_DATSDR);
++ // addresses scan in line direction, column addresses reversed, line address normal
++ write_data(0x02);
++ // segment arrangement
++ write_data(0x01);
++ // 32 gray-scale 3 byte 3 pixel mode (1 byte per pixel)
++ write_data(0x02);
++ // set line address
++ write_cmd(ST7529_CMD_LASET);
++ // from 0 to 63
++ write_data(0);
++ write_data(DISPLAY_PIXEL_HEIGHT-1);
++ // set column address
++ write_cmd(ST7529_CMD_CASET);
++ // from 0 to 79
++ write_data(0);
++ write_data(DISPLAY_WIDTH-1);
++ // enter extended command mode
++ write_cmd(ST7529_CMD_EXT_OUT);
++ // set grey level 1
++ write_cmd(ST7529_CMD_GRAY1SET);
++ for(n=0;n<16;n++) write_data(st7529_grayscale[n]);
++ // set grey level 2
++ write_cmd(ST7529_CMD_GRAY2SET);
++ for(n=0;n<16;n++) write_data(st7529_grayscale[n]);
++ // setup analogue circuit
++ write_cmd(ST7529_CMD_ANASET);
++ // oscillator freq =0 (default 12.7kHz)
++ write_data(0);
++ // booster efficiency 1 (default)
++ write_data(0x01);
++ // bias = 1/9
++ write_data(0x05);
++ // dithering off
++ write_cmd(ST7529_CMD_SWINT);
++
++ // back into normal command mode
++ write_cmd(ST7529_CMD_EXT_IN);
++ // switch display on
++ write_cmd(ST7529_CMD_DISON);
++ // and enter RAM write mode
++ write_cmd(ST7529_CMD_RAMWR);
++}
++
++
++static void st7529_write_char(unsigned int display, unsigned char c, int xsize, int ysize, int pixelx, int pixely) {
++ int column, columnwidth,pixelfillleft,pixelfillright,charwidth,charheight;
++ int columncount,x,y,ysub;
++ unsigned char pixeldata[3];
++
++ charwidth=xsize*6;
++ charheight=ysize*8;
++ // work out which column the top left pixel starts in
++ column=pixelx/3;
++ // and how many pixels either side of the character need to be ignored
++ pixelfillleft=pixelx%3;
++
++ columnwidth=(pixelfillleft+charwidth+2)/3;
++
++ pixelfillright=(columnwidth*3)-(pixelfillleft+charwidth);
++
++ // define box to draw the character in
++ write_cmd(ST7529_CMD_EXT_IN);
++ // set line address
++ write_cmd(ST7529_CMD_LASET);
++ // from pixely to pixely+charheight
++ write_data(pixely);
++ write_data(pixely+charheight-1);
++ // set column address
++ write_cmd(ST7529_CMD_CASET);
++ // from column to column+columnwidth
++ write_data(column);
++ write_data(column+columnwidth-1);
++ // we use read-modify-write mode for this
++ write_cmd(ST7529_CMD_RMWIN);
++
++ // now draw the character
++ for(y=0; y<8; y++) {
++ for(ysub=0;ysub<ysize;ysub++) {
++ // we have to go column-by-column because the LCD controller
++ // is daft and requires us to read all three pixels in a column
++ // before writing them back
++ for(columncount=0;columncount<columnwidth;columncount++) {
++ // first, read all the data out of the column
++ // dummy read. Why?
++ read_data();
++ for(x=0;x<3;x++)
++ pixeldata[x]=read_data();
++ // now modify the pixel data as required
++ for(x=0;x<3;x++) {
++ // work out where we are in the character 'cell'
++ int incell=x+(3*columncount)-pixelfillleft;
++ int charx=incell/xsize;
++ // and whereabouts in the character pixel we are (for font smoothing purposes)
++ int charxsub=((x+(3*columncount)-pixelfillleft)%xsize);
++ // are we past the empty pixels on the left?
++ // and within the character pixels?
++ if(incell>=0 && charx<7) {
++ // yes, figure out the value of this dot
++ // get the pixel data for this column
++ int charptr=((c-32)<<3);
++ char p=charset[charptr+charx];
++ unsigned int pleft, pright, pcurrent, pmask;
++ // get the correct bit. bit 0 is at the top, bit 7 at the bottom
++ pmask=1<<y;
++
++ // for size>1, do font smoothing but only for switched-off pixels
++ // and only when we're at the 'corner' of this character pixel
++ if(xsize>1 && ysize>1 && !(p&pmask)) {
++ // these 3 variables will contain columns of 3 pixels
++ // in bits 2..0
++ if(charx)
++ pleft=(((unsigned int)charset[charptr+charx-1])<<1)>>y;
++ else
++ pleft=0;
++ if(charx<6)
++ pright=(((unsigned int)charset[charptr+charx+1])<<1)>>y;
++ else
++ pright=0;
++ // and add the current column of pixels
++ pcurrent=((unsigned int)p<<1)>>y;
++ // do the surrounding pixels match any of the patterns we smooth?
++ // if so, force a pixel to be plotted here
++ // but only in the relevant 'corner' of the character pixel
++ if(charxsub==0 && ysub==0)
++ if((pleft & PIX_CENTRE) && (pcurrent & PIX_UP) && !(pleft & PIX_UP))
++ p=0xff;
++ if(charxsub==xsize-1 && ysub==0)
++ if((pright & PIX_CENTRE) && (pcurrent & PIX_UP) && !(pright & PIX_UP))
++ p=0xff;
++ if(charxsub==0 && ysub==ysize-1)
++ if((pleft & PIX_CENTRE) && (pcurrent & PIX_DOWN) && !(pleft & PIX_DOWN))
++ p=0xff;
++ if(charxsub==xsize-1 && ysub==ysize-1)
++ if((pright & PIX_CENTRE) && (pcurrent & PIX_DOWN) && !(pright & PIX_DOWN))
++ p=0xff;
++ }
++ // and set the pixel to be white or black
++ p&=pmask;
++ pixeldata[x]=(p?WHITE:BLACK);
++ } // if we're in the character pixels
++ } // x loop within display column
++ // now write the data back to the display
++ for(x=0;x<3;x++)
++ write_data(pixeldata[x]);
++ } // column loop
++ } // display y loop
++ } // character y loop
++ // leave read-modify-write mode
++ write_cmd(ST7529_CMD_RMWOUT);
++}
++
++static void st7529_write_chars(unsigned int display, unsigned char *s, int xsize, int ysize, int pixelx, int pixely) {
++ int n, x;
++
++ x=pixelx;
++ n=0;
++
++ while(s[n]) {
++ st7529_write_char(display,s[n],xsize,ysize, x,pixely);
++ x+=xsize*6;
++ n++;
++ }
++}
++
++static void lmr5428_vdu(unsigned int display, unsigned char c) {
++ struct lmr5428_dev *d=&(lmr5428[display]);
++
++ /* pr_info("%s state 0x%02x\n",__func__,d->vdustate); */
++ // check VDU state
++ switch(d->vdustate) {
++ case VDU_STATE_NORMAL:
++ // is this a standard character?
++ if(c>31 && c<128) {
++ int pixelx = d->cursorx * HORIZONTAL_CHAR_SIZE;
++ int pixely = d->cursory * VERTICAL_CHAR_SIZE;
++ // if so, just draw it at the current cursor position
++ st7529_write_char(display,c,d->textsizex,d->textsizey,pixelx,pixely);
++ // and update the cursor position
++ d->cursorx+=d->textsizex;
++ } else {
++ // handle control characters
++ switch(c) {
++ case VDU_CURSOR_LEFT:
++ if (d->cursorx>=d->textsizex)
++ d->cursorx-=d->textsizex;
++ else
++ d->cursorx=0;
++ break;
++ case VDU_CURSOR_RIGHT:
++ d->cursorx+=d->textsizex;
++ if(d->cursorx>=DISPLAY_WIDTH_CHARS)
++ d->cursorx=DISPLAY_WIDTH_CHARS-1;
++ break;
++ case VDU_CURSOR_DOWN:
++ d->cursory+=d->textsizey;
++ if(d->cursory>=DISPLAY_HEIGHT_CHARS)
++ d->cursory=DISPLAY_HEIGHT_CHARS-1;
++ break;
++ case VDU_CURSOR_UP:
++ if (d->cursory>=d->textsizey)
++ d->cursory-=d->textsizey;
++ else
++ d->cursory=0;
++ break;
++ case VDU_CLEAR_SCREEN:
++ d->cursorx=0;
++ d->cursory=0;
++ st7529_block(display,0,0,DISPLAY_WIDTH,DISPLAY_PIXEL_HEIGHT,BLACK);
++ break;
++ case VDU_CARRIAGE_RETURN:
++ d->cursorx=0;
++ break;
++ case VDU_SET_TEXT_SIZE:
++ d->vdustate=VDU_STATE_SET_TEXT_SIZE;
++ break;
++ case VDU_HOME:
++ d->cursorx=0;
++ d->cursory=0;
++ break;
++ case VDU_CURSOR_POSITION:
++ d->vdustate=VDU_STATE_CURSOR_POSITION_X;
++ break;
++ }
++ }
++ break;
++ case VDU_STATE_SET_TEXT_SIZE:
++ d->textsizex=(c&0xf0)>>4;
++ d->textsizey=c&0x0f;
++ if(d->textsizex==0) d->textsizex=1;
++ if(d->textsizey==0) d->textsizey=1;
++ d->vdustate=VDU_STATE_NORMAL;
++ break;
++ case VDU_STATE_CURSOR_POSITION_X:
++ if(c<0) c=0;
++ if(c>=DISPLAY_WIDTH_CHARS) c=DISPLAY_WIDTH_CHARS-1;
++ d->cursorx=c;
++ d->vdustate=VDU_STATE_CURSOR_POSITION_Y;
++ break;
++ case VDU_STATE_CURSOR_POSITION_Y:
++ if(c<0) c=0;
++ if(c>=DISPLAY_HEIGHT_CHARS) c=DISPLAY_HEIGHT_CHARS-1;
++ d->cursory=c;
++ d->vdustate=VDU_STATE_NORMAL;
++ break;
++ }
++}
++static ssize_t lmr5428_read(struct file *, char *, size_t, loff_t *);
++static ssize_t lmr5428_write(struct file *, const char *, size_t, loff_t *);
++static int lmr5428_open(struct inode *, struct file *);
++static int lmr5428_release(struct inode *, struct file *);
++static int lmr5428_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
++static int lmr5428_mmap(struct file *, struct vm_area_struct *vm);
++
++static ssize_t lmr5428_read_raw(struct file *, char *, size_t, loff_t *);
++static ssize_t lmr5428_write_raw(struct file *, const char *, size_t, loff_t *);
++static int lmr5428_open_raw(struct inode *, struct file *);
++static int lmr5428_release_raw(struct inode *, struct file *);
++static int lmr5428_ioctl_raw(struct inode *, struct file *, unsigned int, unsigned long);
++static int lmr5428_mmap_raw(struct file *, struct vm_area_struct *vm);
++
++static struct file_operations lmr5428_fops = {
++ read: lmr5428_read,
++ write: lmr5428_write,
++ open: lmr5428_open,
++ release: lmr5428_release,
++ ioctl: lmr5428_ioctl,
++ mmap: lmr5428_mmap,
++};
++
++static struct file_operations lmr5428_fops_raw = {
++ read: lmr5428_read_raw,
++ write: lmr5428_write_raw,
++ open: lmr5428_open_raw,
++ release: lmr5428_release_raw,
++ ioctl: lmr5428_ioctl_raw,
++ mmap: lmr5428_mmap_raw,
++};
++
++/* proc interface */
++static ssize_t proc_read_lmr5428(struct file *file, char *buf,
++ size_t nbytes, loff_t *ppos);
++static ssize_t proc_write_lmr5428(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos);
++
++static struct file_operations proc_lmr5428_operations = {
++ read: proc_read_lmr5428,
++ write: proc_write_lmr5428
++};
++static struct proc_dir_entry *proc_lmr5428;
++#define PROC_LMR5428 "lmr5428"
++
++static void lmr5428_setup(unsigned int display)
++{
++ st7529_init(display);
++ st7529_block(display,0,0,DISPLAY_WIDTH,DISPLAY_PIXEL_HEIGHT,BLACK);
++}
++
++static int lmr5428_open(struct inode *inode, struct file *filp)
++{
++ struct lmr5428_dev *lmr5428_devp;
++
++ if (samosa_sm_present())
++ return -ENODEV;
++
++ lmr5428_devp = container_of(inode->i_cdev, struct lmr5428_dev, cdev);
++ filp->private_data = lmr5428_devp;
++
++ return 0;
++}
++
++static int lmr5428_release(struct inode *inode, struct file *filp)
++{
++ return 0;
++}
++
++static ssize_t lmr5428_read(struct file *filp, char *buf,
++ size_t size, loff_t *offp)
++{
++ /* we don't support reading at the moment */
++ return -EINVAL;
++}
++
++static ssize_t lmr5428_write(struct file *filp, const char *buf,
++ size_t size, loff_t *offp)
++{
++ struct lmr5428_dev *mp = (struct lmr5428_dev *)filp->private_data;
++ /* just pass all the data to the text-interpreting routine */
++ unsigned char c;
++ size_t org_size = size;
++ while (size) {
++ copy_from_user(&c, buf, sizeof(c));
++ buf += sizeof(c);
++ /* pr_info("%s: char 0x%x\n", __func__, c); */
++ lmr5428_vdu(mp->display, c);
++ size -= sizeof(unsigned char);
++ }
++ return org_size;
++}
++
++/* maybe this will be handy in due course */
++static int lmr5428_ioctl(struct inode *inode, struct file *flip,
++ unsigned int command, unsigned long arg)
++{
++ int err;
++ err = -EINVAL;
++ return err;
++}
++
++static int lmr5428_mmap(struct file *filp, struct vm_area_struct *vma)
++{
++ /*struct lmr5428_dev *mp = (struct lmr5428_dev *)filp->private_data;*/
++
++ return -EINVAL;
++}
++
++static int lmr5428_open_raw(struct inode *inode, struct file *filp)
++{
++ struct lmr5428_dev *lmr5428_devp;
++
++ if (samosa_sm_present())
++ return -ENODEV;
++
++ lmr5428_devp = container_of(inode->i_cdev, struct lmr5428_dev, cdevraw);
++ filp->private_data = lmr5428_devp;
++
++ /* set drawing rectangle to full screen */
++ write_cmd(ST7529_CMD_EXT_IN);
++ // set line address
++ write_cmd(ST7529_CMD_LASET);
++ // from 0 to 63
++ write_data(0);
++ write_data(DISPLAY_PIXEL_HEIGHT-1);
++ // set column address
++ write_cmd(ST7529_CMD_CASET);
++ // from 0 to 79
++ write_data(0);
++ write_data(DISPLAY_WIDTH-1);
++
++ /* and go into write mode */
++ write_cmd(ST7529_CMD_RAMWR);
++
++ return 0;
++}
++
++static int lmr5428_release_raw(struct inode *inode, struct file *filp)
++{
++ return 0;
++}
++
++static ssize_t lmr5428_read_raw(struct file *filp, char *buf,
++ size_t size, loff_t *offp)
++{
++ /* we don't support reading at the moment */
++ return -EINVAL;
++}
++
++static ssize_t lmr5428_write_raw(struct file *filp, const char *buf,
++ size_t size, loff_t *offp)
++{
++ struct lmr5428_dev *mp = (struct lmr5428_dev *)filp->private_data;
++ /* just pass all the data to the text-interpreting routine */
++ unsigned char c;
++ size_t org_size = size;
++ while (size) {
++ copy_from_user(&c, buf, sizeof(c));
++ buf += sizeof(c);
++ /* pr_info("%s: char 0x%x\n", __func__, c); */
++ write_data(c);
++ size -= sizeof(unsigned char);
++ }
++ return org_size;
++}
++
++/* maybe this will be handy in due course */
++static int lmr5428_ioctl_raw(struct inode *inode, struct file *flip,
++ unsigned int command, unsigned long arg)
++{
++ int err;
++ err = -EINVAL;
++ return err;
++}
++
++static int lmr5428_mmap_raw(struct file *filp, struct vm_area_struct *vma)
++{
++ /*struct lmr5428_dev *mp = (struct lmr5428_dev *)filp->private_data;*/
++
++ return -EINVAL;
++}
++
++static int proc_read_lmr5428(struct file *filp, char *buf,
++ size_t nbytes, loff_t *ppos)
++{
++ char outputbuf[512];
++ int count = 0;
++
++ /* all done in a single read */
++ if (*ppos > 0)
++ return 0;
++
++ count += sprintf(&outputbuf[count], "lmr5428: major dev = %d major dev raw = %d\n", MAJOR(dev),MAJOR(dev_raw));
++
++ if (count > nbytes) /* Assume output can be read at one time */
++ return -EINVAL;
++ if (copy_to_user(buf, outputbuf, count))
++ return -EFAULT;
++ *ppos += count;
++ return count;
++}
++
++static ssize_t proc_write_lmr5428(struct file *filp, const char *buffer,
++ size_t count, loff_t *ppos)
++{
++ /* struct lmr5428_dev *mp= (struct lmr5428_dev *)filp->private_data;
++ * if (strncmp(buff,"reset:",6)==0)
++ * newRegValue = simple_strtoul(buffer,&endp,0);
++ * a bold but simple claim is to have read it all
++ */
++ return count;
++}
++
++
++/* driver initialisation */
++
++static int __init lmr5428_probe(struct samosa_device *pdev)
++{
++#ifndef CONFIG_BALLOON2_BUILD_TCL_PIKEY2
++ /* if smart media present - cpld cannot be so declare invalid */
++ if (samosa_sm_present()) {
++ dev_info(&pdev->dev, "%s: samosa bus not present\n", __func__);
++ return -ENODEV;
++ }
++#endif
++
++
++ lmr5428_setup(pdev->id);
++
++#ifdef USE_GRAPHICS_TEST
++ lmr5428_bars(pdev->id);
++#endif
++
++ dev_info(&pdev->dev, "LMR5428 %d display support installed\n", pdev->id);
++
++ return 0;
++}
++
++static int __exit lmr5428_remove(struct samosa_device *dev)
++{
++ samosa_set_drvdata(dev, NULL);
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int lmr5428_suspend(struct samosa_device *dev, pm_message_t state)
++{
++ /*MinipugPowerSave(dev->id);*/
++ return 0;
++}
++
++static int lmr5428_resume(struct samosa_device *dev)
++{
++ /*MinipugExitPowerSave(dev->id);*/
++ return 0;
++}
++#else /* CONFIG_PM */
++#define lmr5428_suspend NULL
++#define lmr5428_resume NULL
++#endif /* CONFIG_PM */
++
++#define lmr5428_shutdown NULL
++
++/* driver definition */
++static struct samosa_driver lmr5428_driver = {
++ .probe = lmr5428_probe,
++ .shutdown = lmr5428_shutdown,
++ .remove = __exit_p(lmr5428_remove),
++ .suspend = lmr5428_suspend,
++ .resume = lmr5428_resume,
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = "lmr5428",
++ },
++};
++
++/* bus device */
++static struct samosa_device *lmr5428_device[2];
++
++/* class object */
++static struct class *lmr5428_class;
++static struct class *lmr5428_raw_class;
++
++static int __init lmr5428_init(void)
++{
++ int i;
++ int ret;
++
++ /* general initialisation */
++ spin_lock_init(&lmr5428_lock);
++
++ /* register a range of device nodes */
++ ret = alloc_chrdev_region(&dev, 0, 1, "lmr5428");
++ if (ret)
++ goto error;
++ ret = alloc_chrdev_region(&dev_raw, 0, 1, "lmr5428raw");
++ if (ret)
++ goto error;
++
++ /* create the lmr5428 character devices */
++ for (i = 0; i < LMR5428_DISPLAYS; i++) {
++ lmr5428[i].display = i;
++ lmr5428[i].cursorx=0;
++ lmr5428[i].cursory=0;
++ lmr5428[i].textsizex=1;
++ lmr5428[i].textsizey=1;
++ lmr5428[i].displaymode=DISPLAY_MODE_TEXT;
++ lmr5428[i].vdustate=VDU_STATE_NORMAL;
++ /* initialise character device */
++ cdev_init(&lmr5428[i].cdev, &lmr5428_fops);
++ cdev_init(&lmr5428[i].cdevraw, &lmr5428_fops_raw);
++ /* claim ownership */
++ lmr5428[i].cdev.owner = THIS_MODULE;
++ lmr5428[i].cdevraw.owner = THIS_MODULE;
++ /* add character device */
++ ret = cdev_add(&lmr5428[i].cdev, dev + i, 1);
++ if (ret)
++ break;
++ ret = cdev_add(&lmr5428[i].cdevraw, dev_raw + i, 1);
++ if (ret)
++ break;
++ }
++ if (ret) {
++ goto error_region;
++ }
++
++ /* create the class and devices */
++ lmr5428_class = class_create(THIS_MODULE, "lmr5428");
++ lmr5428_raw_class = class_create(THIS_MODULE, "lmr5428raw");
++
++ for (i = 0; i < LMR5428_DISPLAYS; i++) {
++ if (!device_create(lmr5428_class, NULL, (dev + i), NULL, "lmr5428%d", i))
++ goto error_class_device;
++ if (!device_create(lmr5428_raw_class, NULL, (dev_raw + i), NULL, "lmr5428raw%d", i))
++ goto error_class_device;
++ /* register the device on a bus. */
++ lmr5428_device[i] = samosa_device_register_simple("lmr5428", i);
++ if (!lmr5428_device[i])
++ goto error_bus;
++ }
++
++ /* create proc access to displays */
++ proc_lmr5428 = create_proc_entry(PROC_LMR5428, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_lmr5428)
++ proc_lmr5428->proc_fops = &proc_lmr5428_operations;
++
++ /* register the driver */
++ return samosa_driver_register(&lmr5428_driver);
++
++error_bus:
++ for (i = 0; i < LMR5428_DISPLAYS; i++)
++ /* remove samosa device */
++ samosa_device_unregister(lmr5428_device[i]);
++error_class_device:
++ for (i = 0; i < LMR5428_DISPLAYS; i++) {
++ device_destroy(lmr5428_class, dev + i);
++ device_destroy(lmr5428_raw_class, dev_raw + i);
++ }
++error_region:
++ unregister_chrdev_region(dev, 1);
++ unregister_chrdev_region(dev_raw, 1);
++error:
++ return ret;
++}
++
++static void __exit lmr5428_exit(void)
++{
++ int i;
++
++ /* remove proc entry */
++ remove_proc_entry(PROC_LMR5428, NULL);
++
++ for (i = 0; i < LMR5428_DISPLAYS; i++) {
++ /* remove class device */
++ device_destroy(lmr5428_class, (dev + i));
++ device_destroy(lmr5428_raw_class, (dev_raw + i));
++
++ /* remove samosa device */
++ samosa_device_unregister(lmr5428_device[i]);
++
++ /* remove character device */
++ cdev_del(&lmr5428[i].cdev);
++ cdev_del(&lmr5428[i].cdevraw);
++ }
++ /* remove driver */
++ samosa_driver_unregister(&lmr5428_driver);
++
++ /* unregister region */
++ unregister_chrdev_region(dev, 1);
++ unregister_chrdev_region(dev_raw, 1);
++
++ /* remove class */
++ class_destroy(lmr5428_class);
++ class_destroy(lmr5428_raw_class);
++}
++
++module_init(lmr5428_init);
++module_exit(lmr5428_exit);
++
++MODULE_AUTHOR("Chris Jones <chris@martin-jones.com>");
++MODULE_DESCRIPTION("LMR5428 display interface via samosa bus on Balloon");
++MODULE_LICENSE("GPL");
+Index: linux-2.6.29.1/drivers/char/Kconfig
+===================================================================
+--- linux-2.6.29.1.orig/drivers/char/Kconfig 2009-09-03 07:40:24.000000000 +0100
++++ linux-2.6.29.1/drivers/char/Kconfig 2009-09-07 14:24:24.000000000 +0100
+@@ -666,6 +666,12 @@
+ help
+ Virtio console for use with lguest and other hypervisors.
+
++config LMR5428
++ tristate "LMR5428 Display"
++ depends on SAMOSA
++ default m
++ help
++ Densitron LMR5428 LCD display driven down Samosa bus (for Balloonboard).
+
+ config HVCS
+ tristate "IBM Hypervisor Virtual Console Server support"
+Index: linux-2.6.29.1/drivers/char/Makefile
+===================================================================
+--- linux-2.6.29.1.orig/drivers/char/Makefile 2009-09-03 07:40:24.000000000 +0100
++++ linux-2.6.29.1/drivers/char/Makefile 2009-09-07 14:24:24.000000000 +0100
+@@ -112,6 +112,7 @@
+ js-rtc-y = rtc.o
+
+ obj-$(CONFIG_SAMOSA) += samosa.o
++obj-$(CONFIG_LMR5428) += lmr5428.o
+
+ # Files generated that shall be removed upon make clean
+ clean-files := consolemap_deftbl.c defkeymap.c
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-megapug.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-megapug.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-megapug.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,1094 @@
+Index: linux-2.6.31/drivers/char/Kconfig
+===================================================================
+--- linux-2.6.31.orig/drivers/char/Kconfig 2010-01-04 21:07:10.000000000 +0000
++++ linux-2.6.31/drivers/char/Kconfig 2010-01-04 21:07:18.000000000 +0000
+@@ -693,6 +693,13 @@
+ help
+ Minipug will display an animated sequence till opened
+
++config MEGAPUG
++ tristate "Megapug LCD display"
++ depends on SAMOSA
++ default y
++ help
++ 544*288 LCD display driven down Samosa bus (for Balloonboard).
++
+ config HVCS
+ tristate "IBM Hypervisor Virtual Console Server support"
+ depends on PPC_PSERIES
+Index: linux-2.6.31/drivers/char/Makefile
+===================================================================
+--- linux-2.6.31.orig/drivers/char/Makefile 2010-01-04 21:07:10.000000000 +0000
++++ linux-2.6.31/drivers/char/Makefile 2010-01-04 21:07:18.000000000 +0000
+@@ -113,6 +113,7 @@
+
+ obj-$(CONFIG_SAMOSA) += samosa.o
+ obj-$(CONFIG_MINIPUG) += minipug.o
++obj-$(CONFIG_MEGAPUG) += megapug.o
+
+ # Files generated that shall be removed upon make clean
+ clean-files := consolemap_deftbl.c defkeymap.c
+Index: linux-2.6.31/drivers/char/megapug.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.31/drivers/char/megapug.c 2010-01-04 21:07:18.000000000 +0000
+@@ -0,0 +1,1052 @@
++/*
++ * linux/drivers/char/megapug.c
++ *
++ * file interface for megapug displays on the balloon samosa bus
++ * Copyright (c) N C Bane 2006 for Toby Churchill Ltd
++ *
++*/
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <linux/uaccess.h>
++
++#include <mach/balloon3.h>
++
++#include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/proc_fs.h>
++#include <linux/vmalloc.h>
++#include <linux/platform_device.h>
++#include <linux/spinlock.h>
++#include "linux/cdev.h"
++#include "samosa.h"
++
++#define USE_GRAPHICS_TEST
++/* #define USE_GRAPHICS_TEST_PIXEL_TEST */
++
++/* character device start number */
++static dev_t dev;
++
++static spinlock_t megapug_lock;
++
++/* minipug per device data */
++static struct megapug_dev {
++ struct cdev cdev;
++ unsigned char *buffer;
++ unsigned int bpp;
++} megapug;
++
++/* total minipug on board ram */
++#define BUFFER_SIZE (160*1024)
++#define RAM_SIZE (160*1024)
++#define DISPLAY_BPP 4
++
++void megapug_update_graphics(unsigned char *data, unsigned int len, unsigned int offset)
++{
++ spin_lock(&megapug_lock);
++// MinipugSetCursorAddress(disp, display_state[disp].blocks[2].start + offset);
++// Write_Command(disp, COMMAND_MEMWRITE);
++// Write_ParameterBlock(disp, data, len);
++ spin_unlock(&megapug_lock);
++}
++EXPORT_SYMBOL(megapug_update_graphics);
++
++#if 0
++
++/* Minipug manipulation code */
++
++typedef unsigned char BYTE;
++typedef unsigned char BOOLEAN;
++#define TRUE 1
++#define FALSE 0
++
++/* width, in characters (8 bits wide) */
++#define DISPLAY_WIDTH 57
++/* height, in lines */
++#define DISPLAY_HEIGHT 80
++/* screen start addresses */
++#define DISPLAY_BPP 4
++#define TEXT_PAGE_START_ADDR 0x0000
++#define GRAPHICS_PAGE_0_START_ADDR (0x1000)
++#define GRAPHICS_PAGE_1_START_ADDR(bpp) (GRAPHICS_PAGE_0_START_ADDR+(DISPLAY_HEIGHT*DISPLAY_ADDRESSES_PER_LINE(bpp)))
++/* CGRAM start address */
++#define CGRAM_START_ADDR(bpp) (GRAPHICS_PAGE_1_START_ADDR(bpp)+(DISPLAY_HEIGHT*DISPLAY_ADDRESSES_PER_LINE(bpp)))
++
++typedef enum {
++ COMMAND_SYSTEM_SET = 0x40, /* system set, takes 8 bytes */
++ COMMAND_POWER_SAVE = 0x53, /* power save, takes 0 bytes */
++ COMMAND_DISP_ON = 0x59, /* display on, takes 1 byte */
++ COMMAND_DISP_OFF = 0x58, /* display off, takes 1 byte */
++ COMMAND_SCROLL = 0x44, /* set start address and size, takes 10 bytes */
++ COMMAND_CSRFORM = 0x5D, /* set cursor type, takes 2 bytes */
++ COMMAND_CSRDIR = 0x4C, /* set cursor direction, takes 0 bytes, but lower two bits are significant*/
++ COMMAND_OVLAY = 0x5B, /* set overlay format, takes 1 byte */
++ COMMAND_CGRAM_ADR = 0x5C, /* set start of character gen ram, takes 2 bytes */
++ COMMAND_HDOT_SCR = 0x5A, /* set horizontal scroll pos, takes 1 byte */
++ COMMAND_CSRW = 0x46, /* set cursor address, takes 2 bytes */
++ COMMAND_CSRR = 0x47, /* read cursor address, takes 2 bytes */
++ COMMAND_GRAYSCALE = 0x60, /* set grayscale depth bpp, takes 1 byte */
++ COMMAND_MEMWRITE = 0x42, /* write to memory */
++ COMMAND_MEMREAD = 0x43 /* read from memory */
++} MiniPug_LCD_Commands_t;
++
++typedef enum {
++ DISPLAY_BLOCK_OFF = 0,
++ DISPLAY_BLOCK_NO_FLASHING = 1,
++ DISPLAY_BLOCK_2HZ_FLASHING = 2,
++ DISPLAY_BLOCK_16HZ_FLASHING = 3
++} Display_Block_State_t;
++
++typedef enum {
++ DISPLAY_MODE_TEXT = 0,
++ DISPLAY_MODE_GRAPHICS = 1
++} Display_Block_Mode_t;
++
++typedef enum {
++ DISPLAY_LAYER_COMPOSITION_OR = 0,
++ DISPLAY_LAYER_COMPOSITION_EXOR = 1,
++ DISPLAY_LAYER_COMPOSIITON_AND = 3
++} Display_Layer_Composition_t;
++
++typedef struct {
++ Display_Block_State_t state;
++ Display_Block_Mode_t mode;
++ unsigned int start;
++ unsigned int size;
++} DisplayBlockState_t;
++
++typedef struct {
++ DisplayBlockState_t blocks[5];
++ Display_Block_State_t cursor;
++ unsigned char three_layers;
++ Display_Layer_Composition_t layer_composition;
++ unsigned int horizontal_address_range; /* Horizontal Size of virtual space from which the block is taken */
++ unsigned int character_bytes_per_row; /* Actual number of horizontal bytes per displayed line */
++ unsigned int total_character_bytes_per_row; /* Character bytes per row plus blanking bytes */
++} DisplayState_t;
++
++#define MAX_DISPLAYS 2
++static DisplayState_t display_state[] = {
++ {
++ {
++ {DISPLAY_BLOCK_NO_FLASHING, DISPLAY_MODE_GRAPHICS, 0, 0}, /* Block 1 */
++ {DISPLAY_BLOCK_OFF, 0, 0, 0}, /* Block 2 no mode only */
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0}, /* Block 3 */
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0} /* Block 4 */
++ },
++ DISPLAY_BLOCK_OFF, /* Cursor */
++ 0, /* three layers or two */
++ DISPLAY_LAYER_COMPOSITION_OR,
++ 0 /* Horizontal address range */
++ }, /* Display 1 */
++ {
++ {
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0}, /* Block 1 */
++ {DISPLAY_BLOCK_OFF, 0, 0, 0}, /* Block 2 no mode only */
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0}, /* Block 3 */
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0} /* Block 4 */
++ },
++ DISPLAY_BLOCK_NO_FLASHING, /* Cursor */
++ 0, /* three layers or two */
++ DISPLAY_LAYER_COMPOSITION_OR,
++ 0 /* Horizontal address range */
++ }
++ }; /* Display 2 */
++
++typedef enum { CURSOR_DIRECTION_RIGHT = 0,
++ CURSOR_DIRECTION_LEFT = 1,
++ CURSOR_DIRECTION_UP = 2,
++ CURSOR_DIRECTION_DOWN = 3
++} Cursor_Direction_t;
++
++typedef struct {
++ unsigned char height;
++ unsigned char width;
++ unsigned char block;
++ Cursor_Direction_t shift_direction;
++} Cursor_State_t;
++
++Cursor_State_t cursor_state = {8, 8, 1, CURSOR_DIRECTION_RIGHT};
++
++typedef struct {
++ unsigned int x_org;
++ unsigned int y_org;
++ unsigned int x_size;
++ unsigned int y_size;
++} Display_Region_t;
++
++/* Display Size Parameters */
++#define HORIZONTAL_CHAR_SIZE 8
++#define VERTICAL_CHAR_SIZE 8
++#define DISPLAY_PIXEL_WIDTH 453
++#define DISPLAY_PIXEL_HEIGHT 80
++#define RAM_SIZE 0x8000
++
++/* Memory Configuration Register */
++#define SCREEN_ORIGIN_COMPENSATION_SET (1 << 5)
++#define DEFAULT_SCREEN_SET_VALUE (1 << 4)
++#define SINGLE_PANEL_DRIVE 0
++#define DUAL_PANEL_DRIVE (1 << 3)
++#define CHAR_HEIGHT_8_BITS 0
++#define CHAR_HEIGHT_16_BITS (1 << 2)
++#define CGROM_SELECT 0
++#define CGRAM_SELECT 1
++
++/* Horizontal Character Size Register */
++#define AC_DRIVE_TWO_FRAMES (1 << 7)
++#define AC_DRIVE_16_LINES 0
++
++/* OVLAY Register bits */
++#define OVERLAY_TWO_LAYERS 0
++#define OVERLAY_THREE_LAYERS (1 << 4)
++#define SCREEN_BLOCK_3_GRAPHICS 0
++
++static unsigned char MinipugReady(int disp)
++{
++#ifdef USE_READY
++ return samosa_read8(CPLD_LCD_RO_SET) & (1 << (disp ? CPLD_LCD_RO_LCD1_nWAIT_BIT : CPLD_LCD_RO_LCD0_nWAIT_BIT));
++#else
++ return 1;
++#endif
++}
++
++static unsigned char minipug_ready(int display)
++{
++ unsigned char ret;
++ ret = (unsigned char) samosa_read8(CPLD_LCD_RO_SET) & (1 << (display ? CPLD_LCD_RO_LCD1_nWAIT_BIT : CPLD_LCD_RO_LCD0_nWAIT_BIT));
++ pr_debug("%s:returns %x\n", __func__, ret);
++ return ret;
++}
++
++/* optimised for speed */
++static inline void Write_ParameterBlock(unsigned int display, unsigned char *data, unsigned int count)
++ { samosa_write_block8((display ? CPLD_LCD1_DATA_SET : CPLD_LCD0_DATA_SET), data, count); }
++static inline void Write_Parameter(unsigned int display, unsigned char parameter)
++ { samosa_write8((display ? CPLD_LCD1_DATA_SET : CPLD_LCD0_DATA_SET), parameter); }
++static inline void Write_Command(unsigned int display, unsigned char command) { samosa_write8((display ? CPLD_LCD1_COMMAND_SET : CPLD_LCD0_COMMAND_SET), command); }
++
++static inline void MinipugSetCursorAddress(unsigned int display, unsigned int addr)
++{
++ Write_Command(display, COMMAND_CSRW);
++ Write_Parameter(display, (BYTE)(addr & 0xff));
++ Write_Parameter(display, (BYTE)((addr >> 8) & 0xff));
++}
++
++static int MinipugInitDisplay(unsigned int display);
++static void MinipugSetAddresses(unsigned int display,
++ unsigned int block1_addr, unsigned int block1_size,
++ unsigned int block2_addr, unsigned int block2_size,
++ unsigned int block3_addr,
++ unsigned int block4_addr);
++static void MinipugSystemSet(unsigned int display);
++static void MinipugPowerSave(unsigned int display);
++static void MinipugDisplayOn(unsigned int display);
++static void MinipugDisplayOff(unsigned int display);
++static void MinipugCursorDir(unsigned int display);
++static void MinipugScroll(unsigned int display);
++static void MinipugSetCursorFormat(unsigned int display);
++static void MinipugOverlay(unsigned int display);
++static void MinipugSetCharGenRamAddress(unsigned int display, unsigned int address);
++static void MinipugSetHorizontalScroll(unsigned int display, unsigned int offset);
++static unsigned short MinipugGetHorizontalScroll(unsigned int display);
++static unsigned short MinipugGetCursorAddress(unsigned int display);
++static void MinipugSetGrayscale(unsigned int display, unsigned int bits_per_pixel);
++static unsigned char MinipugGetGreyScale(unsigned int display);
++static void MinipugWriteMemoryByte(unsigned int display, BYTE value);
++static unsigned char MinipugReadMemoryByte(unsigned int display);
++static void MinipugWriteMemoryBlock(unsigned int display, int count, unsigned char b);
++static unsigned char Read_Parameter(unsigned int display);
++static void MinipugBlockFill(unsigned int display, unsigned int block, BYTE fill_value);
++static void MinipugClose(unsigned int display);
++static void MinipugWriteString(unsigned int display, char *string);
++static void MinipugGraphicTest(unsigned int display, unsigned int block);
++static void MinipugPixelFill(unsigned int display, unsigned int block, Display_Region_t *area, BYTE fill_value);
++static void MinipugSetByte(unsigned int display, unsigned int block, unsigned int x, unsigned int y, BYTE fill);
++static void MinipugTextTest(unsigned int display, unsigned int block);
++
++static BOOLEAN CheckDisplay(unsigned int display)
++{
++ if (display > MAX_DISPLAYS)
++ return FALSE;
++ else
++ return TRUE;
++}
++
++void minipug_update_graphics(unsigned int disp, unsigned char *data, unsigned int len, unsigned int offset)
++{
++ spin_lock(&minipug_lock);
++ MinipugSetCursorAddress(disp, display_state[disp].blocks[2].start + offset);
++ Write_Command(disp, COMMAND_MEMWRITE);
++ Write_ParameterBlock(disp, data, len);
++ spin_unlock(&minipug_lock);
++}
++EXPORT_SYMBOL(minipug_update_graphics);
++
++static void MinipugBlockFill(unsigned int display, unsigned int block, BYTE fill_value)
++{
++ int i, j;
++ unsigned char byte = 0;
++ unsigned char bits_per_pixel = minipug[display].bpp;
++
++ pr_debug("Block fill display %d with 0x%x\n", display, fill_value);
++ switch (bits_per_pixel) {
++ case 1:
++ if ((fill_value & 0x1) == 1)
++ byte = 0xff;
++ else
++ byte = 0;
++ break;
++ case 2:
++ fill_value = fill_value & 0x3;
++ byte = (BYTE)((fill_value << 6) | (fill_value << 4) |
++ (fill_value << 2) | (fill_value & 0xf));
++ break;
++ case 4:
++ byte = (BYTE)(((fill_value & 0xf) << 4) | (fill_value & 0xf));
++ break;
++ break;
++ }
++ MinipugWriteMemoryByte(display, fill_value);
++ for (i = 0; i < display_state[display].blocks[block].size; i++) {
++ for (j = 0; j < display_state[display].horizontal_address_range; j++) {
++ Write_Parameter(display, byte);
++ }
++ }
++}
++
++static void MinipugPixelFill(unsigned int display, unsigned int block, Display_Region_t *area, BYTE fill_value)
++{
++ int i, j;
++
++ for (i = 0; i < area->y_size; i++) {
++ for (j = 0; j < area->x_size; j++) {
++ MinipugSetByte(display, block, area->x_org + j, area->y_org + i, fill_value);
++ }
++ }
++}
++
++static void MinipugSetByte(unsigned int display, unsigned int block, unsigned int x, unsigned int y, BYTE fill)
++{
++ unsigned int byte_address, x_offset = 0;
++ unsigned char bits_per_pixel = minipug[display].bpp;
++ switch (bits_per_pixel) {
++ case 1:
++ x_offset = (x >> 3);
++ break;
++ case 2:
++ x_offset = (x >> 2);
++ break;
++ case 4:
++ x_offset = (x >> 1);
++ break;
++ }
++ byte_address = display_state[display].blocks[block].start
++ + (y * display_state[display].horizontal_address_range)
++ + x_offset;
++ MinipugSetCursorAddress(display, byte_address);
++ MinipugWriteMemoryByte(display, fill);
++}
++
++
++static void MinipugGraphicTest(unsigned int display, unsigned int block)
++{
++ int i;
++ Display_Region_t blob;
++
++#ifdef USE_GRAPHICS_TEST_PIXEL_TEST
++ pr_debug("%s: block start address is 0x%x\n", __func__,
++ display_state[display].blocks[block].start);
++ for (i = 0; i < 10; i++) {
++ MinipugSetByte(display, block, 0, i, 255);
++ MinipugSetByte(display, block, 8, i, 255);
++ }
++#else
++
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start);
++ MinipugWriteMemoryByte(display, 255);
++ for (i = 0; i < display_state[display].character_bytes_per_row-1; i++)
++ Write_Parameter(display, 255);
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start
++ + (display_state[display].horizontal_address_range)
++ * (display_state[display].blocks[block].size - 1));
++ MinipugWriteMemoryByte(display, 255);
++ for (i = 0; i < display_state[display].character_bytes_per_row-1; i++)
++ Write_Parameter(display, 255);
++ blob.x_org = 100;
++ blob.y_org = 30;
++ blob.x_size = 10;
++ blob.y_size = 10;
++ for (i = 0; i < 16; i++) {
++ MinipugPixelFill(display, block, &blob, i<<4 | i);
++ blob.x_org += 12;
++ }
++#endif
++}
++
++static void MinipugTextTest(unsigned int display, unsigned int block)
++{
++ unsigned char message[250];
++ int i;
++
++ for (i = 0; i < 9; i++) {
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start + (display_state[display].horizontal_address_range * i) + 20);
++ sprintf(message, "T C L");
++ MinipugWriteString(display, message);
++ mdelay(200);
++ sprintf(message, " ");
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start + (display_state[display].horizontal_address_range * i) + 20);
++ MinipugWriteString(display, message);
++ }
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start + (display_state[display].horizontal_address_range * 9) + 20);
++ sprintf(message, "T C L");
++ MinipugWriteString(display, message);
++}
++
++static int MinipugInitDisplay(unsigned int display)
++{
++ unsigned int graphic_block_size, text_block_size;
++ unsigned char bits_per_pixel = minipug[display].bpp;
++
++ if (!CheckDisplay(display))
++ return FALSE;
++ display_state[display].character_bytes_per_row = ((DISPLAY_PIXEL_WIDTH * bits_per_pixel)/8);
++ display_state[display].total_character_bytes_per_row = display_state[display].character_bytes_per_row + 2;
++ display_state[display].horizontal_address_range = display_state[display].total_character_bytes_per_row;
++ graphic_block_size = display_state[display].horizontal_address_range * DISPLAY_PIXEL_HEIGHT;
++ text_block_size = display_state[display].horizontal_address_range * 10;
++ pr_debug("Display #%d\n", display);
++ pr_debug("Graphic block size = 0x%x\n", graphic_block_size);
++ pr_debug("Text block size = 0x%x\n", text_block_size);
++ pr_debug("character_bytes_per_row = %d\n",
++ display_state[display].character_bytes_per_row);
++ pr_debug("total_character_bytes_per_row = %d\n",
++ display_state[display].total_character_bytes_per_row);
++ pr_debug("horizontal_address_range = %d\n",
++ display_state[display].horizontal_address_range);
++ display_state[display].blocks[1].start = 0x0000;
++ display_state[display].blocks[1].size = 80; /* 80 when graphics 10 when text? */
++ display_state[display].blocks[1].state = DISPLAY_BLOCK_NO_FLASHING;
++ display_state[display].blocks[1].mode = DISPLAY_MODE_TEXT;
++ display_state[display].blocks[2].start = text_block_size;
++ display_state[display].blocks[2].size = 80; /* 80 because its graphics */
++ display_state[display].blocks[2].state = DISPLAY_BLOCK_NO_FLASHING;
++ display_state[display].blocks[2].mode = 0;
++ display_state[display].blocks[3].start = text_block_size + graphic_block_size;
++ display_state[display].blocks[3].size = 0;
++ display_state[display].blocks[3].state = DISPLAY_BLOCK_OFF;
++ display_state[display].blocks[3].mode = DISPLAY_MODE_TEXT;
++ display_state[display].blocks[4].start = graphic_block_size + text_block_size + text_block_size;
++ display_state[display].blocks[4].size = 0;
++ display_state[display].blocks[4].state = DISPLAY_BLOCK_OFF;
++ display_state[display].blocks[4].mode = 0;
++
++ MinipugSystemSet(display);
++ MinipugScroll(display);
++ MinipugSetHorizontalScroll(display, 0);
++ MinipugOverlay(display);
++ MinipugDisplayOff(display);
++ MinipugSetCursorAddress(display, display_state[display].blocks[2].start);
++ MinipugBlockFill(display, 2, 0);
++ MinipugSetCursorAddress(display, display_state[display].blocks[1].start);
++ MinipugBlockFill(display, 1, 0x20);
++ MinipugDisplayOn(display);
++ MinipugSetGrayscale(display, bits_per_pixel);
++ MinipugSetCursorFormat(display);
++ return TRUE;
++}
++
++static void MinipugSetAddresses(unsigned int display,
++ unsigned int block1_addr, unsigned int block1_size,
++ unsigned int block2_addr, unsigned int block2_size,
++ unsigned int block3_addr,
++ unsigned int block4_addr)
++{
++ pr_debug("Setting block 1 start = 0x%x\n", block1_addr);
++ display_state[display].blocks[1].start = block1_addr;
++ pr_debug("Setting block 1 size = 0x%x\n", block1_size);
++ display_state[display].blocks[1].size = block1_size;
++ pr_debug("Setting block 2 start = 0x%x\n", block2_addr);
++ display_state[display].blocks[2].start = block2_addr;
++ pr_debug("Setting block 2 size = 0x%x\n", block2_size);
++ display_state[display].blocks[2].size = block2_size;
++ pr_debug("Setting block 3 start = 0x%x\n", block3_addr);
++ display_state[display].blocks[3].start = block3_addr;
++ pr_debug("Setting block 4 start = 0x%x\n", block4_addr);
++ display_state[display].blocks[4].start = block4_addr;
++}
++
++static void MinipugSystemSet(unsigned int display)
++{
++ unsigned char byte;
++
++ Write_Command(display, COMMAND_SYSTEM_SET);
++ byte = DEFAULT_SCREEN_SET_VALUE | SCREEN_ORIGIN_COMPENSATION_SET
++ | SINGLE_PANEL_DRIVE | CHAR_HEIGHT_8_BITS | CGROM_SELECT;
++ Write_Parameter(display, byte); /* P1 Memory configuration register (0x00) */
++ pr_debug("Register[0] = 0x%x\n", byte);
++ byte = AC_DRIVE_TWO_FRAMES | ((HORIZONTAL_CHAR_SIZE - 1) & 0x0f);
++ Write_Parameter(display, byte); /* P2 Horizontal Character size register (0x01) */
++ pr_debug("Register[1] = 0x%x\n", byte);
++ byte = (VERTICAL_CHAR_SIZE - 1) & 0xf;
++ Write_Parameter(display, byte); /* P3 Vertical Character Size Register (0x02) */
++ pr_debug("Register[2] = 0x%x\n", byte);
++ byte = (BYTE)((display_state[display].character_bytes_per_row & 0xff) - 1);
++ Write_Parameter(display, byte); /* P4 Character Bytes per Row Register (0x03) */
++ pr_debug("Register[3] = 0x%x\n", byte);
++ byte = (BYTE)(display_state[display].total_character_bytes_per_row & 0xff);
++ Write_Parameter(display, byte); /* Total Character Bytes per Row Register (0x04) */
++ pr_debug("Register[4] = 0x%x\n", byte);
++ byte = (DISPLAY_PIXEL_HEIGHT & 0xff);
++ Write_Parameter(display, byte); /* Frame Height Register (0x05) */
++ pr_debug("Register[5] = 0x%x\n", byte);
++ byte = (BYTE)(display_state[display].horizontal_address_range & 0xff);
++ Write_Parameter(display, byte); /* Horizontal Address Range Register (low) */
++ pr_debug("Register[6] = 0x%x\n", byte);
++ byte = (BYTE)((display_state[display].horizontal_address_range & 0xff00) >> 8);
++ Write_Parameter(display, byte); /* Horizontal Address Range Register (high) */
++ pr_debug("Register[7] = 0x%x\n", byte);
++}
++
++static void MinipugPowerSave(unsigned int display)
++{
++ Write_Command(display, COMMAND_POWER_SAVE);
++}
++
++static void MinipugExitPowerSave(unsigned int display)
++{
++ /* this is copied from the msp430 code minipug handler
++ * it is prefaced by "dunno why this convoluted sequence is
++ * necessary but ..."
++ * it could do with review
++ */
++ MinipugSystemSet(display);
++ while (!MinipugReady(display))
++ ;
++ mdelay(20);
++ MinipugSystemSet(display);
++ while (!MinipugReady(display))
++ ;
++ mdelay(20);
++ /* 2 dummy writes as specified by epson controller code */
++ MinipugDisplayOn(display);
++ MinipugDisplayOn(display);
++ MinipugSetGrayscale(display, minipug[display].bpp);
++}
++
++static void MinipugDisplayOn(unsigned int display)
++{
++ unsigned char byte;
++
++ Write_Command(display, COMMAND_DISP_ON);
++ byte = (display_state[display].blocks[3].state << 6) |
++ (display_state[display].blocks[2].state << 4) |
++ (display_state[display].blocks[1].state << 2) |
++ (display_state[display].cursor);
++ Write_Parameter(display, byte); /* Display Enable Register (0x09) */
++ pr_debug("Display On Register[0x9] = 0x%x\n", byte);
++}
++
++static void MinipugDisplayOff(unsigned int display)
++{
++ unsigned char byte;
++ Write_Command(display, COMMAND_DISP_OFF);
++ byte = (display_state[display].blocks[3].state << 6) |
++ (display_state[display].blocks[2].state << 4) |
++ (display_state[display].blocks[1].state << 2) |
++ (display_state[display].cursor);
++ Write_Parameter(display, byte); /* Display Enable Register (0x09) */
++ pr_debug("Display Off Register[0x9] = 0x%x\n", byte);
++}
++
++static void MinipugCursorDir(unsigned int display)
++{
++ Write_Command(display, (BYTE)(COMMAND_CSRDIR | (cursor_state.shift_direction & 3)));
++}
++
++static void MinipugScroll(unsigned int display)
++{
++ unsigned char byte;
++
++ Write_Command(display, COMMAND_SCROLL);
++ byte = (display_state[display].blocks[1].start & 0xff);
++ Write_Parameter(display, byte); /* Screen Block 1 Start Address Register (0x0b) */
++ pr_debug("Block 1 Start Register[0x0b] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[1].start & 0xff00) >> 8;
++ Write_Parameter(display, byte); /* Screen Block 1 Start Address Register (0x0c) */
++ pr_debug("Block 1 Start Register[0x0c] = 0x%x\n", byte);
++ byte = display_state[display].blocks[1].size & 0xff;
++ Write_Parameter(display, byte); /* Screen Block 1 size Register (0x0d) */
++ pr_debug("Block 1 Size Register[0x0d] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[2].start & 0xff);
++ Write_Parameter(display, byte); /* Screen Block 2 Start Address Register (0x0e) */
++ pr_debug("Block 2 Start Register[0x0e] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[2].start & 0xff00) >> 8;
++ Write_Parameter(display, byte); /* Screen Block 2 Start Address Register (0x0f) */
++ pr_debug("Block 2 Start Register[0x0f] = 0x%x\n", byte);
++ byte = display_state[display].blocks[2].size & 0xff;
++ Write_Parameter(display, byte); /* Screen Block 2 size Register (0x10) */
++ pr_debug("Block 2 Size Register[0x10] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[3].start & 0xff);
++ Write_Parameter(display, byte); /* Screen Block 3 Start Address Register (0x11) */
++ pr_debug("Block 3 Start Register[0x11] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[3].start & 0xff00) >> 8;
++ Write_Parameter(display, byte); /* Screen Block 3 Start Address Register (0x12) */
++ pr_debug("Block 3 Start Register[0x12] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[4].start & 0xff);
++ Write_Parameter(display, byte); /* Screen Block 4 Start Address Register (0x13) */
++ pr_debug("Block 4 Start Register[0x13] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[4].start & 0xff00) >> 8;
++ Write_Parameter(display, byte); /* Screen Block 4 Start Address Register (0x14) */
++ pr_debug("Block 4 Start Register[0x14] = 0x%x\n", byte);
++}
++
++static void MinipugSetCursorFormat(unsigned int display)
++{
++ Write_Command(display, COMMAND_CSRFORM);
++ Write_Parameter(display, (BYTE)(cursor_state.width & 0x0f));
++ pr_debug("Overlay Register[0x15] = 0x%x\n", (BYTE)(cursor_state.width & 0x0f));
++ Write_Parameter(display, (BYTE)(((cursor_state.block & 0x1) << 7) | (cursor_state.height & 0x0f)));
++ pr_debug("Overlay Register[0x16] = 0x%x\n", (BYTE)(((cursor_state.block & 0x1) << 7) | (cursor_state.height & 0x0f)));
++}
++
++static void MinipugOverlay(unsigned int display)
++{
++ unsigned char byte;
++ Write_Command(display, COMMAND_OVLAY);
++ byte = (display_state[display].blocks[3].mode << 3) | (display_state[display].blocks[1].mode << 2) |
++ (display_state[display].three_layers << 4) |
++ (display_state[display].layer_composition << 0);
++ Write_Parameter(display, byte);
++ pr_debug("Overlay Register[0x18] = 0x%x\n", byte);
++}
++
++/* Set the address in RAM of the start of the RAM Character Generator */
++static void MinipugSetCharGenRamAddress(unsigned int display, unsigned int address)
++{
++ /* FIXME check bound of address */
++ Write_Command(display, COMMAND_CGRAM_ADR);
++ Write_Parameter(display, (BYTE)(address & 0xff)); /* Character Generator start address LSB (0x19) */
++ Write_Parameter(display, (BYTE)((address & 0xff00) >> 8)); /* MSB (0x1A) */
++}
++
++static void MinipugSetHorizontalScroll(unsigned int display, unsigned int offset)
++{
++ Write_Command(display, COMMAND_HDOT_SCR);
++ Write_Parameter(display, (BYTE)(offset & 0xff));
++ pr_debug("Horizontal scroll Register[0x1B] = 0x%x\n", offset);
++}
++
++static unsigned short MinipugGetHorizontalScroll(unsigned int display)
++{
++ Write_Command(display, COMMAND_HDOT_SCR);
++ return Read_Parameter(display);
++}
++
++static unsigned short MinipugGetCursorAddress(unsigned int display)
++{
++ unsigned char lsb, msb;
++ Write_Command(display, COMMAND_CSRR);
++ lsb = Read_Parameter(display) & 0xff;
++ msb = (Read_Parameter(display) << 8) & 0xff00;
++ return msb | lsb;
++}
++
++static void MinipugSetGrayscale(unsigned int display, unsigned int bits_per_pixel)
++{
++ unsigned char byte;
++ Write_Command(display, COMMAND_GRAYSCALE);
++ switch (bits_per_pixel) {
++ default:
++ case 1:
++ byte = 0x00; break;
++ case 2:
++ byte = 0x01; break;
++ case 4:
++ byte = 0x02; break;
++ }
++ Write_Parameter(display, byte);
++ pr_debug("Greyscale Register[0x20] = 0x%x\n", byte);
++}
++
++static unsigned char MinipugGetGreyScale(unsigned int display)
++{
++ Write_Command(display, COMMAND_CSRR);
++ return Read_Parameter(display) & 0x03;
++}
++
++static void MinipugWriteString(unsigned int display, char *string)
++{
++ int p;
++
++ p = 0;
++ Write_Command(display, COMMAND_MEMWRITE);
++ while (string[p] != '\0')
++ Write_Parameter(display, string[p++]);
++}
++
++static void MinipugWriteMemoryByte(unsigned int display, BYTE value)
++{
++ Write_Command(display, COMMAND_MEMWRITE);
++ Write_Parameter(display, value);
++}
++
++static unsigned char MinipugReadMemoryByte(unsigned int display)
++{
++ Write_Command(display, COMMAND_MEMREAD);
++ return Read_Parameter(display);
++}
++
++static unsigned char Read_Parameter(unsigned int display)
++{
++ return 0;
++}
++
++#endif
++
++static ssize_t megapug_read(struct file *, char *, size_t, loff_t *);
++static ssize_t megapug_write(struct file *, const char *, size_t, loff_t *);
++static int megapug_open(struct inode *, struct file *);
++static int megapug_release(struct inode *, struct file *);
++static int megapug_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
++static int megapug_mmap(struct file *, struct vm_area_struct *vm);
++
++static struct file_operations megapug_fops = {
++ read: megapug_read,
++ write: megapug_write,
++ open: megapug_open,
++ release: megapug_release,
++ ioctl: megapug_ioctl,
++ mmap: megapug_mmap,
++};
++
++/* proc interface */
++static ssize_t proc_read_megapug(struct file *file, char *buf,
++ size_t nbytes, loff_t *ppos);
++static ssize_t proc_write_megapug(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos);
++
++static struct file_operations proc_megapug_operations = {
++ read: proc_read_megapug,
++ write: proc_write_megapug
++};
++static struct proc_dir_entry *proc_megapug;
++#define PROC_MEGAPUG "megapug"
++
++static void megapug_reset(void)
++{
++/*
++ samosa_write8(CPLD_LCD_CLR, 1 << CPLD_LCD_NRESET_BIT);
++ mdelay(1);
++ samosa_write8(CPLD_LCD_SET, 1 << CPLD_LCD_NRESET_BIT);
++ mdelay(3);
++*/
++}
++
++static void megapug_setup(void)
++{
++/*
++ MinipugInitDisplay(disp);
++ memset(minipug[disp].buffer, 0, RAM_SIZE);
++ minipug_update_graphics(disp, minipug[disp].buffer, RAM_SIZE, 0);
++*/
++}
++
++static int megapug_open(struct inode *inode, struct file *filp)
++{
++ struct megapug_dev *megapug_devp;
++
++ if (samosa_sm_present())
++ return -ENODEV;
++
++ megapug_devp = container_of(inode->i_cdev, struct megapug_dev, cdev);
++ filp->private_data = megapug_devp;
++
++ return 0;
++}
++
++static int megapug_release(struct inode *inode, struct file *filp)
++{
++ return 0;
++}
++
++static ssize_t megapug_read(struct file *filp, char *buf,
++ size_t size, loff_t *offp)
++{
++ struct megapug_dev *mp = (struct megapug_dev *)filp->private_data;
++ if (*offp >= RAM_SIZE-1)
++ return -EINVAL;
++ if (*offp+size > RAM_SIZE)
++ size = RAM_SIZE-*offp;
++ return copy_to_user(buf, &mp->buffer[*offp], size);
++}
++
++static ssize_t megapug_write(struct file *filp, const char *buf,
++ size_t size, loff_t *offp)
++{
++ struct megapug_dev *mp = (struct megapug_dev *)filp->private_data;
++ /* first RAM_SIZE address spaces are the frame buffer */
++ if (*offp < RAM_SIZE) {
++ unsigned long copied;
++ if (*offp+size > RAM_SIZE)
++ size = RAM_SIZE-*offp;
++ copied = copy_from_user(&mp->buffer[*offp], buf, size);
++ megapug_update_graphics(mp->buffer + *offp, size, *offp);
++ return copied;
++ } else if (size == sizeof(unsigned int)) {
++ loff_t command = (*offp)-RAM_SIZE;
++ unsigned int arg;
++ unsigned long copied = copy_from_user(&arg, buf, sizeof(arg));
++ if (command == 0) {
++ if ((arg == 1) || (arg == 2) || (arg == 4)) {
++ mp->bpp = arg;
++ megapug_setup();
++ }
++ }
++ return copied;
++ }
++ /* groups of double ints are display buffer update requests */
++ else if (size == (size / (sizeof(unsigned int)*2))*(sizeof(unsigned int)*2)) {
++ unsigned int offset;
++ unsigned int count;
++ size_t org_size = size;
++ while (size) {
++ unsigned long copied = copy_from_user(&offset, buf, sizeof(offset));
++ buf += sizeof(offset);
++ copied = copy_from_user(&count, buf, sizeof(count));
++ buf += sizeof(count);
++ if (offset >= RAM_SIZE)
++ pr_info("%s: ignoring, offset = 0x%x max = 0x%x\n", __func__, offset, RAM_SIZE-1);
++ else if (offset+count > RAM_SIZE)
++ pr_info("%s: ignoring, offset + count = 0x%x max = 0x%x\n", __func__, offset+count, RAM_SIZE-1);
++ else {
++ pr_debug("%s: updating offset %d count = %d on display\n", __func__, offset, count);
++ megapug_update_graphics(mp->buffer + offset, count, offset);
++ }
++ size -= sizeof(unsigned int)*2;
++ }
++ return org_size;
++ }
++ return -EINVAL;
++}
++
++/* maybe this will be handy in due course */
++static int megapug_ioctl(struct inode *inode, struct file *flip,
++ unsigned int command, unsigned long arg)
++{
++ int err;
++ err = -EINVAL;
++ return err;
++}
++
++static int megapug_mmap(struct file *filp, struct vm_area_struct *vma)
++{
++ struct megapug_dev *mp = (struct megapug_dev *)filp->private_data;
++
++ if (remap_vmalloc_range(vma, mp->buffer, 0)) {
++ pr_err("remap_pfn_range failed\n");
++ return -EAGAIN;
++ }
++ return 0;
++}
++
++static int proc_read_megapug(struct file *filp, char *buf,
++ size_t nbytes, loff_t *ppos)
++{
++ char outputbuf[512];
++ int count = 0;
++
++ /* all done in a single read */
++ if (*ppos > 0)
++ return 0;
++
++ count += sprintf(&outputbuf[count], "Megapug: major dev = %d\n", MAJOR(dev));
++ count += sprintf(&outputbuf[count], "Megapug: ready\n Bits per pixel %d\n", megapug.bpp);
++
++ if (count > nbytes) /* Assume output can be read at one time */
++ return -EINVAL;
++ if (copy_to_user(buf, outputbuf, count))
++ return -EFAULT;
++ *ppos += count;
++ return count;
++}
++
++static ssize_t proc_write_megapug(struct file *filp, const char *buffer,
++ size_t count, loff_t *ppos)
++{
++ /* struct minipug_dev *mp= (struct minipug_dev *)filp->private_data;
++ * if (strncmp(buff,"reset:",6)==0)
++ * newRegValue = simple_strtoul(buffer,&endp,0);
++ * a bold but simple claim is to have read it all
++ */
++ return count;
++}
++
++/* driver initialisation */
++
++static int __init megapug_probe(struct samosa_device *pdev)
++{
++/*
++ if (!minipug_ready(pdev->id)) {
++ dev_info(&pdev->dev, "%s: minipug %d not ready\n", __func__, pdev->id);
++ return -ENODEV;
++ }
++*/
++
++ megapug_setup();
++
++/*
++#ifdef USE_GRAPHICS_TEST
++ MinipugSetCursorAddress(pdev->id, display_state[0].blocks[2].start);
++ MinipugBlockFill(pdev->id, 2, (BYTE)(20 & 0xff));
++ MinipugGraphicTest(pdev->id, 2);
++// MinipugTextTest(pdev->id, 1);
++#endif
++*/
++
++ dev_info(&pdev->dev, "Megapug display support installed\n");
++
++ return 0;
++}
++
++static int __exit megapug_remove(struct samosa_device *dev)
++{
++ samosa_set_drvdata(dev, NULL);
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int megapug_suspend(struct samosa_device *dev, pm_message_t state)
++{
++// MegapugPowerSave();
++ return 0;
++}
++
++static int megapug_resume(struct samosa_device *dev)
++{
++// MegapugExitPowerSave();
++ megapug_update_graphics(megapug.buffer, RAM_SIZE, 0);
++ return 0;
++}
++#else /* CONFIG_PM */
++#define megapug_suspend NULL
++#define megapug_resume NULL
++#endif /* CONFIG_PM */
++
++#define megapug_shutdown NULL
++
++/* driver definition */
++static struct samosa_driver megapug_driver = {
++ .probe = megapug_probe,
++ .shutdown = megapug_shutdown,
++ .remove = __exit_p(megapug_remove),
++ .suspend = megapug_suspend,
++ .resume = megapug_resume,
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = "megapug",
++ },
++};
++
++/* bus device */
++static struct samosa_device *megapug_device;
++
++/* class object */
++static struct class *megapug_class;
++
++static int __init megapug_init(void)
++{
++ int ret;
++
++ /* general initialisation */
++ spin_lock_init(&megapug_lock);
++
++ /* register a range of device nodes */
++ ret = alloc_chrdev_region(&dev, 0, 2, "megapug");
++
++ if (ret)
++ goto error;
++
++ /* create the minipug character devices */
++ megapug.bpp = DISPLAY_BPP;
++ megapug.buffer = (unsigned char *)vmalloc_user(BUFFER_SIZE);
++ if (!megapug.buffer) {
++ pr_err("%s: megapug not enough memory\n", __func__);
++ ret = -ENOMEM;
++ }
++
++ /* initialise character device */
++ cdev_init(&megapug.cdev, &megapug_fops);
++ /* claim ownership */
++ megapug.cdev.owner = THIS_MODULE;
++ /* add character device */
++ ret = cdev_add(&megapug.cdev, dev, 1);
++ if (ret) {
++ if (megapug.buffer)
++ vfree(megapug.buffer);
++ kobject_put(&megapug.cdev.kobj);
++ goto error_region;
++ }
++
++ /* create the class and devices */
++ megapug_class = class_create(THIS_MODULE, "megapug");
++
++ if (!device_create(megapug_class, NULL, dev, NULL, "megapug%d", 0))
++ goto error_class_device;
++ /* register the device on a bus. */
++ megapug_device = samosa_device_register_simple("megapug", 0);
++ if (!megapug_device)
++ goto error_bus;
++
++ /* create proc access to displays */
++ proc_megapug = create_proc_entry(PROC_MEGAPUG, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_megapug)
++ proc_megapug->proc_fops = &proc_megapug_operations;
++
++ /* register the driver */
++ return samosa_driver_register(&megapug_driver);
++
++error_bus:
++ /* remove samosa device */
++ samosa_device_unregister(megapug_device);
++error_class_device:
++ device_destroy(megapug_class, dev);
++error_region:
++ unregister_chrdev_region(dev, 1);
++error:
++ return ret;
++}
++
++static void __exit megapug_exit(void)
++{
++ /* remove proc entry */
++ remove_proc_entry(PROC_MEGAPUG, NULL);
++
++ /* remove class device */
++ device_destroy(megapug_class, dev);
++
++ /* remove samosa device */
++ samosa_device_unregister(megapug_device);
++
++ /* remove character device */
++ cdev_del(&megapug.cdev);
++
++ /* free buffer */
++ vfree(megapug.buffer);
++
++ /* remove driver */
++ samosa_driver_unregister(&megapug_driver);
++
++ /* unregister region */
++ unregister_chrdev_region(dev, 1);
++
++ /* remove class */
++ class_destroy(megapug_class);
++}
++
++module_init(megapug_init);
++module_exit(megapug_exit);
++
++MODULE_AUTHOR("Nick Bane <nick@cecomputing.co.uk>");
++MODULE_DESCRIPTION("Megapug display interface via samosa bus on Balloon");
++MODULE_LICENSE("GPL");
+Index: linux-2.6.31/include/video/megapug.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.31/include/video/megapug.h 2010-01-04 21:07:18.000000000 +0000
+@@ -0,0 +1,2 @@
++/* graphics display interface utility for Toby Churchill Megapug device */
++void megapug_update_graphics(unsigned char *data, unsigned int len, unsigned int offset);
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-minipug.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-minipug.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-minipug.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,1163 @@
+Toby Churchill Lightwriter Minipug display driver
+
+Minipug is actually epson S1D137000A1 driver over Samosa
+
+from: Nick Bane <nick@cecomputing.co.uk>
+
+Signed-off-by: Wookey <wookey@wookware.org>
+
+Index: linux-2.6.31/drivers/char/Kconfig
+===================================================================
+--- linux-2.6.31.orig/drivers/char/Kconfig 2010-01-04 22:35:54.000000000 +0000
++++ linux-2.6.31/drivers/char/Kconfig 2010-01-06 14:16:46.000000000 +0000
+@@ -679,6 +679,19 @@
+ help
+ Virtio console for use with lguest and other hypervisors.
+
++config MINIPUG
++ tristate "Minipug LCD display"
++ depends on SAMOSA
++ default y
++ help
++ 456*80 LCD display driven down Samosa bus (for Balloonboard).
++
++config MINIPUG_ANIMATE
++ tristate "Animated Minipug displays till opened"
++ depends on MINIPUG
++ default y
++ help
++ Minipug will display an animated sequence till opened
+
+ config HVCS
+ tristate "IBM Hypervisor Virtual Console Server support"
+Index: linux-2.6.31/drivers/char/Makefile
+===================================================================
+--- linux-2.6.31.orig/drivers/char/Makefile 2010-01-04 22:35:54.000000000 +0000
++++ linux-2.6.31/drivers/char/Makefile 2010-01-06 14:16:45.000000000 +0000
+@@ -112,6 +112,7 @@
+ js-rtc-y = rtc.o
+
+ obj-$(CONFIG_SAMOSA) += samosa.o
++obj-$(CONFIG_MINIPUG) += minipug.o
+
+ # Files generated that shall be removed upon make clean
+ clean-files := consolemap_deftbl.c defkeymap.c
+Index: linux-2.6.31/drivers/char/minipug.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.31/drivers/char/minipug.c 2010-01-06 14:22:19.000000000 +0000
+@@ -0,0 +1,1107 @@
++/*
++ * linux/drivers/char/minipug.c
++ *
++ * file interface for minipug displays on the balloon samosa bus
++ * Copyright (c) N C Bane 2005 2006 for Toby Churchill Ltd
++ *
++*/
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <linux/uaccess.h>
++
++#if defined(CONFIG_MACH_BALLOON2)
++#include <mach/balloon2.h>
++#endif
++#if defined(CONFIG_MACH_BALLOON3)
++#include <mach/balloon3.h>
++#endif
++#include <asm/cacheflush.h>
++
++#include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/proc_fs.h>
++#include <linux/vmalloc.h>
++#include <linux/platform_device.h>
++#include <linux/spinlock.h>
++#include "linux/cdev.h"
++#include "linux/timer.h"
++#include <linux/samosa.h>
++
++#define MINIPUG_DISPLAYS 2
++/* uncomment USE_PLATFORM_BUS to use the platform rather than the samosa bus */
++#define USE_GRAPHICS_TEST
++/* #define USE_GRAPHICS_TEST_PIXEL_TEST */
++
++#ifdef CONFIG_MINIPUG_ANIMATE
++static int animate = 1;
++#define CONFIG_MINIPUG_ANIMATE_RATE 8
++#endif
++
++/* character device start number */
++static dev_t dev;
++
++static spinlock_t minipug_lock;
++
++/* minipug per device data */
++static struct minipug_dev {
++ unsigned int display;
++ struct cdev cdev;
++ unsigned char *buffer;
++ unsigned int bpp;
++#ifdef CONFIG_MINIPUG_ANIMATE
++ struct timer_list minipug_timer;
++ int animate_block;
++ unsigned int animate_index;
++#endif
++} minipug[MINIPUG_DISPLAYS];
++
++/* total minipug on board ram */
++#define BUFFER_SIZE (32*1024)
++
++/* Minipug manipulation code */
++
++typedef unsigned char BYTE;
++typedef unsigned char BOOLEAN;
++#define TRUE 1
++#define FALSE 0
++
++/* width, in characters (8 bits wide) */
++#define DISPLAY_WIDTH 57
++/* height, in lines */
++#define DISPLAY_HEIGHT 80
++/* screen start addresses */
++#define DISPLAY_BPP 4
++#define TEXT_PAGE_START_ADDR 0x0000
++#define GRAPHICS_PAGE_0_START_ADDR (0x1000)
++#define GRAPHICS_PAGE_1_START_ADDR(bpp) (GRAPHICS_PAGE_0_START_ADDR+(DISPLAY_HEIGHT*DISPLAY_ADDRESSES_PER_LINE(bpp)))
++/* CGRAM start address */
++#define CGRAM_START_ADDR(bpp) (GRAPHICS_PAGE_1_START_ADDR(bpp)+(DISPLAY_HEIGHT*DISPLAY_ADDRESSES_PER_LINE(bpp)))
++
++typedef enum {
++ COMMAND_SYSTEM_SET = 0x40, /* system set, takes 8 bytes */
++ COMMAND_POWER_SAVE = 0x53, /* power save, takes 0 bytes */
++ COMMAND_DISP_ON = 0x59, /* display on, takes 1 byte */
++ COMMAND_DISP_OFF = 0x58, /* display off, takes 1 byte */
++ COMMAND_SCROLL = 0x44, /* set start address and size, takes 10 bytes */
++ COMMAND_CSRFORM = 0x5D, /* set cursor type, takes 2 bytes */
++ COMMAND_CSRDIR = 0x4C, /* set cursor direction, takes 0 bytes, but lower two bits are significant*/
++ COMMAND_OVLAY = 0x5B, /* set overlay format, takes 1 byte */
++ COMMAND_CGRAM_ADR = 0x5C, /* set start of character gen ram, takes 2 bytes */
++ COMMAND_HDOT_SCR = 0x5A, /* set horizontal scroll pos, takes 1 byte */
++ COMMAND_CSRW = 0x46, /* set cursor address, takes 2 bytes */
++ COMMAND_CSRR = 0x47, /* read cursor address, takes 2 bytes */
++ COMMAND_GRAYSCALE = 0x60, /* set grayscale depth bpp, takes 1 byte */
++ COMMAND_MEMWRITE = 0x42, /* write to memory */
++ COMMAND_MEMREAD = 0x43 /* read from memory */
++} MiniPug_LCD_Commands_t;
++
++typedef enum {
++ DISPLAY_BLOCK_OFF = 0,
++ DISPLAY_BLOCK_NO_FLASHING = 1,
++ DISPLAY_BLOCK_2HZ_FLASHING = 2,
++ DISPLAY_BLOCK_16HZ_FLASHING = 3
++} Display_Block_State_t;
++
++typedef enum {
++ DISPLAY_MODE_TEXT = 0,
++ DISPLAY_MODE_GRAPHICS = 1
++} Display_Block_Mode_t;
++
++typedef enum {
++ DISPLAY_LAYER_COMPOSITION_OR = 0,
++ DISPLAY_LAYER_COMPOSITION_EXOR = 1,
++ DISPLAY_LAYER_COMPOSIITON_AND = 3
++} Display_Layer_Composition_t;
++
++typedef struct {
++ Display_Block_State_t state;
++ Display_Block_Mode_t mode;
++ unsigned int start;
++ unsigned int size;
++} DisplayBlockState_t;
++
++typedef struct {
++ DisplayBlockState_t blocks[5];
++ Display_Block_State_t cursor;
++ unsigned char three_layers;
++ Display_Layer_Composition_t layer_composition;
++ unsigned int horizontal_address_range; /* Horizontal Size of virtual space from which the block is taken */
++ unsigned int character_bytes_per_row; /* Actual number of horizontal bytes per displayed line */
++ unsigned int total_character_bytes_per_row; /* Character bytes per row plus blanking bytes */
++} DisplayState_t;
++
++#define MAX_DISPLAYS 2
++static DisplayState_t display_state[] = {
++ {
++ {
++ {DISPLAY_BLOCK_NO_FLASHING, DISPLAY_MODE_GRAPHICS, 0, 0}, /* Block 1 */
++ {DISPLAY_BLOCK_OFF, 0, 0, 0}, /* Block 2 no mode only */
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0}, /* Block 3 */
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0} /* Block 4 */
++ },
++ DISPLAY_BLOCK_OFF, /* Cursor */
++ 0, /* three layers or two */
++ DISPLAY_LAYER_COMPOSITION_OR,
++ 0 /* Horizontal address range */
++ }, /* Display 1 */
++ {
++ {
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0}, /* Block 1 */
++ {DISPLAY_BLOCK_OFF, 0, 0, 0}, /* Block 2 no mode only */
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0}, /* Block 3 */
++ {DISPLAY_BLOCK_OFF, DISPLAY_MODE_GRAPHICS, 0, 0} /* Block 4 */
++ },
++ DISPLAY_BLOCK_NO_FLASHING, /* Cursor */
++ 0, /* three layers or two */
++ DISPLAY_LAYER_COMPOSITION_OR,
++ 0 /* Horizontal address range */
++ }
++ }; /* Display 2 */
++
++typedef enum { CURSOR_DIRECTION_RIGHT = 0,
++ CURSOR_DIRECTION_LEFT = 1,
++ CURSOR_DIRECTION_UP = 2,
++ CURSOR_DIRECTION_DOWN = 3
++} Cursor_Direction_t;
++
++typedef struct {
++ unsigned char height;
++ unsigned char width;
++ unsigned char block;
++ Cursor_Direction_t shift_direction;
++} Cursor_State_t;
++
++Cursor_State_t cursor_state = {8, 8, 1, CURSOR_DIRECTION_RIGHT};
++
++typedef struct {
++ unsigned int x_org;
++ unsigned int y_org;
++ unsigned int x_size;
++ unsigned int y_size;
++} Display_Region_t;
++
++/* Display Size Parameters */
++#define HORIZONTAL_CHAR_SIZE 8
++#define VERTICAL_CHAR_SIZE 8
++#define DISPLAY_PIXEL_WIDTH 453
++#define DISPLAY_PIXEL_HEIGHT 80
++#define RAM_SIZE 0x8000
++
++/* Memory Configuration Register */
++#define SCREEN_ORIGIN_COMPENSATION_SET (1 << 5)
++#define DEFAULT_SCREEN_SET_VALUE (1 << 4)
++#define SINGLE_PANEL_DRIVE 0
++#define DUAL_PANEL_DRIVE (1 << 3)
++#define CHAR_HEIGHT_8_BITS 0
++#define CHAR_HEIGHT_16_BITS (1 << 2)
++#define CGROM_SELECT 0
++#define CGRAM_SELECT 1
++
++/* Horizontal Character Size Register */
++#define AC_DRIVE_TWO_FRAMES (1 << 7)
++#define AC_DRIVE_16_LINES 0
++
++/* OVLAY Register bits */
++#define OVERLAY_TWO_LAYERS 0
++#define OVERLAY_THREE_LAYERS (1 << 4)
++#define SCREEN_BLOCK_3_GRAPHICS 0
++
++static unsigned char MinipugReady(int disp)
++{
++#ifdef USE_READY
++ return samosa_read8(CPLD_LCD_RO_SET) & (1 << (disp ? CPLD_LCD_RO_LCD1_nWAIT_BIT : CPLD_LCD_RO_LCD0_nWAIT_BIT));
++#else
++ return 1;
++#endif
++}
++
++static unsigned char minipug_ready(int display)
++{
++ unsigned char ret;
++ ret = (unsigned char) samosa_read8(CPLD_LCD_RO_SET) & (1 << (display ? CPLD_LCD_RO_LCD1_nWAIT_BIT : CPLD_LCD_RO_LCD0_nWAIT_BIT));
++ pr_debug("%s:returns %x\n", __func__, ret);
++ return ret;
++}
++
++/* optimised for speed */
++static inline void Write_ParameterBlock(unsigned int display, unsigned char *data, unsigned int count)
++ { samosa_write_block8((display ? CPLD_LCD1_DATA_SET : CPLD_LCD0_DATA_SET), data, count); }
++static inline void Write_Parameter(unsigned int display, unsigned char parameter)
++ { samosa_write8((display ? CPLD_LCD1_DATA_SET : CPLD_LCD0_DATA_SET), parameter); }
++static inline void Write_Command(unsigned int display, unsigned char command) { samosa_write8((display ? CPLD_LCD1_COMMAND_SET : CPLD_LCD0_COMMAND_SET), command); }
++
++static inline void MinipugSetCursorAddress(unsigned int display, unsigned int addr)
++{
++ Write_Command(display, COMMAND_CSRW);
++ Write_Parameter(display, (BYTE)(addr & 0xff));
++ Write_Parameter(display, (BYTE)((addr >> 8) & 0xff));
++}
++
++static int MinipugInitDisplay(unsigned int display);
++static void MinipugSetAddresses(unsigned int display,
++ unsigned int block1_addr, unsigned int block1_size,
++ unsigned int block2_addr, unsigned int block2_size,
++ unsigned int block3_addr,
++ unsigned int block4_addr);
++static void MinipugSystemSet(unsigned int display);
++static void MinipugPowerSave(unsigned int display);
++static void MinipugDisplayOn(unsigned int display);
++static void MinipugDisplayOff(unsigned int display);
++static void MinipugCursorDir(unsigned int display);
++static void MinipugScroll(unsigned int display);
++static void MinipugSetCursorFormat(unsigned int display);
++static void MinipugOverlay(unsigned int display);
++static void MinipugSetCharGenRamAddress(unsigned int display, unsigned int address);
++static void MinipugSetHorizontalScroll(unsigned int display, unsigned int offset);
++static unsigned short MinipugGetHorizontalScroll(unsigned int display);
++static unsigned short MinipugGetCursorAddress(unsigned int display);
++static void MinipugSetGrayscale(unsigned int display, unsigned int bits_per_pixel);
++static unsigned char MinipugGetGreyScale(unsigned int display);
++static void MinipugWriteMemoryByte(unsigned int display, BYTE value);
++static unsigned char MinipugReadMemoryByte(unsigned int display);
++static void MinipugWriteMemoryBlock(unsigned int display, int count, unsigned char b);
++static unsigned char Read_Parameter(unsigned int display);
++static void MinipugBlockFill(unsigned int display, unsigned int block, BYTE fill_value);
++static void MinipugClose(unsigned int display);
++static void MinipugWriteString(unsigned int display, char *string);
++static void MinipugGraphicTest(unsigned int display, unsigned int block);
++static void MinipugPixelFill(unsigned int display, unsigned int block, Display_Region_t *area, BYTE fill_value);
++static void MinipugSetByte(unsigned int display, unsigned int block, unsigned int x, unsigned int y, BYTE fill);
++static void MinipugTextTest(unsigned int display, unsigned int block);
++
++static BOOLEAN CheckDisplay(unsigned int display)
++{
++ if (display > MAX_DISPLAYS)
++ return FALSE;
++ else
++ return TRUE;
++}
++
++void minipug_update_graphics(unsigned int disp, unsigned char *data, unsigned int len, unsigned int offset)
++{
++ spin_lock(&minipug_lock);
++ MinipugSetCursorAddress(disp, display_state[disp].blocks[2].start + offset);
++ Write_Command(disp, COMMAND_MEMWRITE);
++ Write_ParameterBlock(disp, data, len);
++ spin_unlock(&minipug_lock);
++}
++EXPORT_SYMBOL(minipug_update_graphics);
++
++static void MinipugBlockFill(unsigned int display, unsigned int block, BYTE fill_value)
++{
++ int i, j;
++ unsigned char byte = 0;
++ unsigned char bits_per_pixel = minipug[display].bpp;
++
++ pr_debug("Block fill display %d with 0x%x\n", display, fill_value);
++ switch (bits_per_pixel) {
++ case 1:
++ if ((fill_value & 0x1) == 1)
++ byte = 0xff;
++ else
++ byte = 0;
++ break;
++ case 2:
++ fill_value = fill_value & 0x3;
++ byte = (BYTE)((fill_value << 6) | (fill_value << 4) |
++ (fill_value << 2) | (fill_value & 0xf));
++ break;
++ case 4:
++ byte = (BYTE)(((fill_value & 0xf) << 4) | (fill_value & 0xf));
++ break;
++ break;
++ }
++ MinipugWriteMemoryByte(display, fill_value);
++ for (i = 0; i < display_state[display].blocks[block].size; i++) {
++ for (j = 0; j < display_state[display].horizontal_address_range; j++) {
++ Write_Parameter(display, byte);
++ }
++ }
++}
++
++static void MinipugPixelFill(unsigned int display, unsigned int block, Display_Region_t *area, BYTE fill_value)
++{
++ int i, j;
++
++ for (i = 0; i < area->y_size; i++) {
++ for (j = 0; j < area->x_size; j++) {
++ MinipugSetByte(display, block, area->x_org + j, area->y_org + i, fill_value);
++ }
++ }
++}
++
++static void MinipugSetByte(unsigned int display, unsigned int block, unsigned int x, unsigned int y, BYTE fill)
++{
++ unsigned int byte_address, x_offset = 0;
++ unsigned char bits_per_pixel = minipug[display].bpp;
++ switch (bits_per_pixel) {
++ case 1:
++ x_offset = (x >> 3);
++ break;
++ case 2:
++ x_offset = (x >> 2);
++ break;
++ case 4:
++ x_offset = (x >> 1);
++ break;
++ }
++ byte_address = display_state[display].blocks[block].start
++ + (y * display_state[display].horizontal_address_range)
++ + x_offset;
++ MinipugSetCursorAddress(display, byte_address);
++ MinipugWriteMemoryByte(display, fill);
++}
++
++#ifdef CONFIG_MINIPUG_ANIMATE
++static void MinipugGraphicAnimate(unsigned long display) {
++ if (animate) {
++ unsigned int i;
++ int block = minipug[display].animate_block;
++ struct timer_list *t = &minipug[display].minipug_timer;
++ Display_Region_t blob;
++ blob.x_org = 100;
++ blob.y_org = 30;
++ blob.x_size = 10;
++ blob.y_size = 10;
++ for (i = 0; i < 16; i++) {
++ MinipugPixelFill(display, block, &blob, i<<4 | i);
++ blob.x_org = 100 + ((i + minipug[display].animate_index) % 16) * 12 ;
++ }
++ minipug[display].animate_index++;
++ init_timer(t);
++ t->expires = jiffies + HZ/CONFIG_MINIPUG_ANIMATE_RATE;
++ t->data = display;
++ t->function = MinipugGraphicAnimate;
++ add_timer(t);
++ }
++}
++#endif
++
++static void MinipugGraphicTest(unsigned int display, unsigned int block)
++{
++ int i;
++ Display_Region_t blob;
++
++#ifdef USE_GRAPHICS_TEST_PIXEL_TEST
++ pr_debug("%s: block start address is 0x%x\n", __func__,
++ display_state[display].blocks[block].start);
++ for (i = 0; i < 10; i++) {
++ MinipugSetByte(display, block, 0, i, 255);
++ MinipugSetByte(display, block, 8, i, 255);
++ }
++#else
++
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start);
++ MinipugWriteMemoryByte(display, 255);
++ for (i = 0; i < display_state[display].character_bytes_per_row-1; i++)
++ Write_Parameter(display, 255);
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start
++ + (display_state[display].horizontal_address_range)
++ * (display_state[display].blocks[block].size - 1));
++ MinipugWriteMemoryByte(display, 255);
++ for (i = 0; i < display_state[display].character_bytes_per_row-1; i++)
++ Write_Parameter(display, 255);
++ blob.x_org = 100;
++ blob.y_org = 30;
++ blob.x_size = 10;
++ blob.y_size = 10;
++ for (i = 0; i < 16; i++) {
++ MinipugPixelFill(display, block, &blob, i<<4 | i);
++ blob.x_org += 12;
++ }
++#ifdef CONFIG_MINIPUG_ANIMATE
++ minipug[display].animate_block = block;
++ MinipugGraphicAnimate(display);
++#endif
++#endif
++}
++
++static void MinipugTextTest(unsigned int display, unsigned int block)
++{
++ unsigned char message[250];
++ int i;
++
++ for (i = 0; i < 9; i++) {
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start + (display_state[display].horizontal_address_range * i) + 20);
++ sprintf(message, "T C L");
++ MinipugWriteString(display, message);
++ mdelay(200);
++ sprintf(message, " ");
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start + (display_state[display].horizontal_address_range * i) + 20);
++ MinipugWriteString(display, message);
++ }
++ MinipugSetCursorAddress(display, display_state[display].blocks[block].start + (display_state[display].horizontal_address_range * 9) + 20);
++ sprintf(message, "T C L");
++ MinipugWriteString(display, message);
++}
++
++static int MinipugInitDisplay(unsigned int display)
++{
++ unsigned int graphic_block_size, text_block_size;
++ unsigned char bits_per_pixel = minipug[display].bpp;
++
++ if (!CheckDisplay(display))
++ return FALSE;
++ display_state[display].character_bytes_per_row = ((DISPLAY_PIXEL_WIDTH * bits_per_pixel)/8);
++ display_state[display].total_character_bytes_per_row = display_state[display].character_bytes_per_row + 2;
++ display_state[display].horizontal_address_range = display_state[display].total_character_bytes_per_row;
++ graphic_block_size = display_state[display].horizontal_address_range * DISPLAY_PIXEL_HEIGHT;
++ text_block_size = display_state[display].horizontal_address_range * 10;
++ pr_debug("Display #%d\n", display);
++ pr_debug("Graphic block size = 0x%x\n", graphic_block_size);
++ pr_debug("Text block size = 0x%x\n", text_block_size);
++ pr_debug("character_bytes_per_row = %d\n",
++ display_state[display].character_bytes_per_row);
++ pr_debug("total_character_bytes_per_row = %d\n",
++ display_state[display].total_character_bytes_per_row);
++ pr_debug("horizontal_address_range = %d\n",
++ display_state[display].horizontal_address_range);
++ display_state[display].blocks[1].start = 0x0000;
++ display_state[display].blocks[1].size = 80; /* 80 when graphics 10 when text? */
++ display_state[display].blocks[1].state = DISPLAY_BLOCK_NO_FLASHING;
++ display_state[display].blocks[1].mode = DISPLAY_MODE_TEXT;
++ display_state[display].blocks[2].start = text_block_size;
++ display_state[display].blocks[2].size = 80; /* 80 because its graphics */
++ display_state[display].blocks[2].state = DISPLAY_BLOCK_NO_FLASHING;
++ display_state[display].blocks[2].mode = 0;
++ display_state[display].blocks[3].start = text_block_size + graphic_block_size;
++ display_state[display].blocks[3].size = 0;
++ display_state[display].blocks[3].state = DISPLAY_BLOCK_OFF;
++ display_state[display].blocks[3].mode = DISPLAY_MODE_TEXT;
++ display_state[display].blocks[4].start = graphic_block_size + text_block_size + text_block_size;
++ display_state[display].blocks[4].size = 0;
++ display_state[display].blocks[4].state = DISPLAY_BLOCK_OFF;
++ display_state[display].blocks[4].mode = 0;
++
++ MinipugSystemSet(display);
++ MinipugScroll(display);
++ MinipugSetHorizontalScroll(display, 0);
++ MinipugOverlay(display);
++ MinipugDisplayOff(display);
++ MinipugSetCursorAddress(display, display_state[display].blocks[2].start);
++ MinipugBlockFill(display, 2, 0);
++ MinipugSetCursorAddress(display, display_state[display].blocks[1].start);
++ MinipugBlockFill(display, 1, 0x20);
++ MinipugDisplayOn(display);
++ MinipugSetGrayscale(display, bits_per_pixel);
++ MinipugSetCursorFormat(display);
++ return TRUE;
++}
++
++static void MinipugSetAddresses(unsigned int display,
++ unsigned int block1_addr, unsigned int block1_size,
++ unsigned int block2_addr, unsigned int block2_size,
++ unsigned int block3_addr,
++ unsigned int block4_addr)
++{
++ pr_debug("Setting block 1 start = 0x%x\n", block1_addr);
++ display_state[display].blocks[1].start = block1_addr;
++ pr_debug("Setting block 1 size = 0x%x\n", block1_size);
++ display_state[display].blocks[1].size = block1_size;
++ pr_debug("Setting block 2 start = 0x%x\n", block2_addr);
++ display_state[display].blocks[2].start = block2_addr;
++ pr_debug("Setting block 2 size = 0x%x\n", block2_size);
++ display_state[display].blocks[2].size = block2_size;
++ pr_debug("Setting block 3 start = 0x%x\n", block3_addr);
++ display_state[display].blocks[3].start = block3_addr;
++ pr_debug("Setting block 4 start = 0x%x\n", block4_addr);
++ display_state[display].blocks[4].start = block4_addr;
++}
++
++static void MinipugSystemSet(unsigned int display)
++{
++ unsigned char byte;
++
++ Write_Command(display, COMMAND_SYSTEM_SET);
++ byte = DEFAULT_SCREEN_SET_VALUE | SCREEN_ORIGIN_COMPENSATION_SET
++ | SINGLE_PANEL_DRIVE | CHAR_HEIGHT_8_BITS | CGROM_SELECT;
++ Write_Parameter(display, byte); /* P1 Memory configuration register (0x00) */
++ pr_debug("Register[0] = 0x%x\n", byte);
++ byte = AC_DRIVE_TWO_FRAMES | ((HORIZONTAL_CHAR_SIZE - 1) & 0x0f);
++ Write_Parameter(display, byte); /* P2 Horizontal Character size register (0x01) */
++ pr_debug("Register[1] = 0x%x\n", byte);
++ byte = (VERTICAL_CHAR_SIZE - 1) & 0xf;
++ Write_Parameter(display, byte); /* P3 Vertical Character Size Register (0x02) */
++ pr_debug("Register[2] = 0x%x\n", byte);
++ byte = (BYTE)((display_state[display].character_bytes_per_row & 0xff) - 1);
++ Write_Parameter(display, byte); /* P4 Character Bytes per Row Register (0x03) */
++ pr_debug("Register[3] = 0x%x\n", byte);
++ byte = (BYTE)(display_state[display].total_character_bytes_per_row & 0xff);
++ Write_Parameter(display, byte); /* Total Character Bytes per Row Register (0x04) */
++ pr_debug("Register[4] = 0x%x\n", byte);
++ byte = (DISPLAY_PIXEL_HEIGHT & 0xff);
++ Write_Parameter(display, byte); /* Frame Height Register (0x05) */
++ pr_debug("Register[5] = 0x%x\n", byte);
++ byte = (BYTE)(display_state[display].horizontal_address_range & 0xff);
++ Write_Parameter(display, byte); /* Horizontal Address Range Register (low) */
++ pr_debug("Register[6] = 0x%x\n", byte);
++ byte = (BYTE)((display_state[display].horizontal_address_range & 0xff00) >> 8);
++ Write_Parameter(display, byte); /* Horizontal Address Range Register (high) */
++ pr_debug("Register[7] = 0x%x\n", byte);
++}
++
++static void MinipugPowerSave(unsigned int display)
++{
++ Write_Command(display, COMMAND_POWER_SAVE);
++}
++
++static void MinipugExitPowerSave(unsigned int display)
++{
++ /* this is copied from the msp430 code minipug handler
++ * it is prefaced by "dunno why this convoluted sequence is
++ * necessary but ..."
++ * it could do with review
++ */
++ MinipugSystemSet(display);
++ while (!MinipugReady(display))
++ ;
++ mdelay(20);
++ MinipugSystemSet(display);
++ while (!MinipugReady(display))
++ ;
++ mdelay(20);
++ /* 2 dummy writes as specified by epson controller code */
++ MinipugDisplayOn(display);
++ MinipugDisplayOn(display);
++ MinipugSetGrayscale(display, minipug[display].bpp);
++}
++
++static void MinipugDisplayOn(unsigned int display)
++{
++ unsigned char byte;
++
++ Write_Command(display, COMMAND_DISP_ON);
++ byte = (display_state[display].blocks[3].state << 6) |
++ (display_state[display].blocks[2].state << 4) |
++ (display_state[display].blocks[1].state << 2) |
++ (display_state[display].cursor);
++ Write_Parameter(display, byte); /* Display Enable Register (0x09) */
++ pr_debug("Display On Register[0x9] = 0x%x\n", byte);
++}
++
++static void MinipugDisplayOff(unsigned int display)
++{
++ unsigned char byte;
++ Write_Command(display, COMMAND_DISP_OFF);
++ byte = (display_state[display].blocks[3].state << 6) |
++ (display_state[display].blocks[2].state << 4) |
++ (display_state[display].blocks[1].state << 2) |
++ (display_state[display].cursor);
++ Write_Parameter(display, byte); /* Display Enable Register (0x09) */
++ pr_debug("Display Off Register[0x9] = 0x%x\n", byte);
++}
++
++static void MinipugCursorDir(unsigned int display)
++{
++ Write_Command(display, (BYTE)(COMMAND_CSRDIR | (cursor_state.shift_direction & 3)));
++}
++
++static void MinipugScroll(unsigned int display)
++{
++ unsigned char byte;
++
++ Write_Command(display, COMMAND_SCROLL);
++ byte = (display_state[display].blocks[1].start & 0xff);
++ Write_Parameter(display, byte); /* Screen Block 1 Start Address Register (0x0b) */
++ pr_debug("Block 1 Start Register[0x0b] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[1].start & 0xff00) >> 8;
++ Write_Parameter(display, byte); /* Screen Block 1 Start Address Register (0x0c) */
++ pr_debug("Block 1 Start Register[0x0c] = 0x%x\n", byte);
++ byte = display_state[display].blocks[1].size & 0xff;
++ Write_Parameter(display, byte); /* Screen Block 1 size Register (0x0d) */
++ pr_debug("Block 1 Size Register[0x0d] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[2].start & 0xff);
++ Write_Parameter(display, byte); /* Screen Block 2 Start Address Register (0x0e) */
++ pr_debug("Block 2 Start Register[0x0e] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[2].start & 0xff00) >> 8;
++ Write_Parameter(display, byte); /* Screen Block 2 Start Address Register (0x0f) */
++ pr_debug("Block 2 Start Register[0x0f] = 0x%x\n", byte);
++ byte = display_state[display].blocks[2].size & 0xff;
++ Write_Parameter(display, byte); /* Screen Block 2 size Register (0x10) */
++ pr_debug("Block 2 Size Register[0x10] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[3].start & 0xff);
++ Write_Parameter(display, byte); /* Screen Block 3 Start Address Register (0x11) */
++ pr_debug("Block 3 Start Register[0x11] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[3].start & 0xff00) >> 8;
++ Write_Parameter(display, byte); /* Screen Block 3 Start Address Register (0x12) */
++ pr_debug("Block 3 Start Register[0x12] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[4].start & 0xff);
++ Write_Parameter(display, byte); /* Screen Block 4 Start Address Register (0x13) */
++ pr_debug("Block 4 Start Register[0x13] = 0x%x\n", byte);
++ byte = (display_state[display].blocks[4].start & 0xff00) >> 8;
++ Write_Parameter(display, byte); /* Screen Block 4 Start Address Register (0x14) */
++ pr_debug("Block 4 Start Register[0x14] = 0x%x\n", byte);
++}
++
++static void MinipugSetCursorFormat(unsigned int display)
++{
++ Write_Command(display, COMMAND_CSRFORM);
++ Write_Parameter(display, (BYTE)(cursor_state.width & 0x0f));
++ pr_debug("Overlay Register[0x15] = 0x%x\n", (BYTE)(cursor_state.width & 0x0f));
++ Write_Parameter(display, (BYTE)(((cursor_state.block & 0x1) << 7) | (cursor_state.height & 0x0f)));
++ pr_debug("Overlay Register[0x16] = 0x%x\n", (BYTE)(((cursor_state.block & 0x1) << 7) | (cursor_state.height & 0x0f)));
++}
++
++static void MinipugOverlay(unsigned int display)
++{
++ unsigned char byte;
++ Write_Command(display, COMMAND_OVLAY);
++ byte = (display_state[display].blocks[3].mode << 3) | (display_state[display].blocks[1].mode << 2) |
++ (display_state[display].three_layers << 4) |
++ (display_state[display].layer_composition << 0);
++ Write_Parameter(display, byte);
++ pr_debug("Overlay Register[0x18] = 0x%x\n", byte);
++}
++
++/* Set the address in RAM of the start of the RAM Character Generator */
++static void MinipugSetCharGenRamAddress(unsigned int display, unsigned int address)
++{
++ /* FIXME check bound of address */
++ Write_Command(display, COMMAND_CGRAM_ADR);
++ Write_Parameter(display, (BYTE)(address & 0xff)); /* Character Generator start address LSB (0x19) */
++ Write_Parameter(display, (BYTE)((address & 0xff00) >> 8)); /* MSB (0x1A) */
++}
++
++static void MinipugSetHorizontalScroll(unsigned int display, unsigned int offset)
++{
++ Write_Command(display, COMMAND_HDOT_SCR);
++ Write_Parameter(display, (BYTE)(offset & 0xff));
++ pr_debug("Horizontal scroll Register[0x1B] = 0x%x\n", offset);
++}
++
++static unsigned short MinipugGetHorizontalScroll(unsigned int display)
++{
++ Write_Command(display, COMMAND_HDOT_SCR);
++ return Read_Parameter(display);
++}
++
++static unsigned short MinipugGetCursorAddress(unsigned int display)
++{
++ unsigned char lsb, msb;
++ Write_Command(display, COMMAND_CSRR);
++ lsb = Read_Parameter(display) & 0xff;
++ msb = (Read_Parameter(display) << 8) & 0xff00;
++ return msb | lsb;
++}
++
++static void MinipugSetGrayscale(unsigned int display, unsigned int bits_per_pixel)
++{
++ unsigned char byte;
++ Write_Command(display, COMMAND_GRAYSCALE);
++ switch (bits_per_pixel) {
++ default:
++ case 1:
++ byte = 0x00; break;
++ case 2:
++ byte = 0x01; break;
++ case 4:
++ byte = 0x02; break;
++ }
++ Write_Parameter(display, byte);
++ pr_debug("Greyscale Register[0x20] = 0x%x\n", byte);
++}
++
++static unsigned char MinipugGetGreyScale(unsigned int display)
++{
++ Write_Command(display, COMMAND_CSRR);
++ return Read_Parameter(display) & 0x03;
++}
++
++static void MinipugWriteString(unsigned int display, char *string)
++{
++ int p;
++
++ p = 0;
++ Write_Command(display, COMMAND_MEMWRITE);
++ while (string[p] != '\0')
++ Write_Parameter(display, string[p++]);
++}
++
++static void MinipugWriteMemoryByte(unsigned int display, BYTE value)
++{
++ Write_Command(display, COMMAND_MEMWRITE);
++ Write_Parameter(display, value);
++}
++
++static unsigned char MinipugReadMemoryByte(unsigned int display)
++{
++ Write_Command(display, COMMAND_MEMREAD);
++ return Read_Parameter(display);
++}
++
++static unsigned char Read_Parameter(unsigned int display)
++{
++ return 0;
++}
++
++static ssize_t minipug_read(struct file *, char *, size_t, loff_t *);
++static ssize_t minipug_write(struct file *, const char *, size_t, loff_t *);
++static int minipug_open(struct inode *, struct file *);
++static int minipug_release(struct inode *, struct file *);
++static int minipug_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
++static int minipug_mmap(struct file *, struct vm_area_struct *vm);
++
++static struct file_operations minipug_fops = {
++ read: minipug_read,
++ write: minipug_write,
++ open: minipug_open,
++ release: minipug_release,
++ ioctl: minipug_ioctl,
++ mmap: minipug_mmap,
++};
++
++/* proc interface */
++static ssize_t proc_read_minipug(struct file *file, char *buf,
++ size_t nbytes, loff_t *ppos);
++static ssize_t proc_write_minipug(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos);
++
++static struct file_operations proc_minipug_operations = {
++ read: proc_read_minipug,
++ write: proc_write_minipug
++};
++static struct proc_dir_entry *proc_minipug;
++#define PROC_MINIPUG "minipug"
++
++static void minipugs_reset(void)
++{
++ samosa_write8(CPLD_LCD_CLR, 1 << CPLD_LCD_NRESET_BIT);
++ mdelay(1);
++ samosa_write8(CPLD_LCD_SET, 1 << CPLD_LCD_NRESET_BIT);
++ mdelay(3);
++}
++
++static void minipug_setup(int disp)
++{
++ MinipugInitDisplay(disp);
++ memset(minipug[disp].buffer, 0, RAM_SIZE);
++ minipug_update_graphics(disp, minipug[disp].buffer, RAM_SIZE, 0);
++}
++
++static int minipug_open(struct inode *inode, struct file *filp)
++{
++ struct minipug_dev *minipug_devp;
++
++#ifdef CONFIG_MINIPUG_ANIMATE
++ animate = 0;
++#endif
++ if (samosa_sm_present())
++ return -ENODEV;
++
++ minipug_devp = container_of(inode->i_cdev, struct minipug_dev, cdev);
++ filp->private_data = minipug_devp;
++
++ return 0;
++}
++
++static int minipug_release(struct inode *inode, struct file *filp)
++{
++ return 0;
++}
++
++static ssize_t minipug_read(struct file *filp, char *buf,
++ size_t size, loff_t *offp)
++{
++ struct minipug_dev *mp = (struct minipug_dev *)filp->private_data;
++ if (*offp >= RAM_SIZE-1)
++ return -EINVAL;
++ if (*offp+size > RAM_SIZE)
++ size = RAM_SIZE-*offp;
++ return copy_to_user(buf, &mp->buffer[*offp], size);
++}
++
++static ssize_t minipug_write(struct file *filp, const char *buf,
++ size_t size, loff_t *offp)
++{
++ struct minipug_dev *mp = (struct minipug_dev *)filp->private_data;
++ /* first RAM_SIZE address spaces are the frame buffer */
++ if (*offp < RAM_SIZE) {
++ unsigned long copied;
++ if (*offp+size > RAM_SIZE)
++ size = RAM_SIZE-*offp;
++ copied = copy_from_user(&mp->buffer[*offp], buf, size);
++ minipug_update_graphics(mp->display, mp->buffer + *offp, size, *offp);
++ return copied;
++ } else if (size == sizeof(unsigned int)) {
++ loff_t command = (*offp)-RAM_SIZE;
++ unsigned int arg;
++ unsigned long copied = copy_from_user(&arg, buf, sizeof(arg));
++ if (command == 0) {
++ if ((arg == 1) || (arg == 2) || (arg == 4)) {
++ mp->bpp = arg;
++ minipug_setup(mp->display);
++ }
++ }
++ return copied;
++ }
++ /* groups of double ints are display buffer update requests */
++ else if (size == (size / (sizeof(unsigned int)*2))*(sizeof(unsigned int)*2)) {
++ unsigned int offset;
++ unsigned int count;
++ size_t org_size = size;
++ while (size) {
++ unsigned long copied = copy_from_user(&offset, buf, sizeof(offset));
++ buf += sizeof(offset);
++ copied = copy_from_user(&count, buf, sizeof(count));
++ buf += sizeof(count);
++ if (offset >= RAM_SIZE)
++ pr_info("%s: ignoring, offset = 0x%x max = 0x%x\n", __func__, offset, RAM_SIZE-1);
++ else if (offset+count > RAM_SIZE)
++ pr_info("%s: ignoring, offset + count = 0x%x max = 0x%x\n", __func__, offset+count, RAM_SIZE-1);
++ else {
++ pr_debug("%s: updating offset %d count = %d on display %d\n", __func__, offset, count, mp->display);
++ minipug_update_graphics(mp->display, mp->buffer + offset, count, offset);
++ }
++ size -= sizeof(unsigned int)*2;
++ }
++ return org_size;
++ }
++ return -EINVAL;
++}
++
++/* maybe this will be handy in due course */
++static int minipug_ioctl(struct inode *inode, struct file *flip,
++ unsigned int command, unsigned long arg)
++{
++ int err;
++ err = -EINVAL;
++ return err;
++}
++
++static int minipug_mmap(struct file *filp, struct vm_area_struct *vma)
++{
++ struct minipug_dev *mp = (struct minipug_dev *)filp->private_data;
++
++ if (remap_vmalloc_range(vma, mp->buffer, 0)) {
++ pr_err("remap_pfn_range failed\n");
++ return -EAGAIN;
++ }
++ return 0;
++}
++
++static int proc_read_minipug(struct file *filp, char *buf,
++ size_t nbytes, loff_t *ppos)
++{
++ char outputbuf[512];
++ int count = 0;
++
++ /* all done in a single read */
++ if (*ppos > 0)
++ return 0;
++
++ count += sprintf(&outputbuf[count], "Minipug: major dev = %d\n", MAJOR(dev));
++ count += sprintf(&outputbuf[count], "Minipug %d: ready\n Bits per pixel %d\n",
++ minipug[0].display, minipug[0].bpp);
++ count += sprintf(&outputbuf[count], "Minipug %d: ready\n Bits per pixel %d\n",
++ minipug[1].display, minipug[1].bpp);
++
++ if (count > nbytes) /* Assume output can be read at one time */
++ return -EINVAL;
++ if (copy_to_user(buf, outputbuf, count))
++ return -EFAULT;
++ *ppos += count;
++ return count;
++}
++
++static ssize_t proc_write_minipug(struct file *filp, const char *buffer,
++ size_t count, loff_t *ppos)
++{
++ /* struct minipug_dev *mp= (struct minipug_dev *)filp->private_data;
++ * if (strncmp(buff,"reset:",6)==0)
++ * newRegValue = simple_strtoul(buffer,&endp,0);
++ * a bold but simple claim is to have read it all
++ */
++ return count;
++}
++
++
++/* driver initialisation */
++
++static int __init minipug_probe(struct samosa_device *pdev)
++{
++#ifndef CONFIG_BALLOON2_BUILD_TCL_PIKEY2
++ /* if smart media present - cpld cannot be so declare invalid */
++ if (samosa_sm_present()) {
++ dev_info(&pdev->dev, "%s: samosa bus not present\n", __func__);
++ return -ENODEV;
++ }
++#endif
++
++ if (!minipug_ready(pdev->id)) {
++ dev_info(&pdev->dev, "%s: minipug %d not ready\n", __func__, pdev->id);
++ return -ENODEV;
++ }
++
++ minipug_setup(pdev->id);
++
++#ifdef USE_GRAPHICS_TEST
++ MinipugSetCursorAddress(pdev->id, display_state[0].blocks[2].start);
++ MinipugBlockFill(pdev->id, 2, (BYTE)(20 & 0xff));
++ MinipugGraphicTest(pdev->id, 2);
++ /* MinipugTextTest(pdev->id, 1); */
++#endif
++
++ dev_info(&pdev->dev, "Minipug %d display support installed\n", pdev->id);
++
++ return 0;
++}
++
++static int __exit minipug_remove(struct samosa_device *dev)
++{
++ samosa_set_drvdata(dev, NULL);
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int minipug_suspend(struct samosa_device *dev, pm_message_t state)
++{
++ MinipugPowerSave(dev->id);
++ return 0;
++}
++
++static int minipug_resume(struct samosa_device *dev)
++{
++ MinipugExitPowerSave(dev->id);
++ minipug_update_graphics(dev->id, minipug[dev->id].buffer, RAM_SIZE, 0);
++ return 0;
++}
++#else /* CONFIG_PM */
++#define minipug_suspend NULL
++#define minipug_resume NULL
++#endif /* CONFIG_PM */
++
++#define minipug_shutdown NULL
++
++/* driver definition */
++static struct samosa_driver minipug_driver = {
++ .probe = minipug_probe,
++ .shutdown = minipug_shutdown,
++ .remove = __exit_p(minipug_remove),
++ .suspend = minipug_suspend,
++ .resume = minipug_resume,
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = "minipug",
++ },
++};
++
++/* bus device */
++static struct samosa_device *minipug_device[2];
++
++/* class object */
++static struct class *minipug_class;
++
++static int __init minipug_init(void)
++{
++ int i;
++ int ret;
++
++ /* general initialisation */
++ spin_lock_init(&minipug_lock);
++
++ /* register a range of device nodes */
++ ret = alloc_chrdev_region(&dev, 0, 2, "minipug");
++
++ if (ret)
++ goto error;
++
++ /* create the minipug character devices */
++ for (i = 0; i < MINIPUG_DISPLAYS; i++) {
++ minipug[i].display = i;
++ minipug[i].bpp = DISPLAY_BPP;
++ minipug[i].buffer = (unsigned char *)vmalloc_user(BUFFER_SIZE);
++ if (!minipug[i].buffer) {
++ pr_err("%s: minipug %d not enough memory\n", __func__, i);
++ ret = -ENOMEM;
++ break;
++ }
++
++ /* initialise character device */
++ cdev_init(&minipug[i].cdev, &minipug_fops);
++ /* claim ownership */
++ minipug[i].cdev.owner = THIS_MODULE;
++ /* add character device */
++ ret = cdev_add(&minipug[i].cdev, dev + i, 1);
++ if (ret)
++ break;
++ }
++ if (ret) {
++ for (i = 0; i < MINIPUG_DISPLAYS; i++) {
++ if (minipug[i].buffer)
++ vfree(minipug[i].buffer);
++ kobject_put(&minipug[i].cdev.kobj);
++ }
++ goto error_region;
++ }
++
++ /* create the class and devices */
++ minipug_class = class_create(THIS_MODULE, "minipug");
++
++ for (i = 0; i < MINIPUG_DISPLAYS; i++) {
++ if (!device_create(minipug_class, NULL, (dev + i), NULL, "minipug%d", i))
++ goto error_class_device;
++ /* register the device on a bus. */
++ minipug_device[i] = samosa_device_register_simple("minipug", i);
++ if (!minipug_device[i])
++ goto error_bus;
++ }
++
++ /* create proc access to displays */
++ proc_minipug = create_proc_entry(PROC_MINIPUG, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_minipug)
++ proc_minipug->proc_fops = &proc_minipug_operations;
++
++ /* register the driver */
++ return samosa_driver_register(&minipug_driver);
++
++error_bus:
++ for (i = 0; i < MINIPUG_DISPLAYS; i++)
++ /* remove samosa device */
++ samosa_device_unregister(minipug_device[i]);
++error_class_device:
++ for (i = 0; i < MINIPUG_DISPLAYS; i++)
++ device_destroy(minipug_class, dev + i);
++error_region:
++ unregister_chrdev_region(dev, 2);
++error:
++ return ret;
++}
++
++static void __exit minipug_exit(void)
++{
++ int i;
++
++ /* remove proc entry */
++ remove_proc_entry(PROC_MINIPUG, NULL);
++
++ for (i = 0; i < MINIPUG_DISPLAYS; i++) {
++ /* remove class device */
++ device_destroy(minipug_class, (dev + i));
++
++ /* remove samosa device */
++ samosa_device_unregister(minipug_device[i]);
++
++ /* remove character device */
++ cdev_del(&minipug[i].cdev);
++
++ /* free buffer */
++ vfree(minipug[i].buffer);
++ }
++ /* remove driver */
++ samosa_driver_unregister(&minipug_driver);
++
++ /* unregister region */
++ unregister_chrdev_region(dev, 2);
++
++ /* remove class */
++ class_destroy(minipug_class);
++}
++
++module_init(minipug_init);
++module_exit(minipug_exit);
++
++MODULE_AUTHOR("Nick Bane <nick@cecomputing.co.uk>");
++MODULE_DESCRIPTION("Minipug display interface via samosa bus on Balloon");
++MODULE_LICENSE("GPL");
+Index: linux-2.6.31/include/video/minipug.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.31/include/video/minipug.h 2010-01-04 22:35:55.000000000 +0000
+@@ -0,0 +1,2 @@
++/* graphics display interface utility for Toby Churchill Minipug device */
++void minipug_update_graphics(unsigned int disp, unsigned char *data, unsigned int len, unsigned int offset);
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-minipugfb.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-minipugfb.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-minipugfb.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,500 @@
+Index: linux-2.6.31-rc4/drivers/video/Kconfig
+===================================================================
+--- linux-2.6.31-rc4.orig/drivers/video/Kconfig 2009-07-23 03:32:59.000000000 +0100
++++ linux-2.6.31-rc4/drivers/video/Kconfig 2009-07-24 10:40:32.000000000 +0100
+@@ -1818,6 +1818,28 @@
+
+ <file:Documentation/fb/pxafb.txt> describes the available parameters.
+
++config FB_MINIPUG
++ tristate "MINIPUG LCD framebuffer support"
++ depends on FB && ARCH_PXA
++ select FB_SYS_FILLRECT
++ select FB_SYS_COPYAREA
++ select FB_SYS_IMAGEBLIT
++ select FB_SYS_FOPS
++ select FB_DEFERRED_IO
++ select FB_CFB_FILLRECT
++ select FB_CFB_COPYAREA
++ select FB_CFB_IMAGEBLIT
++ ---help---
++ Frame buffer driver for the built-in LCD controller in the Toby
++ Churchill SL40 Lightwriters.
++
++ This driver is also available as a module ( = code which can be
++ inserted and removed from the running kernel whenever you want). The
++ module will be called minipugfb. If you want to compile it as a module,
++ say M here and read <file:Documentation/kbuild/modules.txt>.
++
++ If unsure, say N.
++
+ config FB_MBX
+ tristate "2700G LCD framebuffer support"
+ depends on FB && ARCH_PXA
+Index: linux-2.6.31-rc4/drivers/video/Makefile
+===================================================================
+--- linux-2.6.31-rc4.orig/drivers/video/Makefile 2009-07-23 03:32:59.000000000 +0100
++++ linux-2.6.31-rc4/drivers/video/Makefile 2009-07-24 10:41:25.000000000 +0100
+@@ -97,6 +97,7 @@
+ obj-$(CONFIG_FB_CIRRUS) += cirrusfb.o
+ obj-$(CONFIG_FB_ASILIANT) += asiliantfb.o
+ obj-$(CONFIG_FB_PXA) += pxafb.o
++obj-$(CONFIG_FB_MINIPUG) += minipugfb.o
+ obj-$(CONFIG_FB_PXA168) += pxa168fb.o
+ obj-$(CONFIG_FB_W100) += w100fb.o
+ obj-$(CONFIG_FB_TMIO) += tmiofb.o
+Index: linux-2.6.31-rc4/drivers/video/minipugfb.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.31-rc4/drivers/video/minipugfb.c 2009-07-24 10:40:32.000000000 +0100
+@@ -0,0 +1,450 @@
++/*
++ * linux/drivers/video/minipugfb.c -- FB driver for primary Minipug display
++ *
++ * Copyright (C) 2009, Nick Bane
++ * This work was derived from the hecuba driver layout
++ *
++ * 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.
++ *
++ * Layout is based on skeletonfb.c by James Simmons and Geert Uytterhoeven.
++ *
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/slab.h>
++#include <linux/vmalloc.h>
++#include <linux/delay.h>
++#include <linux/interrupt.h>
++#include <linux/fb.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/list.h>
++#include <linux/uaccess.h>
++
++#include "video/minipug.h"
++
++#define MINIPUG_W 456
++#define MINIPUG_H 80
++#define MINIPUGFB_BITS_PER_PIXEL 8
++
++/* main minipugfb functions */
++
++struct minipugfb_par {
++ int device;
++ unsigned char buffer[MINIPUG_W * MINIPUG_H /2];
++ struct fb_info *info;
++};
++
++static unsigned char getgrey8(unsigned char val) {
++ unsigned char red = val & 0xa0;
++ unsigned char green = (val & 0x38) << 2;
++ unsigned char blue = (val & 0x7) << 5;
++ return (red + green + blue) / 3;
++}
++
++static unsigned char getgrey16(u16 val) {
++ unsigned char red = val & 0x7800;
++ unsigned char green = (val & 0x7e0) << 5;
++ unsigned char blue = (val & 0x1f) << 11;
++ return (red + green + blue) / 3;
++}
++
++static unsigned char getgrey32(u32 val) {
++ unsigned char red = (val & 0xff0000) >> 16;
++ unsigned char green = (val & 0xff00) >> 8;
++ unsigned char blue = (val & 0xff);
++ return ((red + green + blue) / 3);
++}
++
++static void minipugfb_dpy_update(struct minipugfb_par *par)
++{
++ int x, y;
++ unsigned char *mpptr = &par->buffer[0];
++ // 8 bit?
++ if (par->info->var.bits_per_pixel == 8) {
++ unsigned char *monoptr8 = (unsigned char __force *)par->info->screen_base;
++ for (y = 0; y < MINIPUG_H; y++) {
++ for (x = 0; x < MINIPUG_W; x += 2)
++ mpptr[x / 2] = (getgrey8(monoptr8[x]) & 0xf0) | ((getgrey8(monoptr8[x + 1]) & 0xf0) >> 4);
++ mpptr += MINIPUG_W / 2;
++ monoptr8 += MINIPUG_W;
++ }
++ }
++ else if (par->info->var.bits_per_pixel == 16) {
++ u16 *monoptr16 = (unsigned short __force *)par->info->screen_base;
++ for (y = 0; y < MINIPUG_H; y++) {
++ for (x = 0; x < MINIPUG_W; x += 2)
++ mpptr[x / 2] = (getgrey16(monoptr16[x]) & 0xf0) | ((getgrey16(monoptr16[x + 1]) & 0xf0) >> 4);
++ mpptr += MINIPUG_W / 2;
++ monoptr16 += MINIPUG_W;
++ }
++ }
++ // else 32 bit
++ else {
++ u32 *monoptr32 = (unsigned int __force *)par->info->screen_base;
++ for (y = 0; y < MINIPUG_H; y++) {
++ for (x = 0; x < MINIPUG_W; x += 2)
++ mpptr[x / 2] = (getgrey32(monoptr32[x]) & 0xf0) | ((getgrey32(monoptr32[x + 1]) & 0xf0) >> 4);
++ mpptr += MINIPUG_W / 2;
++ monoptr32 += MINIPUG_W;
++ }
++ }
++ minipug_update_graphics(par->device, &par->buffer[0], (sizeof par->buffer), 0);
++}
++
++/* this is called back from the deferred io workqueue */
++static void minipugfb_dpy_deferred_io(struct fb_info *info,
++ struct list_head *pagelist)
++{
++ minipugfb_dpy_update(info->par);
++}
++
++static void minipugfb_fillrect(struct fb_info *info,
++ const struct fb_fillrect *rect)
++{
++ struct minipugfb_par *par = info->par;
++
++ sys_fillrect(info, rect);
++
++ minipugfb_dpy_update(par);
++}
++
++static void minipugfb_copyarea(struct fb_info *info,
++ const struct fb_copyarea *area)
++{
++ struct minipugfb_par *par = info->par;
++
++ sys_copyarea(info, area);
++
++ minipugfb_dpy_update(par);
++}
++
++static void minipugfb_imageblit(struct fb_info *info,
++ const struct fb_image *image)
++{
++ struct minipugfb_par *par = info->par;
++
++ sys_imageblit(info, image);
++
++ minipugfb_dpy_update(par);
++}
++
++static ssize_t minipugfb_write(struct fb_info *info, const char __user *buf,
++ size_t count, loff_t *ppos)
++{
++ unsigned long p;
++ int err=-EINVAL;
++ struct minipugfb_par *par;
++ unsigned int xres;
++ unsigned int fbmemlength;
++
++ p = *ppos;
++ par = info->par;
++ xres = info->var.xres;
++ fbmemlength = info->fix.smem_len;
++
++ if (p > fbmemlength) {
++ return -EFBIG;
++ }
++
++ err = 0;
++ if (count > fbmemlength) {
++ err = -EFBIG;
++ count = fbmemlength;
++ }
++
++ if ((count + p) > fbmemlength)
++ count = fbmemlength - p;
++
++ if (count && !err) {
++ char *base_addr;
++
++ base_addr = (char __force *)info->screen_base;
++
++ if (copy_from_user(base_addr + p, buf, count))
++ err = -EFAULT;
++
++ if (!err)
++ *ppos += count;
++
++ }
++
++ minipugfb_dpy_update(par);
++
++ return err ? err : count;
++
++}
++
++static int
++minipugfb_set_par(struct fb_info *info)
++{
++ struct fb_var_screeninfo *var = &info->var;
++// unsigned long palette_mem_size;
++
++ if (var->bits_per_pixel == 16)
++ info->fix.visual = FB_VISUAL_TRUECOLOR;
++// else if (!fbi->cmap_static)
++// info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
++ else {
++ /*
++ * Some people have weird ideas about wanting static
++ * pseudocolor maps. I suspect their user space
++ * applications are broken.
++ */
++ info->fix.visual = FB_VISUAL_STATIC_PSEUDOCOLOR;
++ }
++ switch (var->bits_per_pixel) {
++ case 8 :
++// info->fix.visual = FB_VISUAL_STATIC_PSEUDOCOLOR;
++ var->red.offset = 3; var->red.length = 2;
++ var->green.offset = 3; var->green.length = 3;
++ var->blue.offset = 0; var->blue.length = 3;
++ var->transp.offset = var->transp.length = 0;
++ break;
++ case 16 :
++// info->fix.visual = FB_VISUAL_TRUECOLOR;
++ var->red.offset = 11; var->red.length = 5;
++ var->green.offset = 5; var->green.length = 6;
++ var->blue.offset = 0; var->blue.length = 5;
++ var->transp.offset = var->transp.length = 0;
++ break;
++ case 32 :
++// info->fix.visual = FB_VISUAL_TRUECOLOR;
++ var->red.offset = 16; var->red.length = 8;
++ var->green.offset = 8; var->green.length = 8;
++ var->blue.offset = 0; var->blue.length = 8;
++ var->transp.offset = var->transp.length = 0;
++ break;
++ default :
++ return -EINVAL;
++ break;
++ }
++
++ if (var->bits_per_pixel != 8)
++ fb_dealloc_cmap(&info->cmap);
++ else
++ fb_alloc_cmap(&info->cmap, 1<<info->var.bits_per_pixel, 0);
++
++ return 0;
++}
++
++static int
++minipugfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
++{
++ return 0;
++}
++
++static int
++minipugfb_setcolreg(unsigned int color_index, unsigned int red, unsigned int green,
++ unsigned int blue, unsigned int transp, struct fb_info *info)
++{
++ u32 *palette = info->pseudo_palette;
++
++ if (color_index >= info->cmap.len)
++ return -EINVAL;
++
++ if (info->var.grayscale) {
++ /* Convert color to grayscale.
++ * grayscale = 0.30*R + 0.59*G + 0.11*B */
++ red = green = blue =
++ (red * 77 + green * 151 + blue * 28 + 127) >> 8;
++ }
++
++ switch (info->fix.visual) {
++ case FB_VISUAL_PSEUDOCOLOR :
++ case FB_VISUAL_STATIC_PSEUDOCOLOR :
++ break;
++ case FB_VISUAL_TRUECOLOR :
++ // reduce colour depth
++ red >>= 16 - info->var.red.length;
++ green >>= 16 - info->var.green.length;
++ blue >>= 16 - info->var.blue.length;
++ palette[color_index] =
++ (red << info->var.red.offset) |
++ (green << info->var.green.offset) |
++ (blue << info->var.blue.offset);
++ break;
++ default :
++ break;
++ }
++ return 0;
++}
++
++static struct fb_fix_screeninfo minipugfb_fix __devinitdata = {
++ .id = "minipugfb",
++ .type = FB_TYPE_PACKED_PIXELS,
++// .visual = FB_VISUAL_TRUECOLOR,
++// .visual = FB_VISUAL_STATIC_PSEUDOCOLOR,
++// .visual = FB_VISUAL_PSEUDOCOLOR,
++ .xpanstep = 0,
++ .ypanstep = 0,
++ .ywrapstep = 0,
++ .accel = FB_ACCEL_NONE,
++};
++
++static struct fb_var_screeninfo minipugfb_var __devinitdata = {
++ .xres = MINIPUG_W,
++ .yres = MINIPUG_H,
++ .xres_virtual = MINIPUG_W,
++ .yres_virtual = MINIPUG_H,
++ .bits_per_pixel = MINIPUGFB_BITS_PER_PIXEL,
++ .grayscale = 1,
++};
++
++static struct fb_ops minipugfb_ops = {
++ .owner = THIS_MODULE,
++ .fb_check_var = minipugfb_check_var,
++ .fb_set_par = minipugfb_set_par,
++ .fb_setcolreg = minipugfb_setcolreg,
++ .fb_read = fb_sys_read,
++ .fb_write = minipugfb_write,
++ .fb_fillrect = minipugfb_fillrect,
++ .fb_copyarea = minipugfb_copyarea,
++ .fb_imageblit = minipugfb_imageblit,
++};
++
++static struct fb_deferred_io minipugfb_defio = {
++ .delay = HZ/4,
++ .deferred_io = minipugfb_dpy_deferred_io,
++};
++
++static int __devinit minipugfb_probe(struct platform_device *dev)
++{
++ struct fb_info *info;
++ int retval = -ENOMEM;
++ int videomemorysize;
++ unsigned char *videomemory;
++ struct minipugfb_par *par;
++ int i;
++
++ // make sure we have enough for 32 bits per pixel
++ videomemorysize = MINIPUG_W * MINIPUG_H * 4;
++
++ if (!(videomemory = vmalloc(videomemorysize)))
++ return retval;
++
++ memset(videomemory, 0, videomemorysize);
++
++ info = framebuffer_alloc(sizeof(struct minipugfb_par), &dev->dev);
++ if (!info)
++ goto err;
++
++ info->screen_base = (char __iomem *) videomemory;
++ info->fbops = &minipugfb_ops;
++
++ info->var = minipugfb_var;
++ info->fix = minipugfb_fix;
++ info->fix.smem_start = (unsigned long)videomemorysize;
++ info->fix.smem_len = videomemorysize;
++ info->fix.line_length = MINIPUG_W;
++ info->flags = FBINFO_FLAG_DEFAULT;
++ par = info->par;
++ par->info = info;
++ par->device = dev->id;
++
++ info->fbdefio = &minipugfb_defio;
++ fb_deferred_io_init(info);
++
++ retval = fb_alloc_cmap(&info->cmap, 16, 0);
++ if (retval < 0)
++ goto err_fb;
++
++ // set red green blue colour depths
++ minipugfb_check_var(&info->var,info);
++ minipugfb_set_par(info);
++
++ retval = register_framebuffer(info);
++ if (retval < 0)
++ goto err_cmap;
++ platform_set_drvdata(dev, info);
++
++ printk(KERN_INFO
++ "fb%d: Minipug frame buffer device, using %dK of video memory\n",
++ info->node, videomemorysize >> 10);
++
++ return 0;
++
++err_cmap:
++ fb_dealloc_cmap(&info->cmap);
++err_fb:
++ framebuffer_release(info);
++err:
++ vfree(videomemory);
++ return retval;
++}
++
++static int __devexit minipugfb_remove(struct platform_device *dev)
++{
++ struct fb_info *info = platform_get_drvdata(dev);
++
++ if (info) {
++ fb_deferred_io_cleanup(info);
++ unregister_framebuffer(info);
++ vfree((void __force *)info->screen_base);
++ framebuffer_release(info);
++ }
++ return 0;
++}
++
++static struct platform_driver minipugfb_driver = {
++ .probe = minipugfb_probe,
++ .remove = minipugfb_remove,
++ .driver = {
++ .name = "minipugfb",
++ },
++};
++
++static struct platform_device *minipugfb0_device;
++static struct platform_device *minipugfb1_device;
++
++static int __init minipugfb_init(void)
++{
++ int ret;
++
++ ret = platform_driver_register(&minipugfb_driver);
++ if (!ret) {
++ minipugfb0_device = platform_device_alloc("minipugfb", 0);
++ if (minipugfb0_device) {
++ ret = platform_device_add(minipugfb0_device);
++ if (!ret) {
++ minipugfb1_device = platform_device_alloc("minipugfb", 1);
++ if (minipugfb1_device)
++ ret = platform_device_add(minipugfb1_device);
++ else
++ ret = -ENOMEM;
++ }
++ }
++ else
++ ret = -ENOMEM;
++
++ if (ret) {
++ platform_device_put(minipugfb0_device);
++ platform_device_put(minipugfb1_device);
++ platform_driver_unregister(&minipugfb_driver);
++ }
++ }
++ return ret;
++
++}
++
++static void __exit minipugfb_exit(void)
++{
++ platform_device_unregister(minipugfb0_device);
++ platform_device_unregister(minipugfb1_device);
++ platform_driver_unregister(&minipugfb_driver);
++}
++
++module_init(minipugfb_init);
++module_exit(minipugfb_exit);
++
++MODULE_DESCRIPTION("fbdev defio driver for Minipug display");
++MODULE_AUTHOR("Nick Bane");
++MODULE_LICENSE("GPL");
++
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-nand.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-nand.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-nand.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,341 @@
+Balloon3 nand support
+
+from: Nick Bane <nick@cecomputing.co.uk>
+
+Signed-off-by: Wookey <wookey@wookware.org>
+
+Index: drivers/mtd/nand/Makefile
+===================================================================
+--- drivers/mtd/nand/Makefile.orig 2010-08-22 22:21:59.000000000 +0100
++++ drivers/mtd/nand/Makefile 2010-08-22 22:23:05.000000000 +0100
+@@ -32,6 +32,7 @@
+ obj-$(CONFIG_MTD_NAND_PXA3xx) += pxa3xx_nand.o
+ obj-$(CONFIG_MTD_NAND_TMIO) += tmio_nand.o
+ obj-$(CONFIG_MTD_NAND_PLATFORM) += plat_nand.o
++obj-$(CONFIG_MTD_NAND_BALLOON3) += balloon3.o
+ obj-$(CONFIG_MTD_ALAUDA) += alauda.o
+ obj-$(CONFIG_MTD_NAND_PASEMI) += pasemi_nand.o
+ obj-$(CONFIG_MTD_NAND_ORION) += orion_nand.o
+Index: drivers/mtd/nand/Kconfig
+===================================================================
+--- drivers/mtd/nand/Kconfig.orig 2010-08-22 22:21:59.000000000 +0100
++++ drivers/mtd/nand/Kconfig 2010-08-22 22:23:05.000000000 +0100
+@@ -425,6 +425,10 @@
+ Support for NAND flash connected to a Toshiba Mobile IO
+ Controller in some PDAs, including the Sharp SL6000x.
+
++config MTD_NAND_BALLOON3
++ tristate "Support for NAND Flash on Balloon3 board"
++ depends on MTD_NAND && MACH_BALLOON3
++
+ config MTD_NAND_NANDSIM
+ tristate "Support for NAND Flash Simulator"
+ depends on MTD_PARTITIONS
+Index: drivers/mtd/nand/balloon3.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ drivers/mtd/nand/balloon3.c 2010-08-22 22:23:05.000000000 +0100
+@@ -0,0 +1,274 @@
++/*
++ * linux/drivers/mtd/nand/balloon3.c
++ *
++ * Author: Nick Bane
++ * Created: June, 2006
++ * Copyright: Toby Churchill Ltd
++ * Derived from drivers/mtd/nand/sharpsl.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/slab.h>
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/io.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/nand.h>
++#include <linux/mtd/partitions.h>
++#include <mach/hardware.h>
++
++#include <mach/pxa27x.h>
++#include <mach/balloon3.h>
++
++/* option to ioremap in two small ranges */
++#define SPLIT_RANGE
++
++#ifdef SPLIT_RANGE
++/* FIXME - unsure which to use, a word or a block */
++#define SPLIT_RANGE_SIZE 0x1000
++/* #define SPLIT_RANGE_SIZE 4 */
++
++#define balloon3_phys_ctl_base (BALLOON3_NANDIO_PHYS + BALLOON3_NANDIO_CTL_OFFSET)
++#define balloon3_phys_io_base (BALLOON3_NANDIO_PHYS + BALLOON3_NANDIO_IO_OFFSET)
++static void __iomem *balloon3_io_base =
++ (void __iomem *)(BALLOON3_NANDIO_VIRT + BALLOON3_NANDIO_IO_OFFSET);
++#define FLASHIO balloon3_io_base /* Flash I/O */
++
++#else
++#define balloon3_phys_nand_base (BALLOON3_NANDIO_PHYS)
++static void __iomem *balloon3_nand_base =
++ (void __iomem *)(BALLOON3_NANDIO_VIRT);
++#define FLASHIO ((balloon3_nand_base)+BALLOON3_NANDIO_IO_OFFSET) /* Flash I/O */
++#endif
++
++/* Flash control bits */
++#define FLWP (1 << 7)
++#define FLCE3 (1 << 5)
++#define FLCE2 (1 << 4)
++#define FLCE1 (1 << 3)
++#define FLCE0 (1 << 2)
++#define FLALE (1 << 1)
++#define FLCLE (1 << 0)
++
++/*
++ * MTD structure for Balloon3
++ */
++static struct mtd_info *balloon3_mtd;
++
++/*
++ * Define partitions for flash device
++ */
++#define DEFAULT_NUM_PARTITIONS 2
++
++static int nr_partitions;
++static struct mtd_partition balloon3_nand_default_partition_info[] = {
++ {
++ .name = "boot",
++ .offset = 0,
++ .size = 4 * 1024 * 1024,
++ },
++ {
++ .name = "rootfs",
++ .offset = MTDPART_OFS_APPEND,
++ .size = MTDPART_SIZ_FULL,
++ },
++};
++
++static void
++balloon3_nand_read_buf(struct mtd_info *mtd, u_char *buf, int len)
++{
++ struct nand_chip *this = mtd->priv;
++ __raw_readsb(this->IO_ADDR_R, buf, len);
++}
++
++static void
++balloon3_nand_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
++{
++ struct nand_chip *this = mtd->priv;
++ __raw_writesb(this->IO_ADDR_W, buf, len);
++}
++
++/*
++ * Hardware specific access to control-lines
++ */
++static void
++balloon3_nand_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
++{
++ struct nand_chip *this = mtd->priv;
++
++ if (ctrl & NAND_CTRL_CHANGE) {
++ unsigned char set_ctl = 0;
++ unsigned char clear_ctl = 0;
++
++ if (ctrl & NAND_CLE)
++ set_ctl = FLCLE;
++ else
++ clear_ctl = FLCLE;
++ if (ctrl & NAND_ALE)
++ set_ctl |= FLALE;
++ else
++ clear_ctl |= FLALE;
++
++ if (clear_ctl)
++ __raw_writel(clear_ctl, BALLOON3_NAND_CONTROL_CLR_REG);
++ if (set_ctl)
++ __raw_writel(set_ctl, BALLOON3_NAND_CONTROL_SET_REG);
++ }
++ if (cmd != NAND_CMD_NONE)
++ writeb(cmd, this->IO_ADDR_W);
++}
++
++#ifdef CONFIG_MTD_PARTITIONS
++const char *part_probes[] = { "cmdlinepart", NULL };
++#endif
++
++void
++balloon3_nand_select_chip(struct mtd_info *mtd, int chip)
++{
++ /* deselect all chips */
++ __raw_writel((FLCE0 | FLCE1 | FLCE2 | FLCE3), BALLOON3_NAND_CONTROL_SET_REG);
++ /* do chip select as required */
++ switch (chip) {
++ case -1:
++ break;
++ case 0:
++ __raw_writel(FLCE0, BALLOON3_NAND_CONTROL_CLR_REG); break;
++ case 1:
++ __raw_writel(FLCE1, BALLOON3_NAND_CONTROL_CLR_REG); break;
++ case 2:
++ __raw_writel(FLCE2, BALLOON3_NAND_CONTROL_CLR_REG); break;
++ case 3:
++ __raw_writel(FLCE3, BALLOON3_NAND_CONTROL_CLR_REG); break;
++ }
++}
++
++static int balloon3_nand_dev_ready(struct mtd_info *mtd)
++{
++ unsigned char status = __raw_readl(BALLOON3_NAND_STATUS_REG);
++ return (BALLOON3_NAND_RNB & status) ? 1 : 0;
++}
++
++/*
++ * Main initialization routine
++ */
++int __init
++balloon3_nand_init(void)
++{
++ struct nand_chip *this;
++ struct mtd_partition *balloon3_partition_info;
++
++ /* Allocate memory for MTD device structure and private data */
++ balloon3_mtd = kmalloc(sizeof(struct mtd_info) +
++ sizeof(struct nand_chip), GFP_KERNEL);
++ if (!balloon3_mtd) {
++ pr_err("Unable to allocate Balloon3 NAND MTD device structure\n");
++ return -ENOMEM;
++ }
++
++ balloon3_mtd->owner = THIS_MODULE;
++
++#ifdef SPLIT_RANGE
++ /* map physical io address */
++ balloon3_io_base = ioremap(balloon3_phys_io_base, SPLIT_RANGE_SIZE);
++ if (!balloon3_io_base) {
++ pr_err("ioremap to access Balloon3 NAND chip io failed\n");
++ kfree(balloon3_mtd);
++ return -EIO;
++ }
++#else
++ balloon3_nand_base = ioremap(balloon3_phys_nand_base, NANDIO_LENGTH);
++ if (!balloon3_nand_base) {
++ pr_err("ioremap to access Balloon3 NAND chip io failed\n");
++ kfree(balloon3_mtd);
++ return -EIO;
++ }
++#endif
++
++ /* Get pointer to private data */
++ this = (struct nand_chip *) (&balloon3_mtd[1]);
++
++ /* Initialize structures */
++ memset((char *) balloon3_mtd, 0, sizeof(struct mtd_info));
++ memset((char *) this, 0, sizeof(struct nand_chip));
++
++ /* Link the private data with the MTD structure */
++ balloon3_mtd->priv = this;
++
++ /* initialise lines */
++ /* we don't set plait for the 8-bit bus nand chips, already set up by the bootldr */
++ __raw_writel((FLCE0 | FLCE1 | FLCE2 | FLCE3 | FLWP), BALLOON3_NAND_CONTROL_SET_REG);
++
++ /* initialise mtd nand i/o */
++ this->IO_ADDR_R = FLASHIO;
++ this->IO_ADDR_W = FLASHIO;
++ this->dev_ready = balloon3_nand_dev_ready;
++ this->read_buf = balloon3_nand_read_buf;
++ this->write_buf = balloon3_nand_write_buf;
++ this->cmd_ctrl = balloon3_nand_hwcontrol;
++ this->select_chip = balloon3_nand_select_chip;
++
++ /* 20 us command delay time */
++ /* empirical increase needed for 2K nand it seems */
++ this->chip_delay = 50;
++ this->ecc.mode = NAND_ECC_SOFT;
++
++ /* Scan to find existence of the device */
++ if (nand_scan(balloon3_mtd, 4)) {
++#ifdef SPLIT_RANGE
++ iounmap(balloon3_io_base);
++#else
++ iounmap(balloon3_nand_base);
++#endif
++ kfree(balloon3_mtd);
++ return -ENXIO;
++ }
++
++ /* Register the partitions */
++ balloon3_mtd->name = "balloon3-nand";
++
++#ifdef CONFIG_MTD_PARTITIONS
++ nr_partitions = parse_mtd_partitions(balloon3_mtd, part_probes,
++ &balloon3_partition_info, 0);
++#else
++ nr_partitions = 0;
++#endif
++ if (nr_partitions <= 0) {
++ nr_partitions = DEFAULT_NUM_PARTITIONS;
++ balloon3_partition_info = balloon3_nand_default_partition_info;
++ }
++
++ add_mtd_partitions(balloon3_mtd, balloon3_partition_info,
++ nr_partitions);
++
++ /* Return happy */
++ return 0;
++}
++module_init(balloon3_nand_init);
++
++/*
++ * Clean up routine
++ */
++static void __exit balloon3_nand_cleanup(void)
++{
++ /* Release resources, unregister device */
++ nand_release(balloon3_mtd);
++
++#ifdef SPLIT_RANGE
++ iounmap(balloon3_io_base);
++#else
++ iounmap(balloon3_nand_base);
++#endif
++
++ /* Free the MTD device structure */
++ kfree(balloon3_mtd);
++}
++module_exit(balloon3_nand_cleanup);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Nick Bane <nick@cecomputing.co.uk>");
++MODULE_DESCRIPTION("Device specific logic for NAND flash on Balloon3 board");
+Index: arch/arm/mach-pxa/include/mach/balloon3.h
+===================================================================
+--- arch/arm/mach-pxa/include/mach/balloon3.h.orig 2010-08-22 22:21:59.000000000 +0100
++++ arch/arm/mach-pxa/include/mach/balloon3.h 2010-08-22 22:23:36.000000000 +0100
+@@ -103,6 +103,15 @@
+ /* backlight control */
+ #define BALLOON3_GPIO_RUN_BACKLIGHT (99)
+
++/* add this for balloon3 nand-driver - FIXME driver needs to use above style*/
++#define BALLOON3_NANDIO_PHYS BALLOON3_FPGA_PHYS
++#define BALLOON3_NANDIO_VIRT BALLOON3_FPGA_VIRT
++#define BALLOON3_NANDIO_IO_OFFSET 0x00e00000
++#define BALLOON3_NANDIO_CTL2_OFFSET 0x00e00010
++#define BALLOON3_NANDIO_CTL_OFFSET 0x00e00014
++
++#define BALLOON3_NAND_RNB (1 << 0)
++
+ #define BALLOON3_GPIO_S0_CD (105)
+
+ /* NAND */
+@@ -112,7 +121,7 @@
+ #define BALLOON3_GPIO_RUN_232 (22)
+
+ /* NAND power */
+-+#define BALLOON3_GPIO_RUN_NAND (102)
++#define BALLOON3_GPIO_RUN_NAND (102)
+
+ /* SAMOSA power */
+ #define BALLOON3_GPIO_RUN_SAMOSA (101)
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-pcmcia.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-pcmcia.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-pcmcia.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,256 @@
+Balloon3 PCMCIA support for CF slot (where fitted)
+
+In theory 2 sockets could be fitted and supported but no such hardware has been built
+
+from: Nick Bane <nick@cecomputing.co.uk>
+
+Signed-off-by: Wookey <wookey@wookware.org>
+
+Index: linux-2.6.34/drivers/pcmcia/pxa2xx_balloon3.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.34/drivers/pcmcia/pxa2xx_balloon3.c 2010-06-07 07:47:37.000000000 +0100
+@@ -0,0 +1,205 @@
++/*
++ * linux/drivers/pcmcia/pxa2xx_balloon3.c
++ *
++ * Balloon3 PCMCIA specific routines.
++ *
++ * Author: Nick Bane
++ * Created: June, 2006
++ * Copyright: Toby Churchill Ltd
++ * Derived from pxa2xx_mainstone.c, by Nico Pitre
++ *
++ * 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/gpio.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++
++#include <pcmcia/ss.h>
++
++#include <mach/hardware.h>
++#include <asm/irq.h>
++
++#include <mach/balloon3.h>
++#include <mach/mfp-pxa27x.h>
++#include <mach/pxa27x.h>
++
++#include <asm/io.h>
++
++
++#include "soc_common.h"
++
++/* #define FAKE_STATUS */
++
++/*
++ * These are a list of interrupt sources that provokes a polled
++ * check of status
++ */
++static struct pcmcia_irqs irqs[] = {
++ { 0, BALLOON3_S0_CD_IRQ, "PCMCIA0 CD" },
++ { 0, BALLOON3_BP_NSTSCHG_IRQ, "PCMCIA0 STSCHG" },
++};
++
++static unsigned long balloon3_pcmcia_pin_config[] = {
++ /* PC Card */
++ GPIO48_nPOE,
++ GPIO49_nPWE,
++ GPIO50_nPIOR,
++ GPIO51_nPIOW,
++ GPIO85_nPCE_1,
++ GPIO54_nPCE_2,
++ GPIO79_PSKTSEL,
++ GPIO55_nPREG,
++ GPIO56_nPWAIT,
++ GPIO57_nIOIS16,
++};
++
++static int balloon3_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
++{
++ /*
++ * Setup default state of GPIO outputs
++ * before we enable them as outputs.
++ */
++ pxa2xx_mfp_config(balloon3_pcmcia_pin_config,
++ ARRAY_SIZE(balloon3_pcmcia_pin_config));
++
++ skt->socket.pci_irq = BALLOON3_BP_CF_NRDY_IRQ;
++
++ dev_info(&skt->socket.dev,
++ "%s: socket irq is %d, requesting status change irqs\n",
++ __func__, skt->socket.pci_irq);
++
++ return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
++}
++
++static void balloon3_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
++{
++ soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
++}
++
++static unsigned long balloon3_pcmcia_status[2] = {
++ BALLOON3_PCMCIA_nSTSCHG_BVD1,
++ BALLOON3_PCMCIA_nSTSCHG_BVD1
++};
++
++static void balloon3_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
++ struct pcmcia_state *state)
++{
++#ifdef FAKE_STATUS
++ state->detect = 0;
++ state->ready = 1;
++ state->bvd1 = 0;
++ state->bvd2 = 0;
++ state->vs_3v = 1;
++ state->vs_Xv = 0;
++ state->wrprot = 0; /* not available */
++#else
++ unsigned long status, flip;
++
++ status = __raw_readl(BALLOON3_CF_STATUS_REG);
++ flip = (status ^ balloon3_pcmcia_status[skt->nr])
++ & BALLOON3_PCMCIA_nSTSCHG_BVD1;
++
++ /*
++ * Workaround for STSCHG which can't be deasserted:
++ * We therefore disable/enable corresponding IRQs
++ * as needed to avoid IRQ locks.
++ */
++ if (flip) {
++ balloon3_pcmcia_status[skt->nr] = status;
++ if (status & BALLOON3_PCMCIA_nSTSCHG_BVD1)
++ enable_irq(BALLOON3_BP_NSTSCHG_IRQ);
++ else
++ disable_irq(BALLOON3_BP_NSTSCHG_IRQ);
++ }
++
++ state->detect = (GPLR(BALLOON3_GPIO_S0_CD) & GPIO_bit(BALLOON3_GPIO_S0_CD)) ? 0 : 1;
++ state->ready = (status & BALLOON3_PCMCIA_nIRQ) ? 1 : 0;
++ state->bvd1 = (status & BALLOON3_PCMCIA_nSTSCHG_BVD1) ? 1 : 0;
++ state->bvd2 = 0; /* not available */
++ state->vs_3v = 1; /* Always true its a CF card */
++ state->vs_Xv = 0; /* not available */
++ state->wrprot = 0; /* not available */
++#endif
++}
++
++static int balloon3_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
++ const socket_state_t *state)
++{
++ unsigned long power = 0;
++ int ret = 0;
++
++ if (state->flags & SS_RESET)
++ power |= BALLOON3_PCMCIA_RESET;
++
++ switch (skt->nr) {
++ case 0:
++ if (state->flags & SS_RESET)
++ __raw_writel(BALLOON3_PCMCIA_RESET,BALLOON3_CF_CONTROL_SET_REG);
++ else
++ __raw_writel(BALLOON3_PCMCIA_RESET,BALLOON3_CF_CONTROL_CLR_REG);
++ break;
++ default:
++ ret = -1;
++ }
++
++ return ret;
++}
++
++static void balloon3_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
++{
++ dev_info(&skt->socket.dev, "%s: socket %d initialised\n", __func__, skt->nr);
++}
++
++static void balloon3_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
++{
++}
++
++static struct pcmcia_low_level balloon3_pcmcia_ops = {
++ .owner = THIS_MODULE,
++ .hw_init = balloon3_pcmcia_hw_init,
++ .hw_shutdown = balloon3_pcmcia_hw_shutdown,
++ .socket_state = balloon3_pcmcia_socket_state,
++ .configure_socket = balloon3_pcmcia_configure_socket,
++ .socket_init = balloon3_pcmcia_socket_init,
++ .socket_suspend = balloon3_pcmcia_socket_suspend,
++ .nr = 1,
++};
++
++static struct platform_device *balloon3_pcmcia_device;
++
++static int __init balloon3_pcmcia_init(void)
++{
++ int ret;
++
++ balloon3_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
++ if (!balloon3_pcmcia_device)
++ return -ENOMEM;
++
++ balloon3_pcmcia_device->dev.platform_data = &balloon3_pcmcia_ops;
++
++ ret = platform_device_add(balloon3_pcmcia_device);
++
++ if (ret)
++ platform_device_put(balloon3_pcmcia_device);
++
++ return ret;
++}
++
++static void __exit balloon3_pcmcia_exit(void)
++{
++ platform_device_unregister(balloon3_pcmcia_device);
++}
++
++fs_initcall(balloon3_pcmcia_init);
++module_exit(balloon3_pcmcia_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Nick Bane <nick@cecomputing.co.uk>");
++MODULE_DESCRIPTION("Balloon3 board CF/PCMCIA driver");
+Index: linux-2.6.34/drivers/pcmcia/Makefile
+===================================================================
+--- linux-2.6.34.orig/drivers/pcmcia/Makefile 2010-06-07 07:20:05.000000000 +0100
++++ linux-2.6.34/drivers/pcmcia/Makefile 2010-06-07 07:21:43.000000000 +0100
+@@ -57,6 +57,7 @@
+ pxa2xx_cm_x2xx_cs-y += pxa2xx_cm_x2xx.o pxa2xx_cm_x255.o pxa2xx_cm_x270.o
+ pxa2xx-obj-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock_cs.o
+ pxa2xx-obj-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o
++pxa2xx-obj-$(CONFIG_MACH_BALLOON3) += pxa2xx_balloon3.o
+ pxa2xx-obj-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o
+ pxa2xx-obj-$(CONFIG_MACH_ARMCORE) += pxa2xx_cm_x2xx_cs.o
+ pxa2xx-obj-$(CONFIG_ARCOM_PCMCIA) += pxa2xx_viper.o
+Index: linux-2.6.34/drivers/pcmcia/Kconfig
+===================================================================
+--- linux-2.6.34.orig/drivers/pcmcia/Kconfig 2010-06-07 07:20:05.000000000 +0100
++++ linux-2.6.34/drivers/pcmcia/Kconfig 2010-06-07 07:21:43.000000000 +0100
+@@ -234,7 +234,8 @@
+ depends on ARM && ARCH_PXA && PCMCIA
+ depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
+ || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \
+- || ARCOM_PCMCIA || ARCH_PXA_ESERIES || MACH_STARGATE2)
++ || ARCOM_PCMCIA || ARCH_PXA_ESERIES || MACH_STARGATE2 \
++ || MACH_BALLOON3)
+ select PCMCIA_SOC_COMMON
+ help
+ Say Y here to include support for the PXA2xx PCMCIA controller
+Index: linux-2.6.34/arch/arm/mach-pxa/mfp-pxa2xx.c
+===================================================================
+--- linux-2.6.34.orig/arch/arm/mach-pxa/mfp-pxa2xx.c 2010-06-07 07:20:05.000000000 +0100
++++ linux-2.6.34/arch/arm/mach-pxa/mfp-pxa2xx.c 2010-06-07 07:21:43.000000000 +0100
+@@ -145,6 +145,7 @@
+ local_irq_restore(flags);
+ }
+ }
++EXPORT_SYMBOL_GPL(pxa2xx_mfp_config);
+
+ void pxa2xx_mfp_set_lpm(int mfp, unsigned long lpm)
+ {
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-powerfail.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-powerfail.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-powerfail.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,322 @@
+Index: linux-2.6.29.1/drivers/char/Kconfig
+===================================================================
+--- linux-2.6.29.1.orig/drivers/char/Kconfig 2009-09-21 01:17:07.000000000 +0100
++++ linux-2.6.29.1/drivers/char/Kconfig 2009-09-21 01:17:07.000000000 +0100
+@@ -680,6 +680,13 @@
+ help
+ TSL2560 light sensor driven down Samosa bus (for Balloonboard).
+
++config BALLOON3_POWERFAIL
++ tristate "Balloon 3 powerfail"
++ depends on MACH_BALLOON3
++ default m
++ help
++ Balloon 3 power failure detection device.
++
+ config HVCS
+ tristate "IBM Hypervisor Virtual Console Server support"
+ depends on PPC_PSERIES
+Index: linux-2.6.29.1/drivers/char/Makefile
+===================================================================
+--- linux-2.6.29.1.orig/drivers/char/Makefile 2009-09-21 01:17:07.000000000 +0100
++++ linux-2.6.29.1/drivers/char/Makefile 2009-09-21 01:17:07.000000000 +0100
+@@ -114,6 +114,7 @@
+ obj-$(CONFIG_SAMOSA) += samosa.o
+ obj-$(CONFIG_LMR5428) += lmr5428.o
+ obj-$(CONFIG_TSL2560) += tsl2560.o
++obj-$(CONFIG_BALLOON3_POWERFAIL) += balloon3-powerfail.o
+
+ # Files generated that shall be removed upon make clean
+ clean-files := consolemap_deftbl.c defkeymap.c
+Index: linux-2.6.29.1/drivers/char/balloon3-powerfail.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.29.1/drivers/char/balloon3-powerfail.c 2009-09-21 01:22:45.000000000 +0100
+@@ -0,0 +1,287 @@
++/*
++ * linux/drivers/char/balloon3-powerfail.c
++ *
++ * file interface balloon 3 power failure
++ * Copyright (c) Chris Jones, Martin-Jones Technology Ltd 2009
++ *
++*/
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <linux/uaccess.h>
++
++#include <mach/balloon3.h>
++#include <asm/cacheflush.h>
++
++#include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/proc_fs.h>
++#include <linux/vmalloc.h>
++#include <linux/platform_device.h>
++#include <linux/spinlock.h>
++#include <linux/cdev.h>
++#include <linux/interrupt.h>
++
++#include <mach/pxa-regs.h>
++#include <mach/pxa2xx-regs.h>
++
++#define PMCR_INTRS (1<<5)
++#define PMCR_IAS (1<<4)
++#define PMCR_VIDAS (1<<3)
++#define PMCR_VIDAE (1<<2)
++#define PMCR_BIDAS (1<<1)
++#define PMCR_BIDAE (1<<0)
++
++/* character device start number */
++static dev_t dev;
++
++static int powerstate;
++
++static spinlock_t powerfail_lock;
++
++#define POWERSTATE_OK 0
++#define POWERSTATE_BATT_FAULT (1<<0)
++#define POWERSTATE_VDD_FAULT (1<<1)
++
++/* per device data */
++static struct powerfail_dev {
++ struct cdev cdev;
++} powerfail;
++
++static irqreturn_t powerfail_interrupt(int irq, struct irq_desc *desc);
++
++irqreturn_t powerfail_interrupt(int irq, struct irq_desc *desc) {
++ pr_info("%s\n",__func__);
++
++ /* look at PXA registers to see what's happened */
++ if(!(PMCR&PMCR_INTRS)) {
++ /* INTRS wasn't set, so this wasn't ours */
++ return IRQ_NONE;
++ }
++ PMCR|=PMCR_INTRS;
++
++ if(PMCR&PMCR_VIDAS) {
++ pr_info("VDD fault\n");
++ powerstate|=POWERSTATE_VDD_FAULT;
++ PMCR|=PMCR_VIDAS;
++ } else {
++ powerstate&=~POWERSTATE_VDD_FAULT;
++ }
++
++ if(PMCR&PMCR_BIDAS) {
++ pr_info("Batt fault\n");
++ powerstate|=POWERSTATE_BATT_FAULT;
++ PMCR|=PMCR_BIDAS;
++ } else {
++ powerstate&=~POWERSTATE_BATT_FAULT;
++ }
++
++ return IRQ_HANDLED;
++}
++
++static ssize_t powerfail_read(struct file *, char *, size_t, loff_t *);
++static ssize_t powerfail_write(struct file *, const char *, size_t, loff_t *);
++static int powerfail_open(struct inode *, struct file *);
++static int powerfail_release(struct inode *, struct file *);
++static int powerfail_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
++static int powerfail_mmap(struct file *, struct vm_area_struct *vm);
++
++static struct file_operations powerfail_fops = {
++ read: powerfail_read,
++ write: powerfail_write,
++ open: powerfail_open,
++ release: powerfail_release,
++ ioctl: powerfail_ioctl,
++ mmap: powerfail_mmap,
++};
++
++/* proc interface */
++static ssize_t proc_read_powerfail(struct file *file, char *buf,
++ size_t nbytes, loff_t *ppos);
++static ssize_t proc_write_powerfail(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos);
++
++static struct file_operations proc_powerfail_operations = {
++ read: proc_read_powerfail,
++ write: proc_write_powerfail
++};
++static struct proc_dir_entry *proc_powerfail;
++#define PROC_POWERFAIL "powerfail"
++
++static int powerfail_open(struct inode *inode, struct file *filp)
++{
++ struct powerfail_dev *powerfail_devp;
++
++ powerfail_devp = container_of(inode->i_cdev, struct powerfail_dev, cdev);
++ filp->private_data = powerfail_devp;
++
++ return 0;
++}
++
++static int powerfail_release(struct inode *inode, struct file *filp)
++{
++ return 0;
++}
++
++static ssize_t powerfail_read(struct file *filp, char *buf,
++ size_t size, loff_t *offp)
++{
++ char outputbuf[80];
++ int count = 0;
++
++ /* all done in a single read */
++ if (*offp > 0)
++ return 0;
++
++ /* quick and dirty, this: just read the value of PMCR and munge it a bit */
++ if(PMCR&PMCR_VIDAS) powerstate |= POWERSTATE_VDD_FAULT;
++ if(PMCR&PMCR_BIDAS) powerstate |= POWERSTATE_BATT_FAULT;
++
++ count += sprintf(&outputbuf[count], "0x%02x\n", powerstate);
++
++ if (count > size) /* Assume output can be read at one time */
++ return -EINVAL;
++ if (copy_to_user(buf, outputbuf, count))
++ return -EFAULT;
++ *offp += count;
++ return count;
++}
++
++static ssize_t powerfail_write(struct file *filp, const char *buf,
++ size_t size, loff_t *offp)
++{
++ /* we don't support writing at the moment */
++ return -EINVAL;
++}
++
++/* maybe this will be handy in due course */
++static int powerfail_ioctl(struct inode *inode, struct file *flip,
++ unsigned int command, unsigned long arg)
++{
++ int err;
++ err = -EINVAL;
++ return err;
++}
++
++static int powerfail_mmap(struct file *filp, struct vm_area_struct *vma)
++{
++ /*struct powerfail_dev *mp = (struct powerfail_dev *)filp->private_data;*/
++
++ return -EINVAL;
++}
++
++
++static int proc_read_powerfail(struct file *filp, char *buf,
++ size_t nbytes, loff_t *ppos)
++{
++ char outputbuf[512];
++ int count = 0;
++
++ /* all done in a single read */
++ if (*ppos > 0)
++ return 0;
++
++ count += sprintf(&outputbuf[count], "powerfail: major dev = %d\n", MAJOR(dev));
++
++ if (count > nbytes) /* Assume output can be read at one time */
++ return -EINVAL;
++ if (copy_to_user(buf, outputbuf, count))
++ return -EFAULT;
++ *ppos += count;
++ return count;
++}
++
++static ssize_t proc_write_powerfail(struct file *filp, const char *buffer,
++ size_t count, loff_t *ppos)
++{
++ /* struct powerfail_dev *mp= (struct powerfail_dev *)filp->private_data;
++ * if (strncmp(buff,"reset:",6)==0)
++ * newRegValue = simple_strtoul(buffer,&endp,0);
++ * a bold but simple claim is to have read it all
++ */
++ return count;
++}
++
++/* class object */
++static struct class *powerfail_class;
++
++static int __init powerfail_init(void)
++{
++ int ret;
++
++ /* general initialisation */
++ spin_lock_init(&powerfail_lock);
++
++ /* register a range of device nodes */
++ ret = alloc_chrdev_region(&dev, 0, 1, "powerfail");
++ if (ret)
++ goto error;
++
++ /* create the powerfail character devices */
++ /* initialise character device */
++ cdev_init(&powerfail.cdev, &powerfail_fops);
++ /* claim ownership */
++ powerfail.cdev.owner = THIS_MODULE;
++ /* add character device */
++ ret = cdev_add(&powerfail.cdev, dev, 1);
++ if (ret) {
++ goto error_region;
++ }
++
++ /* create the class and devices */
++ powerfail_class = class_create(THIS_MODULE, "powerfail");
++
++ if (!device_create(powerfail_class, NULL, (dev), NULL, "powerfail"))
++ goto error_class_device;
++
++ /* create proc access */
++ proc_powerfail = create_proc_entry(PROC_POWERFAIL, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_powerfail)
++ proc_powerfail->proc_fops = &proc_powerfail_operations;
++
++ /* set up interrupt handler */
++ /* no, actually, don't: it's too hard */
++
++ powerstate =0;
++
++ /* clear any pending interrupts and put the power manager in the right state */
++ PMCR=PMCR_INTRS+PMCR_IAS+PMCR_VIDAS+PMCR_VIDAE+PMCR_BIDAS+PMCR_BIDAE;
++
++ return 0;
++
++error_class_device:
++ device_destroy(powerfail_class, dev);
++error_region:
++ unregister_chrdev_region(dev, 1);
++error:
++ return ret;
++}
++
++static void __exit powerfail_exit(void)
++{
++ /* remove interrupt handler */
++ /* we never registered it */
++
++ /* remove proc entry */
++ remove_proc_entry(PROC_POWERFAIL, NULL);
++
++ /* remove class device */
++ device_destroy(powerfail_class, (dev));
++
++ /* remove character device */
++ cdev_del(&powerfail.cdev);
++
++ /* unregister region */
++ unregister_chrdev_region(dev, 1);
++
++ /* remove class */
++ class_destroy(powerfail_class);
++}
++
++module_init(powerfail_init);
++module_exit(powerfail_exit);
++
++MODULE_AUTHOR("Chris Jones <chris@martin-jones.com>");
++MODULE_DESCRIPTION("Balloon 3 power failure device");
++MODULE_LICENSE("GPL");
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa-podpoint.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa-podpoint.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa-podpoint.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,357 @@
+Index: linux-2.6.31/drivers/char/samosa.c
+===================================================================
+--- linux-2.6.31.orig/drivers/char/samosa.c 2010-01-11 22:16:24.000000000 +0000
++++ linux-2.6.31/drivers/char/samosa.c 2010-01-11 22:20:01.000000000 +0000
+@@ -10,6 +10,9 @@
+ *
+ */
+
++/* JIM - back ported proc code from 2.6.29.1 */
++#define CONFIG_PROC_SAMOSA
++
+ #include <linux/samosa.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+@@ -689,16 +692,45 @@
+ EXPORT_SYMBOL_GPL(samosa_bus_type);
+
+ #ifdef CONFIG_PROC_SAMOSA
+-#define PROC_SAMOSA "samosa"
+-static ssize_t proc_read_samosa(struct file *file, char *buf,
++static ssize_t proc_read_samosa_default(struct file *file, char *buf,
+ size_t nbytes, loff_t *ppos) {
++ char outputbuf[512];
+ int count = 0;
++
++ /* all done in a single read */
++ if (*ppos > 0)
++ return 0;
++
++ count += sprintf(&outputbuf[count], "Hello - I'm a test message from Jim\n");
++
++ if (count > nbytes)
++ return -EINVAL;
++ if (copy_to_user(buf, outputbuf, count))
++ return -EFAULT;
++ *ppos += count;
+ return count;
+ }
+
+-static ssize_t proc_write_samosa(struct file *file, const char *buffer,
++static ssize_t proc_read_samosa(unsigned char reg, struct file *file, char *buf,
++ size_t nbytes, loff_t *ppos) {
++ char val;
++ char outputbuf[10];
++
++ /* all done in a single read */
++ if (*ppos > 0)
++ return 0;
++
++ val = samosa_read8(reg);
++ sprintf(outputbuf,"%02x",val);
++
++ if (copy_to_user(buf, outputbuf, 2))
++ return -EFAULT;
++ *ppos += 2;
++ return 2;
++}
++
++static ssize_t proc_write_samosa(unsigned char reg, struct file *file, const char *buffer,
+ size_t count, loff_t *ppos) {
+- unsigned long samosa_addr;
+ unsigned long samosa_data;
+ char buf[40];
+ char *p = buf;
+@@ -713,28 +745,202 @@
+ buf[count] = 0;
+ while (isspace(*p))
+ p++;
+- samosa_addr = simple_strtoul(p,&pp,0);
+- if (pp && (pp > p)) {
+- p = pp;
+- while (isspace(*p))
+- p++;
+- samosa_data = simple_strtoul(p,&pp,0);
+- if (pp && (pp > p))
+- samosa_write8(samosa_addr, samosa_data);
+- else
+- pr_info("cannot parse data from <%s> address = 0x%lx\n",p,samosa_addr);
+- }
++
++ samosa_data = simple_strtoul(p,&pp,0);
++ if (pp && (pp > p))
++ samosa_write8(reg, samosa_data);
+ else
+- pr_info("cannot parse address from start of <%s>\n",buf);
++ pr_info("cannot parse data from <%s> reg 0x%02x\n",p,reg);
+ return count;
+ }
+
+-static struct file_operations proc_samosa_operations = {
+- read: proc_read_samosa,
+- write: proc_write_samosa
++/* All very quick hack and very dirty - DON'T write to/read from more than one proc dir at a time */
++
++/* write */
++static ssize_t proc_write_samosa_backlight(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x02, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_brightness(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x03, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_leds_clear(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x84, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_leds_set(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x04, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_doors_clear(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x85, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_doors_set(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x05, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_assorted_clear(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x86, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_assorted_set(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x06, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_lcd_data(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x00, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_lcd_cntrl(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x01, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_interrupt_enable_set(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x0e, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_interrupt_enable_clear(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x0e, file, buffer, count, ppos);
++}
++
++static ssize_t proc_write_samosa_interrupt_status(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_write_samosa(0x0f, file, buffer, count, ppos);
++}
++
++/* read */
++static ssize_t proc_read_samosa_doors_clear(struct file *file, char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_read_samosa(0x85, file, buffer, count, ppos);
++}
++
++static ssize_t proc_read_samosa_doors_set(struct file *file, char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_read_samosa(0x05, file, buffer, count, ppos);
++}
++
++static ssize_t proc_read_samosa_assorted_clear(struct file *file, char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_read_samosa(0x86, file, buffer, count, ppos);
++}
++
++static ssize_t proc_read_samosa_assorted_set(struct file *file, char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_read_samosa(0x06, file, buffer, count, ppos);
++}
++
++static ssize_t proc_read_samosa_lcd_data(struct file *file, char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_read_samosa(0x00, file, buffer, count, ppos);
++}
++
++static ssize_t proc_read_samosa_lcd_cntrl(struct file *file, char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_read_samosa(0x01, file, buffer, count, ppos);
++}
++
++static ssize_t proc_read_samosa_interrupt_status(struct file *file, char *buffer,
++ size_t count, loff_t *ppos) {
++ return proc_read_samosa(0x0f, file, buffer, count, ppos);
++}
++
++/* operations */
++static struct file_operations proc_samosa_ops_backlight = {
++ read: proc_read_samosa_default,
++ write:proc_write_samosa_backlight
+ };
+
+-static struct proc_dir_entry *proc_samosa;
++static struct file_operations proc_samosa_ops_brightness = {
++ read: proc_read_samosa_default,
++ write:proc_write_samosa_brightness
++};
++
++static struct file_operations proc_samosa_ops_leds_clear = {
++ read: proc_read_samosa_default,
++ write:proc_write_samosa_leds_clear
++};
++
++static struct file_operations proc_samosa_ops_leds_set = {
++ read: proc_read_samosa_default,
++ write:proc_write_samosa_leds_set
++};
++
++static struct file_operations proc_samosa_ops_doors_clear = {
++ read: proc_read_samosa_doors_clear,
++ write:proc_write_samosa_doors_clear
++};
++
++static struct file_operations proc_samosa_ops_doors_set = {
++ read: proc_read_samosa_doors_set,
++ write:proc_write_samosa_doors_set
++};
++
++static struct file_operations proc_samosa_ops_assorted_clear = {
++ read: proc_read_samosa_assorted_clear,
++ write:proc_write_samosa_assorted_clear
++};
++
++static struct file_operations proc_samosa_ops_assorted_set = {
++ read: proc_read_samosa_assorted_set,
++ write:proc_write_samosa_assorted_set
++};
++
++static struct file_operations proc_samosa_ops_lcd_data = {
++ read: proc_read_samosa_lcd_data,
++ write:proc_write_samosa_lcd_data
++};
++
++static struct file_operations proc_samosa_ops_lcd_cntrl = {
++ read: proc_read_samosa_lcd_cntrl,
++ write:proc_write_samosa_lcd_cntrl
++};
++
++static struct file_operations proc_samosa_ops_interrupt_enable_set = {
++ read: proc_read_samosa_default,
++ write:proc_write_samosa_interrupt_enable_set
++};
++
++static struct file_operations proc_samosa_ops_interrupt_enable_clear = {
++ read: proc_read_samosa_default,
++ write:proc_write_samosa_interrupt_enable_clear
++};
++
++static struct file_operations proc_samosa_ops_interrupt_status = {
++ read: proc_read_samosa_interrupt_status,
++ write:proc_write_samosa_interrupt_status
++};
++
++static struct proc_dir_entry *proc_samosa_pod[13];
++
++#define PROC_SAMOSA_BACKLIGHT "pod_backlight" /* 02 w */
++#define PROC_SAMOSA_BRIGHTNESS "pod_brightness" /* 03 w */
++#define PROC_SAMOSA_LEDS_CLEAR "pod_leds_clear" /* 04 w */
++#define PROC_SAMOSA_LEDS_SET "pod_leds_set" /* 84 w */
++#define PROC_SAMOSA_DOORS_CLEAR "pod_doors_clear" /* 05 rw */
++#define PROC_SAMOSA_DOORS_SET "pod_doors_set" /* 85 rw */
++#define PROC_SAMOSA_ASSORTED_CLEAR "pod_assorted_clear" /* 06 rw */
++#define PROC_SAMOSA_ASSORTED_SET "pod_assorted_set" /* 86 rw */
++
++#define PROC_SAMOSA_LCD_DATA "pod_lcd_data" /* 00 rw */
++#define PROC_SAMOSA_LCD_CNTRL "pod_lcd_cntrl" /* 01 rw */
++#define PROC_SAMOSA_INTERRUPT_ENABLE_SET "pod_interrupt_enable_set" /* 0e w */
++#define PROC_SAMOSA_INTERRUPT_ENABLE_CLEAR "pod_interrupt_enable_clear" /* 1e w */
++#define PROC_SAMOSA_INTERRUPT_STATUS "pod_interrupt_status" /* 0f rw */
++
+ #endif
+
+ static int __init samosa_bus_init(void)
+@@ -755,10 +961,48 @@
+ pr_info("Samosa services initialised.\n");
+ ver = BALLOON3_VERSION_REG;
+ pr_info("VHDL logic version (memread):%08X\n", ver);
++ pr_info("Jim hacked podpoint version v0.02 (write/read various /proc/pod_* entries)\n");
+ #ifdef CONFIG_PROC_SAMOSA
+- proc_samosa = create_proc_entry(PROC_SAMOSA, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
+- if (proc_samosa)
+- proc_samosa->proc_fops = &proc_samosa_operations;
++ proc_samosa_pod[0] = create_proc_entry(PROC_SAMOSA_BACKLIGHT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[0])
++ proc_samosa_pod[0]->proc_fops = &proc_samosa_ops_backlight;
++ proc_samosa_pod[1] = create_proc_entry(PROC_SAMOSA_BRIGHTNESS, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[1])
++ proc_samosa_pod[1]->proc_fops = &proc_samosa_ops_brightness;
++ proc_samosa_pod[2] = create_proc_entry(PROC_SAMOSA_LEDS_CLEAR, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[2])
++ proc_samosa_pod[2]->proc_fops = &proc_samosa_ops_leds_clear;
++ proc_samosa_pod[3] = create_proc_entry(PROC_SAMOSA_LEDS_SET, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[3])
++ proc_samosa_pod[3]->proc_fops = &proc_samosa_ops_leds_set;
++ proc_samosa_pod[4] = create_proc_entry(PROC_SAMOSA_DOORS_CLEAR, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[4])
++ proc_samosa_pod[4]->proc_fops = &proc_samosa_ops_doors_clear;
++ proc_samosa_pod[5] = create_proc_entry(PROC_SAMOSA_DOORS_SET, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[5])
++ proc_samosa_pod[5]->proc_fops = &proc_samosa_ops_doors_set;
++ proc_samosa_pod[6] = create_proc_entry(PROC_SAMOSA_ASSORTED_CLEAR, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[6])
++ proc_samosa_pod[6]->proc_fops = &proc_samosa_ops_assorted_clear;
++ proc_samosa_pod[7] = create_proc_entry(PROC_SAMOSA_ASSORTED_SET, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[7])
++ proc_samosa_pod[7]->proc_fops = &proc_samosa_ops_assorted_set;
++
++ proc_samosa_pod[8] = create_proc_entry(PROC_SAMOSA_LCD_DATA, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[8])
++ proc_samosa_pod[8]->proc_fops = &proc_samosa_ops_lcd_data;
++ proc_samosa_pod[9] = create_proc_entry(PROC_SAMOSA_LCD_CNTRL, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[9])
++ proc_samosa_pod[9]->proc_fops = &proc_samosa_ops_lcd_cntrl;
++ proc_samosa_pod[10] = create_proc_entry(PROC_SAMOSA_INTERRUPT_ENABLE_SET, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[10])
++ proc_samosa_pod[10]->proc_fops = &proc_samosa_ops_interrupt_enable_set;
++ proc_samosa_pod[11] = create_proc_entry(PROC_SAMOSA_INTERRUPT_ENABLE_CLEAR, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[11])
++ proc_samosa_pod[11]->proc_fops = &proc_samosa_ops_interrupt_enable_clear;
++ proc_samosa_pod[12] = create_proc_entry(PROC_SAMOSA_INTERRUPT_STATUS, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa_pod[12])
++ proc_samosa_pod[12]->proc_fops = &proc_samosa_ops_interrupt_status;
+ #endif
+ }
+ else
+@@ -769,7 +1013,20 @@
+ static void __exit samosa_bus_remove(void)
+ {
+ #ifdef CONFIG_PROC_SAMOSA
+- remove_proc_entry(PROC_SAMOSA, NULL);
++ remove_proc_entry(PROC_SAMOSA_BACKLIGHT, NULL);
++ remove_proc_entry(PROC_SAMOSA_BRIGHTNESS, NULL);
++ remove_proc_entry(PROC_SAMOSA_LEDS_CLEAR, NULL);
++ remove_proc_entry(PROC_SAMOSA_LEDS_SET, NULL);
++ remove_proc_entry(PROC_SAMOSA_DOORS_CLEAR, NULL);
++ remove_proc_entry(PROC_SAMOSA_DOORS_SET, NULL);
++ remove_proc_entry(PROC_SAMOSA_ASSORTED_CLEAR, NULL);
++ remove_proc_entry(PROC_SAMOSA_ASSORTED_SET, NULL);
++
++ remove_proc_entry(PROC_SAMOSA_LCD_DATA, NULL);
++ remove_proc_entry(PROC_SAMOSA_LCD_CNTRL, NULL);
++ remove_proc_entry(PROC_SAMOSA_INTERRUPT_ENABLE_SET, NULL);
++ remove_proc_entry(PROC_SAMOSA_INTERRUPT_ENABLE_CLEAR, NULL);
++ remove_proc_entry(PROC_SAMOSA_INTERRUPT_STATUS, NULL);
+ #endif
+
+ bus_unregister(&samosa_bus_type);
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa-uart.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa-uart.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa-uart.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,193 @@
+Index: linux-2.6.31/include/linux/serial_core.h
+===================================================================
+--- linux-2.6.31.orig/include/linux/serial_core.h 2009-09-09 23:13:59.000000000 +0100
++++ linux-2.6.31/include/linux/serial_core.h 2010-01-12 04:09:34.000000000 +0000
+@@ -280,6 +280,7 @@
+ #define UPIO_TSI (5) /* Tsi108/109 type IO */
+ #define UPIO_DWAPB (6) /* DesignWare APB UART */
+ #define UPIO_RM9000 (7) /* RM9000 type IO */
++#define UPIO_SAMOSA (8) /* SAMOSA IO */
+
+ unsigned int read_status_mask; /* driver specific */
+ unsigned int ignore_status_mask; /* driver specific */
+Index: linux-2.6.31/drivers/serial/8250.c
+===================================================================
+--- linux-2.6.31.orig/drivers/serial/8250.c 2009-09-09 23:13:59.000000000 +0100
++++ linux-2.6.31/drivers/serial/8250.c 2010-01-12 04:09:34.000000000 +0000
+@@ -39,6 +39,8 @@
+ #include <linux/nmi.h>
+ #include <linux/mutex.h>
+
++#include <linux/samosa.h>
++
+ #include <asm/io.h>
+ #include <asm/irq.h>
+
+@@ -477,6 +479,18 @@
+ outb(value, p->iobase + offset);
+ }
+
++static unsigned int samosa_serial_in(struct uart_port *p, int offset)
++{
++ offset = map_8250_in_reg(p, offset) << p->regshift;
++ return samosa_read8((unsigned char)(p->iobase + offset));
++}
++
++static void samosa_serial_out(struct uart_port *p, int offset, int value)
++{
++ offset = map_8250_out_reg(p, offset) << p->regshift;
++ samosa_write8((unsigned char)(p->iobase + offset), value);
++}
++
+ static void set_io_from_upio(struct uart_port *p)
+ {
+ struct uart_8250_port *up = (struct uart_8250_port *)p;
+@@ -513,6 +527,11 @@
+ p->serial_out = dwapb_serial_out;
+ break;
+
++ case UPIO_SAMOSA:
++ p->serial_in = samosa_serial_in;
++ p->serial_out = samosa_serial_out;
++ break;
++
+ default:
+ p->serial_in = io_serial_in;
+ p->serial_out = io_serial_out;
+@@ -2418,8 +2437,9 @@
+
+ serial8250_set_sleep(p, state != 0);
+
+- if (p->pm)
++ if (p->pm) {
+ p->pm(port, state, oldstate);
++ }
+ }
+
+ static unsigned int serial8250_port_size(struct uart_8250_port *pt)
+@@ -2845,9 +2865,9 @@
+ static struct uart_driver serial8250_reg = {
+ .owner = THIS_MODULE,
+ .driver_name = "serial",
+- .dev_name = "ttyS",
++ .dev_name = "ttySM",
+ .major = TTY_MAJOR,
+- .minor = 64,
++ .minor = 70,
+ .cons = SERIAL8250_CONSOLE,
+ };
+
+Index: linux-2.6.31/include/linux/serial_8250.h
+===================================================================
+--- linux-2.6.31.orig/include/linux/serial_8250.h 2009-09-09 23:13:59.000000000 +0100
++++ linux-2.6.31/include/linux/serial_8250.h 2010-01-12 04:09:34.000000000 +0000
+@@ -50,6 +50,7 @@
+ PLAT8250_DEV_MCA,
+ PLAT8250_DEV_AU1X00,
+ PLAT8250_DEV_SM501,
++ PLAT8250_DEV_SAMOSA_PODPOINT
+ };
+
+ /*
+Index: linux-2.6.31/drivers/serial/Kconfig
+===================================================================
+--- linux-2.6.31.orig/drivers/serial/Kconfig 2009-09-09 23:13:59.000000000 +0100
++++ linux-2.6.31/drivers/serial/Kconfig 2010-01-12 04:09:34.000000000 +0000
+@@ -167,6 +167,16 @@
+ # Multi-port serial cards
+ #
+
++config SERIAL_8250_SAMOSA_PODPOINT
++ tristate "Support Samosa UART on PodPoint"
++ depends on SERIAL_8250 != n && SAMOSA && SERIAL_8250_MANY_PORTS
++ default m
++ help
++ Say Y here if you have a PodPoint on your Samosa bus.
++
++ To compile this driver as a module, choose M here: the module
++ will be called 8250_samosa_podpoint.
++
+ config SERIAL_8250_FOURPORT
+ tristate "Support Fourport cards"
+ depends on SERIAL_8250 != n && ISA && SERIAL_8250_MANY_PORTS
+Index: linux-2.6.31/drivers/serial/Makefile
+===================================================================
+--- linux-2.6.31.orig/drivers/serial/Makefile 2009-09-09 23:13:59.000000000 +0100
++++ linux-2.6.31/drivers/serial/Makefile 2010-01-12 04:10:59.000000000 +0000
+@@ -79,3 +79,4 @@
+ obj-$(CONFIG_KGDB_SERIAL_CONSOLE) += kgdboc.o
+ obj-$(CONFIG_SERIAL_QE) += ucc_uart.o
+ obj-$(CONFIG_SERIAL_TIMBERDALE) += timbuart.o
++obj-$(CONFIG_SERIAL_8250_SAMOSA_PODPOINT) += 8250_samosa_podpoint.o
+Index: linux-2.6.31/drivers/serial/serial_core.c
+===================================================================
+--- linux-2.6.31.orig/drivers/serial/serial_core.c 2009-09-09 23:13:59.000000000 +0100
++++ linux-2.6.31/drivers/serial/serial_core.c 2010-01-12 04:09:34.000000000 +0000
+@@ -2146,6 +2146,10 @@
+ snprintf(address, sizeof(address),
+ "MMIO 0x%llx", (unsigned long long)port->mapbase);
+ break;
++ case UPIO_SAMOSA:
++ snprintf(address, sizeof(address),
++ "Samosa 0x%02x", port->iobase);
++ break;
+ default:
+ strlcpy(address, "*unknown*", sizeof(address));
+ break;
+Index: linux-2.6.31/drivers/serial/8250_samosa_podpoint.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.31/drivers/serial/8250_samosa_podpoint.c 2010-01-12 04:09:34.000000000 +0000
+@@ -0,0 +1,52 @@
++/*
++ * linux/drivers/serial/8250_samosa_podpoint.c
++ *
++ * Copyright (C) 2005 Russell King.
++ * Data taken from include/asm-i386/serial.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.
++ */
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/serial_8250.h>
++#include <mach/irqs.h>
++
++#define PORT(_base,_irq) \
++ { \
++ .iobase = _base, \
++ .irq = _irq, \
++ .uartclk = 7372800, \
++ .iotype = UPIO_SAMOSA, \
++ .flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ \
++ }
++
++static struct plat_serial8250_port samosa_podpoint_data[] = {
++ PORT(0x10, BALLOON3_SAMOSA_IRQ),
++ PORT(0x18, BALLOON3_SAMOSA_IRQ),
++ PORT(0x20, BALLOON3_SAMOSA_IRQ),
++ PORT(0x28, BALLOON3_SAMOSA_IRQ),
++ { },
++};
++
++static struct platform_device samosa_podpoint_device = {
++ .name = "serial8250",
++ .id = PLAT8250_DEV_SAMOSA_PODPOINT,
++ .dev = {
++ .platform_data = samosa_podpoint_data,
++ },
++};
++
++static int __init samosa_podpoint_init(void)
++{
++ pr_info("%s\n",__func__);
++
++ return platform_device_register(&samosa_podpoint_device);
++}
++
++module_init(samosa_podpoint_init);
++
++MODULE_AUTHOR("Martin-Jones Technology Ltd");
++MODULE_DESCRIPTION("8250 serial probe module for Balloon 3 Samosa bus on PodPoint");
++MODULE_LICENSE("GPL");
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-samosa.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,901 @@
+Balloon3 Samosa bus support
+
+Samosa is a simple 16-bit bus implemented in the FPGA or CPLD on
+balloon3. Balloon2 also supports the bus.
+
+from: Nick Bane <nick@cecomputing.co.uk>
+
+Signed-off-by: Wookey <wookey@wookware.org>
+
+Index: linux-2.6.34/drivers/char/Makefile
+===================================================================
+--- linux-2.6.34.orig/drivers/char/Makefile 2010-05-23 11:04:57.000000000 +0100
++++ linux-2.6.34/drivers/char/Makefile 2010-05-23 11:17:56.000000000 +0100
+@@ -111,6 +111,8 @@
+ obj-$(CONFIG_JS_RTC) += js-rtc.o
+ js-rtc-y = rtc.o
+
++obj-$(CONFIG_SAMOSA) += samosa.o
++
+ # Files generated that shall be removed upon make clean
+ clean-files := consolemap_deftbl.c defkeymap.c
+
+Index: linux-2.6.34/drivers/char/Kconfig
+===================================================================
+--- linux-2.6.34.orig/drivers/char/Kconfig 2010-05-23 11:04:57.000000000 +0100
++++ linux-2.6.34/drivers/char/Kconfig 2010-05-23 11:17:56.000000000 +0100
+@@ -1113,5 +1113,22 @@
+
+ source "drivers/s390/char/Kconfig"
+
++config SAMOSA
++ tristate "Balloon samosa bus"
++ depends on MACH_BALLOON3 || MACH_BALLOON2
++ default y
++ help
++ Simple IO bus (via FPGA/CPLD) on Balloonboard. 8 bit on
++ Balloon2, 8 or 16 bit on Balloon3. You normally want this
++ unless you are using the bus lines for something else.
++
++config PROC_SAMOSA
++ bool "Balloon samosa bus proc interface"
++ depends on SAMOSA
++ default n
++ help
++ Enable procfs access to samosa bus as /proc/samosa
++ writes are formatted as samosa_address data_byte
++
+ endmenu
+
+Index: linux-2.6.34/drivers/char/samosa.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.34/drivers/char/samosa.c 2010-05-23 11:19:48.000000000 +0100
+@@ -0,0 +1,784 @@
++/*
++ * drivers/char/samosa.c
++ * Author: Nick Bane
++ * Created: May 2005
++ * Copyright: Toby Churchill Ltd
++ *
++ * 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/samosa.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/err.h>
++#include <linux/slab.h>
++#include <linux/io.h>
++#include <linux/interrupt.h>
++#include <linux/irq.h>
++#ifdef CONFIG_PROC_SAMOSA
++#include <linux/proc_fs.h>
++#include <linux/ctype.h>
++#include <linux/uaccess.h>
++#endif
++
++#include <linux/kernel.h>
++
++#include <mach/hardware.h>
++#include <asm/mach-types.h>
++#include <asm/setup.h>
++
++#include <asm/mach/arch.h>
++
++#include <mach/pxa27x.h>
++#include <mach/balloon3.h>
++
++#include <linux/spinlock.h>
++
++static DEFINE_SPINLOCK(samosa_lock);
++
++#ifdef CONFIG_MACH_BALLOON3
++/* balloon3 version */
++
++/* Samosa bus on Balloon3 is dead simple. Address latching and
++ * read/write enable are taken care of automaticaly by FPGA/CPLD logic.
++ * So just write address to address register
++ * then read or write data from/to data register
++ */
++
++int samosa_read8(unsigned char reg)
++{
++ int ret;
++ unsigned long flags;
++ pr_debug("Samosa byte read:reg %x, ", reg);
++ spin_lock_irqsave(&samosa_lock, flags);
++ __raw_writel(reg, BALLOON3_SAMOSA_ADDR_REG);
++ ret = __raw_readl(BALLOON3_SAMOSA_DATA_REG);
++ spin_unlock_irqrestore(&samosa_lock, flags);
++ pr_debug("returned:%x\n", ret);
++ return ret;
++}
++EXPORT_SYMBOL_GPL(samosa_read8);
++
++void samosa_write8(unsigned char reg, unsigned char value)
++{
++ unsigned long flags;
++ pr_debug("Samosa byte write:value:%x to reg %x\n", value, reg);
++ spin_lock_irqsave(&samosa_lock, flags);
++ __raw_writel(reg, BALLOON3_SAMOSA_ADDR_REG);
++ __raw_writel(value, BALLOON3_SAMOSA_DATA_REG);
++ spin_unlock_irqrestore(&samosa_lock, flags);
++}
++EXPORT_SYMBOL_GPL(samosa_write8);
++
++void samosa_write_block8(unsigned char reg, const unsigned char *value,
++ unsigned int count)
++{
++ unsigned long flags;
++ pr_debug("Samosa block byte write:count %d\n", count);
++ spin_lock_irqsave(&samosa_lock, flags);
++ __raw_writel(reg, BALLOON3_SAMOSA_ADDR_REG);
++ while (count--)
++ __raw_writel(*(value)++, BALLOON3_SAMOSA_DATA_REG);
++ spin_unlock_irqrestore(&samosa_lock, flags);
++}
++EXPORT_SYMBOL_GPL(samosa_write_block8);
++
++void samosa_write_repeat8(unsigned char reg, unsigned char value,
++ unsigned int count)
++{
++ unsigned long flags;
++ pr_debug("Samosa repeat byte write:value:%x, count %d\n", value, count);
++ spin_lock_irqsave(&samosa_lock, flags);
++ __raw_writel(reg, BALLOON3_SAMOSA_ADDR_REG);
++ while (count--)
++ __raw_writel(value, BALLOON3_SAMOSA_DATA_REG);
++ spin_unlock_irqrestore(&samosa_lock, flags);
++}
++EXPORT_SYMBOL_GPL(samosa_write_repeat8);
++
++/* fixme - this should probably do something...*/
++int samosa_sm_present(void)
++{
++ return 0;
++}
++EXPORT_SYMBOL_GPL(samosa_sm_present);
++
++#endif
++
++/* samosa bus support */
++
++#define to_samosa_driver(drv) (container_of((drv), struct samosa_driver, \
++ driver))
++
++//static void samosa_bus_release(struct device *dev) {
++//}
++
++struct device samosa_bus = {
++ .init_name = "samosa",
++#if 0
++ .bus_id = "samosa",
++#endif
++// .release = samosa_bus_release,
++};
++EXPORT_SYMBOL_GPL(samosa_bus);
++
++struct samosa_object {
++ struct samosa_device sdev;
++ char name[1];
++};
++
++void samosa_device_put(struct samosa_device *sdev)
++{
++ if (sdev)
++ put_device(&sdev->dev);
++}
++EXPORT_SYMBOL_GPL(samosa_device_put);
++
++static void samosa_device_release(struct device *dev)
++{
++ struct samosa_object *sa = container_of(dev, struct samosa_object,
++ sdev.dev);
++
++ kfree(sa->sdev.dev.platform_data);
++ kfree(sa);
++}
++
++struct samosa_device *samosa_device_alloc(const char *name, int id)
++{
++ struct samosa_object *sa;
++
++ sa = kzalloc(sizeof(struct samosa_object) + strlen(name), GFP_KERNEL);
++ if (sa) {
++ strcpy(sa->name, name);
++ sa->sdev.name = sa->name;
++ sa->sdev.id = id;
++ device_initialize(&sa->sdev.dev);
++ sa->sdev.dev.release = samosa_device_release;
++ }
++
++ return sa ? &sa->sdev : NULL;
++}
++EXPORT_SYMBOL_GPL(samosa_device_alloc);
++
++int samosa_device_add(struct samosa_device *sdev)
++{
++ int ret = 0;
++
++ if (!sdev)
++ return -EINVAL;
++
++ if (!sdev->dev.parent)
++ sdev->dev.parent = &samosa_bus;
++
++ sdev->dev.bus = &samosa_bus_type;
++
++ if (sdev->id != -1)
++ dev_set_name(&sdev->dev, "%s.%d", sdev->name, sdev->id);
++ else
++ dev_set_name(&sdev->dev, "%s", sdev->name);
++
++ pr_debug("Registering samosa device '%s'. Parent at %s\n",
++ dev_name(&sdev->dev), dev_name(sdev->dev.parent));
++
++ ret = device_add(&sdev->dev);
++
++ return ret;
++}
++EXPORT_SYMBOL_GPL(samosa_device_add);
++
++void samosa_device_del(struct samosa_device *sdev)
++{
++ if (sdev)
++ device_del(&sdev->dev);
++}
++EXPORT_SYMBOL_GPL(samosa_device_del);
++
++int samosa_device_register(struct samosa_device *sdev)
++{
++ device_initialize(&sdev->dev);
++ return samosa_device_add(sdev);
++}
++EXPORT_SYMBOL_GPL(samosa_device_register);
++
++void samosa_device_unregister(struct samosa_device *sdev)
++{
++ samosa_device_del(sdev);
++ samosa_device_put(sdev);
++}
++EXPORT_SYMBOL_GPL(samosa_device_unregister);
++
++struct samosa_device *samosa_device_register_simple(const char *name, int id)
++{
++ struct samosa_device *sdev;
++ int retval;
++
++ sdev = samosa_device_alloc(name, id);
++ if (!sdev) {
++ retval = -ENOMEM;
++ goto error;
++ }
++
++
++ retval = samosa_device_add(sdev);
++ if (retval)
++ goto error;
++
++ return sdev;
++
++error:
++ samosa_device_put(sdev);
++ return ERR_PTR(retval);
++}
++EXPORT_SYMBOL_GPL(samosa_device_register_simple);
++
++static int samosa_drv_probe(struct device *_dev)
++{
++ struct samosa_driver *drv = to_samosa_driver(_dev->driver);
++ struct samosa_device *dev = to_samosa_device(_dev);
++
++ return drv->probe(dev);
++}
++
++static int samosa_drv_probe_fail(struct device *_dev)
++{
++ return -ENXIO;
++}
++
++static int samosa_drv_remove(struct device *_dev)
++{
++ struct samosa_driver *drv = to_samosa_driver(_dev->driver);
++ struct samosa_device *dev = to_samosa_device(_dev);
++
++ return drv->remove(dev);
++}
++
++static void samosa_drv_shutdown(struct device *_dev)
++{
++ struct samosa_driver *drv = to_samosa_driver(_dev->driver);
++ struct samosa_device *dev = to_samosa_device(_dev);
++
++ drv->shutdown(dev);
++}
++
++static int samosa_drv_suspend(struct device *_dev, pm_message_t state)
++{
++ struct samosa_driver *drv = to_samosa_driver(_dev->driver);
++ struct samosa_device *dev = to_samosa_device(_dev);
++
++ return drv->suspend(dev, state);
++}
++
++static int samosa_drv_resume(struct device *_dev)
++{
++ struct samosa_driver *drv = to_samosa_driver(_dev->driver);
++ struct samosa_device *dev = to_samosa_device(_dev);
++
++ return drv->resume(dev);
++}
++
++int samosa_driver_register(struct samosa_driver *drv)
++{
++ drv->driver.bus = &samosa_bus_type;
++ if (drv->probe)
++ drv->driver.probe = samosa_drv_probe;
++ if (drv->remove)
++ drv->driver.remove = samosa_drv_remove;
++ if (drv->shutdown)
++ drv->driver.shutdown = samosa_drv_shutdown;
++ if (drv->suspend)
++ drv->driver.suspend = samosa_drv_suspend;
++ if (drv->resume)
++ drv->driver.resume = samosa_drv_resume;
++ return driver_register(&drv->driver);
++}
++EXPORT_SYMBOL_GPL(samosa_driver_register);
++
++void samosa_driver_unregister(struct samosa_driver *drv)
++{
++ driver_unregister(&drv->driver);
++}
++EXPORT_SYMBOL_GPL(samosa_driver_unregister);
++
++
++/* modalias support enables more hands-off userspace setup:
++ * (a) environment variable lets new-style hotplug events work once system is
++ * fully running: "modprobe $MODALIAS"
++ * (b) sysfs attribute lets new-style coldplug recover from hotplug events
++ * mishandled before system is fully running: "modprobe $(cat modalias)"
++ */
++static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
++ char *buf)
++{
++ struct samosa_device *sdev = to_samosa_device(dev);
++ int len = snprintf(buf, PAGE_SIZE, "samosa:%s\n", sdev->name);
++
++ return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
++}
++
++static struct device_attribute samosa_dev_attrs[] = {
++ __ATTR_RO(modalias),
++ __ATTR_NULL,
++};
++
++static int samosa_uevent(struct device *dev, struct kobj_uevent_env *env)
++{
++ struct samosa_device *sdev = to_samosa_device(dev);
++
++ add_uevent_var(env, "MODALIAS=samosa:%s", sdev->name);
++ return 0;
++}
++
++static int samosa_match(struct device *dev, struct device_driver *drv)
++{
++ struct samosa_device *sdev = to_samosa_device(dev);
++// struct samosa_driver *sdrv = to_samosa_driver(drv);
++
++ /* do driver name match */
++ return (strcmp(sdev->name, drv->name) == 0);
++}
++
++
++#ifdef CONFIG_PM_SLEEP
++
++static int samosa_legacy_suspend(struct device *dev, pm_message_t mesg)
++{
++ struct samosa_driver *pdrv = to_samosa_driver(dev->driver);
++ struct samosa_device *pdev = to_samosa_device(dev);
++ int ret = 0;
++
++ if (dev->driver && pdrv->suspend)
++ ret = pdrv->suspend(pdev, mesg);
++
++ return ret;
++}
++
++static int samosa_legacy_suspend_late(struct device *dev, pm_message_t mesg)
++{
++ struct samosa_driver *pdrv = to_samosa_driver(dev->driver);
++ struct samosa_device *pdev = to_samosa_device(dev);
++ int ret = 0;
++
++ if (dev->driver && pdrv->suspend_late)
++ ret = pdrv->suspend_late(pdev, mesg);
++
++ return ret;
++}
++
++static int samosa_legacy_resume_early(struct device *dev)
++{
++ struct samosa_driver *pdrv = to_samosa_driver(dev->driver);
++ struct samosa_device *pdev = to_samosa_device(dev);
++ int ret = 0;
++
++ if (dev->driver && pdrv->resume_early)
++ ret = pdrv->resume_early(pdev);
++
++ return ret;
++}
++
++static int samosa_legacy_resume(struct device *dev)
++{
++ struct samosa_driver *pdrv = to_samosa_driver(dev->driver);
++ struct samosa_device *pdev = to_samosa_device(dev);
++ int ret = 0;
++
++ if (dev->driver && pdrv->resume)
++ ret = pdrv->resume(pdev);
++
++ return ret;
++}
++
++static int samosa_pm_prepare(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (drv && drv->pm && drv->pm->prepare)
++ ret = drv->pm->prepare(dev);
++
++ return ret;
++}
++
++static void samosa_pm_complete(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++
++ if (drv && drv->pm && drv->pm->complete)
++ drv->pm->complete(dev);
++}
++
++
++#ifdef CONFIG_SUSPEND
++
++static int samosa_pm_suspend(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->suspend)
++ ret = drv->pm->suspend(dev);
++ } else {
++ ret = samosa_legacy_suspend(dev, PMSG_SUSPEND);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_suspend_noirq(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->suspend_noirq)
++ ret = drv->pm->suspend_noirq(dev);
++ } else {
++ ret = samosa_legacy_suspend_late(dev, PMSG_SUSPEND);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_resume(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->resume)
++ ret = drv->pm->resume(dev);
++ } else {
++ ret = samosa_legacy_resume(dev);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_resume_noirq(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->resume_noirq)
++ ret = drv->pm->resume_noirq(dev);
++ } else {
++ ret = samosa_legacy_resume_early(dev);
++ }
++
++ return ret;
++}
++
++#else /* !CONFIG_SUSPEND */
++
++#define samosa_pm_suspend NULL
++#define samosa_pm_resume NULL
++#define samosa_pm_suspend_noirq NULL
++#define samosa_pm_resume_noirq NULL
++
++#endif /* !CONFIG_SUSPEND */
++
++#ifdef CONFIG_HIBERNATION
++
++static int samosa_pm_freeze(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->freeze)
++ ret = drv->pm->freeze(dev);
++ } else {
++ ret = samosa_legacy_suspend(dev, PMSG_FREEZE);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_freeze_noirq(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->freeze_noirq)
++ ret = drv->pm->freeze_noirq(dev);
++ } else {
++ ret = samosa_legacy_suspend_late(dev, PMSG_FREEZE);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_thaw(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->thaw)
++ ret = drv->pm->thaw(dev);
++ } else {
++ ret = samosa_legacy_resume(dev);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_thaw_noirq(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->thaw_noirq)
++ ret = drv->pm->thaw_noirq(dev);
++ } else {
++ ret = samosa_legacy_resume_early(dev);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_poweroff(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->poweroff)
++ ret = drv->pm->poweroff(dev);
++ } else {
++ ret = samosa_legacy_suspend(dev, PMSG_HIBERNATE);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_poweroff_noirq(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->poweroff_noirq)
++ ret = drv->pm->poweroff_noirq(dev);
++ } else {
++ ret = samosa_legacy_suspend_late(dev, PMSG_HIBERNATE);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_restore(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->restore)
++ ret = drv->pm->restore(dev);
++ } else {
++ ret = samosa_legacy_resume(dev);
++ }
++
++ return ret;
++}
++
++static int samosa_pm_restore_noirq(struct device *dev)
++{
++ struct device_driver *drv = dev->driver;
++ int ret = 0;
++
++ if (!drv)
++ return 0;
++
++ if (drv->pm) {
++ if (drv->pm->restore_noirq)
++ ret = drv->pm->restore_noirq(dev);
++ } else {
++ ret = samosa_legacy_resume_early(dev);
++ }
++
++ return ret;
++}
++
++#else /* !CONFIG_HIBERNATION */
++
++#define samosa_pm_freeze NULL
++#define samosa_pm_thaw NULL
++#define samosa_pm_poweroff NULL
++#define samosa_pm_restore NULL
++#define samosa_pm_freeze_noirq NULL
++#define samosa_pm_thaw_noirq NULL
++#define samosa_pm_poweroff_noirq NULL
++#define samosa_pm_restore_noirq NULL
++
++#endif /* !CONFIG_HIBERNATION */
++
++static struct dev_pm_ops samosa_dev_pm_ops = {
++ .prepare = samosa_pm_prepare,
++ .complete = samosa_pm_complete,
++ .suspend = samosa_pm_suspend,
++ .resume = samosa_pm_resume,
++ .freeze = samosa_pm_freeze,
++ .thaw = samosa_pm_thaw,
++ .poweroff = samosa_pm_poweroff,
++ .restore = samosa_pm_restore,
++ .suspend_noirq = samosa_pm_suspend_noirq,
++ .resume_noirq = samosa_pm_resume_noirq,
++ .freeze_noirq = samosa_pm_freeze_noirq,
++ .thaw_noirq = samosa_pm_thaw_noirq,
++ .poweroff_noirq = samosa_pm_poweroff_noirq,
++ .restore_noirq = samosa_pm_restore_noirq,
++};
++
++#define SAMOSA_PM_OPS_PTR (&samosa_dev_pm_ops)
++
++#else /* !CONFIG_PM_SLEEP */
++
++#define SAMOSA_PM_OPS_PTR NULL
++
++#endif /* !CONFIG_PM_SLEEP */
++
++struct bus_type samosa_bus_type = {
++
++ .name = "samosa",
++ .dev_attrs = samosa_dev_attrs,
++ .match = samosa_match,
++ .uevent = samosa_uevent,
++ .pm = SAMOSA_PM_OPS_PTR,
++};
++EXPORT_SYMBOL_GPL(samosa_bus_type);
++
++#ifdef CONFIG_PROC_SAMOSA
++#define PROC_SAMOSA "samosa"
++static ssize_t proc_read_samosa(struct file *file, char *buf,
++ size_t nbytes, loff_t *ppos) {
++ int count = 0;
++ return count;
++}
++
++static ssize_t proc_write_samosa(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos) {
++ unsigned long samosa_addr;
++ unsigned long samosa_data;
++ char buf[40];
++ char *p = buf;
++ char *pp;
++
++ if (count >= (sizeof(buf) -1 ))
++ return -EFAULT;
++
++ if (copy_from_user(buf, buffer, count))
++ return -EFAULT;
++
++ buf[count] = 0;
++ while (isspace(*p))
++ p++;
++ samosa_addr = simple_strtoul(p,&pp,0);
++ if (pp && (pp > p)) {
++ p = pp;
++ while (isspace(*p))
++ p++;
++ samosa_data = simple_strtoul(p,&pp,0);
++ if (pp && (pp > p))
++ samosa_write8(samosa_addr, samosa_data);
++ else
++ pr_info("cannot parse data from <%s> address = 0x%lx\n",p,samosa_addr);
++ }
++ else
++ pr_info("cannot parse address from start of <%s>\n",buf);
++ return count;
++}
++
++static struct file_operations proc_samosa_operations = {
++ read: proc_read_samosa,
++ write: proc_write_samosa
++};
++
++static struct proc_dir_entry *proc_samosa;
++#endif
++
++static int __init samosa_bus_init(void)
++{
++ int error;
++
++ pr_info("Samosa device registration\n");
++ error = device_register(&samosa_bus);
++ if (error)
++ return error;
++ pr_info("Samosa bus registration\n");
++ error = bus_register(&samosa_bus_type);
++ if (error)
++ device_unregister(&samosa_bus);
++ if (!error) {
++ unsigned int ver;
++ set_irq_type(BALLOON3_FPGA_IRQ, IRQ_TYPE_EDGE_RISING);
++ pr_info("Samosa services initialised.\n");
++ ver = BALLOON3_VERSION_REG;
++ pr_info("VHDL logic version (memread):%08X\n", ver);
++#ifdef CONFIG_PROC_SAMOSA
++ proc_samosa = create_proc_entry(PROC_SAMOSA, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_samosa)
++ proc_samosa->proc_fops = &proc_samosa_operations;
++#endif
++ }
++ else
++ pr_info("Samosa services initialisation failed\n");
++ return error;
++}
++
++static void __exit samosa_bus_remove(void)
++{
++#ifdef CONFIG_PROC_SAMOSA
++ remove_proc_entry(PROC_SAMOSA, NULL);
++#endif
++
++ bus_unregister(&samosa_bus_type);
++ device_unregister(&samosa_bus);
++}
++
++module_init(samosa_bus_init);
++module_exit(samosa_bus_remove);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Nick Bane <nick@cecomputing.co.uk>");
++MODULE_DESCRIPTION("samosa bus interface\n");
+Index: linux-2.6.34/include/linux/samosa.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.34/include/linux/samosa.h 2010-05-23 11:07:15.000000000 +0100
+@@ -0,0 +1,58 @@
++/*
++ * drivers/char/samosa.h
++ * Author: Nick Bane
++ * Created: May 2005
++ * Copyright: Toby Churchill Ltd
++ *
++ * 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 _SAMOSA_H_
++#define _SAMOSA_H_
++
++#include "linux/device.h"
++#include "linux/interrupt.h"
++
++struct samosa_device {
++ const char *name;
++ int id;
++ struct device dev;
++};
++
++#define to_samosa_device(x) container_of((x), struct samosa_device, dev)
++
++extern int samosa_device_register(struct samosa_device *dev);
++extern void samosa_device_unregister(struct samosa_device *dev);
++
++extern struct bus_type samosa_bus_type;
++extern struct device samosa_bus;
++
++extern struct samosa_device *samosa_device_register_simple(const char *, int id);
++
++struct samosa_driver {
++ int (*probe)(struct samosa_device *);
++ int (*remove)(struct samosa_device *);
++ void (*shutdown)(struct samosa_device *);
++ int (*suspend)(struct samosa_device *, pm_message_t state);
++ int (*suspend_late)(struct samosa_device *, pm_message_t state);
++ int (*resume_early)(struct samosa_device *);
++ int (*resume)(struct samosa_device *);
++ struct device_driver driver;
++};
++
++extern int samosa_driver_register(struct samosa_driver *);
++extern void samosa_driver_unregister(struct samosa_driver *);
++
++#define samosa_get_drvdata(_dev) dev_get_drvdata(&(_dev)->dev)
++#define samosa_set_drvdata(_dev, data) dev_set_drvdata(&(_dev)->dev, (data))
++
++/* samosa bus access functions */
++extern int samosa_read8(unsigned char reg);
++extern void samosa_write8(unsigned char reg, unsigned char value);
++extern void samosa_write_block8(unsigned char reg, const unsigned char *value, unsigned int count);
++extern void samosa_write_repeat8(unsigned char reg, unsigned char value, unsigned int count);
++extern int samosa_sm_present(void);
++
++#endif
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-sl40.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-sl40.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-sl40.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,404 @@
+Index: linux-2.6.34/arch/arm/mach-pxa/include/mach/balloon3.h
+===================================================================
+--- linux-2.6.34.orig/arch/arm/mach-pxa/include/mach/balloon3.h 2010-05-23 11:18:02.000000000 +0100
++++ linux-2.6.34/arch/arm/mach-pxa/include/mach/balloon3.h 2010-05-23 11:31:46.000000000 +0100
+@@ -123,6 +123,8 @@
+ #define CPLD_SERIAL_LPR_CTS_BIT 3
+ #define CPLD_SERIAL_TC232_CTS_BIT 4
+ #define CPLD_SERIAL_TC232_DSR_BIT 5
++#define CPLD_SERIAL_GSM_RTS_BIT 6
++#define CPLD_SERIAL_GSM_DSR_BIT 7
+
+ #define CPLD_SROUTING_SET 0x0b
+ #define CPLD_SROUTING_CLR 0x1b
+Index: linux-2.6.34/drivers/serial/pxa.c
+===================================================================
+--- linux-2.6.34.orig/drivers/serial/pxa.c 2010-05-23 11:18:02.000000000 +0100
++++ linux-2.6.34/drivers/serial/pxa.c 2010-05-23 11:31:24.000000000 +0100
+@@ -24,6 +24,53 @@
+ * with the serial core maintainer satisfaction to appear soon.
+ */
+
++// gsm modem control line support
++//#define POLL_GSM_CTS
++
++#include "linux/samosa.h"
++#if defined(CONFIG_MACH_BALLOON2)
++#include <mach/balloon2.h>
++#endif
++#if defined(CONFIG_MACH_BALLOON3)
++#include <mach/balloon3.h>
++#endif
++
++#ifdef POLL_GSM_CTS
++#include "linux/kthread.h"
++struct task_struct *poll_gsm_cts_task;
++#endif
++
++static void gsm_uart_enable_dtr(void) {
++ samosa_write8(CPLD_SERIAL_CLR, 1 << CPLD_SERIAL_GSM_DTR_BIT);
++ pr_debug("%s: FFUART enable dtr done\n",__FUNCTION__);
++}
++
++static void gsm_uart_disable_dtr(void) {
++ samosa_write8(CPLD_SERIAL_SET, 1 << CPLD_SERIAL_GSM_DTR_BIT);
++ pr_debug("%s: FFUART disable dtr done\n",__FUNCTION__);
++}
++
++static void gsm_uart_enable_rts(void) {
++ samosa_write8(CPLD_SERIAL_CLR, 1 << CPLD_SERIAL_GSM_RTS_BIT);
++ pr_debug("%s: FFUART enable rts done\n",__FUNCTION__);
++}
++
++static void gsm_uart_disable_rts(void) {
++ samosa_write8(CPLD_SERIAL_SET, 1 << CPLD_SERIAL_GSM_RTS_BIT);
++ pr_debug("%s: FFUART disable rts done\n",__FUNCTION__);
++}
++
++static int gsm_uart_delta_cts;
++static int gsm_uart_last_cts;
++
++static int gsm_uart_get_cts(void) {
++ unsigned char serial_status = samosa_read8(CPLD_SERIAL_SET);
++ int gsm_uart_cts = (serial_status & ( 1 << CPLD_SERIAL_GSM_CTS_BIT)) ? 0:1;
++ if (gsm_uart_last_cts != gsm_uart_cts)
++ gsm_uart_delta_cts = 1;
++ gsm_uart_last_cts = gsm_uart_cts;
++ return gsm_uart_last_cts;
++}
+
+ #if defined(CONFIG_SERIAL_PXA_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+ #define SUPPORT_SYSRQ
+@@ -38,6 +85,7 @@
+ #include <linux/circ_buf.h>
+ #include <linux/delay.h>
+ #include <linux/interrupt.h>
++#include <linux/irq.h>
+ #include <linux/platform_device.h>
+ #include <linux/tty.h>
+ #include <linux/tty_flip.h>
+@@ -46,6 +94,9 @@
+ #include <linux/io.h>
+ #include <linux/slab.h>
+
++#include <mach/hardware.h>
++#include <mach/regs-uart.h>
++
+ struct uart_pxa_port {
+ struct uart_port port;
+ unsigned char ier;
+@@ -160,6 +211,19 @@
+ tty_flip_buffer_push(tty);
+ }
+
++static inline int tx_empty(struct uart_pxa_port *up) {
++ struct circ_buf *xmit = &up->port.state->xmit;
++ return uart_circ_empty(xmit);
++}
++
++static inline int tx_pending(struct uart_pxa_port *up) {
++ return !tx_empty(up);
++}
++
++static inline int tx_stopped(struct uart_pxa_port *up) {
++ return uart_tx_stopped(&up->port);
++}
++
+ static void transmit_chars(struct uart_pxa_port *up)
+ {
+ struct circ_buf *xmit = &up->port.state->xmit;
+@@ -171,6 +235,7 @@
+ up->port.x_char = 0;
+ return;
+ }
++
+ if (uart_circ_empty(xmit) || uart_tx_stopped(&up->port)) {
+ serial_pxa_stop_tx(&up->port);
+ return;
+@@ -188,9 +253,11 @@
+ if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+ uart_write_wakeup(&up->port);
+
+-
+ if (uart_circ_empty(xmit))
+ serial_pxa_stop_tx(&up->port);
++
++ if (up->port.mapbase == __PREG(FFUART))
++ pr_debug("%s: FFUART tx data complete\n",__FUNCTION__);
+ }
+
+ static void serial_pxa_start_tx(struct uart_port *port)
+@@ -209,6 +276,17 @@
+
+ status = serial_in(up, UART_MSR);
+
++ // update status with changes in gsm cts
++ if (up->port.mapbase == __PREG(FFUART)) {
++ gsm_uart_get_cts();
++ if (gsm_uart_delta_cts) {
++ gsm_uart_delta_cts = 0;
++ status |= UART_MSR_DCTS;
++ }
++ if (gsm_uart_last_cts)
++ status |= UART_MSR_CTS;
++ }
++
+ if ((status & UART_MSR_ANY_DELTA) == 0)
+ return;
+
+@@ -224,6 +302,30 @@
+ wake_up_interruptible(&up->port.state->port.delta_msr_wait);
+ }
+
++#ifdef POLL_GSM_CTS
++static int poll_gsm_cts_thread(void *data) {
++ struct uart_pxa_port *up = (struct uart_pxa_port *)data;
++ while (!kthread_should_stop()) {
++ unsigned long flags;
++ int poll_fast = 0;
++ spin_lock_irqsave(&up->port.lock, flags);
++ check_modem_status(up);
++ // if cts false
++ if (!gsm_uart_last_cts) {
++ struct circ_buf *xmit = &up->port.info->xmit;
++ // and something waiting, poll fast
++ if (!uart_circ_empty(xmit))
++ poll_fast = 1;
++ }
++ spin_unlock_irqrestore(&up->port.lock, flags);
++ if (!poll_fast)
++ msleep(250);
++ }
++ pr_debug("%s: FFUART poll cts thread exit\n",__FUNCTION__);
++ return 0;
++}
++#endif
++
+ /*
+ * This handles the interrupt from one port.
+ */
+@@ -244,6 +346,25 @@
+ return IRQ_HANDLED;
+ }
+
++/*
++ * This handles the interrupt from samosa associated with the gsm_uart
++ */
++static inline irqreturn_t serial_gsm_irq(int irq, void *dev_id)
++{
++ unsigned int lsr;
++ struct uart_pxa_port *up = dev_id;
++ lsr = serial_in(up, UART_LSR);
++ gsm_uart_delta_cts = 1;
++ // this is required to clear the interrupt
++ gsm_uart_get_cts();
++ // sets the start/stop tx
++ check_modem_status(up);
++ if (lsr & UART_LSR_THRE)
++ transmit_chars(up);
++// pr_debug("#");
++ return IRQ_HANDLED;
++}
++
+ static unsigned int serial_pxa_tx_empty(struct uart_port *port)
+ {
+ struct uart_pxa_port *up = (struct uart_pxa_port *)port;
+@@ -270,10 +391,29 @@
+ ret |= TIOCM_CAR;
+ if (status & UART_MSR_RI)
+ ret |= TIOCM_RNG;
+- if (status & UART_MSR_DSR)
+- ret |= TIOCM_DSR;
+- if (status & UART_MSR_CTS)
+- ret |= TIOCM_CTS;
++ if (up->port.mapbase == __PREG(FFUART)) {
++ unsigned char serial_status = samosa_read8(CPLD_SERIAL_SET);
++ if ((serial_status & ( 1 << CPLD_SERIAL_GSM_DSR_BIT)) == 0) {
++ ret |= TIOCM_DSR;
++ pr_debug("%s: FFUART DSR active\n",__FUNCTION__);
++ }
++ else
++ pr_debug("%s: FFUART DSR inactive\n",__FUNCTION__);
++ // clear delta cts flag
++ gsm_uart_delta_cts = 0;
++ if (gsm_uart_get_cts()) {
++ ret |= TIOCM_CTS;
++ pr_debug("%s: FFUART CTS active\n",__FUNCTION__);
++ }
++ else
++ pr_debug("%s: FFUART CTS inactive\n",__FUNCTION__);
++ }
++ else {
++ if (status & UART_MSR_DSR)
++ ret |= TIOCM_DSR;
++ if (status & UART_MSR_CTS)
++ ret |= TIOCM_CTS;
++ }
+ return ret;
+ }
+
+@@ -296,8 +436,20 @@
+ mcr |= up->mcr;
+
+ serial_out(up, UART_MCR, mcr);
++
++ if (up->port.mapbase == __PREG(FFUART)) {
++ if (mcr & UART_MCR_DTR)
++ gsm_uart_enable_dtr();
++ else
++ gsm_uart_disable_dtr();
++ if (mcr & UART_MCR_RTS)
++ gsm_uart_enable_rts();
++ else
++ gsm_uart_disable_rts();
++ }
+ }
+
++
+ static void serial_pxa_break_ctl(struct uart_port *port, int break_state)
+ {
+ struct uart_pxa_port *up = (struct uart_pxa_port *)port;
+@@ -358,6 +510,19 @@
+ return retval;
+
+ /*
++ * Allocate the samosa IRQ
++ */
++ if (up->port.mapbase == __PREG(FFUART)) {
++ retval = request_irq(BALLOON3_FPGA_IRQ, serial_gsm_irq, 0, "FPGA", up);
++ if (retval) {
++ pr_debug("%s: cannot obtain fpga irq\n",__FUNCTION__);
++ return retval;
++ }
++ set_irq_type(BALLOON3_FPGA_IRQ, IRQ_TYPE_EDGE_BOTH);
++ pr_info("%s: fpga irq obtained\n",__FUNCTION__);
++ }
++
++ /*
+ * Clear the FIFO buffers and disable them.
+ * (they will be reenabled in set_termios())
+ */
+@@ -400,6 +565,16 @@
+ (void) serial_in(up, UART_IIR);
+ (void) serial_in(up, UART_MSR);
+
++#ifdef POLL_GSM_CTS
++ if (up->port.mapbase == __PREG(FFUART)) {
++ poll_gsm_cts_task = kthread_create(poll_gsm_cts_thread, up, "%s", "poll_gsm_cts_thread");
++ if (poll_gsm_cts_task) {
++ wake_up_process(poll_gsm_cts_task);
++ pr_debug("%s: FFUART CTS polling started\n",__FUNCTION__);
++ }
++ }
++#endif
++
+ return 0;
+ }
+
+@@ -410,6 +585,14 @@
+
+ free_irq(up->port.irq, up);
+
++ if (up->port.mapbase == __PREG(FFUART)) {
++#ifdef POLL_GSM_CTS
++ kthread_stop(poll_gsm_cts_task);
++#endif
++ free_irq(BALLOON3_FPGA_IRQ, up);
++ pr_debug("%s: fpga irq released\n",__FUNCTION__);
++ }
++
+ /*
+ * Disable interrupts from this port
+ */
+@@ -531,10 +714,16 @@
+
+ serial_out(up, UART_IER, up->ier);
+
+- if (termios->c_cflag & CRTSCTS)
++ if (termios->c_cflag & CRTSCTS) {
+ up->mcr |= UART_MCR_AFE;
+- else
++ if (up->port.mapbase == __PREG(FFUART))
++ pr_debug("%s: CRTSCTS hardware handshaking set\n",__FUNCTION__);
++ }
++ else {
+ up->mcr &= ~UART_MCR_AFE;
++ if (up->port.mapbase == __PREG(FFUART))
++ pr_debug("%s: no CRTSCTS handshaking set\n",__FUNCTION__);
++ }
+
+ serial_out(up, UART_LCR, cval | UART_LCR_DLAB); /* set DLAB */
+ serial_out(up, UART_DLL, quot & 0xff); /* LS of divisor */
+@@ -560,10 +749,16 @@
+ {
+ struct uart_pxa_port *up = (struct uart_pxa_port *)port;
+
+- if (!state)
++ if (!state) {
+ clk_enable(up->clk);
+- else
++ if (up->port.mapbase == __PREG(FFUART))
++ gsm_uart_enable_rts();
++ }
++ else {
++ if (up->port.mapbase == __PREG(FFUART))
++ gsm_uart_disable_rts();
+ clk_disable(up->clk);
++ }
+ }
+
+ static void serial_pxa_release_port(struct uart_port *port)
+@@ -726,6 +921,7 @@
+ .verify_port = serial_pxa_verify_port,
+ };
+
++
+ static struct uart_driver serial_pxa_reg = {
+ .owner = THIS_MODULE,
+ .driver_name = "PXA serial",
+@@ -741,8 +937,11 @@
+ {
+ struct uart_pxa_port *sport = dev_get_drvdata(dev);
+
+- if (sport)
++ if (sport) {
+ uart_suspend_port(&serial_pxa_reg, &sport->port);
++ if (sport->port.mapbase == __PREG(FFUART))
++ gsm_uart_disable_rts();
++ }
+
+ return 0;
+ }
+@@ -751,8 +950,11 @@
+ {
+ struct uart_pxa_port *sport = dev_get_drvdata(dev);
+
+- if (sport)
++ if (sport) {
+ uart_resume_port(&serial_pxa_reg, &sport->port);
++ if (sport->port.mapbase == __PREG(FFUART))
++ gsm_uart_enable_rts();
++ }
+
+ return 0;
+ }
+Index: linux-2.6.34-rc7/arch/arm/mach-pxa/balloon3.c
+===================================================================
+--- linux-2.6.34-rc7.orig/arch/arm/mach-pxa/balloon3.c 2010-05-15 10:36:27.000000000 +0100
++++ linux-2.6.34-rc7/arch/arm/mach-pxa/balloon3.c 2010-05-15 10:36:44.000000000 +0100
+@@ -326,6 +326,15 @@
+
+ pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config));
+
++#ifdef CONFIG_SL40
++ // set ac97 bus controller to hold codec in reset
++ // needed to clobber whine on sl40
++ GCR &= GCR_COLD_RST; /* clear everything but nCRST */
++ pr_info("Initialising Balloon3\n");
++ GCR &= ~GCR_COLD_RST; /* then assert nCRST */
++ pr_info("Adding support for sl40\n");
++#endif
++
+ platform_device_register(&balloon3led_device);
+ }
+
\ No newline at end of file
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-tsl2560.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-tsl2560.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-tsl2560.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,587 @@
+Index: linux-2.6.29.1/drivers/char/Kconfig
+===================================================================
+--- linux-2.6.29.1.orig/drivers/char/Kconfig 2009-09-03 07:35:19.000000000 +0100
++++ linux-2.6.29.1/drivers/char/Kconfig 2009-09-03 07:35:19.000000000 +0100
+@@ -673,6 +673,13 @@
+ help
+ Densitron LMR5428 LCD display driven down Samosa bus (for Balloonboard).
+
++config TSL2560
++ tristate "TSL2560 Light sensor"
++ depends on SAMOSA
++ default m
++ help
++ TSL2560 light sensor driven down Samosa bus (for Balloonboard).
++
+ config HVCS
+ tristate "IBM Hypervisor Virtual Console Server support"
+ depends on PPC_PSERIES
+Index: linux-2.6.29.1/drivers/char/Makefile
+===================================================================
+--- linux-2.6.29.1.orig/drivers/char/Makefile 2009-09-03 07:35:19.000000000 +0100
++++ linux-2.6.29.1/drivers/char/Makefile 2009-09-03 07:35:19.000000000 +0100
+@@ -113,6 +113,7 @@
+
+ obj-$(CONFIG_SAMOSA) += samosa.o
+ obj-$(CONFIG_LMR5428) += lmr5428.o
++obj-$(CONFIG_TSL2560) += tsl2560.o
+
+ # Files generated that shall be removed upon make clean
+ clean-files := consolemap_deftbl.c defkeymap.c
+Index: linux-2.6.29.1/drivers/char/tsl2560.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ linux-2.6.29.1/drivers/char/tsl2560.c 2009-09-03 07:40:13.000000000 +0100
+@@ -0,0 +1,552 @@
++/*
++ * linux/drivers/char/tsl2560.c
++ *
++ * file interface for Taos TSL2560 light sensor on the balloon samosa bus
++ * Copyright (c) Chris Jones, Martin-Jones Technology Ltd 2009
++ *
++*/
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/fs.h>
++#include <linux/uaccess.h>
++
++#if defined(CONFIG_MACH_BALLOON2)
++#include <mach/balloon2.h>
++#endif
++#if defined(CONFIG_MACH_BALLOON3)
++#include <mach/balloon3.h>
++#endif
++#include <asm/cacheflush.h>
++
++#include <linux/delay.h>
++#include <linux/device.h>
++#include <linux/proc_fs.h>
++#include <linux/vmalloc.h>
++#include <linux/platform_device.h>
++#include <linux/spinlock.h>
++#include "linux/cdev.h"
++#include <linux/samosa.h>
++
++#define SAMOSA_I2C_ADDR_SET 0x06
++#define SAMOSA_I2C_ADDR_CLEAR 0x86
++#define SAMOSA_I2C_ADDR_READ 0x06
++#define I2C_SCL_MASK (1<<6)
++#define I2C_SDA_WRITE_MASK (1<<7)
++#define I2C_SDA_READ_MASK (1<<7)
++
++#define I2C_SDA_SET samosa_write8(SAMOSA_I2C_ADDR_SET,I2C_SDA_WRITE_MASK)
++#define I2C_SDA_CLEAR samosa_write8(SAMOSA_I2C_ADDR_CLEAR,I2C_SDA_WRITE_MASK)
++#define I2C_SCL_SET samosa_write8(SAMOSA_I2C_ADDR_SET,I2C_SCL_MASK)
++#define I2C_SCL_CLEAR samosa_write8(SAMOSA_I2C_ADDR_CLEAR,I2C_SCL_MASK)
++#define I2C_SDA_READ (samosa_read8(SAMOSA_I2C_ADDR_READ)&I2C_SDA_READ_MASK)
++
++/* this corresponds to the ADDR SEL pin being grounded */
++/* note that I2C addresses are only bits 7..1 because bit 0 is R/nW */
++#define TSL2560_I2C_ADDRESS 0x52
++#define TSL2560_I2C_ADDRESS_WRITE (TSL2560_I2C_ADDRESS)
++#define TSL2560_I2C_ADDRESS_READ (TSL2560_I2C_ADDRESS | 0x01)
++
++#define TSL2560_REG_CONTROL 0x00
++#define TSL2560_REG_TIMING 0x01
++#define TSL2560_REG_THRESHLOWLOW 0x02
++#define TSL2560_REG_THRESHLOWHIGH 0x03
++#define TSL2560_REG_THRESHHIGHLOW 0x04
++#define TSL2560_REG_THRESHHIGHHIGH 0x05
++#define TSL2560_REG_INTERRUPT 0x06
++#define TSL2560_REG_ID 0x0a
++#define TSL2560_REG_DATA0LOW 0x0c
++#define TSL2560_REG_DATA0HIGH 0x0d
++#define TSL2560_REG_DATA1LOW 0x0e
++#define TSL2560_REG_DATA1HIGH 0x0f
++
++/* character device start number */
++static dev_t dev;
++
++static spinlock_t tsl2560_lock;
++
++/* tsl2560 per device data */
++static struct tsl2560_dev {
++ struct cdev cdev;
++} tsl2560;
++
++/* I2C functions */
++static void i2c_clock_pulse(void);
++static unsigned char i2c_clock_pulse_read(void);
++static void i2c_write_byte (unsigned char data);
++static unsigned char i2c_read_byte (void);
++static void i2c_start(void);
++static void i2c_ack(void);
++static void i2c_nak(void);
++static void i2c_stop(void);
++static unsigned char i2c_read_ack(void);
++
++static void tsl2560_write_cmd_byte(unsigned char command, unsigned char data);
++static unsigned char tsl2560_read_cmd_byte(unsigned char command);
++static void tsl2560_write_cmd_word(unsigned char command, unsigned int data);
++static unsigned int tsl2560_read_cmd_word(unsigned char command);
++
++static void tsl2560_init_hardware(void);
++static unsigned char tsl2560_id(void);
++static unsigned int tsl2560_channel0(void);
++static unsigned int tsl2560_channel1(void);
++
++static void i2c_clock_pulse(void) {
++ I2C_SCL_SET;
++ udelay(10);
++ I2C_SCL_CLEAR;
++ udelay(10);
++}
++
++static unsigned char i2c_clock_pulse_read(void) {
++ unsigned char b;
++
++ I2C_SCL_CLEAR;
++ udelay(1);
++ I2C_SDA_SET;
++ udelay(9);
++ I2C_SCL_SET;
++ udelay(1);
++ b=I2C_SDA_READ;
++ udelay(9);
++// pr_info("%s: %d\n",__func__,b);
++ I2C_SCL_CLEAR;
++ return b;
++}
++
++static void i2c_write_byte (unsigned char data) {
++ int n;
++
++ for(n=0;n<8;n++) {
++ I2C_SCL_CLEAR;
++ udelay(1);
++ if(data&0x80) {
++// pr_info("%s: 1\n",__func__);
++ I2C_SDA_SET;
++ } else {
++// pr_info("%s: 0\n",__func__);
++ I2C_SDA_CLEAR;
++ }
++ udelay(9);
++ I2C_SCL_SET;
++ udelay(10);
++ data<<=1;
++ }
++}
++
++static unsigned char i2c_read_byte (void){
++ int n;
++ unsigned char data=0;
++
++ for(n=0;n<8;n++) {
++ data|=i2c_clock_pulse_read()?0x01:0;
++ data<<=1;
++ }
++
++ return data;
++}
++
++static void i2c_start(void){
++// pr_info("%s\n",__func__);
++ I2C_SDA_SET;
++ udelay(1);
++ I2C_SCL_SET;
++ udelay(20);
++ I2C_SDA_CLEAR;
++ udelay(10);
++}
++
++static void i2c_ack(void) {
++// pr_info("%s\n",__func__);
++ I2C_SCL_CLEAR;
++ udelay(1);
++ I2C_SDA_CLEAR;
++ udelay(9);
++ I2C_SCL_SET;
++ udelay(20);
++ I2C_SCL_CLEAR;
++}
++
++static void i2c_nak(void) {
++// pr_info("%s\n",__func__);
++ I2C_SCL_CLEAR;
++ udelay(1);
++ I2C_SDA_SET;
++ udelay(9);
++ I2C_SCL_SET;
++ udelay(10);
++ I2C_SCL_CLEAR;
++}
++
++static void i2c_stop(void) {
++// pr_info("%s\n",__func__);
++ I2C_SDA_CLEAR;
++ udelay(1);
++ I2C_SCL_SET;
++ udelay(10);
++ I2C_SDA_SET;
++ udelay(10);
++}
++
++static unsigned char i2c_read_ack(void) {
++ unsigned char b;
++
++ I2C_SCL_CLEAR;
++ udelay(1);
++ I2C_SDA_SET;
++ udelay(9);
++ I2C_SCL_SET;
++ udelay(1);
++ b=I2C_SDA_READ;
++ udelay(20);
++// pr_info("%s: %d\n",__func__,b);
++ I2C_SCL_CLEAR;
++ udelay(5);
++ return b;
++
++}
++
++static void tsl2560_write_cmd_byte(unsigned char command, unsigned char data) {
++ i2c_start();
++ i2c_write_byte(TSL2560_I2C_ADDRESS_WRITE);
++ i2c_read_ack();
++ i2c_write_byte(command);
++ i2c_read_ack();
++ i2c_write_byte(data);
++ i2c_read_ack();
++ i2c_stop();
++}
++
++static unsigned char tsl2560_read_cmd_byte(unsigned char command) {
++ unsigned char b;
++
++ i2c_start();
++ i2c_write_byte(TSL2560_I2C_ADDRESS_WRITE);
++ i2c_read_ack();
++ i2c_write_byte(command);
++ i2c_read_ack();
++ i2c_start();
++ i2c_write_byte(TSL2560_I2C_ADDRESS_READ);
++ i2c_read_ack();
++ b=i2c_read_byte();
++ i2c_ack();
++ i2c_stop();
++
++ return b;
++}
++
++static void tsl2560_write_cmd_word(unsigned char command, unsigned int data) {
++ i2c_start();
++ i2c_write_byte(TSL2560_I2C_ADDRESS_WRITE);
++ i2c_read_ack();
++ i2c_write_byte(command);
++ i2c_read_ack();
++ i2c_write_byte(data&0xff);
++ i2c_read_ack();
++ i2c_write_byte((data&0xff00)>>8);
++ i2c_read_ack();
++ i2c_stop();
++}
++
++static unsigned int tsl2560_read_cmd_word(unsigned char command) {
++ unsigned int b;
++
++ i2c_start();
++ i2c_write_byte(TSL2560_I2C_ADDRESS_WRITE);
++ i2c_read_ack();
++ i2c_write_byte(command);
++ i2c_read_ack();
++ i2c_start();
++ i2c_write_byte(TSL2560_I2C_ADDRESS_READ);
++ i2c_read_ack();
++ b=i2c_read_byte();
++ i2c_ack();
++ b|=(i2c_read_byte()<<8);
++ i2c_ack();
++ i2c_stop();
++
++ return b;
++}
++
++static void tsl2560_init_hardware(void) {
++ tsl2560_write_cmd_byte(TSL2560_REG_CONTROL,0x03);
++}
++
++static unsigned char tsl2560_id(void) {
++ return tsl2560_read_cmd_byte(TSL2560_REG_ID);
++}
++
++static unsigned int tsl2560_channel0(void) {
++ return tsl2560_read_cmd_word(TSL2560_REG_DATA0LOW);
++}
++
++static unsigned int tsl2560_channel1(void) {
++ return tsl2560_read_cmd_word(TSL2560_REG_DATA1LOW);
++}
++
++static ssize_t tsl2560_read(struct file *, char *, size_t, loff_t *);
++static ssize_t tsl2560_write(struct file *, const char *, size_t, loff_t *);
++static int tsl2560_open(struct inode *, struct file *);
++static int tsl2560_release(struct inode *, struct file *);
++static int tsl2560_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
++static int tsl2560_mmap(struct file *, struct vm_area_struct *vm);
++
++static struct file_operations tsl2560_fops = {
++ read: tsl2560_read,
++ write: tsl2560_write,
++ open: tsl2560_open,
++ release: tsl2560_release,
++ ioctl: tsl2560_ioctl,
++ mmap: tsl2560_mmap,
++};
++
++/* proc interface */
++static ssize_t proc_read_tsl2560(struct file *file, char *buf,
++ size_t nbytes, loff_t *ppos);
++static ssize_t proc_write_tsl2560(struct file *file, const char *buffer,
++ size_t count, loff_t *ppos);
++
++static struct file_operations proc_tsl2560_operations = {
++ read: proc_read_tsl2560,
++ write: proc_write_tsl2560
++};
++static struct proc_dir_entry *proc_tsl2560;
++#define PROC_TSL2560 "tsl2560"
++
++static int tsl2560_open(struct inode *inode, struct file *filp)
++{
++ struct tsl2560_dev *tsl2560_devp;
++
++ if (samosa_sm_present())
++ return -ENODEV;
++
++ tsl2560_devp = container_of(inode->i_cdev, struct tsl2560_dev, cdev);
++ filp->private_data = tsl2560_devp;
++
++ return 0;
++}
++
++static int tsl2560_release(struct inode *inode, struct file *filp)
++{
++ return 0;
++}
++
++static ssize_t tsl2560_read(struct file *filp, char *buf,
++ size_t size, loff_t *offp)
++{
++ char outputbuf[80];
++ int count = 0;
++
++ /* all done in a single read */
++ if (*offp > 0)
++ return 0;
++
++ count += sprintf(&outputbuf[count], "0x%04x 0x%04x\n", tsl2560_channel0(),tsl2560_channel1());
++
++ if (count > size) /* Assume output can be read at one time */
++ return -EINVAL;
++ if (copy_to_user(buf, outputbuf, count))
++ return -EFAULT;
++ *offp += count;
++ return count;
++}
++
++static ssize_t tsl2560_write(struct file *filp, const char *buf,
++ size_t size, loff_t *offp)
++{
++ /* we don't support writing at the moment */
++ return -EINVAL;
++}
++
++/* maybe this will be handy in due course */
++static int tsl2560_ioctl(struct inode *inode, struct file *flip,
++ unsigned int command, unsigned long arg)
++{
++ int err;
++ err = -EINVAL;
++ return err;
++}
++
++static int tsl2560_mmap(struct file *filp, struct vm_area_struct *vma)
++{
++ /*struct tsl2560_dev *mp = (struct tsl2560_dev *)filp->private_data;*/
++
++ return -EINVAL;
++}
++
++
++static int proc_read_tsl2560(struct file *filp, char *buf,
++ size_t nbytes, loff_t *ppos)
++{
++ char outputbuf[512];
++ int count = 0;
++
++ /* all done in a single read */
++ if (*ppos > 0)
++ return 0;
++
++ count += sprintf(&outputbuf[count], "tsl2560: major dev = %d\n", MAJOR(dev));
++
++ if (count > nbytes) /* Assume output can be read at one time */
++ return -EINVAL;
++ if (copy_to_user(buf, outputbuf, count))
++ return -EFAULT;
++ *ppos += count;
++ return count;
++}
++
++static ssize_t proc_write_tsl2560(struct file *filp, const char *buffer,
++ size_t count, loff_t *ppos)
++{
++ /* struct tsl2560_dev *mp= (struct tsl2560_dev *)filp->private_data;
++ * if (strncmp(buff,"reset:",6)==0)
++ * newRegValue = simple_strtoul(buffer,&endp,0);
++ * a bold but simple claim is to have read it all
++ */
++ return count;
++}
++
++
++/* driver initialisation */
++
++static int __init tsl2560_probe(struct samosa_device *pdev)
++{
++#ifndef CONFIG_BALLOON2_BUILD_TCL_PIKEY2
++ /* if smart media present - cpld cannot be so declare invalid */
++ if (samosa_sm_present()) {
++ dev_info(&pdev->dev, "%s: samosa bus not present\n", __func__);
++ return -ENODEV;
++ }
++#endif
++
++
++ tsl2560_init_hardware();
++
++ dev_info(&pdev->dev, "TSL2560 light sensor support installed. Chip ID=0x%02x\n",tsl2560_id());
++
++ return 0;
++}
++
++static int __exit tsl2560_remove(struct samosa_device *dev)
++{
++ samosa_set_drvdata(dev, NULL);
++ return 0;
++}
++
++#ifdef CONFIG_PM
++static int tsl2560_suspend(struct samosa_device *dev, pm_message_t state)
++{
++ return 0;
++}
++
++static int tsl2560_resume(struct samosa_device *dev)
++{
++ return 0;
++}
++#else /* CONFIG_PM */
++#define tsl2560_suspend NULL
++#define tsl2560_resume NULL
++#endif /* CONFIG_PM */
++
++#define tsl2560_shutdown NULL
++
++/* driver definition */
++static struct samosa_driver tsl2560_driver = {
++ .probe = tsl2560_probe,
++ .shutdown = tsl2560_shutdown,
++ .remove = __exit_p(tsl2560_remove),
++ .suspend = tsl2560_suspend,
++ .resume = tsl2560_resume,
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = "tsl2560",
++ },
++};
++
++/* bus device */
++static struct samosa_device *tsl2560_device;
++
++/* class object */
++static struct class *tsl2560_class;
++
++static int __init tsl2560_init(void)
++{
++ int ret;
++
++ /* general initialisation */
++ spin_lock_init(&tsl2560_lock);
++
++ /* register a range of device nodes */
++ ret = alloc_chrdev_region(&dev, 0, 1, "tsl2560");
++ if (ret)
++ goto error;
++
++ /* create the tsl2560 character devices */
++ /* initialise character device */
++ cdev_init(&tsl2560.cdev, &tsl2560_fops);
++ /* claim ownership */
++ tsl2560.cdev.owner = THIS_MODULE;
++ /* add character device */
++ ret = cdev_add(&tsl2560.cdev, dev, 1);
++ if (ret) {
++ goto error_region;
++ }
++
++ /* create the class and devices */
++ tsl2560_class = class_create(THIS_MODULE, "tsl2560");
++
++ if (!device_create(tsl2560_class, NULL, (dev), NULL, "tsl2560"))
++ goto error_class_device;
++ /* register the device on a bus. */
++ tsl2560_device = samosa_device_register_simple("tsl2560", 0);
++ if (!tsl2560_device)
++ goto error_bus;
++
++ /* create proc access to displays */
++ proc_tsl2560 = create_proc_entry(PROC_TSL2560, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, NULL);
++ if (proc_tsl2560)
++ proc_tsl2560->proc_fops = &proc_tsl2560_operations;
++
++ /* register the driver */
++ return samosa_driver_register(&tsl2560_driver);
++
++error_bus:
++ /* remove samosa device */
++ samosa_device_unregister(tsl2560_device);
++error_class_device:
++ device_destroy(tsl2560_class, dev);
++error_region:
++ unregister_chrdev_region(dev, 1);
++error:
++ return ret;
++}
++
++static void __exit tsl2560_exit(void)
++{
++ /* remove proc entry */
++ remove_proc_entry(PROC_TSL2560, NULL);
++
++ /* remove class device */
++ device_destroy(tsl2560_class, (dev));
++
++ /* remove samosa device */
++ samosa_device_unregister(tsl2560_device);
++
++ /* remove character device */
++ cdev_del(&tsl2560.cdev);
++ /* remove driver */
++ samosa_driver_unregister(&tsl2560_driver);
++
++ /* unregister region */
++ unregister_chrdev_region(dev, 1);
++
++ /* remove class */
++ class_destroy(tsl2560_class);
++}
++
++module_init(tsl2560_init);
++module_exit(tsl2560_exit);
++
++MODULE_AUTHOR("Chris Jones <chris@martin-jones.com>");
++MODULE_DESCRIPTION("TSL2560 light sensor via samosa bus on Balloon");
++MODULE_LICENSE("GPL");
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-vga.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-vga.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3-vga.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,196 @@
+Balloon3 VGA support
+
+Adds support for VGA and SVGA displays via the dev board.
+Includes generic support for PCDDIV LCCR4 bit (odd pixclock divisors)
+
+from: Nick Bane <nick@cecomputing.co.uk>
+
+Signed-off-by: Wookey <wookey@wookware.org>
+
+Index: linux-2.6.36-rc1/arch/arm/mach-pxa/Kconfig
+===================================================================
+--- linux-2.6.36-rc1.orig/arch/arm/mach-pxa/Kconfig 2010-08-16 01:41:37.000000000 +0100
++++ linux-2.6.36-rc1/arch/arm/mach-pxa/Kconfig 2010-08-22 16:59:07.000000000 +0100
+@@ -51,6 +51,7 @@
+
+ comment "Third Party Dev Platforms (sorted by vendor name)"
+
++
+ config ARCH_PXA_IDP
+ bool "Accelent Xscale IDP"
+ select PXA25x
+@@ -79,6 +80,32 @@
+ select IWMMXT
+ select PXA_HAVE_BOARD_IRQS
+
++ choice
++ prompt "Balloon 3 LCD configuration"
++
++ config BALLOON3_TOPPOLY
++ bool "Toppoly LCD panel on Balloon3"
++ depends on MACH_BALLOON3
++
++config BALLOON3_VGA
++ bool "VGA (640x480 62Hz) monitor output"
++ help
++ Say Y to add support for VGA output
++ on a Balloon3 board
++
++config BALLOON3_SVGA
++ bool "SVGA (800x600 52Hz) monitor output"
++ help
++ Say Y to add support for SVGA output
++ on a Balloon3 board
++
++config BALLOON3_NODISPLAY
++ bool "No LCD output"
++ help
++ Say Y for no LCD output on Balloon3
++
++endchoice
++
+ config MACH_CSB726
+ bool "Enable Cogent CSB726 System On a Module"
+ select PXA27x
+Index: linux-2.6.36-rc1/drivers/video/pxafb.c
+===================================================================
+--- linux-2.6.36-rc1.orig/drivers/video/pxafb.c 2010-08-16 01:41:37.000000000 +0100
++++ linux-2.6.36-rc1/drivers/video/pxafb.c 2010-08-22 16:59:07.000000000 +0100
+@@ -60,6 +60,7 @@
+ #include <asm/irq.h>
+ #include <asm/div64.h>
+ #include <mach/bitfield.h>
++#include <mach/regs-lcd.h>
+ #include <mach/pxafb.h>
+
+ /*
+@@ -984,9 +985,11 @@
+ * speeds */
+ pcd = (unsigned long long)(clk_get_rate(fbi->clk) / 10000);
+ pcd *= pixclock;
+- do_div(pcd, 100000000 * 2);
+- /* no need for this, since we should subtract 1 anyway. they cancel */
+- /* pcd += 1; */ /* make up for integer math truncations */
++ /* also take into account LCCR4 PCDDIV bit */
++ if (LCCR4 & LCCR4_PCDDIV)
++ do_div(pcd, 100000000);
++ else
++ do_div(pcd, 100000000 * 2);
+ return (unsigned int)pcd;
+ }
+
+@@ -1405,6 +1408,7 @@
+ pr_debug("reg_lccr1 0x%08x\n", (unsigned int) fbi->reg_lccr1);
+ pr_debug("reg_lccr2 0x%08x\n", (unsigned int) fbi->reg_lccr2);
+ pr_debug("reg_lccr3 0x%08x\n", (unsigned int) fbi->reg_lccr3);
++ pr_debug("reg_lccr4 0x%08x\n", (unsigned int) fbi->reg_lccr4);
+
+ /* enable LCD controller clock */
+ clk_enable(fbi->clk);
+@@ -1619,7 +1623,7 @@
+ case CPUFREQ_POSTCHANGE:
+ pcd = get_pcd(fbi, fbi->fb.var.pixclock);
+ set_hsync_time(fbi, pcd);
+- fbi->reg_lccr3 = (fbi->reg_lccr3 & ~0xff) |
++ fbi->reg_lccr3 = (fbi->reg_lccr3 & ~(LCCR3_PCD)) |
+ LCCR3_PixClkDiv(pcd);
+ set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE);
+ break;
+@@ -1737,6 +1741,7 @@
+ fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff);
+ fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0;
+ fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0;
++ fbi->lccr4 |= (lcd_conn & LCD_PCLK_DIV_ODD) ? LCCR4_PCDDIV : 0;
+
+ decode_mode:
+ pxafb_setmode(&fbi->fb.var, &inf->modes[0]);
+@@ -2051,6 +2056,8 @@
+ (inf->modes->upper_margin || inf->modes->lower_margin))
+ dev_warn(dev, "Upper and lower margins must be 0 in "
+ "passive mode\n");
++ if ((inf->lccr4 & LCCR4_PCDDIV) && ((inf->lccr3 & LCCR3_PCD) < 1))
++ dev_warn(dev, "Invalid pixel clock register settings\n");
+ }
+ #else
+ #define pxafb_check_options(...) do {} while (0)
+Index: linux-2.6.36-rc1/arch/arm/mach-pxa/include/mach/pxafb.h
+===================================================================
+--- linux-2.6.36-rc1.orig/arch/arm/mach-pxa/include/mach/pxafb.h 2010-08-16 01:41:37.000000000 +0100
++++ linux-2.6.36-rc1/arch/arm/mach-pxa/include/mach/pxafb.h 2010-08-22 16:59:07.000000000 +0100
+@@ -61,6 +61,7 @@
+ #define LCD_PCLK_EDGE_RISE (0 << 19)
+ #define LCD_PCLK_EDGE_FALL (1 << 19)
+ #define LCD_ALTERNATE_MAPPING (1 << 20)
++#define LCD_PCLK_DIV_ODD (1 << 21)
+
+ /*
+ * This structure describes the machine which we are running on.
+@@ -146,8 +147,8 @@
+ u_int lccr3;
+ /* The following should be defined in LCCR4
+ * LCCR4_PAL_FOR_0 or LCCR4_PAL_FOR_1 or LCCR4_PAL_FOR_2
++ * LCCR4_PCDDIV (if odd pixclock divisor required)
+ *
+- * All other bits in LCCR4 should be left alone.
+ */
+ u_int lccr4;
+ void (*pxafb_backlight_power)(int);
+Index: linux-2.6.36-rc1/drivers/video/fbmem.c
+===================================================================
+--- linux-2.6.36-rc1.orig/drivers/video/fbmem.c 2010-08-16 01:41:37.000000000 +0100
++++ linux-2.6.36-rc1/drivers/video/fbmem.c 2010-08-22 16:59:07.000000000 +0100
+@@ -1050,6 +1050,8 @@
+ ret = copy_to_user(argp, &var, sizeof(var)) ? -EFAULT : 0;
+ break;
+ case FBIOPUT_VSCREENINFO:
++ /*!! W - pretend it worked*/
++ return 0;
+ if (copy_from_user(&var, argp, sizeof(var)))
+ return -EFAULT;
+ if (!lock_fb_info(info))
+Index: linux-2.6.36-rc1/arch/arm/mach-pxa/include/mach/regs-lcd.h
+===================================================================
+--- linux-2.6.36-rc1.orig/arch/arm/mach-pxa/include/mach/regs-lcd.h 2010-08-16 01:41:37.000000000 +0100
++++ linux-2.6.36-rc1/arch/arm/mach-pxa/include/mach/regs-lcd.h 2010-08-22 16:59:07.000000000 +0100
+@@ -46,6 +46,41 @@
+ #define LCCR4_PAL_FOR_2 (2 << 15)
+ #define LCCR4_PAL_FOR_3 (3 << 15)
+ #define LCCR4_PAL_FOR_MASK (3 << 15)
++#define LCCR4_PCDDIV (1<<31) /* PCD Divisor Selection */
++#define LCCR4_K3 Fld(3, 6) /* Multiplication constant for Green for Half Transparency */
++#define LCCR4_K3green(K) (((K) << FShft(LCCR4_K3)))
++#define LCCR4_K2 Fld(3, 3) /* Multiplication constant for Blue for Half Transparency */
++#define LCCR4_K2blue(K) (((K) << FShft(LCCR4_K2)))
++#define LCCR4_K1 Fld(3, 0) /* Multiplication constant for Red for Half Transparency */
++#define LCCR4_K1red(K) (((K) << FShft(LCCR4_K1)))
++
++#define LCCR5_IUM6 (1<<29) /* Input FIFO Underrun Mask for Command Data */
++#define LCCR5_IUM5 (1<<28) /* Input FIFO Underrun Mask for Cursor */
++#define LCCR5_IUM4 (1<<27) /* Input FIFO Underrun Mask for Overlay 2 */
++#define LCCR5_IUM3 (1<<26) /* Input FIFO Underrun Mask for Overlay 2 */
++#define LCCR5_IUM2 (1<<25) /* Input FIFO Underrun Mask for Overlay 2 */
++#define LCCR5_IUM1 (1<<24) /* Input FIFO Underrun Mask for Overlay 1 */
++
++#define LCCR5_BSM6 (1<<21) /* Branch Mask for DMA Channel 6 */
++#define LCCR5_BSM5 (1<<20) /* Branch Mask for DMA Channel 5 */
++#define LCCR5_BSM4 (1<<19) /* Branch Mask for DMA Channel 4 */
++#define LCCR5_BSM3 (1<<18) /* Branch Mask for DMA Channel 3 */
++#define LCCR5_BSM2 (1<<17) /* Branch Mask for DMA Channel 2 */
++#define LCCR5_BSM1 (1<<16) /* Branch Mask for DMA Channel 1 */
++
++#define LCCR5_EOFM6 (1<<13) /* End of Frame Mask for DMA Channel 6 */
++#define LCCR5_EOFM5 (1<<12) /* End of Frame Mask for DMA Channel 5 */
++#define LCCR5_EOFM4 (1<<11) /* End of Frame Mask for DMA Channel 4 */
++#define LCCR5_EOFM3 (1<<10) /* End of Frame Mask for DMA Channel 3 */
++#define LCCR5_EOFM2 (1<<9) /* End of Frame Mask for DMA Channel 2 */
++#define LCCR5_EOFM1 (1<<8) /* End of Frame Mask for DMA Channel 1 */
++
++#define LCCR5_SOFM5 (1<<5) /* Start of Frame Mask for DMA Channel 6 */
++#define LCCR5_SOFM4 (1<<4) /* Start of Frame Mask for DMA Channel 6 */
++#define LCCR5_SOFM3 (1<<3) /* Start of Frame Mask for DMA Channel 6 */
++#define LCCR5_SOFM2 (1<<2) /* Start of Frame Mask for DMA Channel 6 */
++#define LCCR5_SOFM1 (1<<1) /* Start of Frame Mask for DMA Channel 6 */
++#define LCCR5_SOFM0 (1<<0) /* Start of Frame Mask for DMA Channel 6 */
+
+ #define FDADR0 (0x200) /* DMA Channel 0 Frame Descriptor Address Register */
+ #define FDADR1 (0x210) /* DMA Channel 1 Frame Descriptor Address Register */
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3.patch
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3.patch (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3.patch 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,244 @@
+Index: linux-2.6.36-rc1/arch/arm/Kconfig
+===================================================================
+--- linux-2.6.36-rc1.orig/arch/arm/Kconfig 2010-08-22 18:06:12.000000000 +0100
++++ linux-2.6.36-rc1/arch/arm/Kconfig 2010-08-22 18:06:20.000000000 +0100
+@@ -1363,7 +1363,8 @@
+ ARCH_OMAP || ARCH_P720T || ARCH_PXA_IDP || \
+ ARCH_SA1100 || ARCH_SHARK || ARCH_VERSATILE || \
+ ARCH_AT91 || ARCH_DAVINCI || \
+- ARCH_KS8695 || MACH_RD88F5182 || ARCH_REALVIEW
++ ARCH_KS8695 || MACH_RD88F5182 || ARCH_REALVIEW || \
++ MACH_BALLOON3
+ help
+ If you say Y here, the LEDs on your machine will be used
+ to provide useful information about your current system status.
+Index: linux-2.6.36-rc1/arch/arm/mach-pxa/balloon3.c
+===================================================================
+--- linux-2.6.36-rc1.orig/arch/arm/mach-pxa/balloon3.c 2010-08-22 18:06:13.000000000 +0100
++++ linux-2.6.36-rc1/arch/arm/mach-pxa/balloon3.c 2010-08-22 18:53:54.000000000 +0100
+@@ -26,6 +26,7 @@
+ #include <linux/mtd/mtd.h>
+ #include <linux/mtd/partitions.h>
+ #include <linux/types.h>
++#include <linux/delay.h>
+ #include <linux/i2c/pcf857x.h>
+ #include <linux/mtd/nand.h>
+ #include <linux/mtd/physmap.h>
+@@ -48,7 +49,6 @@
+ #include <mach/mmc.h>
+ #include <mach/udc.h>
+ #include <mach/pxa27x-udc.h>
+-#include <mach/irda.h>
+ #include <mach/ohci.h>
+
+ #include <plat/i2c.h>
+@@ -313,7 +313,7 @@
+ static void __init balloon3_udc_init(void)
+ {
+ pxa_set_udc_info(&balloon3_udc_info);
+- platform_device_register(&balloon3_gpio_vbus);
++// platform_device_register(&balloon3_gpio_vbus);
+ }
+ #else
+ static inline void balloon3_udc_init(void) {}
+@@ -450,14 +450,14 @@
+ {
+ int balloon3_irq = (irq - BALLOON3_IRQ(0));
+ balloon3_irq_enabled &= ~(1 << balloon3_irq);
+- __raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_REG);
++ __raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_SET_REG);
+ }
+
+ static void balloon3_unmask_irq(unsigned int irq)
+ {
+ int balloon3_irq = (irq - BALLOON3_IRQ(0));
+ balloon3_irq_enabled |= (1 << balloon3_irq);
+- __raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_REG);
++ __raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_CLR_REG);
+ }
+
+ static struct irq_chip balloon3_irq_chip = {
+@@ -733,6 +733,82 @@
+ static inline void balloon3_pmic_init(void) {}
+ #endif
+
++static void balloon3_poweroff(void) {
++ int n;
++// unsigned int ac97powercontrol=0;
++
++ pr_info("balloon3_poweroff\n");
++ /* enable 32.768kHz osc so the CPU can switch off 13MHz one */
++ OSCC |= OSCC_OON;
++ pr_info("Waiting for 32kHz osc to stabilise...\n");
++ for(n=0;n<50;n++) {
++ if(OSCC&OSCC_OOK)
++ break;
++ mdelay(100);
++ }
++ if(n==50)
++ pr_info("Failed. Is crystal OK?\n");
++ else
++ pr_info("OK\n");
++
++ /* nasty hack for L3 because codec power is not switchable */
++ /* bludgeon AC97 interface into putting codec in standby */
++ /* doesn't work */
++// pr_info("Shutting down codec\n");
++// GSR = GSR_CDONE | GSR_SDONE;
++// ac97powercontrol|=AC97_PD_PR0 | AC97_PD_PR1;
++// PAC_REG_POWERCONTROL = ac97powercontrol;
++// //while (!(GSR & GSR_CDONE));
++// udelay(100);
++// GSR = GSR_CDONE | GSR_SDONE;
++// ac97powercontrol|=AC97_PD_PR3;
++// PAC_REG_POWERCONTROL = ac97powercontrol;
++// //while (!(GSR & GSR_CDONE));
++// udelay(100);
++// GSR = GSR_CDONE | GSR_SDONE;
++// ac97powercontrol|=AC97_PD_PR4 | AC97_PD_PR5;
++// PAC_REG_POWERCONTROL = ac97powercontrol;
++// //while (!(GSR & GSR_CDONE));
++
++ /* switch off backlight, not that anyone uses it */
++ gpio_set_value(BALLOON3_GPIO_RUN_BACKLIGHT, 0);
++ /* switch off NAND and Samosa */
++ gpio_set_value(BALLOON3_GPIO_RUN_NAND, 0);
++ gpio_set_value(BALLOON3_GPIO_RUN_SAMOSA, 0);
++ /* switch off FPGA */
++ gpio_set_value(BALLOON3_GPIO_RUN_SPARTAN, 0);
++
++ /* switch off CPU by entering deep-sleep mode */
++ /* this is cut-and-pasted from pxa27x_cpu_pm_enter() */
++ /* ensure voltage-change sequencer not initiated, which hangs */
++ /* enable linear regulator rather than dc-dc converter */
++ /* and say it's ok to stop 13MHz osc */
++ PCFR &= ~(PCFR_FVC+PCFR_DC_EN+PCFR_RO);
++ PCFR |= PCFR_L1_EN + PCFR_OPDE;
++ /* Clear edge-detect status register. */
++ PEDR = 0xDF12FE1B;
++ /* make sure nothing will wake us up */
++ /* although deep sleep seems to insist on listening to GPIO0 and 1 even if we tell it not to */
++ PRER = 0x0;
++ PFER = 0x0;
++ PWER = 0x0;
++ /* configure sleep to ignore nVDD_FAULT and not assert reset */
++ PSLR |= (1<<2) + PSLR_SL_ROD + (0xf << 8);
++ PSLR &= ~ 0x0c;
++ /* Clear reset status */
++ RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
++ pr_info("Going into deep sleep\n");
++
++ /* switch off RS232 */
++ gpio_set_value(BALLOON3_GPIO_RUN_232, 0);
++ asm ( "mov r0,#0x7\n"
++ "mcr p14, 0, r0, c7, c0, 0\n"
++ );
++ while(1);
++ /* nothing can save us now */
++}
++
++
+ /******************************************************************************
+ * Machine init
+ ******************************************************************************/
+@@ -742,6 +818,8 @@
+
+ pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config));
+
++ pm_power_off = balloon3_poweroff;
++
+ pxa_set_ffuart_info(NULL);
+ pxa_set_btuart_info(NULL);
+ pxa_set_stuart_info(NULL);
+@@ -774,6 +852,62 @@
+ iotable_init(balloon3_io_desc, ARRAY_SIZE(balloon3_io_desc));
+ }
+
++/* power management which is board-specific but doesn't fit anywhere else */
++#ifdef CONFIG_PM
++
++/* sys_device for Balloon 3 PM */
++
++static int balloon3_pm_suspend(struct sys_device *dev, pm_message_t msg)
++{
++ pr_debug("%s: suspend\n", __func__);
++ /* switch off serial port transceiver */
++ gpio_set_value(BALLOON3_GPIO_RUN_232,0);
++ /* switch off NAND and SAMOSA */
++ __raw_writel(BALLOON3_NAND_PARKING + BALLOON3_CF_SAMOSA_PARKING, BALLOON3_GENERAL_CONTROL_SET_REG);
++ gpio_set_value(BALLOON3_GPIO_RUN_NAND,0);
++ gpio_set_value(BALLOON3_GPIO_RUN_SAMOSA,0);
++
++ return 0;
++}
++
++static int balloon3_pm_resume(struct sys_device *dev)
++{
++ /* switch on serial port transceiver */
++ gpio_set_value(BALLOON3_GPIO_RUN_232,1);
++ /* switch on NAND and SAMOSA */
++ __raw_writel(BALLOON3_NAND_PARKING + BALLOON3_CF_SAMOSA_PARKING, BALLOON3_GENERAL_CONTROL_CLR_REG);
++ gpio_set_value(BALLOON3_GPIO_RUN_NAND,1);
++ gpio_set_value(BALLOON3_GPIO_RUN_SAMOSA,1);
++ pr_debug("%s: resume\n", __func__);
++
++ return 0;
++}
++
++static struct sysdev_class balloon3_pm_sysclass = {
++ .name = "balloon3_pm",
++ .suspend = balloon3_pm_suspend,
++ .resume = balloon3_pm_resume,
++};
++
++static struct sys_device balloon3_pm_device = {
++ .cls = &balloon3_pm_sysclass,
++};
++
++static int __init balloon3_pm_init(void)
++{
++ int ret = -ENODEV;
++ if (machine_is_balloon3()) {
++ ret = sysdev_class_register(&balloon3_pm_sysclass);
++ if (ret == 0)
++ ret = sysdev_register(&balloon3_pm_device);
++ }
++ return ret;
++}
++
++device_initcall(balloon3_pm_init);
++#endif
++
++
+ MACHINE_START(BALLOON3, "Balloon3")
+ /* Maintainer: Nick Bane. */
+ .phys_io = 0x40000000,
+Index: linux-2.6.36-rc1/arch/arm/mach-pxa/include/mach/memory.h
+===================================================================
+--- linux-2.6.36-rc1.orig/arch/arm/mach-pxa/include/mach/memory.h 2010-08-22 18:06:13.000000000 +0100
++++ linux-2.6.36-rc1/arch/arm/mach-pxa/include/mach/memory.h 2010-08-22 18:06:20.000000000 +0100
+@@ -26,5 +26,24 @@
+ #define ISA_DMA_THRESHOLD (PHYS_OFFSET + SZ_64M - 1)
+ #define MAX_DMA_ADDRESS (PAGE_OFFSET + SZ_64M)
+ #endif
++/*
++ * The Balloon3 board has 384 MB of RAM. This * hack should be removed
++ * once the PHYS_OFFSET can be configured dynamically.
++ *
++ * The three 128MB SDRAM banks are at addresses 0xa0000000, 0xb0000000 and
++ * 0x80000000. The following code moves the block of SDRAM at 0x80000000 past
++ * the block at 0xb0000000 in virtual memory and vice versa. We use SparseMEM to
++ * map the pages properly.
++ */
++#ifdef CONFIG_MACH_BALLOON3
++#define MAX_PHYSMEM_BITS 32
++#define SECTION_SIZE_BITS 29
++#define __phys_to_virt(p) \
++ (((p) & 0x0fffffff) | \
++ (((p) & 0x10000000) ? 0x10000000 : (((p) & 0x20000000) ? 0x00000000 : 0x20000000)) | PAGE_OFFSET)
++#define __virt_to_phys(v) \
++ (((v) & 0x0fffffff) | \
++ (((v) & 0x10000000) ? 0xb0000000 : (((v) & 0x20000000) ? 0x80000000 : 0xa0000000)))
++#endif
+
+ #endif
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,2033 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.29-rc7
+# Thu Mar 5 14:02:02 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_ARCH_HAS_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_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION="-pxa270"
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_CLASSIC_RCU=y
+# CONFIG_TREE_RCU is not set
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_PREEMPT_RCU_TRACE is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+# CONFIG_NET_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_INITRAMFS_ROOT_UID=0
+CONFIG_INITRAMFS_ROOT_GID=0
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+# CONFIG_INITRAMFS_COMPRESSION_NONE is not set
+# CONFIG_INITRAMFS_COMPRESSION_GZIP is not set
+CONFIG_INITRAMFS_COMPRESSION_BZIP2=y
+# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_COMPAT_BRK=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_AIO=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY 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"
+CONFIG_FREEZER=y
+
+#
+# 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_CLPS711X 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_KIRKWOOD is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_ORION5X 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_S3C64XX 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
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_W90X900 is not set
+
+#
+# Intel PXA2xx/PXA3xx Implementations
+#
+# CONFIG_ARCH_GUMSTIX is not set
+# CONFIG_MACH_INTELMOTE2 is not set
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_MACH_MP900C is not set
+CONFIG_MACH_BALLOON3=y
+CONFIG_BALLOON3_TOPPOLY=y
+# CONFIG_BALLOON3_VGA is not set
+# CONFIG_BALLOON3_SVGA is not set
+# CONFIG_BALLOON3_NODISPLAY is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_ARCH_VIPER is not set
+# CONFIG_ARCH_PXA_ESERIES is not set
+# CONFIG_TRIZEPS_PXA is not set
+# CONFIG_MACH_H5000 is not set
+# CONFIG_MACH_EM_X270 is not set
+# CONFIG_MACH_COLIBRI is not set
+# CONFIG_MACH_ZYLONITE is not set
+# CONFIG_MACH_LITTLETON is not set
+# CONFIG_MACH_TAVOREVB is not set
+# CONFIG_MACH_SAAR is not set
+# CONFIG_MACH_ARMCORE is not set
+# CONFIG_MACH_CM_X300 is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_MACH_PCM027 is not set
+# CONFIG_ARCH_PXA_PALM is not set
+# CONFIG_PXA_EZX is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA_PWM is not set
+CONFIG_PXA_HAVE_BOARD_IRQS=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_PABRT_NOIFAR=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 is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_PCCARD=m
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_PCMCIA=m
+CONFIG_PCMCIA_LOAD_CIS=y
+# CONFIG_PCMCIA_IOCTL is not set
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=m
+
+#
+# Kernel Features
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ARCH_FLATMEM_HAS_HOLES=y
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL 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_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+CONFIG_UNEVICTABLE_LRU=y
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Power Management
+#
+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_POWERSAVE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=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_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SLEEP=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+# CONFIG_APM_EMULATION is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+CONFIG_NET_PCI=y
+CONFIG_CS89x0=m
+
+#
+# Networking options
+#
+CONFIG_COMPAT_NET_DEV_OPS=y
+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_XFRM_STATISTICS is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_ASK_IP_FIB_HASH=y
+# CONFIG_IP_FIB_TRIE is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_MULTIPLE_TABLES=y
+# CONFIG_IP_ROUTE_MULTIPATH is not set
+# CONFIG_IP_ROUTE_VERBOSE is not set
+# CONFIG_IP_PNP is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE=m
+# CONFIG_NET_IPGRE_BROADCAST is not set
+# CONFIG_IP_MROUTE 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_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+CONFIG_IPV6_NDISC_NODETYPE=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+# CONFIG_BRIDGE_NETFILTER is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK_QUEUE is not set
+# CONFIG_NETFILTER_NETLINK_LOG is not set
+# CONFIG_NF_CONNTRACK is not set
+# CONFIG_NETFILTER_XTABLES is not set
+# CONFIG_IP_VS is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_NF_DEFRAG_IPV4 is not set
+CONFIG_IP_NF_QUEUE=m
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_IP6_NF_QUEUE=m
+# CONFIG_IP6_NF_IPTABLES is not set
+# CONFIG_IP_DCCP is not set
+CONFIG_IP_SCTP=m
+# CONFIG_SCTP_DBG_MSG is not set
+# CONFIG_SCTP_DBG_OBJCNT is not set
+# CONFIG_SCTP_HMAC_NONE is not set
+# CONFIG_SCTP_HMAC_SHA1 is not set
+CONFIG_SCTP_HMAC_MD5=y
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+CONFIG_STP=m
+CONFIG_BRIDGE=m
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+CONFIG_LLC=m
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+CONFIG_NET_SCHED=y
+
+#
+# Queueing/Scheduling
+#
+# CONFIG_NET_SCH_CBQ is not set
+# CONFIG_NET_SCH_HTB is not set
+# CONFIG_NET_SCH_HFSC is not set
+# CONFIG_NET_SCH_PRIO is not set
+# CONFIG_NET_SCH_MULTIQ is not set
+# CONFIG_NET_SCH_RED is not set
+# CONFIG_NET_SCH_SFQ is not set
+# CONFIG_NET_SCH_TEQL is not set
+# CONFIG_NET_SCH_TBF is not set
+# CONFIG_NET_SCH_GRED is not set
+# CONFIG_NET_SCH_DSMARK is not set
+# CONFIG_NET_SCH_NETEM is not set
+# CONFIG_NET_SCH_DRR is not set
+
+#
+# Classification
+#
+# CONFIG_NET_CLS_BASIC is not set
+# CONFIG_NET_CLS_TCINDEX is not set
+# CONFIG_NET_CLS_ROUTE4 is not set
+# CONFIG_NET_CLS_FW is not set
+# CONFIG_NET_CLS_U32 is not set
+# CONFIG_NET_CLS_RSVP is not set
+# CONFIG_NET_CLS_RSVP6 is not set
+# CONFIG_NET_CLS_FLOW is not set
+# CONFIG_NET_EMATCH is not set
+# CONFIG_NET_CLS_ACT is not set
+CONFIG_NET_SCH_FIFO=y
+# CONFIG_DCB is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+# CONFIG_AF_RXRPC is not set
+# CONFIG_PHONET is not set
+CONFIG_FIB_RULES=y
+CONFIG_WIRELESS=y
+# CONFIG_CFG80211 is not set
+CONFIG_WIRELESS_OLD_REGULATORY=y
+CONFIG_WIRELESS_EXT=y
+CONFIG_WIRELESS_EXT_SYSFS=y
+CONFIG_LIB80211=m
+CONFIG_LIB80211_CRYPT_WEP=m
+CONFIG_LIB80211_CRYPT_CCMP=m
+CONFIG_LIB80211_CRYPT_TKIP=m
+# CONFIG_MAC80211 is not set
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_STANDALONE is not set
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+CONFIG_CONNECTOR=m
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_TESTS is not set
+CONFIG_MTD_REDBOOT_PARTS=m
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+CONFIG_MTD_AFS_PARTS=m
+# CONFIG_MTD_AR7_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+# CONFIG_MTD_OOPS is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT 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
+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_GPIO is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_SHARPSL is not set
+CONFIG_MTD_NAND_BALLOON3=y
+# CONFIG_MTD_NAND_NANDSIM is not set
+# CONFIG_MTD_NAND_PLATFORM is not set
+# CONFIG_MTD_ALAUDA is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# LPDDR flash memory drivers
+#
+# CONFIG_MTD_LPDDR is not set
+
+#
+# UBI - Unsorted block images
+#
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_WL_THRESHOLD=4096
+CONFIG_MTD_UBI_BEB_RESERVE=1
+# CONFIG_MTD_UBI_GLUEBI is not set
+
+#
+# UBI debugging options
+#
+# CONFIG_MTD_UBI_DEBUG is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_UB is not set
+# CONFIG_BLK_DEV_RAM is not set
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+# CONFIG_ATA_OVER_ETH is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_ICS932S401 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_AT24 is not set
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_HAVE_IDE=y
+CONFIG_IDE=m
+
+#
+# Please see Documentation/ide/ide.txt for help/info on IDE drives
+#
+CONFIG_IDE_ATAPI=y
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_IDE_GD=m
+CONFIG_IDE_GD_ATA=y
+# CONFIG_IDE_GD_ATAPI is not set
+CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_IDECD=m
+CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+CONFIG_BLK_DEV_IDETAPE=m
+# CONFIG_IDE_TASK_IOCTL is not set
+CONFIG_IDE_PROC_FS=y
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_PLATFORM is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+
+#
+# SCSI device support
+#
+CONFIG_RAID_ATTRS=m
+CONFIG_SCSI=m
+CONFIG_SCSI_DMA=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=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 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=m
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_LIBFC is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+# CONFIG_SCSI_DH is not set
+CONFIG_ATA=m
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_SATA_PMP=y
+CONFIG_ATA_SFF=y
+# CONFIG_SATA_MV is not set
+CONFIG_PATA_PCMCIA=m
+
+#
+# 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 is not set
+# CONFIG_DM_SNAPSHOT is not set
+# CONFIG_DM_MIRROR is not set
+# CONFIG_DM_ZERO is not set
+# CONFIG_DM_MULTIPATH is not set
+# CONFIG_DM_DELAY is not set
+# CONFIG_DM_UEVENT is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+CONFIG_BONDING=m
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=m
+
+#
+# MII PHY device drivers
+#
+CONFIG_MARVELL_PHY=m
+CONFIG_DAVICOM_PHY=m
+CONFIG_QSEMI_PHY=m
+CONFIG_LXT_PHY=m
+CONFIG_CICADA_PHY=m
+CONFIG_VITESSE_PHY=m
+CONFIG_SMSC_PHY=m
+CONFIG_BROADCOM_PHY=m
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+# CONFIG_AX88796 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_SMC911X is not set
+# CONFIG_SMSC911X is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+# CONFIG_B44 is not set
+CONFIG_CS89x0=m
+CONFIG_NETDEV_1000=y
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+CONFIG_WLAN_80211=y
+CONFIG_PCMCIA_RAYCS=m
+CONFIG_LIBERTAS=m
+CONFIG_LIBERTAS_USB=m
+CONFIG_LIBERTAS_CS=m
+# CONFIG_LIBERTAS_SDIO is not set
+# CONFIG_LIBERTAS_DEBUG is not set
+CONFIG_HERMES=m
+CONFIG_HERMES_CACHE_FW_ON_INIT=y
+# CONFIG_PCMCIA_HERMES is not set
+# CONFIG_PCMCIA_SPECTRUM is not set
+CONFIG_ATMEL=m
+# CONFIG_PCMCIA_ATMEL is not set
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_WL3501=m
+CONFIG_USB_ZD1201=m
+# CONFIG_USB_NET_RNDIS_WLAN is not set
+# CONFIG_IWLWIFI_LEDS is not set
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_FIRMWARE_NVRAM=y
+CONFIG_HOSTAP_CS=m
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+
+#
+# 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_DM9601=m
+# CONFIG_USB_NET_SMSC95XX is not set
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_NET1080=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_CDC_SUBSET=m
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_AN2720=y
+CONFIG_USB_BELKIN=y
+CONFIG_USB_ARMLINUX=y
+# CONFIG_USB_EPSON2888 is not set
+CONFIG_USB_KC2190=y
+CONFIG_USB_NET_ZAURUS=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+# CONFIG_WAN is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+# CONFIG_PPPOL2TP is not set
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLHC=m
+CONFIG_SLIP_SMART=y
+# CONFIG_SLIP_MODE_SLIP6 is not set
+CONFIG_NETCONSOLE=m
+# CONFIG_NETCONSOLE_DYNAMIC is not set
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=m
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=m
+# 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 is not set
+CONFIG_KEYBOARD_GPIO=m
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+# CONFIG_MOUSE_PS2_ELANTECH is not set
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+CONFIG_MOUSE_SERIAL=m
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_BCM5974 is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_MOUSE_GPIO is not set
+CONFIG_INPUT_JOYSTICK=y
+# CONFIG_JOYSTICK_ANALOG is not set
+# CONFIG_JOYSTICK_A3D is not set
+# CONFIG_JOYSTICK_ADI is not set
+# CONFIG_JOYSTICK_COBRA is not set
+# CONFIG_JOYSTICK_GF2K is not set
+# CONFIG_JOYSTICK_GRIP is not set
+# CONFIG_JOYSTICK_GRIP_MP is not set
+# CONFIG_JOYSTICK_GUILLEMOT is not set
+# CONFIG_JOYSTICK_INTERACT is not set
+# CONFIG_JOYSTICK_SIDEWINDER is not set
+# CONFIG_JOYSTICK_TMDC is not set
+# CONFIG_JOYSTICK_IFORCE is not set
+# CONFIG_JOYSTICK_WARRIOR is not set
+# CONFIG_JOYSTICK_MAGELLAN is not set
+# CONFIG_JOYSTICK_SPACEORB is not set
+# CONFIG_JOYSTICK_SPACEBALL is not set
+# CONFIG_JOYSTICK_STINGER is not set
+# CONFIG_JOYSTICK_TWIDJOY is not set
+# CONFIG_JOYSTICK_ZHENHUA is not set
+# CONFIG_JOYSTICK_JOYDUMP is not set
+# CONFIG_JOYSTICK_XPAD is not set
+# CONFIG_INPUT_TABLET is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_FUJITSU is not set
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_UCB1400=m
+# CONFIG_TOUCHSCREEN_WM97XX is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
+# CONFIG_TOUCHSCREEN_TSC2007 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_CM109 is not set
+CONFIG_INPUT_UINPUT=y
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+CONFIG_SERIO_LIBPS2=m
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_DEVKMEM 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_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_MINIPUG=m
+CONFIG_MEGAPUG=m
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM 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_IPWIRELESS is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_SAMOSA=y
+# CONFIG_PROC_SAMOSA is not set
+CONFIG_I2C=m
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_ALGOBIT=m
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+CONFIG_I2C_GPIO=m
+# CONFIG_I2C_OCORES is not set
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_SIMTEC is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_STUB is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_DS1682 is not set
+CONFIG_SENSORS_PCF8574=m
+# CONFIG_PCF8575 is not set
+CONFIG_SENSORS_PCA9539=m
+CONFIG_SENSORS_PCF8591=m
+CONFIG_SENSORS_MAX6875=m
+# CONFIG_SENSORS_TSL2550 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
+# CONFIG_SPI is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+CONFIG_W1=m
+CONFIG_W1_CON=y
+
+#
+# 1-wire Bus Masters
+#
+CONFIG_W1_MASTER_DS2490=m
+CONFIG_W1_MASTER_DS2482=m
+# CONFIG_W1_MASTER_DS1WM is not set
+# CONFIG_W1_MASTER_GPIO is not set
+
+#
+# 1-wire Slaves
+#
+CONFIG_W1_SLAVE_THERM=m
+CONFIG_W1_SLAVE_SMEM=m
+# CONFIG_W1_SLAVE_DS2431 is not set
+CONFIG_W1_SLAVE_DS2433=m
+# CONFIG_W1_SLAVE_DS2433_CRC is not set
+# CONFIG_W1_SLAVE_DS2760 is not set
+# CONFIG_W1_SLAVE_BQ27000 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_SA1100_WATCHDOG=m
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 is not set
+CONFIG_UCB1400_CORE=m
+# CONFIG_TPS65010 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_PCF50633 is not set
+
+#
+# Multimedia devices
+#
+
+#
+# Multimedia core support
+#
+# CONFIG_VIDEO_DEV is not set
+# CONFIG_DVB_CORE is not set
+# CONFIG_VIDEO_MEDIA is not set
+
+#
+# Multimedia drivers
+#
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_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_UVESA is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_OVERLAY is not set
+# CONFIG_FB_PXA_SMARTPANEL is not set
+CONFIG_FB_PXA_PARAMETERS=y
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_W100 is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MB862XX is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+# CONFIG_LCD_ILI9320 is not set
+CONFIG_LCD_PLATFORM=m
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_GENERIC=y
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS 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=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+CONFIG_SOUND_OSS_CORE=y
+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=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+CONFIG_SND_VMASTER=y
+CONFIG_SND_AC97_CODEC=m
+CONFIG_SND_DRIVERS=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
+CONFIG_SND_AC97_POWER_SAVE=y
+CONFIG_SND_AC97_POWER_SAVE_DEFAULT=2
+CONFIG_SND_ARM=y
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_LIB=m
+CONFIG_SND_PXA2XX_LIB_AC97=y
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB=y
+# CONFIG_SND_USB_AUDIO is not set
+# CONFIG_SND_USB_CAIAQ is not set
+# CONFIG_SND_PCMCIA is not set
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_SOC_I2C_AND_SPI=m
+# CONFIG_SND_SOC_ALL_CODECS is not set
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=m
+# CONFIG_HID_DEBUG is not set
+# CONFIG_HIDRAW is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=m
+CONFIG_HID_PID=y
+CONFIG_USB_HIDDEV=y
+
+#
+# Special HID drivers
+#
+CONFIG_HID_COMPAT=y
+CONFIG_HID_A4TECH=m
+CONFIG_HID_APPLE=m
+CONFIG_HID_BELKIN=m
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=m
+CONFIG_HID_CYPRESS=m
+CONFIG_HID_EZKEY=m
+CONFIG_HID_GYRATION=m
+CONFIG_HID_LOGITECH=m
+CONFIG_LOGITECH_FF=y
+# CONFIG_LOGIRUMBLEPAD2_FF is not set
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_MONTEREY=m
+CONFIG_HID_NTRIG=m
+CONFIG_HID_PANTHERLORD=m
+# CONFIG_PANTHERLORD_FF is not set
+CONFIG_HID_PETALYNX=m
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SONY=m
+CONFIG_HID_SUNPLUS=m
+# CONFIG_GREENASIA_FF is not set
+CONFIG_HID_TOPSEED=m
+# CONFIG_THRUSTMASTER_FF is not set
+# CONFIG_ZEROPLUS_FF is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+CONFIG_USB=m
+# CONFIG_USB_DEBUG is not set
+# CONFIG_USB_ANNOUNCE_NEW_DEVICES 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=y
+# CONFIG_USB_OTG is not set
+CONFIG_USB_MON=m
+# CONFIG_USB_WUSB is not set
+# CONFIG_USB_WUSB_CBAF is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_OXU210HP_HCD is not set
+# 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_U132_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_HWA_HCD is not set
+# CONFIG_USB_MUSB_HDRC is not set
+# CONFIG_USB_GADGET_MUSB_HDRC is not set
+
+#
+# USB Device Class drivers
+#
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_TMC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD 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_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_ONETOUCH is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+CONFIG_USB_LIBUSUAL=y
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB port drivers
+#
+CONFIG_USB_SERIAL=m
+CONFIG_USB_EZUSB=y
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+# CONFIG_USB_SERIAL_CH341 is not set
+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 is not set
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_FUNSOFT=m
+# CONFIG_USB_SERIAL_VISOR is not set
+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_IUU is not set
+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
+# CONFIG_USB_SERIAL_KEYSPAN is not set
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+# CONFIG_USB_SERIAL_MOTOROLA is not set
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=m
+# CONFIG_USB_SERIAL_OTI6858 is not set
+# CONFIG_USB_SERIAL_SPCP8X5 is not set
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_SAFE_PADDED=y
+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+# CONFIG_USB_SERIAL_OPTICON is not set
+CONFIG_USB_SERIAL_DEBUG=m
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_SEVSEG 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
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
+# CONFIG_USB_VST is not set
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG is not set
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_VBUS_DRAW=2
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_ATMEL_USBA is not set
+# CONFIG_USB_GADGET_FSL_USB2 is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_PXA25X is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_IMX is not set
+# CONFIG_USB_GADGET_M66592 is not set
+# CONFIG_USB_GADGET_AMD5536UDC is not set
+# CONFIG_USB_GADGET_FSL_QE is not set
+# CONFIG_USB_GADGET_CI13XXX is not set
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_GOKU 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_ETH_RNDIS_COMPAT=y
+# CONFIG_USB_GADGETFS is not set
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_PRINTER is not set
+CONFIG_USB_CDC_COMPOSITE=m
+
+#
+# OTG and related infrastructure
+#
+CONFIG_USB_OTG_UTILS=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_MMC=m
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=m
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+CONFIG_MMC_PXA=m
+# CONFIG_MMC_SDHCI is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+CONFIG_LEDS_GPIO=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_IDE_DISK=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=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_DS1374 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
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_RTC_DRV_SA1100 is not set
+CONFIG_RTC_DRV_PXA=y
+# CONFIG_DMADEVICES is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_UIO is not set
+# CONFIG_STAGING 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=m
+# CONFIG_EXT3_FS_XATTR is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=m
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+# CONFIG_REISERFS_FS_XATTR is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+CONFIG_FILE_LOCKING=y
+# CONFIG_XFS_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=850
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+CONFIG_NTFS_RW=y
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=m
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS2_FS=m
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+CONFIG_CRAMFS=m
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_REGISTER_V4 is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_WEAK_PW_HASH 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
+
+#
+# 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=m
+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 is not set
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=m
+
+#
+# Distributed Lock Manager
+#
+CONFIG_DLM=m
+# CONFIG_DLM_DEBUG is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_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_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT 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_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+
+#
+# Tracers
+#
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_CONTEXT_SWITCH_TRACER is not set
+# CONFIG_BOOT_TRACER is not set
+# CONFIG_TRACE_BRANCH_PROFILING is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+# CONFIG_CRYPTO_FIPS is not set
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_ALGAPI2=m
+CONFIG_CRYPTO_AEAD2=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_BLKCIPHER2=m
+CONFIG_CRYPTO_HASH=m
+CONFIG_CRYPTO_HASH2=m
+CONFIG_CRYPTO_RNG2=m
+CONFIG_CRYPTO_MANAGER=m
+CONFIG_CRYPTO_MANAGER2=m
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_SEQIV is not set
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=m
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_ECB=m
+# CONFIG_CRYPTO_LRW is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_XTS is not set
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_HMAC=m
+# CONFIG_CRYPTO_XCBC is not set
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=m
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+CONFIG_CRYPTO_SHA1=m
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=m
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_ARC4=m
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+
+#
+# Compression
+#
+# CONFIG_CRYPTO_DEFLATE is not set
+# CONFIG_CRYPTO_LZO is not set
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+CONFIG_CRYPTO_HW=y
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_CRC_CCITT=m
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
+CONFIG_CRC_ITU_T=m
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+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
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config-CUED
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config-CUED (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config-CUED 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,2310 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.36-rc1
+# Sun Aug 22 21:06:12 2010
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+# CONFIG_ARCH_USES_GETTIMEOFFSET is not set
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_HAVE_PROC_CPU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_ARCH_HAS_CPUFREQ=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_ARCH_MTD_XIP=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_CROSS_COMPILE=""
+CONFIG_LOCALVERSION="-pxa270"
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_LZO is not set
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_TINY_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_TREE_RCU_TRACE is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+# CONFIG_NET_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+
+#
+# Kernel Performance Events And Counters
+#
+# CONFIG_PERF_EVENTS is not set
+# CONFIG_PERF_COUNTERS is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_COMPAT_BRK=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+CONFIG_HAVE_CLK=y
+
+#
+# GCOV-based kernel profiling
+#
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+CONFIG_INLINE_SPIN_UNLOCK=y
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+CONFIG_INLINE_READ_UNLOCK=y
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+CONFIG_INLINE_READ_UNLOCK_IRQ=y
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+CONFIG_INLINE_WRITE_UNLOCK=y
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+# CONFIG_MUTEX_SPIN_ON_OWNER is not set
+CONFIG_FREEZER=y
+
+#
+# System Type
+#
+CONFIG_MMU=y
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_VEXPRESS is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_BCMRING is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CNS3XXX is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_STMP3XXX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_DOVE is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_LPC32XX is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_NUC93X is not set
+# CONFIG_ARCH_TEGRA is not set
+# CONFIG_ARCH_PNX4008 is not set
+CONFIG_ARCH_PXA=y
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_SHMOBILE is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5P6440 is not set
+# CONFIG_ARCH_S5P6442 is not set
+# CONFIG_ARCH_S5PC100 is not set
+# CONFIG_ARCH_S5PV210 is not set
+# CONFIG_ARCH_S5PV310 is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_U8500 is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_PLAT_SPEAR is not set
+
+#
+# Intel PXA2xx/PXA3xx Implementations
+#
+
+#
+# Intel/Marvell Dev Platforms (sorted by hardware release time)
+#
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_MACH_ZYLONITE300 is not set
+# CONFIG_MACH_ZYLONITE320 is not set
+# CONFIG_MACH_LITTLETON is not set
+# CONFIG_MACH_TAVOREVB is not set
+# CONFIG_MACH_SAAR is not set
+
+#
+# Third Party Dev Platforms (sorted by vendor name)
+#
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_ARCH_VIPER is not set
+# CONFIG_MACH_ARCOM_ZEUS is not set
+CONFIG_MACH_BALLOON3=y
+CONFIG_BALLOON3_TOPPOLY=y
+# CONFIG_BALLOON3_VGA is not set
+# CONFIG_BALLOON3_SVGA is not set
+# CONFIG_BALLOON3_NODISPLAY is not set
+# CONFIG_MACH_CSB726 is not set
+# CONFIG_MACH_ARMCORE is not set
+# CONFIG_MACH_EM_X270 is not set
+# CONFIG_MACH_EXEDA is not set
+# CONFIG_MACH_CM_X300 is not set
+# CONFIG_MACH_CAPC7117 is not set
+# CONFIG_ARCH_GUMSTIX is not set
+# CONFIG_MACH_INTELMOTE2 is not set
+# CONFIG_MACH_STARGATE2 is not set
+# CONFIG_MACH_XCEP is not set
+# CONFIG_TRIZEPS_PXA is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_PCM027 is not set
+# CONFIG_MACH_COLIBRI is not set
+# CONFIG_MACH_COLIBRI300 is not set
+# CONFIG_MACH_COLIBRI320 is not set
+# CONFIG_MACH_VPAC270 is not set
+
+#
+# End-user Products (sorted by vendor name)
+#
+# CONFIG_MACH_H4700 is not set
+# CONFIG_MACH_H5000 is not set
+# CONFIG_MACH_HIMALAYA is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_PXA_EZX is not set
+# CONFIG_MACH_MP900C is not set
+# CONFIG_ARCH_PXA_PALM is not set
+# CONFIG_MACH_RAUMFELD_RC is not set
+# CONFIG_MACH_RAUMFELD_CONNECTOR is not set
+# CONFIG_MACH_RAUMFELD_SPEAKER is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_MACH_ICONTROL is not set
+# CONFIG_ARCH_PXA_ESERIES is not set
+# CONFIG_MACH_ZIPIT2 is not set
+CONFIG_PXA27x=y
+CONFIG_PXA_HAVE_BOARD_IRQS=y
+CONFIG_PLAT_PXA=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_PABRT_LEGACY=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 is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+CONFIG_ARM_L1_CACHE_SHIFT=5
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+CONFIG_CPU_HAS_PMU=y
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_PCCARD=y
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_SOC_COMMON=y
+CONFIG_PCMCIA_PXA2XX=y
+CONFIG_PCMCIA_DEBUG=y
+
+#
+# Kernel Features
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_HIGHMEM is not set
+# CONFIG_SPARSE_IRQ is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_HAVE_MEMBLOCK=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=999999
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_FORCE_MAX_ZONEORDER=11
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+# CONFIG_CC_STACKPROTECTOR is not set
+# CONFIG_DEPRECATED_PARAM_STRUCT is not set
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+CONFIG_ATAGS_PROC=y
+# CONFIG_AUTO_ZRELADDR is not set
+CONFIG_ZRELADDR=0xa0008000
+
+#
+# CPU Power Management
+#
+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_DEFAULT_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=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_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SLEEP=y
+CONFIG_SUSPEND_NVS=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+# CONFIG_APM_EMULATION is not set
+# CONFIG_PM_RUNTIME is not set
+CONFIG_PM_OPS=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=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_XFRM_STATISTICS is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_ASK_IP_FIB_HASH=y
+# CONFIG_IP_FIB_TRIE is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_MULTIPLE_TABLES=y
+# CONFIG_IP_ROUTE_MULTIPATH is not set
+# CONFIG_IP_ROUTE_VERBOSE is not set
+# CONFIG_IP_PNP is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE=m
+# CONFIG_NET_IPGRE_BROADCAST is not set
+# CONFIG_IP_MROUTE 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_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_SIT_6RD is not set
+CONFIG_IPV6_NDISC_NODETYPE=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+# CONFIG_BRIDGE_NETFILTER is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK_QUEUE is not set
+# CONFIG_NETFILTER_NETLINK_LOG is not set
+# CONFIG_NF_CONNTRACK is not set
+# CONFIG_NETFILTER_XTABLES is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_NF_DEFRAG_IPV4 is not set
+CONFIG_IP_NF_QUEUE=m
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_IP6_NF_QUEUE=m
+# CONFIG_IP6_NF_IPTABLES is not set
+# CONFIG_IP_DCCP is not set
+CONFIG_IP_SCTP=m
+# CONFIG_SCTP_DBG_MSG is not set
+# CONFIG_SCTP_DBG_OBJCNT is not set
+# CONFIG_SCTP_HMAC_NONE is not set
+# CONFIG_SCTP_HMAC_SHA1 is not set
+CONFIG_SCTP_HMAC_MD5=y
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_L2TP is not set
+CONFIG_STP=m
+CONFIG_BRIDGE=m
+CONFIG_BRIDGE_IGMP_SNOOPING=y
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+CONFIG_LLC=m
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_IEEE802154 is not set
+CONFIG_NET_SCHED=y
+
+#
+# Queueing/Scheduling
+#
+# CONFIG_NET_SCH_CBQ is not set
+# CONFIG_NET_SCH_HTB is not set
+# CONFIG_NET_SCH_HFSC is not set
+# CONFIG_NET_SCH_PRIO is not set
+# CONFIG_NET_SCH_MULTIQ is not set
+# CONFIG_NET_SCH_RED is not set
+# CONFIG_NET_SCH_SFQ is not set
+# CONFIG_NET_SCH_TEQL is not set
+# CONFIG_NET_SCH_TBF is not set
+# CONFIG_NET_SCH_GRED is not set
+# CONFIG_NET_SCH_DSMARK is not set
+# CONFIG_NET_SCH_NETEM is not set
+# CONFIG_NET_SCH_DRR is not set
+
+#
+# Classification
+#
+# CONFIG_NET_CLS_BASIC is not set
+# CONFIG_NET_CLS_TCINDEX is not set
+# CONFIG_NET_CLS_ROUTE4 is not set
+# CONFIG_NET_CLS_FW is not set
+# CONFIG_NET_CLS_U32 is not set
+# CONFIG_NET_CLS_RSVP is not set
+# CONFIG_NET_CLS_RSVP6 is not set
+# CONFIG_NET_CLS_FLOW is not set
+# CONFIG_NET_EMATCH is not set
+# CONFIG_NET_CLS_ACT is not set
+CONFIG_NET_SCH_FIFO=y
+# CONFIG_DCB is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+# CONFIG_BT_HCIUART_ATH3K is not set
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+# CONFIG_BT_MRVL is not set
+# CONFIG_BT_ATH3K is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_FIB_RULES=y
+CONFIG_WIRELESS=y
+CONFIG_WIRELESS_EXT=y
+CONFIG_WEXT_CORE=y
+CONFIG_WEXT_PROC=y
+CONFIG_WEXT_SPY=y
+CONFIG_WEXT_PRIV=y
+CONFIG_CFG80211=y
+# CONFIG_NL80211_TESTMODE is not set
+# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
+# CONFIG_CFG80211_REG_DEBUG is not set
+CONFIG_CFG80211_DEFAULT_PS=y
+# CONFIG_CFG80211_INTERNAL_REGDB is not set
+CONFIG_CFG80211_WEXT=y
+CONFIG_WIRELESS_EXT_SYSFS=y
+CONFIG_LIB80211=y
+CONFIG_LIB80211_CRYPT_WEP=m
+CONFIG_LIB80211_CRYPT_CCMP=m
+CONFIG_LIB80211_CRYPT_TKIP=m
+CONFIG_LIB80211_DEBUG=y
+CONFIG_MAC80211=y
+CONFIG_MAC80211_HAS_RC=y
+CONFIG_MAC80211_RC_MINSTREL=y
+CONFIG_MAC80211_RC_MINSTREL_HT=y
+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
+CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
+# CONFIG_MAC80211_MESH is not set
+# CONFIG_MAC80211_LEDS is not set
+# CONFIG_MAC80211_DEBUG_MENU is not set
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+# CONFIG_CAIF is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_DEVTMPFS is not set
+# CONFIG_STANDALONE is not set
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+CONFIG_FW_LOADER=y
+# CONFIG_FIRMWARE_IN_KERNEL is not set
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+CONFIG_CONNECTOR=m
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_TESTS is not set
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=m
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+CONFIG_MTD_AFS_PARTS=m
+# CONFIG_MTD_AR7_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+# CONFIG_SM_FTL is not set
+# CONFIG_MTD_OOPS is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT 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_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+CONFIG_MTD_NAND_ECC=y
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND=y
+CONFIG_MTD_NAND_VERIFY_WRITE=y
+# CONFIG_MTD_SM_COMMON is not set
+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
+# CONFIG_MTD_NAND_H1900 is not set
+# CONFIG_MTD_NAND_GPIO is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_SHARPSL is not set
+CONFIG_MTD_NAND_BALLOON3=y
+# CONFIG_MTD_NAND_NANDSIM is not set
+# CONFIG_MTD_NAND_PLATFORM is not set
+# CONFIG_MTD_ALAUDA is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# LPDDR flash memory drivers
+#
+# CONFIG_MTD_LPDDR is not set
+
+#
+# UBI - Unsorted block images
+#
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_WL_THRESHOLD=4096
+CONFIG_MTD_UBI_BEB_RESERVE=1
+# CONFIG_MTD_UBI_GLUEBI is not set
+
+#
+# UBI debugging options
+#
+# CONFIG_MTD_UBI_DEBUG is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_DRBD is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_UB is not set
+# CONFIG_BLK_DEV_RAM is not set
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_MG_DISK is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_AD525X_DPOT is not set
+# CONFIG_ICS932S401 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_ISL29003 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+# CONFIG_SENSORS_BH1780 is not set
+# CONFIG_HMC6352 is not set
+# CONFIG_DS1682 is not set
+# CONFIG_BMP085 is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_AT24 is not set
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_MAX6875 is not set
+CONFIG_EEPROM_93CX6=m
+# CONFIG_IWMC3200TOP is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+CONFIG_SCSI_MOD=y
+CONFIG_RAID_ATTRS=m
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=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=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
+# 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=m
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_ISCSI_BOOT_SYSFS is not set
+# CONFIG_LIBFC is not set
+# CONFIG_LIBFCOE is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+# CONFIG_SCSI_DH is not set
+# CONFIG_SCSI_OSD_INITIATOR is not set
+CONFIG_ATA=m
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_SATA_PMP=y
+
+#
+# Controllers with non-SFF native interface
+#
+# CONFIG_SATA_AHCI_PLATFORM is not set
+CONFIG_ATA_SFF=y
+
+#
+# SFF controllers with custom DMA interface
+#
+CONFIG_ATA_BMDMA=y
+
+#
+# SATA SFF controllers with BMDMA
+#
+# CONFIG_SATA_MV is not set
+
+#
+# PATA SFF controllers with BMDMA
+#
+# CONFIG_PATA_PXA is not set
+
+#
+# PIO-only SFF controllers
+#
+CONFIG_PATA_PCMCIA=m
+
+#
+# Generic fallback / legacy drivers
+#
+CONFIG_MD=y
+# CONFIG_BLK_DEV_MD is not set
+CONFIG_BLK_DEV_DM=m
+# CONFIG_DM_DEBUG is not set
+# CONFIG_DM_CRYPT is not set
+# CONFIG_DM_SNAPSHOT is not set
+# CONFIG_DM_MIRROR is not set
+# CONFIG_DM_ZERO is not set
+# CONFIG_DM_MULTIPATH is not set
+# CONFIG_DM_DELAY is not set
+# CONFIG_DM_UEVENT is not set
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+CONFIG_BONDING=m
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=m
+
+#
+# MII PHY device drivers
+#
+CONFIG_MARVELL_PHY=m
+CONFIG_DAVICOM_PHY=m
+CONFIG_QSEMI_PHY=m
+CONFIG_LXT_PHY=m
+CONFIG_CICADA_PHY=m
+CONFIG_VITESSE_PHY=m
+CONFIG_SMSC_PHY=m
+CONFIG_BROADCOM_PHY=m
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_MICREL_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+# CONFIG_AX88796 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_ETHOC is not set
+# CONFIG_SMC911X is not set
+# CONFIG_SMSC911X is not set
+# CONFIG_DNET is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+# CONFIG_B44 is not set
+CONFIG_CS89x0=m
+# CONFIG_KS8851_MLL is not set
+CONFIG_NETDEV_1000=y
+# CONFIG_NETDEV_10000 is not set
+CONFIG_WLAN=y
+CONFIG_PCMCIA_RAYCS=m
+CONFIG_LIBERTAS_THINFIRM=m
+# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set
+CONFIG_LIBERTAS_THINFIRM_USB=m
+CONFIG_ATMEL=m
+# CONFIG_PCMCIA_ATMEL is not set
+CONFIG_AT76C50X_USB=m
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_WL3501=m
+CONFIG_USB_ZD1201=m
+CONFIG_USB_NET_RNDIS_WLAN=m
+CONFIG_RTL8187=m
+# CONFIG_MAC80211_HWSIM is not set
+CONFIG_ATH_COMMON=m
+# CONFIG_ATH_DEBUG is not set
+# CONFIG_ATH9K_HTC is not set
+CONFIG_AR9170_USB=m
+CONFIG_B43=m
+# CONFIG_B43_PCMCIA is not set
+# CONFIG_B43_SDIO is not set
+CONFIG_B43_PIO=y
+CONFIG_B43_PHY_LP=y
+# CONFIG_B43_DEBUG is not set
+CONFIG_B43LEGACY=m
+# CONFIG_B43LEGACY_DEBUG is not set
+CONFIG_B43LEGACY_DMA=y
+CONFIG_B43LEGACY_PIO=y
+CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
+# CONFIG_B43LEGACY_DMA_MODE is not set
+# CONFIG_B43LEGACY_PIO_MODE is not set
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_FIRMWARE_NVRAM=y
+CONFIG_HOSTAP_CS=m
+# CONFIG_IWM is not set
+CONFIG_LIBERTAS=m
+CONFIG_LIBERTAS_USB=m
+CONFIG_LIBERTAS_CS=m
+# CONFIG_LIBERTAS_SDIO is not set
+# CONFIG_LIBERTAS_DEBUG is not set
+# CONFIG_LIBERTAS_MESH is not set
+CONFIG_HERMES=m
+# CONFIG_HERMES_PRISM is not set
+CONFIG_HERMES_CACHE_FW_ON_INIT=y
+CONFIG_PCMCIA_HERMES=m
+# CONFIG_PCMCIA_SPECTRUM is not set
+# CONFIG_ORINOCO_USB is not set
+# CONFIG_P54_COMMON is not set
+CONFIG_RT2X00=m
+# CONFIG_RT2500USB is not set
+# CONFIG_RT73USB is not set
+# CONFIG_RT2800USB is not set
+# CONFIG_WL12XX is not set
+# CONFIG_ZD1211RW is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+
+#
+# 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_CDC_EEM=m
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_SMSC75XX=m
+CONFIG_USB_NET_SMSC95XX=m
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_NET1080=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_CDC_SUBSET=m
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_AN2720=y
+CONFIG_USB_BELKIN=y
+CONFIG_USB_ARMLINUX=y
+# CONFIG_USB_EPSON2888 is not set
+CONFIG_USB_KC2190=y
+CONFIG_USB_NET_ZAURUS=m
+CONFIG_USB_NET_INT51X1=m
+CONFIG_USB_IPHETH=m
+# CONFIG_USB_SIERRA_NET is not set
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+# CONFIG_WAN is not set
+
+#
+# CAIF transport drivers
+#
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLHC=m
+CONFIG_SLIP_SMART=y
+# CONFIG_SLIP_MODE_SLIP6 is not set
+CONFIG_NETCONSOLE=m
+# CONFIG_NETCONSOLE_DYNAMIC is not set
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=m
+# CONFIG_INPUT_POLLDEV is not set
+# CONFIG_INPUT_SPARSEKMAP is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_KEYBOARD_ADP5588 is not set
+CONFIG_KEYBOARD_ATKBD=m
+# CONFIG_KEYBOARD_QT2160 is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+CONFIG_KEYBOARD_GPIO=m
+# CONFIG_KEYBOARD_TCA6416 is not set
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_KEYBOARD_LM8323 is not set
+# CONFIG_KEYBOARD_MAX7359 is not set
+# CONFIG_KEYBOARD_MCS is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_OPENCORES is not set
+# CONFIG_KEYBOARD_PXA27x is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+# CONFIG_MOUSE_PS2_ELANTECH is not set
+# CONFIG_MOUSE_PS2_SENTELIC is not set
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+CONFIG_MOUSE_SERIAL=m
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_BCM5974 is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_MOUSE_GPIO is not set
+# CONFIG_MOUSE_SYNAPTICS_I2C is not set
+CONFIG_INPUT_JOYSTICK=y
+# CONFIG_JOYSTICK_ANALOG is not set
+# CONFIG_JOYSTICK_A3D is not set
+CONFIG_JOYSTICK_ADI=y
+# CONFIG_JOYSTICK_COBRA is not set
+# CONFIG_JOYSTICK_GF2K is not set
+# CONFIG_JOYSTICK_GRIP is not set
+# CONFIG_JOYSTICK_GRIP_MP is not set
+# CONFIG_JOYSTICK_GUILLEMOT is not set
+# CONFIG_JOYSTICK_INTERACT is not set
+# CONFIG_JOYSTICK_SIDEWINDER is not set
+# CONFIG_JOYSTICK_TMDC is not set
+# CONFIG_JOYSTICK_IFORCE is not set
+CONFIG_JOYSTICK_WARRIOR=m
+# CONFIG_JOYSTICK_MAGELLAN is not set
+# CONFIG_JOYSTICK_SPACEORB is not set
+# CONFIG_JOYSTICK_SPACEBALL is not set
+# CONFIG_JOYSTICK_STINGER is not set
+# CONFIG_JOYSTICK_TWIDJOY is not set
+# CONFIG_JOYSTICK_ZHENHUA is not set
+CONFIG_JOYSTICK_JOYDUMP=m
+CONFIG_JOYSTICK_XPAD=m
+CONFIG_JOYSTICK_XPAD_FF=y
+CONFIG_JOYSTICK_XPAD_LEDS=y
+# CONFIG_INPUT_TABLET is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_AD7879 is not set
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
+# CONFIG_TOUCHSCREEN_DYNAPRO is not set
+# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
+# CONFIG_TOUCHSCREEN_EETI is not set
+# CONFIG_TOUCHSCREEN_FUJITSU is not set
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+# CONFIG_TOUCHSCREEN_MCS5000 is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_QT602240 is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_UCB1400=m
+# CONFIG_TOUCHSCREEN_WM97XX is not set
+CONFIG_TOUCHSCREEN_USB_COMPOSITE=m
+CONFIG_TOUCHSCREEN_USB_EGALAX=y
+CONFIG_TOUCHSCREEN_USB_PANJIT=y
+CONFIG_TOUCHSCREEN_USB_3M=y
+CONFIG_TOUCHSCREEN_USB_ITM=y
+CONFIG_TOUCHSCREEN_USB_ETURBO=y
+CONFIG_TOUCHSCREEN_USB_GUNZE=y
+CONFIG_TOUCHSCREEN_USB_DMC_TSC10=y
+CONFIG_TOUCHSCREEN_USB_IRTOUCH=y
+CONFIG_TOUCHSCREEN_USB_IDEALTEK=y
+CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y
+CONFIG_TOUCHSCREEN_USB_GOTOP=y
+CONFIG_TOUCHSCREEN_USB_JASTEC=y
+CONFIG_TOUCHSCREEN_USB_E2I=y
+CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y
+CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y
+CONFIG_TOUCHSCREEN_USB_NEXIO=y
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
+# CONFIG_TOUCHSCREEN_TSC2007 is not set
+# CONFIG_TOUCHSCREEN_W90X900 is not set
+# CONFIG_TOUCHSCREEN_TPS6507X is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_AD714X is not set
+# 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_CM109 is not set
+CONFIG_INPUT_UINPUT=y
+# CONFIG_INPUT_PCF8574 is not set
+# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
+# CONFIG_INPUT_ADXL34X is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+CONFIG_SERIO_LIBPS2=m
+# CONFIG_SERIO_RAW is not set
+# CONFIG_SERIO_ALTERA_PS2 is not set
+CONFIG_GAMEPORT=y
+# CONFIG_GAMEPORT_NS558 is not set
+# CONFIG_GAMEPORT_L4 is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_DEVKMEM is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_N_GSM 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_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_MINIPUG is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM 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_IPWIRELESS is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+# CONFIG_RAMOOPS is not set
+CONFIG_SAMOSA=y
+# CONFIG_PROC_SAMOSA is not set
+CONFIG_I2C=m
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_COMPAT=y
+CONFIG_I2C_CHARDEV=m
+# CONFIG_I2C_MUX is not set
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_ALGOBIT=m
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+# CONFIG_I2C_DESIGNWARE is not set
+CONFIG_I2C_GPIO=m
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PCA_PLATFORM is not set
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_XILINX is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+# CONFIG_GPIO_IT8761E is not set
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_ADP5588 is not set
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+
+#
+# AC97 GPIO expanders:
+#
+# CONFIG_GPIO_UCB1400 is not set
+
+#
+# MODULbus GPIO expanders:
+#
+CONFIG_W1=m
+CONFIG_W1_CON=y
+
+#
+# 1-wire Bus Masters
+#
+CONFIG_W1_MASTER_DS2490=m
+CONFIG_W1_MASTER_DS2482=m
+# CONFIG_W1_MASTER_DS1WM is not set
+# CONFIG_W1_MASTER_GPIO is not set
+
+#
+# 1-wire Slaves
+#
+CONFIG_W1_SLAVE_THERM=m
+CONFIG_W1_SLAVE_SMEM=m
+# CONFIG_W1_SLAVE_DS2431 is not set
+CONFIG_W1_SLAVE_DS2433=m
+# CONFIG_W1_SLAVE_DS2433_CRC is not set
+# CONFIG_W1_SLAVE_DS2760 is not set
+# CONFIG_W1_SLAVE_BQ27000 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_SA1100_WATCHDOG=m
+# CONFIG_MAX63XX_WATCHDOG is not set
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+CONFIG_SSB=m
+CONFIG_SSB_BLOCKIO=y
+CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
+# CONFIG_SSB_PCMCIAHOST is not set
+CONFIG_SSB_SDIOHOST_POSSIBLE=y
+# CONFIG_SSB_SDIOHOST is not set
+# CONFIG_SSB_DEBUG is not set
+CONFIG_MFD_SUPPORT=y
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 is not set
+CONFIG_UCB1400_CORE=m
+# CONFIG_TPS65010 is not set
+# CONFIG_TPS6507X is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_ABX500_CORE is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_DRM is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_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_UVESA is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_OVERLAY is not set
+# CONFIG_FB_PXA_SMARTPANEL is not set
+CONFIG_FB_PXA_PARAMETERS=y
+# CONFIG_FB_MINIPUG is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_W100 is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_BROADSHEET is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+CONFIG_LCD_PLATFORM=m
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_GENERIC=y
+# CONFIG_BACKLIGHT_ADP8860 is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS 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=y
+CONFIG_SOUND=m
+CONFIG_SOUND_OSS_CORE=y
+CONFIG_SOUND_OSS_CORE_PRECLAIM=y
+CONFIG_SND=m
+CONFIG_SND_TIMER=m
+CONFIG_SND_PCM=m
+CONFIG_SND_JACK=y
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQ_DUMMY is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=m
+CONFIG_SND_PCM_OSS=m
+CONFIG_SND_PCM_OSS_PLUGINS=y
+CONFIG_SND_SEQUENCER_OSS=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+CONFIG_SND_VMASTER=y
+# CONFIG_SND_RAWMIDI_SEQ is not set
+# CONFIG_SND_OPL3_LIB_SEQ is not set
+# CONFIG_SND_OPL4_LIB_SEQ is not set
+# CONFIG_SND_SBAWE_SEQ is not set
+# CONFIG_SND_EMU10K1_SEQ is not set
+CONFIG_SND_AC97_CODEC=m
+CONFIG_SND_DRIVERS=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
+CONFIG_SND_AC97_POWER_SAVE=y
+CONFIG_SND_AC97_POWER_SAVE_DEFAULT=2
+CONFIG_SND_ARM=y
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_LIB=m
+CONFIG_SND_PXA2XX_LIB_AC97=y
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB=y
+# CONFIG_SND_USB_AUDIO is not set
+# CONFIG_SND_USB_UA101 is not set
+# CONFIG_SND_USB_CAIAQ is not set
+# CONFIG_SND_PCMCIA is not set
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
+CONFIG_SND_SOC_I2C_AND_SPI=m
+# CONFIG_SND_SOC_ALL_CODECS is not set
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=m
+# CONFIG_HIDRAW is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=m
+CONFIG_HID_PID=y
+CONFIG_USB_HIDDEV=y
+
+#
+# Special HID drivers
+#
+# CONFIG_HID_3M_PCT is not set
+CONFIG_HID_A4TECH=m
+# CONFIG_HID_ACRUX_FF is not set
+CONFIG_HID_APPLE=m
+CONFIG_HID_BELKIN=m
+# CONFIG_HID_CANDO is not set
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=m
+# CONFIG_HID_PRODIKEYS is not set
+CONFIG_HID_CYPRESS=m
+CONFIG_HID_DRAGONRISE=m
+# CONFIG_DRAGONRISE_FF is not set
+# CONFIG_HID_EGALAX is not set
+# CONFIG_HID_ELECOM is not set
+CONFIG_HID_EZKEY=m
+CONFIG_HID_KYE=m
+CONFIG_HID_GYRATION=m
+CONFIG_HID_TWINHAN=m
+CONFIG_HID_KENSINGTON=m
+CONFIG_HID_LOGITECH=m
+CONFIG_LOGITECH_FF=y
+CONFIG_LOGIRUMBLEPAD2_FF=y
+# CONFIG_LOGIG940_FF is not set
+# CONFIG_HID_MAGICMOUSE is not set
+CONFIG_HID_MICROSOFT=m
+# CONFIG_HID_MOSART is not set
+CONFIG_HID_MONTEREY=m
+CONFIG_HID_NTRIG=m
+CONFIG_HID_ORTEK=m
+CONFIG_HID_PANTHERLORD=m
+# CONFIG_PANTHERLORD_FF is not set
+CONFIG_HID_PETALYNX=m
+# CONFIG_HID_PICOLCD is not set
+# CONFIG_HID_QUANTA is not set
+# CONFIG_HID_ROCCAT is not set
+# CONFIG_HID_ROCCAT_KONE is not set
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SONY=m
+# CONFIG_HID_STANTUM is not set
+CONFIG_HID_SUNPLUS=m
+CONFIG_HID_GREENASIA=m
+# CONFIG_GREENASIA_FF is not set
+CONFIG_HID_SMARTJOYPLUS=m
+# CONFIG_SMARTJOYPLUS_FF is not set
+CONFIG_HID_TOPSEED=m
+CONFIG_HID_THRUSTMASTER=m
+# CONFIG_THRUSTMASTER_FF is not set
+# CONFIG_HID_WACOM is not set
+CONFIG_HID_ZEROPLUS=m
+# CONFIG_ZEROPLUS_FF is not set
+# CONFIG_HID_ZYDACRON is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+CONFIG_USB_DEVICE_CLASS=y
+# CONFIG_USB_DYNAMIC_MINORS is not set
+CONFIG_USB_MON=m
+# CONFIG_USB_WUSB is not set
+# CONFIG_USB_WUSB_CBAF is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_OXU210HP_HCD is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_ISP1362_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_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_HWA_HCD is not set
+# CONFIG_USB_MUSB_HDRC is not set
+
+#
+# USB Device Class drivers
+#
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_TMC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+#
+
+#
+# also be needed; see USB_STORAGE Help for more info
+#
+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_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_ONETOUCH is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+CONFIG_USB_LIBUSUAL=y
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB port drivers
+#
+CONFIG_USB_SERIAL=m
+CONFIG_USB_EZUSB=y
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+# CONFIG_USB_SERIAL_CH341 is not set
+CONFIG_USB_SERIAL_WHITEHEAT=m
+CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
+# CONFIG_USB_SERIAL_CP210X is not set
+CONFIG_USB_SERIAL_CYPRESS_M8=m
+# CONFIG_USB_SERIAL_EMPEG is not set
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_FUNSOFT=m
+# CONFIG_USB_SERIAL_VISOR is not set
+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_IUU is not set
+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
+# CONFIG_USB_SERIAL_KEYSPAN is not set
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+# CONFIG_USB_SERIAL_MOTOROLA is not set
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=m
+# CONFIG_USB_SERIAL_OTI6858 is not set
+# CONFIG_USB_SERIAL_QCAUX is not set
+# CONFIG_USB_SERIAL_QUALCOMM is not set
+# CONFIG_USB_SERIAL_SPCP8X5 is not set
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_SAFE_PADDED=y
+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+# CONFIG_USB_SERIAL_SYMBOL is not set
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_WWAN=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+# CONFIG_USB_SERIAL_OPTICON is not set
+# CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set
+# CONFIG_USB_SERIAL_ZIO is not set
+# CONFIG_USB_SERIAL_SSU100 is not set
+CONFIG_USB_SERIAL_DEBUG=m
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_SEVSEG 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_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
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG is not set
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_VBUS_DRAW=2
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_R8A66597 is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=y
+# CONFIG_USB_GADGET_M66592 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+# CONFIG_USB_AUDIO is not set
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+CONFIG_USB_ETH_RNDIS_COMPAT=y
+# CONFIG_USB_ETH_EEM is not set
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FUNCTIONFS is not set
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+# CONFIG_USB_MASS_STORAGE is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_PRINTER is not set
+CONFIG_USB_CDC_COMPOSITE=m
+# CONFIG_USB_G_MULTI is not set
+# CONFIG_USB_G_HID is not set
+# CONFIG_USB_G_DBGP is not set
+
+#
+# OTG and related infrastructure
+#
+CONFIG_USB_OTG_UTILS=y
+CONFIG_USB_GPIO_VBUS=m
+# CONFIG_USB_ULPI is not set
+# CONFIG_NOP_USB_XCEIV is not set
+CONFIG_MMC=m
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=m
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+CONFIG_MMC_PXA=m
+# CONFIG_MMC_SDHCI is not set
+# CONFIG_MEMSTICK is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_PCA9532 is not set
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_GPIO_PLATFORM=y
+# CONFIG_LEDS_LP3944 is not set
+# CONFIG_LEDS_PCA955X is not set
+# CONFIG_LEDS_BD2802 is not set
+# CONFIG_LEDS_LT3593 is not set
+CONFIG_LEDS_TRIGGERS=y
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_GPIO is not set
+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=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_DS1374 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS3232 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_ISL12022 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_BQ32K is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+# CONFIG_RTC_DRV_RX8025 is not set
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_RTC_DRV_SA1100 is not set
+CONFIG_RTC_DRV_PXA=y
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=m
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+# CONFIG_EXT3_FS_XATTR is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=m
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+# CONFIG_REISERFS_FS_XATTR is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_FANOTIFY is not set
+# CONFIG_QUOTA is not set
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+# CONFIG_CUSE is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=850
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+CONFIG_NTFS_RW=y
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=m
+CONFIG_MISC_FILESYSTEMS=y
+# 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_YAFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
+CONFIG_UBIFS_FS=y
+# CONFIG_UBIFS_FS_XATTR is not set
+# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
+CONFIG_UBIFS_FS_LZO=y
+CONFIG_UBIFS_FS_ZLIB=y
+# CONFIG_UBIFS_FS_DEBUG is not set
+# CONFIG_LOGFS is not set
+CONFIG_CRAMFS=m
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+# CONFIG_CEPH_FS is not set
+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
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_CODEPAGE_737=m
+CONFIG_NLS_CODEPAGE_775=m
+CONFIG_NLS_CODEPAGE_850=y
+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 is not set
+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
+CONFIG_DLM=m
+# CONFIG_DLM_DEBUG is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+# CONFIG_LOCKUP_DETECTOR is not set
+# CONFIG_HARDLOCKUP_DETECTOR is not set
+CONFIG_DETECT_HUNG_TASK=y
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT 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_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+# CONFIG_PAGE_POISONING is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+CONFIG_ARM_UNWIND=y
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_LL is not set
+# CONFIG_OC_ETM is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+CONFIG_CRYPTO=y
+
+#
+# Crypto core or helper
+#
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+CONFIG_CRYPTO_HASH=m
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_PCOMP2=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_MANAGER_TESTS=y
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_NULL is not set
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_AUTHENC is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Authenticated Encryption with Associated Data
+#
+# CONFIG_CRYPTO_CCM is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_SEQIV is not set
+
+#
+# Block modes
+#
+CONFIG_CRYPTO_CBC=m
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_ECB=y
+# CONFIG_CRYPTO_LRW is not set
+CONFIG_CRYPTO_PCBC=m
+# CONFIG_CRYPTO_XTS is not set
+
+#
+# Hash modes
+#
+CONFIG_CRYPTO_HMAC=m
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_VMAC is not set
+
+#
+# Digest
+#
+CONFIG_CRYPTO_CRC32C=m
+# CONFIG_CRYPTO_GHASH is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+CONFIG_CRYPTO_SHA1=m
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_WP512 is not set
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_ARC4=y
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_DES is not set
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SERPENT is not set
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+
+#
+# Compression
+#
+CONFIG_CRYPTO_DEFLATE=y
+# CONFIG_CRYPTO_ZLIB is not set
+CONFIG_CRYPTO_LZO=y
+
+#
+# Random Number Generation
+#
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+CONFIG_CRYPTO_HW=y
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_CRC_CCITT=m
+CONFIG_CRC16=y
+# CONFIG_CRC_T10DIF is not set
+CONFIG_CRC_ITU_T=m
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+CONFIG_LIBCRC32C=m
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_DECOMPRESS_LZO=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
+CONFIG_GENERIC_ATOMIC64=y
Added: balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config-podpoint
===================================================================
--- balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config-podpoint (rev 0)
+++ balloon/branches/menuconfig/kernel/2.6.36-rc1/balloon3config-podpoint 2010-08-22 21:25:46 UTC (rev 1205)
@@ -0,0 +1,2052 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.29-rc7
+# Thu Mar 5 14:02:02 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=y
+# CONFIG_NO_IOPORT is not set
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_ARCH_HAS_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_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION="-pxa270"
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_CLASSIC_RCU=y
+# CONFIG_TREE_RCU is not set
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_PREEMPT_RCU_TRACE is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+# CONFIG_NET_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_COMPAT_BRK=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_AIO=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY 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"
+CONFIG_FREEZER=y
+
+#
+# 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_CLPS711X 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_KIRKWOOD is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_ORION5X 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_S3C64XX 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
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_W90X900 is not set
+
+#
+# Intel PXA2xx/PXA3xx Implementations
+#
+# CONFIG_ARCH_GUMSTIX is not set
+# CONFIG_MACH_INTELMOTE2 is not set
+# CONFIG_ARCH_LUBBOCK is not set
+# CONFIG_MACH_LOGICPD_PXA270 is not set
+# CONFIG_MACH_MAINSTONE is not set
+# CONFIG_MACH_MP900C is not set
+CONFIG_MACH_BALLOON3=y
+CONFIG_BALLOON3_TOPPOLY=y
+# CONFIG_BALLOON3_VGA is not set
+# CONFIG_BALLOON3_SVGA is not set
+# CONFIG_BALLOON3_NODISPLAY is not set
+# CONFIG_ARCH_PXA_IDP is not set
+# CONFIG_PXA_SHARPSL is not set
+# CONFIG_ARCH_VIPER is not set
+# CONFIG_ARCH_PXA_ESERIES is not set
+# CONFIG_TRIZEPS_PXA is not set
+# CONFIG_MACH_H5000 is not set
+# CONFIG_MACH_EM_X270 is not set
+# CONFIG_MACH_COLIBRI is not set
+# CONFIG_MACH_ZYLONITE is not set
+# CONFIG_MACH_LITTLETON is not set
+# CONFIG_MACH_TAVOREVB is not set
+# CONFIG_MACH_SAAR is not set
+# CONFIG_MACH_ARMCORE is not set
+# CONFIG_MACH_CM_X300 is not set
+# CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_MIOA701 is not set
+# CONFIG_MACH_PCM027 is not set
+# CONFIG_ARCH_PXA_PALM is not set
+# CONFIG_PXA_EZX is not set
+CONFIG_PXA27x=y
+# CONFIG_PXA_PWM is not set
+CONFIG_PXA_HAVE_BOARD_IRQS=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_PABRT_NOIFAR=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 is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_IWMMXT=y
+CONFIG_XSCALE_PMU=y
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_PCCARD=m
+CONFIG_PCMCIA_DEBUG=y
+CONFIG_PCMCIA=m
+CONFIG_PCMCIA_LOAD_CIS=y
+# CONFIG_PCMCIA_IOCTL is not set
+
+#
+# PC-card bridges
+#
+CONFIG_PCMCIA_PXA2XX=m
+
+#
+# Kernel Features
+#
+CONFIG_TICK_ONESHOT=y
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_OABI_COMPAT is not set
+CONFIG_ARCH_FLATMEM_HAS_HOLES=y
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL 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_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+CONFIG_UNEVICTABLE_LRU=y
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Power Management
+#
+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_POWERSAVE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=m
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=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_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SLEEP=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+# CONFIG_APM_EMULATION is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+CONFIG_NETDEVICES=y
+CONFIG_TUN=m
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+CONFIG_NET_PCI=y
+CONFIG_CS89x0=m
+
+#
+# Networking options
+#
+CONFIG_COMPAT_NET_DEV_OPS=y
+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_XFRM_STATISTICS is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_ASK_IP_FIB_HASH=y
+# CONFIG_IP_FIB_TRIE is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_MULTIPLE_TABLES=y
+# CONFIG_IP_ROUTE_MULTIPATH is not set
+# CONFIG_IP_ROUTE_VERBOSE is not set
+# CONFIG_IP_PNP is not set
+CONFIG_NET_IPIP=m
+CONFIG_NET_IPGRE=m
+# CONFIG_NET_IPGRE_BROADCAST is not set
+# CONFIG_IP_MROUTE 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_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_IPV6_SIT=m
+CONFIG_IPV6_NDISC_NODETYPE=y
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_NETWORK_SECMARK is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_ADVANCED=y
+# CONFIG_BRIDGE_NETFILTER is not set
+
+#
+# Core Netfilter Configuration
+#
+# CONFIG_NETFILTER_NETLINK_QUEUE is not set
+# CONFIG_NETFILTER_NETLINK_LOG is not set
+# CONFIG_NF_CONNTRACK is not set
+# CONFIG_NETFILTER_XTABLES is not set
+# CONFIG_IP_VS is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_NF_DEFRAG_IPV4 is not set
+CONFIG_IP_NF_QUEUE=m
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_ARPTABLES is not set
+
+#
+# IPv6: Netfilter Configuration
+#
+CONFIG_IP6_NF_QUEUE=m
+# CONFIG_IP6_NF_IPTABLES is not set
+# CONFIG_IP_DCCP is not set
+CONFIG_IP_SCTP=m
+# CONFIG_SCTP_DBG_MSG is not set
+# CONFIG_SCTP_DBG_OBJCNT is not set
+# CONFIG_SCTP_HMAC_NONE is not set
+# CONFIG_SCTP_HMAC_SHA1 is not set
+CONFIG_SCTP_HMAC_MD5=y
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+CONFIG_STP=m
+CONFIG_BRIDGE=m
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+CONFIG_LLC=m
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+CONFIG_NET_SCHED=y
+
+#
+# Queueing/Scheduling
+#
+# CONFIG_NET_SCH_CBQ is not set
+# CONFIG_NET_SCH_HTB is not set
+# CONFIG_NET_SCH_HFSC is not set
+# CONFIG_NET_SCH_PRIO is not set
+# CONFIG_NET_SCH_MULTIQ is not set
+# CONFIG_NET_SCH_RED is not set
+# CONFIG_NET_SCH_SFQ is not set
+# CONFIG_NET_SCH_TEQL is not set
+# CONFIG_NET_SCH_TBF is not set
+# CONFIG_NET_SCH_GRED is not set
+# CONFIG_NET_SCH_DSMARK is not set
+# CONFIG_NET_SCH_NETEM is not set
+# CONFIG_NET_SCH_DRR is not set
+
+#
+# Classification
+#
+# CONFIG_NET_CLS_BASIC is not set
+# CONFIG_NET_CLS_TCINDEX is not set
+# CONFIG_NET_CLS_ROUTE4 is not set
+# CONFIG_NET_CLS_FW is not set
+# CONFIG_NET_CLS_U32 is not set
+# CONFIG_NET_CLS_RSVP is not set
+# CONFIG_NET_CLS_RSVP6 is not set
+# CONFIG_NET_CLS_FLOW is not set
+# CONFIG_NET_EMATCH is not set
+# CONFIG_NET_CLS_ACT is not set
+CONFIG_NET_SCH_FIFO=y
+# CONFIG_DCB is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+CONFIG_BT=m
+CONFIG_BT_L2CAP=m
+CONFIG_BT_SCO=m
+CONFIG_BT_RFCOMM=m
+CONFIG_BT_RFCOMM_TTY=y
+CONFIG_BT_BNEP=m
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
+CONFIG_BT_HIDP=m
+
+#
+# Bluetooth device drivers
+#
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_BCSP=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIDTL1=m
+CONFIG_BT_HCIBT3C=m
+CONFIG_BT_HCIBLUECARD=m
+CONFIG_BT_HCIBTUART=m
+CONFIG_BT_HCIVHCI=m
+# CONFIG_AF_RXRPC is not set
+# CONFIG_PHONET is not set
+CONFIG_FIB_RULES=y
+CONFIG_WIRELESS=y
+# CONFIG_CFG80211 is not set
+CONFIG_WIRELESS_OLD_REGULATORY=y
+CONFIG_WIRELESS_EXT=y
+CONFIG_WIRELESS_EXT_SYSFS=y
+CONFIG_LIB80211=m
+CONFIG_LIB80211_CRYPT_WEP=m
+CONFIG_LIB80211_CRYPT_CCMP=m
+CONFIG_LIB80211_CRYPT_TKIP=m
+# CONFIG_MAC80211 is not set
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_STANDALONE is not set
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+CONFIG_CONNECTOR=m
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_TESTS is not set
+CONFIG_MTD_REDBOOT_PARTS=m
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+CONFIG_MTD_AFS_PARTS=m
+# CONFIG_MTD_AR7_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+# CONFIG_MTD_OOPS is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT 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
+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_GPIO is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_SHARPSL is not set
+CONFIG_MTD_NAND_BALLOON3=y
+# CONFIG_MTD_NAND_NANDSIM is not set
+# CONFIG_MTD_NAND_PLATFORM is not set
+# CONFIG_MTD_ALAUDA is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# LPDDR flash memory drivers
+#
+# CONFIG_MTD_LPDDR is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=m
+CONFIG_BLK_DEV_CRYPTOLOOP=m
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_UB is not set
+# CONFIG_BLK_DEV_RAM is not set
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+# CONFIG_CDROM_PKTCDVD_WCACHE is not set
+CONFIG_ATA_OVER_ETH=m
+CONFIG_MISC_DEVICES=y
+# CONFIG_ICS932S401 is not set
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_AT24 is not set
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_HAVE_IDE=y
+CONFIG_IDE=m
+
+#
+# Please see Documentation/ide/ide.txt for help/info on IDE drives
+#
+CONFIG_IDE_ATAPI=y
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_IDE_GD=m
+CONFIG_IDE_GD_ATA=y
+# CONFIG_IDE_GD_ATAPI is not set
+CONFIG_BLK_DEV_IDECS=m
+CONFIG_BLK_DEV_IDECD=m
+CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS=y
+CONFIG_BLK_DEV_IDETAPE=m
+# CONFIG_IDE_TASK_IOCTL is not set
+CONFIG_IDE_PROC_FS=y
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_PLATFORM is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+
+#
+# SCSI device support
+#
+CONFIG_RAID_ATTRS=m
+CONFIG_SCSI=m
+CONFIG_SCSI_DMA=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=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 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=m
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_LIBFC is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+# CONFIG_SCSI_DH is not set
+CONFIG_ATA=m
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_SATA_PMP=y
+CONFIG_ATA_SFF=y
+# CONFIG_SATA_MV is not set
+CONFIG_PATA_PCMCIA=m
+
+#
+# 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 is not set
+# CONFIG_DM_SNAPSHOT is not set
+# CONFIG_DM_MIRROR is not set
+# CONFIG_DM_ZERO is not set
+# CONFIG_DM_MULTIPATH is not set
+# CONFIG_DM_DELAY is not set
+# CONFIG_DM_UEVENT is not set
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+CONFIG_DUMMY=m
+CONFIG_BONDING=m
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+CONFIG_TUN=m
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=m
+
+#
+# MII PHY device drivers
+#
+CONFIG_MARVELL_PHY=m
+CONFIG_DAVICOM_PHY=m
+CONFIG_QSEMI_PHY=m
+CONFIG_LXT_PHY=m
+CONFIG_CICADA_PHY=m
+CONFIG_VITESSE_PHY=m
+CONFIG_SMSC_PHY=m
+CONFIG_BROADCOM_PHY=m
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=m
+# CONFIG_AX88796 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_SMC911X is not set
+# CONFIG_SMSC911X is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+# CONFIG_B44 is not set
+CONFIG_CS89x0=m
+CONFIG_NETDEV_1000=y
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+CONFIG_WLAN_80211=y
+CONFIG_PCMCIA_RAYCS=m
+CONFIG_LIBERTAS=m
+CONFIG_LIBERTAS_USB=m
+CONFIG_LIBERTAS_CS=m
+# CONFIG_LIBERTAS_SDIO is not set
+# CONFIG_LIBERTAS_DEBUG is not set
+CONFIG_HERMES=m
+CONFIG_HERMES_CACHE_FW_ON_INIT=y
+# CONFIG_PCMCIA_HERMES is not set
+# CONFIG_PCMCIA_SPECTRUM is not set
+CONFIG_ATMEL=m
+# CONFIG_PCMCIA_ATMEL is not set
+CONFIG_AIRO_CS=m
+CONFIG_PCMCIA_WL3501=m
+CONFIG_USB_ZD1201=m
+# CONFIG_USB_NET_RNDIS_WLAN is not set
+# CONFIG_IWLWIFI_LEDS is not set
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_FIRMWARE_NVRAM=y
+CONFIG_HOSTAP_CS=m
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+
+#
+# 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_DM9601=m
+# CONFIG_USB_NET_SMSC95XX is not set
+CONFIG_USB_NET_GL620A=m
+CONFIG_USB_NET_NET1080=m
+CONFIG_USB_NET_PLUSB=m
+CONFIG_USB_NET_MCS7830=m
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_CDC_SUBSET=m
+CONFIG_USB_ALI_M5632=y
+CONFIG_USB_AN2720=y
+CONFIG_USB_BELKIN=y
+CONFIG_USB_ARMLINUX=y
+# CONFIG_USB_EPSON2888 is not set
+CONFIG_USB_KC2190=y
+CONFIG_USB_NET_ZAURUS=m
+CONFIG_NET_PCMCIA=y
+CONFIG_PCMCIA_3C589=m
+CONFIG_PCMCIA_3C574=m
+CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_PCMCIA_PCNET=m
+CONFIG_PCMCIA_NMCLAN=m
+CONFIG_PCMCIA_SMC91C92=m
+CONFIG_PCMCIA_XIRC2PS=m
+CONFIG_PCMCIA_AXNET=m
+# CONFIG_WAN is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+# CONFIG_PPPOL2TP is not set
+CONFIG_SLIP=m
+CONFIG_SLIP_COMPRESSED=y
+CONFIG_SLHC=m
+CONFIG_SLIP_SMART=y
+# CONFIG_SLIP_MODE_SLIP6 is not set
+CONFIG_NETCONSOLE=m
+# CONFIG_NETCONSOLE_DYNAMIC is not set
+CONFIG_NETPOLL=y
+# CONFIG_NETPOLL_TRAP is not set
+CONFIG_NET_POLL_CONTROLLER=y
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=m
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
+# CONFIG_INPUT_JOYDEV is not set
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=m
+# 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 is not set
+CONFIG_KEYBOARD_GPIO=m
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=m
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+# CONFIG_MOUSE_PS2_ELANTECH is not set
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+CONFIG_MOUSE_SERIAL=m
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_BCM5974 is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_MOUSE_GPIO is not set
+CONFIG_INPUT_JOYSTICK=y
+# CONFIG_JOYSTICK_ANALOG is not set
+# CONFIG_JOYSTICK_A3D is not set
+# CONFIG_JOYSTICK_ADI is not set
+# CONFIG_JOYSTICK_COBRA is not set
+# CONFIG_JOYSTICK_GF2K is not set
+# CONFIG_JOYSTICK_GRIP is not set
+# CONFIG_JOYSTICK_GRIP_MP is not set
+# CONFIG_JOYSTICK_GUILLEMOT is not set
+# CONFIG_JOYSTICK_INTERACT is not set
+# CONFIG_JOYSTICK_SIDEWINDER is not set
+# CONFIG_JOYSTICK_TMDC is not set
+# CONFIG_JOYSTICK_IFORCE is not set
+# CONFIG_JOYSTICK_WARRIOR is not set
+# CONFIG_JOYSTICK_MAGELLAN is not set
+# CONFIG_JOYSTICK_SPACEORB is not set
+# CONFIG_JOYSTICK_SPACEBALL is not set
+# CONFIG_JOYSTICK_STINGER is not set
+# CONFIG_JOYSTICK_TWIDJOY is not set
+# CONFIG_JOYSTICK_ZHENHUA is not set
+# CONFIG_JOYSTICK_JOYDUMP is not set
+# CONFIG_JOYSTICK_XPAD is not set
+# CONFIG_INPUT_TABLET is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+# CONFIG_TOUCHSCREEN_FUJITSU is not set
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+CONFIG_TOUCHSCREEN_UCB1400=m
+# CONFIG_TOUCHSCREEN_WM97XX is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
+# CONFIG_TOUCHSCREEN_TSC2007 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_CM109 is not set
+CONFIG_INPUT_UINPUT=y
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+CONFIG_SERIO_LIBPS2=m
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_DEVKMEM=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SAMOSA_PODPOINT=m
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+
+#
+# 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_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_LMR5428=m
+CONFIG_TSL2560=m
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM 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_IPWIRELESS is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_SAMOSA=m
+# CONFIG_PROC_SAMOSA is not set
+CONFIG_I2C=m
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_ALGOBIT=m
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+CONFIG_I2C_GPIO=m
+# CONFIG_I2C_OCORES is not set
+CONFIG_I2C_PXA=m
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_SIMTEC is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_STUB is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_DS1682 is not set
+CONFIG_SENSORS_PCF8574=m
+# CONFIG_PCF8575 is not set
+CONFIG_SENSORS_PCA9539=m
+CONFIG_SENSORS_PCF8591=m
+CONFIG_SENSORS_MAX6875=m
+# CONFIG_SENSORS_TSL2550 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
+# CONFIG_SPI is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+# CONFIG_GPIO_SYSFS is not set
+
+#
+# Memory mapped GPIO expanders:
+#
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+CONFIG_W1=m
+CONFIG_W1_CON=y
+
+#
+# 1-wire Bus Masters
+#
+CONFIG_W1_MASTER_DS2490=m
+CONFIG_W1_MASTER_DS2482=m
+# CONFIG_W1_MASTER_DS1WM is not set
+# CONFIG_W1_MASTER_GPIO is not set
+
+#
+# 1-wire Slaves
+#
+CONFIG_W1_SLAVE_THERM=m
+CONFIG_W1_SLAVE_SMEM=m
+# CONFIG_W1_SLAVE_DS2431 is not set
+CONFIG_W1_SLAVE_DS2433=m
+# CONFIG_W1_SLAVE_DS2433_CRC is not set
+# CONFIG_W1_SLAVE_DS2760 is not set
+# CONFIG_W1_SLAVE_BQ27000 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_SA1100_WATCHDOG=m
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 is not set
+CONFIG_UCB1400_CORE=m
+# CONFIG_TPS65010 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_PCF50633 is not set
+
+#
+# Multimedia devices
+#
+#
+# Multimedia core support
+#
+CONFIG_VIDEO_DEV=m
+CONFIG_VIDEO_V4L2_COMMON=m
+# CONFIG_VIDEO_ALLOW_V4L1 is not set
+CONFIG_VIDEO_V4L1_COMPAT=y
+# CONFIG_DVB_CORE is not set
+CONFIG_VIDEO_MEDIA=m
+
+#
+# Multimedia drivers
+#
+# CONFIG_MEDIA_ATTACH is not set
+CONFIG_MEDIA_TUNER=m
+# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set
+CONFIG_MEDIA_TUNER_SIMPLE=m
+CONFIG_MEDIA_TUNER_TDA8290=m
+CONFIG_MEDIA_TUNER_TDA9887=m
+CONFIG_MEDIA_TUNER_TEA5761=m
+CONFIG_MEDIA_TUNER_TEA5767=m
+CONFIG_MEDIA_TUNER_MT20XX=m
+CONFIG_MEDIA_TUNER_XC2028=m
+CONFIG_MEDIA_TUNER_XC5000=m
+CONFIG_VIDEO_V4L2=m
+# CONFIG_VIDEO_CAPTURE_DRIVERS is not set
+# CONFIG_RADIO_ADAPTERS is not set
+# CONFIG_DAB is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+CONFIG_FB=y
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_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_UVESA is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_PXA=y
+# CONFIG_FB_PXA_OVERLAY is not set
+# CONFIG_FB_PXA_SMARTPANEL is not set
+CONFIG_FB_PXA_PARAMETERS=y
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_W100 is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
+# CONFIG_FB_MB862XX is not set
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_LCD_CLASS_DEVICE=y
+# CONFIG_LCD_ILI9320 is not set
+CONFIG_LCD_PLATFORM=m
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_GENERIC=y
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS 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=y
+
+#
+# Sound
+#
+CONFIG_SOUND=m
+CONFIG_SOUND_OSS_CORE=y
+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=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_VERBOSE_PROCFS is not set
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+CONFIG_SND_VMASTER=y
+CONFIG_SND_AC97_CODEC=m
+CONFIG_SND_DRIVERS=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
+CONFIG_SND_AC97_POWER_SAVE=y
+CONFIG_SND_AC97_POWER_SAVE_DEFAULT=2
+CONFIG_SND_ARM=y
+CONFIG_SND_PXA2XX_PCM=m
+CONFIG_SND_PXA2XX_LIB=m
+CONFIG_SND_PXA2XX_LIB_AC97=y
+CONFIG_SND_PXA2XX_AC97=m
+CONFIG_SND_USB=y
+CONFIG_SND_USB_AUDIO=m
+# CONFIG_SND_USB_CAIAQ is not set
+CONFIG_SND_PCMCIA=y
+# CONFIG_SND_VXPOCKET is not set
+# CONFIG_SND_PDAUDIOCF is not set
+CONFIG_SND_SOC=m
+# CONFIG_SND_PXA2XX_SOC is not set
+CONFIG_SND_SOC_I2C_AND_SPI=m
+# CONFIG_SND_SOC_ALL_CODECS is not set
+# CONFIG_SOUND_PRIME is not set
+CONFIG_AC97_BUS=m
+CONFIG_HID_SUPPORT=y
+CONFIG_HID=m
+# CONFIG_HID_DEBUG is not set
+# CONFIG_HIDRAW is not set
+
+#
+# USB Input Devices
+#
+CONFIG_USB_HID=m
+CONFIG_HID_PID=y
+CONFIG_USB_HIDDEV=y
+
+#
+# Special HID drivers
+#
+CONFIG_HID_COMPAT=y
+CONFIG_HID_A4TECH=m
+CONFIG_HID_APPLE=m
+CONFIG_HID_BELKIN=m
+CONFIG_HID_CHERRY=m
+CONFIG_HID_CHICONY=m
+CONFIG_HID_CYPRESS=m
+CONFIG_HID_EZKEY=m
+CONFIG_HID_GYRATION=m
+CONFIG_HID_LOGITECH=m
+CONFIG_LOGITECH_FF=y
+# CONFIG_LOGIRUMBLEPAD2_FF is not set
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_MONTEREY=m
+CONFIG_HID_NTRIG=m
+CONFIG_HID_PANTHERLORD=m
+# CONFIG_PANTHERLORD_FF is not set
+CONFIG_HID_PETALYNX=m
+CONFIG_HID_SAMSUNG=m
+CONFIG_HID_SONY=m
+CONFIG_HID_SUNPLUS=m
+# CONFIG_GREENASIA_FF is not set
+CONFIG_HID_TOPSEED=m
+# CONFIG_THRUSTMASTER_FF is not set
+# CONFIG_ZEROPLUS_FF is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+CONFIG_USB=m
+# CONFIG_USB_DEBUG is not set
+# CONFIG_USB_ANNOUNCE_NEW_DEVICES 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=y
+# CONFIG_USB_OTG is not set
+CONFIG_USB_MON=m
+# CONFIG_USB_WUSB is not set
+# CONFIG_USB_WUSB_CBAF is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_OXU210HP_HCD is not set
+# 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_U132_HCD is not set
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_HWA_HCD is not set
+# CONFIG_USB_MUSB_HDRC is not set
+# CONFIG_USB_GADGET_MUSB_HDRC is not set
+
+#
+# USB Device Class drivers
+#
+CONFIG_USB_ACM=m
+CONFIG_USB_PRINTER=m
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_TMC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
+#
+
+#
+# see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=m
+# CONFIG_USB_STORAGE_DEBUG is not set
+CONFIG_USB_STORAGE_DATAFAB=y
+CONFIG_USB_STORAGE_FREECOM=y
+CONFIG_USB_STORAGE_ISD200=y
+CONFIG_USB_STORAGE_USBAT=y
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+CONFIG_USB_STORAGE_JUMPSHOT=y
+CONFIG_USB_STORAGE_ALAUDA=y
+# CONFIG_USB_STORAGE_ONETOUCH is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+CONFIG_USB_LIBUSUAL=y
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB port drivers
+#
+CONFIG_USB_SERIAL=m
+CONFIG_USB_EZUSB=y
+CONFIG_USB_SERIAL_GENERIC=y
+CONFIG_USB_SERIAL_AIRCABLE=m
+CONFIG_USB_SERIAL_ARK3116=m
+CONFIG_USB_SERIAL_BELKIN=m
+# CONFIG_USB_SERIAL_CH341 is not set
+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 is not set
+CONFIG_USB_SERIAL_FTDI_SIO=m
+CONFIG_USB_SERIAL_FUNSOFT=m
+# CONFIG_USB_SERIAL_VISOR is not set
+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_IUU is not set
+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
+CONFIG_USB_SERIAL_KEYSPAN=m
+CONFIG_USB_SERIAL_KEYSPAN_MPR=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
+CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19=y
+CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
+CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
+CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
+CONFIG_USB_SERIAL_KLSI=m
+CONFIG_USB_SERIAL_KOBIL_SCT=m
+CONFIG_USB_SERIAL_MCT_U232=m
+CONFIG_USB_SERIAL_MOS7720=m
+CONFIG_USB_SERIAL_MOS7840=m
+# CONFIG_USB_SERIAL_MOTOROLA is not set
+CONFIG_USB_SERIAL_NAVMAN=m
+CONFIG_USB_SERIAL_PL2303=m
+# CONFIG_USB_SERIAL_OTI6858 is not set
+# CONFIG_USB_SERIAL_SPCP8X5 is not set
+CONFIG_USB_SERIAL_HP4X=m
+CONFIG_USB_SERIAL_SAFE=m
+CONFIG_USB_SERIAL_SAFE_PADDED=y
+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+CONFIG_USB_SERIAL_TI=m
+CONFIG_USB_SERIAL_CYBERJACK=m
+CONFIG_USB_SERIAL_XIRCOM=m
+CONFIG_USB_SERIAL_OPTION=m
+CONFIG_USB_SERIAL_OMNINET=m
+# CONFIG_USB_SERIAL_OPTICON is not set
+CONFIG_USB_SERIAL_DEBUG=m
+
+#
+# USB Miscellaneous drivers
+#
+CONFIG_USB_EMI62=m
+CONFIG_USB_EMI26=m
+CONFIG_USB_ADUTUX=m
+# CONFIG_USB_SEVSEG is not set
+# CONFIG_USB_RIO500 is not set
+CONFIG_USB_LEGOTOWER=m
+CONFIG_USB_LCD=m
+CONFIG_USB_BERRY_CHARGE=m
+CONFIG_USB_LED=m
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+CONFIG_USB_CYTHERM=m
+CONFIG_USB_PHIDGET=m
+CONFIG_USB_PHIDGETKIT=m
+CONFIG_USB_PHIDGETMOTORCONTROL=m
+CONFIG_USB_PHIDGETSERVO=m
+CONFIG_USB_IDMOUSE=m
+CONFIG_USB_FTDI_ELAN=m
+# CONFIG_USB_APPLEDISPLAY is not set
+CONFIG_USB_LD=m
+# CONFIG_USB_TRANCEVIBRATOR is not set
+CONFIG_USB_IOWARRIOR=m
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
+# CONFIG_USB_VST is not set
+CONFIG_USB_GADGET=m
+# CONFIG_USB_GADGET_DEBUG is not set
+CONFIG_USB_GADGET_DEBUG_FILES=y
+CONFIG_USB_GADGET_VBUS_DRAW=2
+CONFIG_USB_GADGET_SELECTED=y
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_ATMEL_USBA is not set
+# CONFIG_USB_GADGET_FSL_USB2 is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_PXA25X is not set
+CONFIG_USB_GADGET_PXA27X=y
+CONFIG_USB_PXA27X=m
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_IMX is not set
+# CONFIG_USB_GADGET_M66592 is not set
+# CONFIG_USB_GADGET_AMD5536UDC is not set
+# CONFIG_USB_GADGET_FSL_QE is not set
+# CONFIG_USB_GADGET_CI13XXX is not set
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_GOKU 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 is not set
+CONFIG_USB_GADGETFS=m
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_PRINTER is not set
+CONFIG_USB_CDC_COMPOSITE=m
+
+#
+# OTG and related infrastructure
+#
+CONFIG_USB_OTG_UTILS=y
+CONFIG_USB_GPIO_VBUS=m
+CONFIG_MMC=m
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=m
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+CONFIG_MMC_PXA=m
+# CONFIG_MMC_SDHCI is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_PCA9532 is not set
+CONFIG_LEDS_GPIO=y
+# CONFIG_LEDS_PCA955X is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_IDE_DISK=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=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_DS1374 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
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+
+#
+# SPI RTC drivers
+#
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_RTC_DRV_SA1100 is not set
+CONFIG_RTC_DRV_PXA=y
+# CONFIG_DMADEVICES is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_UIO is not set
+# CONFIG_STAGING 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=m
+# CONFIG_EXT3_FS_XATTR is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=m
+CONFIG_REISERFS_FS=m
+# CONFIG_REISERFS_CHECK is not set
+# CONFIG_REISERFS_PROC_INFO is not set
+# CONFIG_REISERFS_FS_XATTR is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+CONFIG_FILE_LOCKING=y
+# CONFIG_XFS_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+CONFIG_QUOTA=y
+# CONFIG_QUOTA_NETLINK_INTERFACE is not set
+CONFIG_PRINT_QUOTA_WARNING=y
+# CONFIG_QFMT_V1 is not set
+# CONFIG_QFMT_V2 is not set
+CONFIG_QUOTACTL=y
+CONFIG_AUTOFS_FS=m
+CONFIG_AUTOFS4_FS=m
+CONFIG_FUSE_FS=m
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_ISO9660_FS=m
+CONFIG_JOLIET=y
+CONFIG_ZISOFS=y
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=850
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_NTFS_FS=m
+# CONFIG_NTFS_DEBUG is not set
+CONFIG_NTFS_RW=y
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_CONFIGFS_FS=m
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS2_FS=m
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+CONFIG_CRAMFS=m
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_REGISTER_V4 is not set
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
+CONFIG_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_WEAK_PW_HASH 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
+
+#
+# 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=m
+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 is not set
+CONFIG_NLS_ISO8859_1=m
+CONFIG_NLS_ISO8859_2=m
+CONFIG_NLS_ISO8859_3=m
+CONFIG_NLS_ISO8859_4=m
+CONFIG_NLS_ISO8859_5=m
+CONFIG_NLS_ISO8859_6=m
+CONFIG_NLS_ISO8859_7=m
+CONFIG_NLS_ISO8859_9=m
+CONFIG_NLS_ISO8859_13=m
+CONFIG_NLS_ISO8859_14=m
+CONFIG_NLS_ISO8859_15=m
+CONFIG_NLS_KOI8_R=m
+CONFIG_NLS_KOI8_U=m
+CONFIG_NLS_UTF8=m
+
+#
+# Distributed Lock Manager
+#
+CONFIG_DLM=m
+# CONFIG_DLM_DEBUG is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_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_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT 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_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+
+#
+# Tracers
+#
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_CONTEXT_SWITCH_TRACER is not set
+# CONFIG_BOOT_TRACER is not set
+# CONFIG_TRACE_BRANCH_PROFILING is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+CONFIG_CRYPTO=y
+#
+# Crypto core or helper
+#
+# CONFIG_CRYPTO_FIPS is not set
+CONFIG_CRYPTO_ALGAPI=m
+CONFIG_CRYPTO_ALGAPI2=m
+CONFIG_CRYPTO_AEAD2=m
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_BLKCIPHER2=m
+CONFIG_CRYPTO_HASH=m
+CONFIG_CRYPTO_HASH2=m
+CONFIG_CRYPTO_RNG2=m
+CONFIG_CRYPTO_MANAGER=m
+CONFIG_CRYPTO_MANAGER2=m
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO