diff -Nrup linux-2.6.26-orig/arch/arm/boot/compressed/head-xscale.S linux-2.6.26-patched/arch/arm/boot/compressed/head-xscale.S
--- linux-2.6.26-orig/arch/arm/boot/compressed/head-xscale.S	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/arch/arm/boot/compressed/head-xscale.S	2008-07-22 20:48:45.000000000 +0200
@@ -33,6 +33,17 @@ __XScale_start:
 		bic	r0, r0, #0x1000		@ clear Icache
 		mcr	p15, 0, r0, c1, c0, 0
 
+#ifdef CONFIG_MACH_TRIZEPS4
+		mov     r7, #(MACH_TYPE_TRIZEPS4WL & 0xff)
+		orr     r7, r7, #(MACH_TYPE_TRIZEPS4WL & 0xff00)
+#endif
+
+#ifdef CONFIG_MACH_TRIZEPS5
+		mov     r7, #(MACH_TYPE_TRIZEPS5 & 0xff)
+		orr     r7, r7, #(MACH_TYPE_TRIZEPS5 & 0xff00)
+#endif
+
+
 #ifdef CONFIG_ARCH_IXP2000
 		mov	r1, #-1
 		mov	r0, #0xd6000000
diff -Nrup linux-2.6.26-orig/arch/arm/kernel/process.c linux-2.6.26-patched/arch/arm/kernel/process.c
--- linux-2.6.26-orig/arch/arm/kernel/process.c	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/arch/arm/kernel/process.c	2008-07-22 20:48:46.000000000 +0200
@@ -28,6 +28,7 @@
 #include <linux/pm.h>
 #include <linux/tick.h>
 #include <linux/utsname.h>
+#include <linux/leds.h>
 
 #include <asm/leds.h>
 #include <asm/processor.h>
@@ -157,6 +158,7 @@ void cpu_idle(void)
 #ifdef CONFIG_HOTPLUG_CPU
 		if (cpu_is_offline(smp_processor_id())) {
 			leds_event(led_idle_start);
+			ledtrig_cpu_busy(1);
 			cpu_die();
 		}
 #endif
@@ -164,10 +166,12 @@ void cpu_idle(void)
 		if (!idle)
 			idle = default_idle;
 		leds_event(led_idle_start);
+		ledtrig_cpu_busy(1);
 		tick_nohz_stop_sched_tick();
 		while (!need_resched())
 			idle();
 		leds_event(led_idle_end);
+		ledtrig_cpu_busy(0);
 		tick_nohz_restart_sched_tick();
 		preempt_enable_no_resched();
 		schedule();
diff -Nrup linux-2.6.26-orig/arch/arm/mach-pxa/cpu-pxa.c linux-2.6.26-patched/arch/arm/mach-pxa/cpu-pxa.c
--- linux-2.6.26-orig/arch/arm/mach-pxa/cpu-pxa.c	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/arch/arm/mach-pxa/cpu-pxa.c	2008-07-22 20:48:46.000000000 +0200
@@ -49,7 +49,7 @@ MODULE_PARM_DESC(freq_debug, "Set the de
 #define freq_debug  0
 #endif
 
-static unsigned int pxa27x_maxfreq;
+static unsigned int pxa27x_maxfreq = 520000;
 module_param(pxa27x_maxfreq, uint, 0);
 MODULE_PARM_DESC(pxa27x_maxfreq, "Set the pxa27x maxfreq in MHz"
 		 "(typically 624=>pxa270, 416=>pxa271, 520=>pxa272)");
diff -Nrup linux-2.6.26-orig/arch/arm/mach-pxa/devices.c linux-2.6.26-patched/arch/arm/mach-pxa/devices.c
--- linux-2.6.26-orig/arch/arm/mach-pxa/devices.c	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/arch/arm/mach-pxa/devices.c	2008-07-22 20:48:46.000000000 +0200
@@ -12,6 +12,7 @@
 #include <asm/arch/i2c.h>
 #include <asm/arch/ohci.h>
 #include <asm/arch/pxa27x_keypad.h>
+#include <asm/arch/pxa2xx_spi.h>
 #include <asm/arch/camera.h>
 
 #include "devices.h"
@@ -719,3 +720,20 @@ void __init pxa3xx_set_mci3_info(struct 
 }
 
 #endif /* CONFIG_PXA3xx */
+
+/* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1.
+ * See comment in arch/arm/mach-pxa/ssp.c::ssp_probe() */
+void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info)
+{
+	struct platform_device *pd;
+
+	pd = platform_device_alloc("pxa2xx-spi", id);
+	if (pd == NULL) {
+		printk(KERN_ERR "pxa2xx-spi: failed to allocate device id %d\n",
+		       id);
+		return;
+	}
+
+	pd->dev.platform_data = info;
+	platform_device_add(pd);
+}
diff -Nrup linux-2.6.26-orig/arch/arm/mach-pxa/Kconfig linux-2.6.26-patched/arch/arm/mach-pxa/Kconfig
--- linux-2.6.26-orig/arch/arm/mach-pxa/Kconfig	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/arch/arm/mach-pxa/Kconfig	2008-07-22 20:48:46.000000000 +0200
@@ -101,9 +101,8 @@ config MACH_E800
 	  Say Y here if you intend to run this kernel on a Toshiba
 	  e800 family PDA.
 
-config MACH_TRIZEPS4
-	bool "Keith und Koep Trizeps4 DIMM-Module"
-	select PXA27x
+config PXA_TRIZEPS
+	bool "Keith und Koep Trizeps DIMM-Module"
 
 config MACH_EM_X270
 	bool "CompuLab EM-x270 platform"
@@ -180,7 +179,16 @@ endchoice
 endif
 
 
-if MACH_TRIZEPS4
+if PXA_TRIZEPS
+
+config MACH_TRIZEPS4
+	bool "Keith und Koep Trizeps4 DIMM-Module"
+	select PXA27x
+
+config MACH_TRIZEPS4WL
+	bool "Keith und Koep Trizeps4-WL DIMM-Module"
+	select PXA27x
+	select PXA_SSP
 
 choice
 	prompt "Select base board for Trizeps 4 module"
diff -Nrup linux-2.6.26-orig/arch/arm/mach-pxa/trizeps4.c linux-2.6.26-patched/arch/arm/mach-pxa/trizeps4.c
--- linux-2.6.26-orig/arch/arm/mach-pxa/trizeps4.c	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/arch/arm/mach-pxa/trizeps4.c	2008-07-22 22:21:25.000000000 +0200
@@ -22,7 +22,9 @@
 #include <linux/fb.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
+#include <linux/dm9000.h>
 #include <linux/serial_8250.h>
+#include <linux/spi/spi.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/partitions.h>
@@ -41,95 +43,212 @@
 #include <asm/mach/flash.h>
 
 #include <asm/arch/pxa-regs.h>
-#include <asm/arch/pxa2xx-gpio.h>
+#include <asm/arch/pxa2xx-regs.h>
+#include <asm/arch/pxa2xx_spi.h> 
+#include <asm/arch/mfp-pxa2xx.h>
+#include <asm/arch/mfp-pxa27x.h>
 #include <asm/arch/trizeps4.h>
 #include <asm/arch/audio.h>
 #include <asm/arch/pxafb.h>
 #include <asm/arch/mmc.h>
 #include <asm/arch/irda.h>
 #include <asm/arch/ohci.h>
+#include <asm/arch/i2c.h>
 
 #include "generic.h"
 #include "devices.h"
 
+#define STATUS_LEDS_ON_STUART_PINS
+
+/********************************************************************************************
+ * MultiFunctionPins of CPU
+ ********************************************************************************************/
+static unsigned long trizeps4_pin_config[] __initdata = {
+    /* Chip Selects */
+    GPIO15_nCS_1,		/* DiskOnChip CS */
+    GPIO93_GPIO,		/* DOC irq */
+    GPIO94_GPIO,		/* DOC lock */
+
+    GPIO78_nCS_2,		/* DM9000 CS */
+    GPIO101_GPIO,		/* DM9000 irq */	
+
+    GPIO79_nCS_3,		/* Logic CS */
+    GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,	/* Logic irq */	
+
+    GPIO80_nCS_4,		/* ??? */
+
+    /* LCD - 16bpp Active TFT */
+    GPIO58_LCD_LDD_0,
+    GPIO59_LCD_LDD_1,
+    GPIO60_LCD_LDD_2,
+    GPIO61_LCD_LDD_3,
+    GPIO62_LCD_LDD_4,
+    GPIO63_LCD_LDD_5,
+    GPIO64_LCD_LDD_6,
+    GPIO65_LCD_LDD_7,
+    GPIO66_LCD_LDD_8,
+    GPIO67_LCD_LDD_9,
+    GPIO68_LCD_LDD_10,
+    GPIO69_LCD_LDD_11,
+    GPIO70_LCD_LDD_12,
+    GPIO71_LCD_LDD_13,
+    GPIO72_LCD_LDD_14,
+    GPIO73_LCD_LDD_15,
+    GPIO74_LCD_FCLK,
+    GPIO75_LCD_LCLK,
+    GPIO76_LCD_PCLK,
+    GPIO77_LCD_BIAS,
+
+    /* UART */
+    GPIO9_FFUART_CTS,
+    GPIO10_FFUART_DCD,
+    GPIO16_FFUART_TXD,
+    GPIO33_FFUART_DSR, 
+    GPIO38_FFUART_RI,
+    GPIO82_FFUART_DTR,
+    GPIO83_FFUART_RTS,
+    GPIO96_FFUART_RXD, 
+
+    GPIO42_BTUART_RXD,
+    GPIO43_BTUART_TXD,
+    GPIO44_BTUART_CTS,
+    GPIO45_BTUART_RTS,
+#ifdef STATUS_LEDS_ON_STUART_PINS
+    MFP_CFG_OUT(GPIO46, AF0, DRIVE_LOW),
+    MFP_CFG_OUT(GPIO47, AF0, DRIVE_LOW),
+#else
+    GPIO46_STUART_RXD,
+    GPIO47_STUART_TXD,
+#endif
+    /* PCMCIA */
+    GPIO11_GPIO,		/* Card Decect */
+    GPIO13_GPIO,		/* irq */
+    GPIO48_nPOE,
+    GPIO49_nPWE,
+    GPIO50_nPIOR,
+    GPIO51_nPIOW,
+    GPIO54_nPCE_2,
+    GPIO55_nPREG,
+    GPIO56_nPWAIT,
+    GPIO57_nIOIS16,
+    GPIO102_nPCE_1,
+    GPIO104_PSKTSEL, 
+
+    /* MultiMediaCard */
+    GPIO32_MMC_CLK,
+    GPIO92_MMC_DAT_0,
+    GPIO109_MMC_DAT_1,
+    GPIO110_MMC_DAT_2,
+    GPIO111_MMC_DAT_3,
+    GPIO112_MMC_CMD,
+    GPIO12_GPIO,		/* MMC DET irq */	
+
+    /* USB OHCI */
+    GPIO88_USBH1_PWR,		/* USBHPWR1 */
+    GPIO89_USBH1_PEN,		/* USBHPEN1 */
+
+    /* I2C */
+    GPIO117_I2C_SCL,
+    GPIO118_I2C_SDA,
+
+    /* MISC */	
+    GPIO100_DREQ_2,
+};
+
+static unsigned long trizeps4wl_pin_config[] __initdata = {
+    /* SSP 2 */
+    GPIO14_SSP2_SFRM,
+    GPIO19_SSP2_SCLK,
+    GPIO53_GPIO,		/* SSP irq */	
+    GPIO86_SSP2_RXD,
+    GPIO87_SSP2_TXD,
+};
+
 /********************************************************************************************
  * ONBOARD FLASH
  ********************************************************************************************/
 static struct mtd_partition trizeps4_partitions[] = {
-	{
-		.name =		"Bootloader",
-		.offset =	0x00000000,
-		.size =		0x00040000,
-		.mask_flags =	MTD_WRITEABLE  /* force read-only */
-	},{
-		.name =		"Backup",
-		.offset =	0x00040000,
-		.size =		0x00040000,
-	},{
-		.name =		"Image",
-		.offset =	0x00080000,
-		.size =		0x01080000,
-	},{
-		.name =		"IPSM",
-		.offset =	0x01100000,
-		.size =		0x00e00000,
-	},{
-		.name =		"Registry",
-		.offset =	0x01f00000,
-		.size =		MTDPART_SIZ_FULL,
-	}
+    {
+	.name =		"Bootloader",
+	.offset =	0x00000000,
+	.size =		0x00040000,
+	.mask_flags =	MTD_WRITEABLE  /* force read-only */
+    },{
+	.name =		"Backup",
+	.offset =	0x00040000,
+	.size =		0x00040000,
+    },{
+	.name =		"Image",
+	.offset =	0x00080000,
+	.size =		0x01080000,
+    },{
+	.name =		"IPSM",
+	.offset =	0x01100000,
+	.size =		0x00e00000,
+    },{
+	.name =		"Registry",
+	.offset =	0x01f00000,
+	.size =		MTDPART_SIZ_FULL,
+    }
 };
 
 static struct physmap_flash_data trizeps4_flash_data[] = {
-	{
-		.width		= 4,			/* bankwidth in bytes */
-		.parts		= trizeps4_partitions,
-		.nr_parts	= ARRAY_SIZE(trizeps4_partitions)
-	}
+    {
+	.width		= 4,			/* bankwidth in bytes */
+	.parts		= trizeps4_partitions,
+	.nr_parts	= ARRAY_SIZE(trizeps4_partitions)
+    }
 };
 
 static struct resource flash_resource = {
-	.start	= PXA_CS0_PHYS,
-	.end	= PXA_CS0_PHYS + SZ_32M - 1,
-	.flags	= IORESOURCE_MEM,
+    .start	= PXA_CS0_PHYS,
+    .end	= PXA_CS0_PHYS + SZ_32M - 1,
+    .flags	= IORESOURCE_MEM,
 };
 
 static struct platform_device flash_device = {
-	.name		= "physmap-flash",
-	.id		= 0,
-	.dev = {
-		.platform_data = trizeps4_flash_data,
-	},
-	.resource = &flash_resource,
-	.num_resources = 1,
+    .name		= "physmap-flash",
+    .id		= 0,
+    .dev = {
+	.platform_data = trizeps4_flash_data,
+    },
+    .resource = &flash_resource,
+    .num_resources = 1,
 };
 
 /********************************************************************************************
  * DAVICOM DM9000 Ethernet
  ********************************************************************************************/
 static struct resource dm9000_resources[] = {
-	[0] = {
-		.start	= TRIZEPS4_ETH_PHYS+0x300,
-		.end	= TRIZEPS4_ETH_PHYS+0x400-1,
-		.flags	= IORESOURCE_MEM,
-	},
-	[1] = {
-		.start	= TRIZEPS4_ETH_PHYS+0x8300,
-		.end	= TRIZEPS4_ETH_PHYS+0x8400-1,
-		.flags	= IORESOURCE_MEM,
-	},
-	[2] = {
-		.start	= TRIZEPS4_ETH_IRQ,
-		.end	= TRIZEPS4_ETH_IRQ,
-		.flags	= (IORESOURCE_IRQ | IRQT_RISING),
-	},
+    [0] = {
+	.start	= TRIZEPS4_ETH_PHYS+0x300,
+	.end	= TRIZEPS4_ETH_PHYS+0x400-1,
+	.flags	= IORESOURCE_MEM,
+    },
+    [1] = {
+	.start	= TRIZEPS4_ETH_PHYS+0x8300,
+	.end	= TRIZEPS4_ETH_PHYS+0x8400-1,
+	.flags	= IORESOURCE_MEM,
+    },
+    [2] = {
+	.start	= TRIZEPS4_ETH_IRQ,
+	.end	= TRIZEPS4_ETH_IRQ,
+	.flags	= (IORESOURCE_IRQ | IRQF_TRIGGER_RISING),
+    },
+};
+
+static struct dm9000_plat_data tri_dm9000_platdata = {
+	.flags		= DM9000_PLATF_32BITONLY,
 };
 
 static struct platform_device dm9000_device = {
-	.name		= "dm9000",
-	.id		= -1,
-	.num_resources	= ARRAY_SIZE(dm9000_resources),
-	.resource	= dm9000_resources,
+    .name		= "dm9000",
+    .id			= -1,
+    .num_resources	= ARRAY_SIZE(dm9000_resources),
+    .resource		= dm9000_resources,
+    .dev		= {
+	.platform_data = &tri_dm9000_platdata,
+    }
 };
 
 /********************************************************************************************
@@ -137,57 +256,131 @@ static struct platform_device dm9000_dev
  ********************************************************************************************/
 static struct plat_serial8250_port tri_serial_ports[] = {
 #ifdef CONFIG_SERIAL_PXA
-	/* this uses the own PXA driver */
-	{
-		0,
-	},
+    /* this uses the own PXA driver */
+    {
+	0,
+    },
 #else
-	/* this uses the generic 8520 driver */
-	[0] = {
-		.membase	= (void *)&FFUART,
-		.irq		= IRQ_FFUART,
-		.flags		= UPF_BOOT_AUTOCONF,
-		.iotype		= UPIO_MEM32,
-		.regshift	= 2,
-		.uartclk	= (921600*16),
-	},
-	[1] = {
-		.membase	= (void *)&BTUART,
-		.irq		= IRQ_BTUART,
-		.flags		= UPF_BOOT_AUTOCONF,
-		.iotype		= UPIO_MEM32,
-		.regshift	= 2,
-		.uartclk	= (921600*16),
+    /* this uses the generic 8520 driver */
+    [0] = {
+	.membase	= (void *)&FFUART,
+	.irq		= IRQ_FFUART,
+	.flags		= UPF_BOOT_AUTOCONF,
+	.iotype		= UPIO_MEM32,
+	.regshift	= 2,
+	.uartclk	= (921600*16),
+    },
+#ifndef STATUS_LEDS_ON_STUART_PINS
+    [1] = {
+	.membase	= (void *)&BTUART,
+	.irq		= IRQ_BTUART,
+	.flags		= UPF_BOOT_AUTOCONF,
+	.iotype		= UPIO_MEM32,
+	.regshift	= 2,
+	.uartclk	= (921600*16),
+    },
+#endif
+    {
+	0,
+    },
+#endif
+};
+
+static struct platform_device uart_devices = {
+    .name		= "serial8250",
+    .id		= 0,
+    .dev		= {
+	.platform_data	= tri_serial_ports,
+    },
+    .num_resources	= 0,
+    .resource	= NULL,
+};
+
+/********************************************************************************************
+ * PXA2xx SPI interface
+ ********************************************************************************************/
+static struct pxa2xx_spi_master pxa_ssp_master_info = {
+    .clock_enable	= CKEN_SSP2,
+    .num_chipselect	= 1,	/* min 1 */
+    .enable_dma		= 1,
+};
+
+static void bw211_cs(u32 command)
+{
+    	return;
+}
+
+static struct pxa2xx_spi_chip bw211_hw = {
+	.tx_threshold		= 1,
+	.rx_threshold		= 2,
+	.cs_control		= bw211_cs,
+};
+
+static long bw211_info[] = {
+	0,
+};
+
+static struct spi_board_info trizeps4_spi_devices[] __initdata = {
+    {
+	.modalias	= "bw211",
+	.platform_data	= &bw211_info,
+	.controller_data = &bw211_hw,
+	.irq		= TRIZEPS4_SPI_IRQ,
+	.max_speed_hz	= 120000 * 26, /* max sample rate at 3V */
+	.bus_num	= 1,
+	.chip_select	= 0,
+	.mode		= SPI_MODE_3,
+    },
+};
+
+/********************************************************************************************
+ * LED's on GPIO pins of PXA
+ ********************************************************************************************/
+#ifdef CONFIG_LEDS_GPIO
+static struct gpio_led trizeps4_led[] = {
+#ifdef STATUS_LEDS_ON_STUART_PINS
+	{
+		.name = "led0:orange",	/* */
+		.default_trigger = "heartbeat",
+		.gpio = GPIO_HEARTBEAT_LED,
 	},
 	{
-		0,
+		.name = "led1:yellow",	/* */
+		.default_trigger = "cpu-busy",
+		.gpio = GPIO_SYS_BUSY_LED,
 	},
 #endif
 };
 
-static struct platform_device uart_devices = {
-	.name		= "serial8250",
+static struct gpio_led_platform_data trizeps4_led_data = {
+	.leds		= trizeps4_led,
+	.num_leds	= ARRAY_SIZE(trizeps4_led),
+};
+
+static struct platform_device leds_devices = {
+	.name		= "leds-gpio",
 	.id		= 0,
 	.dev		= {
-		.platform_data	= tri_serial_ports,
+		.platform_data	= &trizeps4_led_data,
 	},
-	.num_resources	= 0,
-	.resource	= NULL,
 };
-
-/********************************************************************************************
- * PXA270 ac97 sound codec
- ********************************************************************************************/
-static struct platform_device ac97_audio_device = {
-	.name		= "pxa2xx-ac97",
-	.id		= -1,
+#endif /* CONFIG_LEDS_GPIO */
+  
+static struct platform_device * trizeps4_devices[] __initdata = {
+    &flash_device,
+    &uart_devices,
+    &dm9000_device,
+#ifdef CONFIG_LEDS_GPIO
+    &leds_devices,
+#endif /* CONFIG_LEDS_GPIO */
 };
 
-static struct platform_device * trizeps4_devices[] __initdata = {
-	&flash_device,
-	&uart_devices,
-	&dm9000_device,
-	&ac97_audio_device,
+static struct platform_device * trizeps4wl_devices[] __initdata = {
+    &flash_device,
+    &uart_devices,
+#ifdef CONFIG_LEDS_GPIO
+    &leds_devices,
+#endif /* CONFIG_LEDS_GPIO */
 };
 
 #ifdef CONFIG_MACH_TRIZEPS4_CONXS
@@ -196,55 +389,55 @@ static short trizeps_conxs_bcr;
 /* PCCARD power switching supports only 3,3V */
 void board_pcmcia_power(int power)
 {
-	if (power) {
-		/* switch power on, put in reset and enable buffers */
-		trizeps_conxs_bcr |= power;
-		trizeps_conxs_bcr |= ConXS_BCR_CF_RESET;
-		trizeps_conxs_bcr &= ~(ConXS_BCR_CF_BUF_EN);
-		ConXS_BCR = trizeps_conxs_bcr;
-		/* wait a little */
-		udelay(2000);
-		/* take reset away */
-		trizeps_conxs_bcr &= ~(ConXS_BCR_CF_RESET);
-		ConXS_BCR = trizeps_conxs_bcr;
-		udelay(2000);
-	} else {
-		/* put in reset */
-		trizeps_conxs_bcr |= ConXS_BCR_CF_RESET;
-		ConXS_BCR = trizeps_conxs_bcr;
-		udelay(1000);
-		/* switch power off */
-		trizeps_conxs_bcr &= ~(0xf);
-		ConXS_BCR = trizeps_conxs_bcr;
+    if (power) {
+	/* switch power on, put in reset and enable buffers */
+	trizeps_conxs_bcr |= power;
+	trizeps_conxs_bcr |= ConXS_BCR_CF_RESET;
+	trizeps_conxs_bcr &= ~(ConXS_BCR_CF_BUF_EN);
+	ConXS_BCR = trizeps_conxs_bcr;
+	/* wait a little */
+	udelay(2000);
+	/* take reset away */
+	trizeps_conxs_bcr &= ~(ConXS_BCR_CF_RESET);
+	ConXS_BCR = trizeps_conxs_bcr;
+	udelay(2000);
+    } else {
+	/* put in reset */
+	trizeps_conxs_bcr |= ConXS_BCR_CF_RESET;
+	ConXS_BCR = trizeps_conxs_bcr;
+	udelay(1000);
+	/* switch power off */
+	trizeps_conxs_bcr &= ~(0xf);
+	ConXS_BCR = trizeps_conxs_bcr;
 
-	}
-	pr_debug("%s: o%s 0x%x\n", __func__, power ? "n": "ff", trizeps_conxs_bcr);
+    }
+    pr_debug("%s: o%s 0x%x\n", __FUNCTION__, power ? "n": "ff", trizeps_conxs_bcr);
 }
 
 /* backlight power switching for LCD panel */
 static void board_backlight_power(int on)
 {
-	if (on) {
-		trizeps_conxs_bcr |= ConXS_BCR_L_DISP;
-	} else {
-		trizeps_conxs_bcr &= ~ConXS_BCR_L_DISP;
-	}
-	pr_debug("%s: o%s 0x%x\n", __func__, on ? "n" : "ff", trizeps_conxs_bcr);
-	ConXS_BCR = trizeps_conxs_bcr;
+    if (on) {
+	trizeps_conxs_bcr |= ConXS_BCR_L_DISP;
+    } else {
+	trizeps_conxs_bcr &= ~ConXS_BCR_L_DISP;
+    }
+    pr_debug("%s: o%s 0x%x\n", __FUNCTION__, on ? "n" : "ff", trizeps_conxs_bcr);
+    ConXS_BCR = trizeps_conxs_bcr;
 }
 
 /* Powersupply for MMC/SD cardslot */
 static void board_mci_power(struct device *dev, unsigned int vdd)
 {
-	struct pxamci_platform_data* p_d = dev->platform_data;
+    struct pxamci_platform_data* p_d = dev->platform_data;
 
-	if (( 1 << vdd) & p_d->ocr_mask) {
-		pr_debug("%s: on\n", __func__);
-		/* FIXME fill in values here */
-	} else {
-		pr_debug("%s: off\n", __func__);
-		/* FIXME fill in values here */
-	}
+    if (( 1 << vdd) & p_d->ocr_mask) {
+	pr_debug("%s: on\n", __FUNCTION__);
+	/* FIXME fill in values here */
+    } else {
+	pr_debug("%s: off\n", __FUNCTION__);
+	/* FIXME fill in values here */
+    }
 }
 
 static short trizeps_conxs_ircr;
@@ -252,25 +445,31 @@ static short trizeps_conxs_ircr;
 /* Switch modes and Power for IRDA receiver */
 static void board_irda_mode(struct device *dev, int mode)
 {
-	unsigned long flags;
+    unsigned long flags;
 
-	local_irq_save(flags);
-	if (mode & IR_SIRMODE) {
-		/* Slow mode */
-		trizeps_conxs_ircr &= ~ConXS_IRCR_MODE;
-	} else if (mode & IR_FIRMODE) {
-		/* Fast mode */
-		trizeps_conxs_ircr |= ConXS_IRCR_MODE;
-	}
-	if (mode & IR_OFF) {
-		trizeps_conxs_ircr |= ConXS_IRCR_SD;
-	} else {
-		trizeps_conxs_ircr &= ~ConXS_IRCR_SD;
-	}
-	/* FIXME write values to register */
-	local_irq_restore(flags);
+    local_irq_save(flags);
+    if (mode & IR_SIRMODE) {
+	/* Slow mode */
+	trizeps_conxs_ircr &= ~ConXS_IRCR_MODE;
+    } else if (mode & IR_FIRMODE) {
+	/* Fast mode */
+	trizeps_conxs_ircr |= ConXS_IRCR_MODE;
+    }
+    if (mode & IR_OFF) {
+	trizeps_conxs_ircr |= ConXS_IRCR_SD;
+    } else {
+	trizeps_conxs_ircr &= ~ConXS_IRCR_SD;
+    }
+    /* FIXME write values to register */
+    local_irq_restore(flags);
 }
 
+/* a I2C based RTC is known on CONXS board */
+static struct i2c_board_info trizeps4_i2c_devices[] __initdata = {
+    { I2C_BOARD_INFO("rtc-pcf8593", 0x51),
+	.type = "rtc-pcf8593",
+    },
+};
 #else
 /* for other baseboards define dummies */
 void board_pcmcia_power(int power)	{;}
@@ -278,104 +477,103 @@ void board_pcmcia_power(int power)	{;}
 #define board_mci_power			NULL
 #define board_irda_mode			NULL
 
+/* for other baseboards no known i2c devices */
+static struct i2c_board_info trizeps4_i2c_devices[] __initdata = {
+    { NULL },
+};
 #endif		/* CONFIG_MACH_TRIZEPS4_CONXS */
 EXPORT_SYMBOL(board_pcmcia_power);
 
 static int trizeps4_mci_init(struct device *dev, irq_handler_t mci_detect_int, void *data)
 {
-	int err;
-	/* setup GPIO for PXA27x MMC controller */
-	pxa_gpio_mode(GPIO32_MMCCLK_MD);
-	pxa_gpio_mode(GPIO112_MMCCMD_MD);
-	pxa_gpio_mode(GPIO92_MMCDAT0_MD);
-	pxa_gpio_mode(GPIO109_MMCDAT1_MD);
-	pxa_gpio_mode(GPIO110_MMCDAT2_MD);
-	pxa_gpio_mode(GPIO111_MMCDAT3_MD);
-
-	pxa_gpio_mode(GPIO_MMC_DET | GPIO_IN);
-
-	err = request_irq(TRIZEPS4_MMC_IRQ, mci_detect_int,
-			  IRQF_DISABLED | IRQF_TRIGGER_RISING,
-			  "MMC card detect", data);
-	if (err)
-		printk(KERN_ERR "trizeps4_mci_init: MMC/SD: can't request MMC card detect IRQ\n");
+    int err;
 
-	return err;
+    err = request_irq(TRIZEPS4_MMC_IRQ, mci_detect_int,
+	    IRQF_DISABLED | IRQF_TRIGGER_RISING,
+	    "MMC card detect", data);
+    if (err) {
+	printk(KERN_ERR "trizeps4_mci_init: MMC/SD: can't request MMC card detect IRQ\n");
+	return -1;
+    }
+    return 0;
 }
 
 static void trizeps4_mci_exit(struct device *dev, void *data)
 {
-	free_irq(TRIZEPS4_MMC_IRQ, data);
+    free_irq(TRIZEPS4_MMC_IRQ, data);
+}
+
+static int trizeps4_mci_get_ro(struct device *dev)
+{
+    return 0;
 }
 
 static struct pxamci_platform_data trizeps4_mci_platform_data = {
-	.ocr_mask	= MMC_VDD_32_33|MMC_VDD_33_34,
-	.init 		= trizeps4_mci_init,
-	.exit		= trizeps4_mci_exit,
-	.setpower 	= board_mci_power,
+    .ocr_mask		= MMC_VDD_32_33|MMC_VDD_33_34,
+    .detect_delay	= 1,
+    .init 		= trizeps4_mci_init,
+    .exit		= trizeps4_mci_exit,
+    .get_ro		= trizeps4_mci_get_ro,
+    .setpower	 	= board_mci_power,
 };
 
 static struct pxaficp_platform_data trizeps4_ficp_platform_data = {
-	.transceiver_cap  = IR_SIRMODE | IR_FIRMODE | IR_OFF,
-	.transceiver_mode = board_irda_mode,
+    .transceiver_cap  = IR_SIRMODE | IR_FIRMODE | IR_OFF,
+    .transceiver_mode = board_irda_mode,
 };
 
 static int trizeps4_ohci_init(struct device *dev)
 {
-	/* setup Port1 GPIO pin. */
-	pxa_gpio_mode( 88 | GPIO_ALT_FN_1_IN);	/* USBHPWR1 */
-	pxa_gpio_mode( 89 | GPIO_ALT_FN_2_OUT);	/* USBHPEN1 */
-
-	/* Set the Power Control Polarity Low and Power Sense
-	   Polarity Low to active low. */
-	UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
-		~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE);
+    /* Set the Power Control Polarity Low and Power Sense
+       Polarity Low to active low. */
+    UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
+	~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSEP3 | UHCHR_SSE);
 
-	return 0;
+    return 0;
 }
 
 static void trizeps4_ohci_exit(struct device *dev)
 {
-	;
+    ;
 }
 
 static struct pxaohci_platform_data trizeps4_ohci_platform_data = {
-	.port_mode	= PMM_PERPORT_MODE,
-	.init		= trizeps4_ohci_init,
-	.exit		= trizeps4_ohci_exit,
+    .port_mode	= PMM_PERPORT_MODE,
+    .init		= trizeps4_ohci_init,
+    .exit		= trizeps4_ohci_exit,
 };
 
 static struct map_desc trizeps4_io_desc[] __initdata = {
-	{ 	/* ConXS CFSR */
-		.virtual	= TRIZEPS4_CFSR_VIRT,
-		.pfn		= __phys_to_pfn(TRIZEPS4_CFSR_PHYS),
-		.length		= 0x00001000,
-		.type		= MT_DEVICE
-	},
-	{	/* ConXS BCR */
-		.virtual	= TRIZEPS4_BOCR_VIRT,
-		.pfn		= __phys_to_pfn(TRIZEPS4_BOCR_PHYS),
-		.length		= 0x00001000,
-		.type		= MT_DEVICE
-	},
-	{ 	/* ConXS IRCR */
-		.virtual	= TRIZEPS4_IRCR_VIRT,
-		.pfn		= __phys_to_pfn(TRIZEPS4_IRCR_PHYS),
-		.length		= 0x00001000,
-		.type		= MT_DEVICE
-	},
-	{	/* ConXS DCR */
-		.virtual	= TRIZEPS4_DICR_VIRT,
-		.pfn		= __phys_to_pfn(TRIZEPS4_DICR_PHYS),
-		.length		= 0x00001000,
-		.type		= MT_DEVICE
-	},
-	{	/* ConXS UPSR */
-		.virtual	= TRIZEPS4_UPSR_VIRT,
-		.pfn		= __phys_to_pfn(TRIZEPS4_UPSR_PHYS),
-		.length		= 0x00001000,
-		.type		= MT_DEVICE
-	}
+    { 	/* ConXS CFSR */
+	.virtual	= TRIZEPS4_CFSR_VIRT,
+	.pfn		= __phys_to_pfn(TRIZEPS4_CFSR_PHYS),
+	.length		= 0x00001000,
+	.type		= MT_DEVICE
+    },
+    {	/* ConXS BCR */
+	.virtual	= TRIZEPS4_BOCR_VIRT,
+	.pfn		= __phys_to_pfn(TRIZEPS4_BOCR_PHYS),
+	.length		= 0x00001000,
+	.type		= MT_DEVICE
+    },
+    { 	/* ConXS IRCR */
+	.virtual	= TRIZEPS4_IRCR_VIRT,
+	.pfn		= __phys_to_pfn(TRIZEPS4_IRCR_PHYS),
+	.length		= 0x00001000,
+	.type		= MT_DEVICE
+    },
+    {	/* ConXS DCR */
+	.virtual	= TRIZEPS4_DICR_VIRT,
+	.pfn		= __phys_to_pfn(TRIZEPS4_DICR_PHYS),
+	.length		= 0x00001000,
+	.type		= MT_DEVICE
+    },
+    {	/* ConXS UPSR */
+	.virtual	= TRIZEPS4_UPSR_VIRT,
+	.pfn		= __phys_to_pfn(TRIZEPS4_UPSR_PHYS),
+	.length		= 0x00001000,
+	.type		= MT_DEVICE
+    }
 };
 
 static struct pxafb_mode_info sharp_lcd_mode = {
@@ -395,7 +593,8 @@ static struct pxafb_mode_info sharp_lcd_
 
 static struct pxafb_mach_info sharp_lcd = {
     .modes		= &sharp_lcd_mode,
-    .num_modes	= 1,
+    .num_modes		= 1,
+    .lcd_conn		= LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
     .cmap_inverse	= 0,
     .cmap_static	= 0,
     .lccr0		= LCCR0_Color | LCCR0_Pas | LCCR0_Dual,
@@ -421,90 +620,95 @@ static struct pxafb_mode_info toshiba_lc
 static struct pxafb_mach_info toshiba_lcd = {
     .modes		= &toshiba_lcd_mode,
     .num_modes	= 1,
+    .lcd_conn		= (LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL), 
     .cmap_inverse	= 0,
     .cmap_static	= 0,
     .lccr0		= LCCR0_Color | LCCR0_Act,
-    .lccr3		= 0x03400002,
-    .pxafb_backlight_power = board_backlight_power,
+    .lccr3		= 0x03400002, 
+    .pxafb_backlight_power = board_backlight_power, 
 };
 
 static void __init trizeps4_init(void)
 {
+    pxa2xx_mfp_config(ARRAY_AND_SIZE(trizeps4_pin_config)); 
+    if (machine_is_trizeps4wl())
+    {
+	pxa2xx_mfp_config(ARRAY_AND_SIZE(trizeps4wl_pin_config)); 
+	platform_add_devices(trizeps4wl_devices, ARRAY_SIZE(trizeps4wl_devices));
+    }
+    else {
 	platform_add_devices(trizeps4_devices, ARRAY_SIZE(trizeps4_devices));
+    }
+    printk("machine (msc0=%08x/%08x) tr4 %d 4wl %d tr5 %d (%d)\n", MSC0, BOOT_DEF, machine_is_trizeps4(), machine_is_trizeps4wl(), machine_is_trizeps5(), __machine_arch_type);
 
-/*	set_pxa_fb_info(&sharp_lcd); */
+    if (0)	/* dont know how to determine LCD */
+	set_pxa_fb_info(&sharp_lcd);
+    else
 	set_pxa_fb_info(&toshiba_lcd);
 
-	pxa_set_mci_info(&trizeps4_mci_platform_data);
-	pxa_set_ficp_info(&trizeps4_ficp_platform_data);
-	pxa_set_ohci_info(&trizeps4_ohci_platform_data);
-}
-
-static void __init trizeps4_map_io(void)
-{
-	pxa_map_io();
-	iotable_init(trizeps4_io_desc, ARRAY_SIZE(trizeps4_io_desc));
-
-	/* for DiskOnChip */
-	pxa_gpio_mode(GPIO15_nCS_1_MD);
-
-	/* for off-module PIC on ConXS board */
-	pxa_gpio_mode(GPIO_PIC | GPIO_IN);
-
-	/* UCB1400 irq */
-	pxa_gpio_mode(GPIO_UCB1400 | GPIO_IN);
-
-	/* for DM9000 LAN */
-	pxa_gpio_mode(GPIO78_nCS_2_MD);
-	pxa_gpio_mode(GPIO_DM9000 | GPIO_IN);
-
-	/* for PCMCIA device */
-	pxa_gpio_mode(GPIO_PCD | GPIO_IN);
-	pxa_gpio_mode(GPIO_PRDY | GPIO_IN);
-
-	/* for I2C adapter */
-	pxa_gpio_mode(GPIO117_I2CSCL_MD);
-	pxa_gpio_mode(GPIO118_I2CSDA_MD);
+    pxa_set_mci_info(&trizeps4_mci_platform_data);
+    pxa_set_ficp_info(&trizeps4_ficp_platform_data);
+    pxa_set_ohci_info(&trizeps4_ohci_platform_data);
+    pxa_set_i2c_info(NULL);
+    pxa_set_ac97_info(NULL);
+    if (machine_is_trizeps4wl())
+    {
+	pxa2xx_set_spi_info(0, &pxa_ssp_master_info);
+	spi_register_board_info(trizeps4_spi_devices, ARRAY_SIZE(trizeps4_spi_devices));
+    }
+    i2c_register_board_info(0, trizeps4_i2c_devices, ARRAY_SIZE(trizeps4_i2c_devices)); 
 
-	/* MMC_DET s.o. */
-	pxa_gpio_mode(GPIO_MMC_DET | GPIO_IN);
-
-	/* whats that for ??? */
-	pxa_gpio_mode(GPIO79_nCS_3_MD);
-
-#ifdef CONFIG_LEDS
-	pxa_gpio_mode( GPIO_SYS_BUSY_LED  | GPIO_OUT);		/* LED1 */
-	pxa_gpio_mode( GPIO_HEARTBEAT_LED | GPIO_OUT);		/* LED2 */
-#endif
 #ifdef CONFIG_MACH_TRIZEPS4_CONXS
 #ifdef CONFIG_IDE_PXA_CF
-	/* if boot direct from compact flash dont disable power */
-	trizeps_conxs_bcr = 0x0009;
+    /* if boot direct from compact flash dont disable power */
+    trizeps_conxs_bcr = 0x0009;
 #else
-	/* this is the reset value */
-	trizeps_conxs_bcr = 0x00A0;
+    /* this is the reset value */
+    trizeps_conxs_bcr = 0x00A0;
 #endif
-	ConXS_BCR = trizeps_conxs_bcr;
+    ConXS_BCR = trizeps_conxs_bcr;
 #endif
+    board_backlight_power(1);
+}
 
-	PWER  = 0x00000002;
-	PFER  = 0x00000000;
-	PRER  = 0x00000002;
-	PGSR0 = 0x0158C000;
-	PGSR1 = 0x00FF0080;
-	PGSR2 = 0x0001C004;
-	/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
-	PCFR |= PCFR_OPDE;
+static void __init trizeps4_map_io(void)
+{
+    pxa_map_io();
+    iotable_init(trizeps4_io_desc, ARRAY_SIZE(trizeps4_io_desc));
+
+    if ((MSC0     & 0x8) &&
+	(BOOT_DEF & 0x1))
+    {
+	/* if flash is 16 bit wide its a Trizeps4 WL */
+	__machine_arch_type = MACH_TYPE_TRIZEPS4WL;
+	trizeps4_flash_data[0].width = 2;
+    }
+    else {
+	/* if flash is 32 bit wide its a Trizeps4 */
+	__machine_arch_type = MACH_TYPE_TRIZEPS4;
+	trizeps4_flash_data[0].width = 4;
+    }
 }
 
 MACHINE_START(TRIZEPS4, "Keith und Koep Trizeps IV module")
-	/* MAINTAINER("Jürgen Schindele") */
-	.phys_io	= 0x40000000,
-	.io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc,
-	.boot_params	= TRIZEPS4_SDRAM_BASE + 0x100,
-	.init_machine	= trizeps4_init,
-	.map_io		= trizeps4_map_io,
-	.init_irq	= pxa27x_init_irq,
-	.timer		= &pxa_timer,
+    /* MAINTAINER("Jürgen Schindele") */
+    .phys_io		= 0x40000000,
+    .io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc,
+    .boot_params	= TRIZEPS4_SDRAM_BASE + 0x100,
+    .init_machine	= trizeps4_init,
+    .map_io		= trizeps4_map_io,
+    .init_irq		= pxa27x_init_irq,
+    .timer		= &pxa_timer,
+MACHINE_END
+
+MACHINE_START(TRIZEPS4WL, "Keith und Koep Trizeps IV-WL module")
+    /* MAINTAINER("Jürgen Schindele") */
+    .phys_io		= 0x40000000,
+    .io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc,
+    .boot_params	= TRIZEPS4_SDRAM_BASE + 0x100,
+    .init_machine	= trizeps4_init,
+    .map_io		= trizeps4_map_io,
+    .init_irq		= pxa27x_init_irq,
+    .timer		= &pxa_timer,
 MACHINE_END
 
diff -Nrup linux-2.6.26-orig/drivers/leds/Kconfig linux-2.6.26-patched/drivers/leds/Kconfig
--- linux-2.6.26-orig/drivers/leds/Kconfig	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/drivers/leds/Kconfig	2008-07-22 20:48:46.000000000 +0200
@@ -174,6 +174,13 @@ config LEDS_TRIGGER_IDE_DISK
 	  This allows LEDs to be controlled by IDE disk activity.
 	  If unsure, say Y.
 
+config LEDS_TRIGGER_CPU_BUSY
+	bool "LED CPU Busy Trigger"
+	depends on LEDS_TRIGGERS
+	help
+	  This allows LEDs to be controlled by CPU activity.
+	  If unsure, say Y.
+
 config LEDS_TRIGGER_HEARTBEAT
 	tristate "LED Heartbeat Trigger"
 	depends on LEDS_TRIGGERS
diff -Nrup linux-2.6.26-orig/drivers/leds/ledtrig-cpu-busy.c linux-2.6.26-patched/drivers/leds/ledtrig-cpu-busy.c
--- linux-2.6.26-orig/drivers/leds/ledtrig-cpu-busy.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.26-patched/drivers/leds/ledtrig-cpu-busy.c	2008-07-22 20:48:46.000000000 +0200
@@ -0,0 +1,48 @@
+/*
+ * LED IDE-Disk Activity Trigger
+ *
+ * Copyright 2006 Openedhand Ltd.
+ *
+ * Author: Richard Purdie <rpurdie@openedhand.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/jiffies.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/timer.h>
+#include <linux/leds.h>
+
+DEFINE_LED_TRIGGER(ledtrig_cpu);
+
+void ledtrig_cpu_busy(int busy)
+{
+    	if (busy) 
+	    led_trigger_event(ledtrig_cpu, LED_FULL);
+	else
+	    led_trigger_event(ledtrig_cpu, LED_OFF);
+}
+EXPORT_SYMBOL(ledtrig_cpu_busy);
+
+static int __init ledtrig_cpu_init(void)
+{
+	led_trigger_register_simple("cpu-busy", &ledtrig_cpu);
+	return 0;
+}
+
+static void __exit ledtrig_cpu_exit(void)
+{
+	led_trigger_unregister_simple(ledtrig_cpu);
+}
+
+module_init(ledtrig_cpu_init);
+module_exit(ledtrig_cpu_exit);
+
+MODULE_AUTHOR("Jurgen Schindele");
+MODULE_DESCRIPTION("CPU busy/idle Trigger");
+MODULE_LICENSE("GPL");
diff -Nrup linux-2.6.26-orig/drivers/leds/Makefile linux-2.6.26-patched/drivers/leds/Makefile
--- linux-2.6.26-orig/drivers/leds/Makefile	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/drivers/leds/Makefile	2008-07-22 20:48:46.000000000 +0200
@@ -25,5 +25,6 @@ obj-$(CONFIG_LEDS_FSG)			+= leds-fsg.o
 # LED Triggers
 obj-$(CONFIG_LEDS_TRIGGER_TIMER)	+= ledtrig-timer.o
 obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK)	+= ledtrig-ide-disk.o
+obj-$(CONFIG_LEDS_TRIGGER_CPU_BUSY)	+= ledtrig-cpu-busy.o
 obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT)	+= ledtrig-heartbeat.o
 obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON)	+= ledtrig-default-on.o
diff -Nrup linux-2.6.26-orig/drivers/pcmcia/Kconfig linux-2.6.26-patched/drivers/pcmcia/Kconfig
--- linux-2.6.26-orig/drivers/pcmcia/Kconfig	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/drivers/pcmcia/Kconfig	2008-07-22 20:48:46.000000000 +0200
@@ -219,7 +219,7 @@ config PCMCIA_SA1111
 config PCMCIA_PXA2XX
 	tristate "PXA2xx support"
 	depends on ARM && ARCH_PXA && PCMCIA
-	depends on ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL || MACH_ARMCORE
+	depends on ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL || MACH_ARMCORE || PXA_TRIZEPS
 	help
 	  Say Y here to include support for the PXA2xx PCMCIA controller
 
diff -Nrup linux-2.6.26-orig/drivers/pcmcia/Makefile linux-2.6.26-patched/drivers/pcmcia/Makefile
--- linux-2.6.26-orig/drivers/pcmcia/Makefile	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/drivers/pcmcia/Makefile	2008-07-22 20:48:46.000000000 +0200
@@ -70,5 +70,6 @@ sa1100_cs-$(CONFIG_SA1100_SIMPAD)		+= sa
 pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK)		+= pxa2xx_lubbock.o sa1111_generic.o
 pxa2xx_cs-$(CONFIG_MACH_MAINSTONE)		+= pxa2xx_mainstone.o
 pxa2xx_cs-$(CONFIG_PXA_SHARPSL)			+= pxa2xx_sharpsl.o
+pxa2xx_cs-$(CONFIG_MACH_TRIZEPS4)               += pxa2xx_trizeps4.o
 pxa2xx_cs-$(CONFIG_MACH_ARMCORE)		+= pxa2xx_cm_x270.o
 
diff -Nrup linux-2.6.26-orig/drivers/pcmcia/pxa2xx_trizeps4.c linux-2.6.26-patched/drivers/pcmcia/pxa2xx_trizeps4.c
--- linux-2.6.26-orig/drivers/pcmcia/pxa2xx_trizeps4.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.26-patched/drivers/pcmcia/pxa2xx_trizeps4.c	2008-07-22 20:48:46.000000000 +0200
@@ -0,0 +1,207 @@
+/*
+ * linux/drivers/pcmcia/pxa2xx_trizeps4.c
+ *
+ * TRIZEPS4 PCMCIA specific routines.
+ *
+ * Author:	Jürgen Schindele
+ * Created:	20 02, 2006
+ * Copyright:	Jürgen Schindele
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+
+#include <pcmcia/ss.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+
+#include <asm/arch/pxa-regs.h>
+#include <asm/arch/trizeps4.h>
+
+#include "soc_common.h"
+
+extern void board_pcmcia_power(int power);
+
+static struct pcmcia_irqs irqs[] = {
+	{ 0, TRIZEPS4_CD_IRQ, "PCMCIA0 CD" }
+};
+
+static int trizeps_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
+{
+    /* we dont have voltage/card/ready detection
+     * so we dont need interrupts for it
+     * TODO set default state on power
+     */
+    switch (skt->nr) {
+      case 0:
+	skt->irq = TRIZEPS4_READY_NINT;
+	break;
+
+      case 1:
+      default:
+	break;
+    }
+    /* release the reset of this card */
+    /* FIXME Remove Card Reset ?? */
+    printk(KERN_DEBUG "%s: sock %d irq %d\n", __FUNCTION__, skt->nr, skt->irq);
+
+    /* supplementory irqs for the socket */
+    /* FIXME are interrupts delivered by ConXS Board ?? */
+    return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
+}
+
+static void trizeps_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
+{
+    /* nothing to do */
+}
+
+static unsigned long trizeps_pcmcia_status[2];
+
+static void trizeps_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
+{
+    unsigned short status=0, change;
+#ifdef CONFIG_MACH_TRIZEPS4_CONXS
+    status = ConXS_CFSR; 
+    change = (status ^ trizeps_pcmcia_status[skt->nr]) & ConXS_CFSR_BVD_MASK;
+
+    if (change) {
+	trizeps_pcmcia_status[skt->nr] = status;
+	if (status & ConXS_CFSR_BVD1) {
+	    /* enable_irq empty */
+	}
+	else {
+	    /* disable_irq empty */
+	}
+    }
+
+    switch (skt->nr) {
+      case 0:
+	/* just fill in fix states */
+	state->detect = (GPLR(GPIO_PCD)  & GPIO_bit(GPIO_PCD))  ? 0 : 1;  
+	state->ready  = (GPLR(GPIO_PRDY) & GPIO_bit(GPIO_PRDY)) ? 1 : 0; 
+	state->bvd1   = (status & ConXS_CFSR_BVD1) ? 1 : 0;
+	state->bvd2   = (status & ConXS_CFSR_BVD2) ? 1 : 0;
+	state->vs_3v  = (status & ConXS_CFSR_VS1) ? 0 : 1;
+	state->vs_Xv  = (status & ConXS_CFSR_VS2) ? 0 : 1;
+	state->wrprot = 0;	/* not available */
+	break;
+
+      case 1:
+	/* on ConXS we only have one slot second is inactive */
+	state->detect = 0;
+	state->ready  = 0;
+	state->bvd1   = 0;
+	state->bvd2   = 0;
+	state->vs_3v  = 0;
+	state->vs_Xv  = 0;
+	state->wrprot = 0;
+	break;
+
+    }
+#endif
+}
+
+static int trizeps_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state)
+{
+    int ret = 0;
+    unsigned short power = 0;
+
+    /* we do nothing here just check a bit */
+    switch (state->Vcc) {
+      case 0:  power &= 0xfc; break;
+      case 33: power |= ConXS_BCR_S0_VCC_3V3; break;
+      case 50:
+	       printk(KERN_ERR "%s(): Vcc 5V not supported in socket\n", __FUNCTION__);
+	       break;
+      default:
+	       printk(KERN_ERR "%s(): bad Vcc %u\n", __FUNCTION__, state->Vcc);
+	       ret = -1;
+    }
+
+    switch (state->Vpp) {
+      case 0:  power &= 0xf3; break;
+      case 33: power |= ConXS_BCR_S0_VPP_3V3; break;
+      case 120:
+	       printk(KERN_ERR "%s(): Vpp 12V not supported in socket\n", __FUNCTION__);
+	       break;
+      default:
+		if(state->Vpp != state->Vcc) {
+		    printk(KERN_ERR "%s(): bad Vpp %u\n", __FUNCTION__, state->Vpp);
+		    ret = -1;
+		}
+    }
+
+    switch (skt->nr) {
+      case 0:			 /* ony have one socket */
+	board_pcmcia_power(power);
+	break;
+
+      case 1:			/* do nothing */
+      default:
+	break;
+    }
+
+    return ret;
+}
+
+static void trizeps_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
+{
+    /* default is on */
+    board_pcmcia_power(0x9);
+}
+
+static void trizeps_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
+{
+}
+
+static struct pcmcia_low_level trizeps_pcmcia_ops = {
+    .owner		= THIS_MODULE,
+    .hw_init		= trizeps_pcmcia_hw_init,
+    .hw_shutdown	= trizeps_pcmcia_hw_shutdown,
+    .socket_state	= trizeps_pcmcia_socket_state,
+    .configure_socket	= trizeps_pcmcia_configure_socket,
+    .socket_init	= trizeps_pcmcia_socket_init,
+    .socket_suspend	= trizeps_pcmcia_socket_suspend,
+    .nr			= 2,
+    .first		= 0,
+};
+
+static struct platform_device *trizeps_pcmcia_device;
+
+static int __init trizeps_pcmcia_init(void)
+{
+	int ret;
+
+	trizeps_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
+	if (!trizeps_pcmcia_device)
+		return -ENOMEM;
+
+	trizeps_pcmcia_device->dev.platform_data = &trizeps_pcmcia_ops;
+
+	ret = platform_device_add(trizeps_pcmcia_device);
+
+	if (ret)
+		platform_device_put(trizeps_pcmcia_device);
+
+	return ret;
+}
+
+static void __exit trizeps_pcmcia_exit(void)
+{
+	platform_device_unregister(trizeps_pcmcia_device);
+}
+
+fs_initcall(trizeps_pcmcia_init);
+module_exit(trizeps_pcmcia_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:pxa2xx-pcmcia");
diff -Nrup linux-2.6.26-orig/drivers/pcmcia/soc_common.c linux-2.6.26-patched/drivers/pcmcia/soc_common.c
--- linux-2.6.26-orig/drivers/pcmcia/soc_common.c	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/drivers/pcmcia/soc_common.c	2008-07-22 20:48:46.000000000 +0200
@@ -748,7 +748,9 @@ int soc_common_drv_pcmcia_probe(struct d
 
 		add_timer(&skt->poll_timer);
 
-		device_create_file(&skt->socket.dev, &dev_attr_status);
+		ret = device_create_file(&skt->socket.dev, &dev_attr_status);
+		if (ret)
+			goto out_err_8;
 	}
 
 	dev_set_drvdata(dev, sinfo);
@@ -758,6 +760,8 @@ int soc_common_drv_pcmcia_probe(struct d
 	do {
 		skt = &sinfo->skt[i];
 
+		device_remove_file(&skt->socket.dev, &dev_attr_status);
+ out_err_8:
 		del_timer_sync(&skt->poll_timer);
 		pcmcia_unregister_socket(&skt->socket);
 
diff -Nrup linux-2.6.26-orig/drivers/rtc/Makefile linux-2.6.26-patched/drivers/rtc/Makefile
--- linux-2.6.26-orig/drivers/rtc/Makefile	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/drivers/rtc/Makefile	2008-07-22 22:26:38.000000000 +0200
@@ -41,6 +41,7 @@ obj-$(CONFIG_RTC_DRV_MAX6902)	+= rtc-max
 obj-$(CONFIG_RTC_DRV_OMAP)	+= rtc-omap.o
 obj-$(CONFIG_RTC_DRV_PCF8563)	+= rtc-pcf8563.o
 obj-$(CONFIG_RTC_DRV_PCF8583)	+= rtc-pcf8583.o
+obj-$(CONFIG_RTC_DRV_PCF8583)	+= rtc-pcf8593.o
 obj-$(CONFIG_RTC_DRV_PL031)	+= rtc-pl031.o
 obj-$(CONFIG_RTC_DRV_PPC)	+= rtc-ppc.o
 obj-$(CONFIG_RTC_DRV_R9701)	+= rtc-r9701.o
diff -Nrup linux-2.6.26-orig/drivers/rtc/rtc-pcf8593.c linux-2.6.26-patched/drivers/rtc/rtc-pcf8593.c
--- linux-2.6.26-orig/drivers/rtc/rtc-pcf8593.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.26-patched/drivers/rtc/rtc-pcf8593.c	2008-07-22 20:48:46.000000000 +0200
@@ -0,0 +1,441 @@
+/*
+ *  drivers/rtc/rtc-pcf8593.c
+ *
+ *  Copyright (C) 2000 Russell King
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Driver for PCF8583 RTC & RAM chip
+ *
+ *  Converted to the generic RTC susbsystem by G. Liakhovetski (2006)
+ */
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/rtc.h>
+#include <linux/bcd.h>
+
+struct rtc_mem {
+	unsigned int	loc;
+	unsigned int	nr;
+	unsigned char	*data;
+};
+
+struct pcf8593 {
+	struct i2c_client *client;
+	struct rtc_device *rtc;
+	unsigned char ctrl;
+};
+
+#define CTRL_STOP	0x80
+#define CTRL_HOLD	0x40
+#define CTRL_32KHZ	0x00
+#define CTRL_MASK	0x08
+#define CTRL_ALARMEN	0x04
+#define CTRL_ALARM	0x02
+#define CTRL_TIMER	0x01
+
+static struct i2c_driver pcf8593_driver;
+
+#define get_ctrl(x)    ((struct pcf8593 *)i2c_get_clientdata(x))->ctrl
+#define set_ctrl(x, v) get_ctrl(x) = v
+
+#define CMOS_YEAR	(9)
+#define CMOS_CHECKSUM	(15)
+
+static int pcf8593_get_datetime(struct i2c_client *client, struct rtc_time *dt)
+{
+	unsigned char buf[8], addr[1] = { 1 };
+	struct i2c_msg msgs[2] = {
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = 1,
+			.buf = addr,
+		}, {
+			.addr = client->addr,
+			.flags = I2C_M_RD,
+			.len = 6,
+			.buf = buf,
+		}
+	};
+	int ret;
+
+	dev_dbg(&client->dev, "%s: %p\n", "get_datetime", client);
+
+	memset(buf, 0, sizeof(buf));
+
+	ret = i2c_transfer(client->adapter, msgs, 2);
+	if (ret == 2) {
+		dt->tm_year = buf[4] >> 6;
+		dt->tm_wday = buf[5] >> 5;
+
+		buf[4] &= 0x3f;
+		buf[5] &= 0x1f;
+
+		dt->tm_sec = BCD2BIN(buf[1]);
+		dt->tm_min = BCD2BIN(buf[2]);
+		dt->tm_hour = BCD2BIN(buf[3]);
+		dt->tm_mday = BCD2BIN(buf[4]);
+		dt->tm_mon = BCD2BIN(buf[5]) - 1;
+	}
+
+	return ret == 2 ? 0 : -EIO;
+}
+
+static int pcf8593_set_datetime(struct i2c_client *client, struct rtc_time *dt, int datetoo)
+{
+	unsigned char buf[8];
+	int ret, len = 6;
+
+	buf[0] = 0;
+	buf[1] = get_ctrl(client) | 0x80;
+	buf[2] = 0;
+	buf[3] = BIN2BCD(dt->tm_sec);
+	buf[4] = BIN2BCD(dt->tm_min);
+	buf[5] = BIN2BCD(dt->tm_hour);
+
+	dev_dbg(&client->dev, "%s: %p\n", "set_datetime", client);
+
+	if (datetoo) {
+		len = 8;
+		buf[6] = BIN2BCD(dt->tm_mday) | (dt->tm_year << 6);
+		buf[7] = BIN2BCD(dt->tm_mon + 1)  | (dt->tm_wday << 5);
+	}
+
+	ret = i2c_master_send(client, (char *)buf, len);
+	if (ret != len)
+		return -EIO;
+
+	buf[1] = get_ctrl(client);
+	ret = i2c_master_send(client, (char *)buf, 2);
+
+	return ret == 2 ? 0 : -EIO;
+}
+
+static int pcf8593_get_ctrl(struct i2c_client *client, unsigned char *ctrl)
+{
+	*ctrl = get_ctrl(client);
+	return 0;
+}
+
+static int pcf8593_set_ctrl(struct i2c_client *client, unsigned char *ctrl)
+{
+	unsigned char buf[2];
+
+	buf[0] = 0;
+	buf[1] = *ctrl;
+	set_ctrl(client, *ctrl);
+
+	return i2c_master_send(client, (char *)buf, 2);
+}
+
+static int pcf8593_read_mem(struct i2c_client *client, struct rtc_mem *mem)
+{
+	unsigned char addr[1];
+	struct i2c_msg msgs[2] = {
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = 1,
+			.buf = addr,
+		}, {
+			.addr = client->addr,
+			.flags = I2C_M_RD,
+			.len = mem->nr,
+			.buf = mem->data,
+		}
+	};
+
+	dev_dbg(&client->dev, "%s: %p\n", "read_mem", client);
+
+	if (mem->loc < 8)
+		return -EINVAL;
+
+	addr[0] = mem->loc;
+
+	return i2c_transfer(client->adapter, msgs, 2) == 2 ? 0 : -EIO;
+}
+
+static int pcf8593_write_mem(struct i2c_client *client, struct rtc_mem *mem)
+{
+	unsigned char addr[1];
+	struct i2c_msg msgs[2] = {
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = 1,
+			.buf = addr,
+		}, {
+			.addr = client->addr,
+			.flags = I2C_M_NOSTART,
+			.len = mem->nr,
+			.buf = mem->data,
+		}
+	};
+
+	dev_dbg(&client->dev, "%s: %p\n", "write_mem", client);
+
+	if (mem->loc < 8)
+		return -EINVAL;
+
+	addr[0] = mem->loc;
+
+	return i2c_transfer(client->adapter, msgs, 2) == 2 ? 0 : -EIO;
+}
+
+static int pcf8593_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	unsigned char ctrl, year[2];
+	struct rtc_mem mem = { CMOS_YEAR, sizeof(year), year };
+	int real_year, year_offset, err;
+
+	printk("pcf8593_rtc_read_time\n ");
+	dev_dbg(&client->dev, "%s: %p\n", "read_time", client);
+	/*
+	 * Ensure that the RTC is running.
+	 */
+	pcf8593_get_ctrl(client, &ctrl);
+	if (ctrl & (CTRL_STOP | CTRL_HOLD)) {
+		unsigned char new_ctrl = ctrl & ~(CTRL_STOP | CTRL_HOLD);
+
+		printk(KERN_WARNING "RTC: resetting control %02x -> %02x\n",
+		       ctrl, new_ctrl);
+
+		if ((err = pcf8593_set_ctrl(client, &new_ctrl)) < 0)
+			return err;
+	}
+
+	if (pcf8593_get_datetime(client, tm) ||
+	    pcf8593_read_mem(client, &mem))
+		return -EIO;
+
+	real_year =  BCD2BIN(year[1]) * 100;
+	real_year += BCD2BIN(year[0]);
+
+	printk("pcf8593 rtc-read year [%d/%x][%d/%x] real %d\n", year[0], year[0], year[1], year[1], real_year);
+	/*
+	 * The RTC year holds the LSB two bits of the current
+	 * year, which should reflect the LSB two bits of the
+	 * CMOS copy of the year.  Any difference indicates
+	 * that we have to correct the CMOS version.
+	 */
+	year_offset = tm->tm_year - (real_year & 3);
+	if (year_offset < 0)
+		/*
+		 * RTC year wrapped.  Adjust it appropriately.
+		 */
+		year_offset += 4;
+
+	printk("pcf8593 rtc-read tm [%d/%x] offset [%d/%x]\n", tm->tm_year, tm->tm_year, year_offset, year_offset);
+	tm->tm_year = (real_year) - 1900;
+
+	return 0;
+}
+
+static int pcf8593_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	unsigned char year[2], chk;
+	struct rtc_mem cmos_year  = { CMOS_YEAR, sizeof(year), year };
+	struct rtc_mem cmos_check = { CMOS_CHECKSUM, 1, &chk };
+	unsigned int proper_year = tm->tm_year + 1900;
+	int ret;
+
+	printk("pcf8593_rtc_set_time\n ");
+	dev_dbg(&client->dev, "%s: %p\n", "set_time", client);
+	/*
+	 * The RTC's own 2-bit year must reflect the least
+	 * significant two bits of the CMOS year.
+	 */
+
+	ret = pcf8593_set_datetime(client, tm, 1);
+	if (ret)
+		return ret;
+
+	ret = pcf8593_read_mem(client, &cmos_check);
+	if (ret)
+		return ret;
+
+	ret = pcf8593_read_mem(client, &cmos_year);
+	if (ret)
+		return ret;
+
+	chk -= year[1] + year[0];
+
+	year[1] = proper_year / 100;
+	year[0] = proper_year % 100;
+
+	chk += year[1] + year[0];
+
+	ret = pcf8593_write_mem(client, &cmos_year);
+
+	if (ret)
+		return ret;
+
+	ret = pcf8593_write_mem(client, &cmos_check);
+
+	return ret;
+}
+
+static const struct rtc_class_ops pcf8593_rtc_ops = {
+	.read_time	= pcf8593_rtc_read_time,
+	.set_time	= pcf8593_rtc_set_time,
+};
+
+static ssize_t pcf8593_memory_read(struct kobject *kobj, struct bin_attribute *bin_attr,
+			   char *buf, loff_t off, size_t count)
+{
+	struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj));
+	struct pcf8593 *pcf = i2c_get_clientdata(client);
+	return 0;
+}
+
+static ssize_t pcf8593_memory_write(struct kobject *kobj, struct bin_attribute *bin_attr,
+			   char *buf, loff_t off, size_t count)
+{
+	struct i2c_client *client = to_i2c_client(container_of(kobj, struct device, kobj));
+	struct pcf8593 *pcf = i2c_get_clientdata(client);
+	return 0;
+}
+
+static struct bin_attribute memory_attr = {
+	.attr = {
+		.name = "memory",
+		.mode = S_IRUGO,
+	},
+	.size  = 64,
+	.read  = pcf8593_memory_read,
+	.write = pcf8593_memory_write,
+};
+
+static int pcf8593_detach(struct i2c_client *client)
+{
+	int err;
+	struct pcf8593 *pcf = i2c_get_clientdata(client);
+	struct rtc_device *rtc = pcf->rtc;
+
+	if (rtc)
+		rtc_device_unregister(rtc);
+
+	if ((err = i2c_detach_client(client)))
+		return err;
+
+	kfree(pcf);
+	return 0;
+}
+
+static int __devinit pcf8593_probe(struct i2c_client *client)
+{
+	struct pcf8593 *pcf;
+	struct rtc_device *rtc;
+	struct i2c_adapter	*adapter = to_i2c_adapter(client->dev.parent);
+	unsigned char buf[16], ad[1] = { 0 };
+	int err;
+	struct i2c_msg msgs[2] = {
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = 1,
+			.buf = ad,
+		}, {
+			.addr = client->addr,
+			.flags = I2C_M_RD,
+			.len = 16,
+			.buf = buf,
+		}
+	};
+
+	printk("pcf8593 addr %x\n", client->addr);
+
+	if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))
+		return 0;
+
+	pcf = kzalloc(sizeof(*pcf), GFP_KERNEL);
+	if (!pcf)
+		return -ENOMEM;
+
+	pcf->client = client;
+	i2c_set_clientdata(client, pcf);
+
+	printk("pcf8593 func addr %x\n", client->addr);
+	client->adapter	= adapter;
+	client->driver	= &pcf8593_driver;
+
+	strlcpy(client->name, pcf8593_driver.driver.name, I2C_NAME_SIZE);
+
+	if (i2c_transfer(client->adapter, msgs, 2) != 2) {
+		err = -EIO;
+		goto exit_kfree;
+	}
+
+	printk("pcf8593 buf:\n ");
+	for (err=0; err < 16; err++) {
+		printk(" %02x", buf[err]);
+	}
+	printk("\npcf8593 ----------\n ");
+
+/*	err = i2c_attach_client(client);
+
+	if (err)
+		goto exit_kfree;
+
+	printk("pcf8593 attached\n "); */
+	rtc = rtc_device_register(pcf8593_driver.driver.name, &client->dev,
+				  &pcf8593_rtc_ops, THIS_MODULE);
+
+	if (IS_ERR(rtc)) {
+		err = PTR_ERR(rtc);
+		goto exit_detach;
+	}
+
+	printk("pcf8593 rtc registered\n ");
+
+	pcf->rtc = rtc;
+	set_ctrl(client, buf[0]);
+
+	err = sysfs_create_bin_file(&client->dev.kobj, &memory_attr);
+	printk("pcf8593 mem created %d\n", err);
+	return 0;
+
+exit_detach:
+	i2c_detach_client(client);
+
+exit_kfree:
+	kfree(pcf);
+
+	return err;
+}
+
+static struct i2c_driver pcf8593_driver = {
+	.driver = {
+		.name	= "rtc-pcf8593",
+		.owner	= THIS_MODULE,
+	},
+	.id		= I2C_DRIVERID_PCF8593,
+	.probe		= pcf8593_probe,
+	.remove		= pcf8593_detach,
+};
+
+static __init int pcf8593_init(void)
+{
+	return i2c_add_driver(&pcf8593_driver);
+}
+
+static __exit void pcf8593_exit(void)
+{
+	i2c_del_driver(&pcf8593_driver);
+}
+
+module_init(pcf8593_init);
+module_exit(pcf8593_exit);
+
+MODULE_AUTHOR("Russell King");
+MODULE_DESCRIPTION("PCF8593 I2C RTC driver");
+MODULE_LICENSE("GPL");
diff -Nrup linux-2.6.26-orig/drivers/watchdog/sa1100_wdt.c linux-2.6.26-patched/drivers/watchdog/sa1100_wdt.c
--- linux-2.6.26-orig/drivers/watchdog/sa1100_wdt.c	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/drivers/watchdog/sa1100_wdt.c	2008-07-22 20:48:46.000000000 +0200
@@ -29,6 +29,7 @@
 
 #ifdef CONFIG_ARCH_PXA
 #include <asm/arch/pxa-regs.h>
+#include <asm/arch/pxa2xx-regs.h>
 #endif
 
 #include <asm/hardware.h>
diff -Nrup linux-2.6.26-orig/include/asm-arm/arch-pxa/pxa2xx_spi.h linux-2.6.26-patched/include/asm-arm/arch-pxa/pxa2xx_spi.h
--- linux-2.6.26-orig/include/asm-arm/arch-pxa/pxa2xx_spi.h	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/include/asm-arm/arch-pxa/pxa2xx_spi.h	2008-07-22 20:48:46.000000000 +0200
@@ -41,4 +41,6 @@ struct pxa2xx_spi_chip {
 	void (*cs_control)(u32 command);
 };
 
+extern void pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info);
+
 #endif /*PXA2XX_SPI_H_*/
diff -Nrup linux-2.6.26-orig/include/asm-arm/arch-pxa/trizeps4.h linux-2.6.26-patched/include/asm-arm/arch-pxa/trizeps4.h
--- linux-2.6.26-orig/include/asm-arm/arch-pxa/trizeps4.h	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/include/asm-arm/arch-pxa/trizeps4.h	2008-07-22 20:48:46.000000000 +0200
@@ -54,6 +54,15 @@
 #define GPIO_MMC_DET		12
 #define TRIZEPS4_MMC_IRQ	IRQ_GPIO(GPIO_MMC_DET)
 
+/* DOC NAND chip */
+#define GPIO_DOC_LOCK		94
+#define GPIO_DOC_IRQ		93
+#define TRIZEPS4_DOC_IRQ	IRQ_GPIO(GPIO_DOC_IRQ)
+
+/* SPI interface */
+#define GPIO_SPI		53
+#define TRIZEPS4_SPI_IRQ	IRQ_GPIO(GPIO_SPI)
+
 /* LEDS using tx2 / rx2 */
 #define GPIO_SYS_BUSY_LED	46
 #define GPIO_HEARTBEAT_LED	47
diff -Nrup linux-2.6.26-orig/include/linux/i2c-id.h linux-2.6.26-patched/include/linux/i2c-id.h
--- linux-2.6.26-orig/include/linux/i2c-id.h	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/include/linux/i2c-id.h	2008-07-22 22:31:21.000000000 +0200
@@ -90,6 +90,7 @@
 #define I2C_DRIVERID_CS4270	94	/* Cirrus Logic 4270 audio codec */
 #define I2C_DRIVERID_M52790 	95      /* Mitsubishi M52790SP/FP AV switch */
 #define I2C_DRIVERID_CS5345	96	/* cs5345 audio processor	*/
+#define I2C_DRIVERID_PCF8593	97	/* real time clock		*/
 
 #define I2C_DRIVERID_I2CDEV	900
 
diff -Nrup linux-2.6.26-orig/include/linux/leds.h linux-2.6.26-patched/include/linux/leds.h
--- linux-2.6.26-orig/include/linux/leds.h	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/include/linux/leds.h	2008-07-22 20:48:46.000000000 +0200
@@ -118,6 +118,12 @@ extern void ledtrig_ide_activity(void);
 #define ledtrig_ide_activity() do {} while(0)
 #endif
 
+#ifdef CONFIG_LEDS_TRIGGER_CPU_BUSY
+extern void ledtrig_cpu_busy(int busy);
+#else
+#define ledtrig_cpu_busy(x) do {} while(0)
+#endif
+
 /* For the leds-gpio driver */
 struct gpio_led {
 	const char *name;
diff -Nrup linux-2.6.26-orig/include/linux/mtd/doc2000.h linux-2.6.26-patched/include/linux/mtd/doc2000.h
--- linux-2.6.26-orig/include/linux/mtd/doc2000.h	2008-07-13 23:51:29.000000000 +0200
+++ linux-2.6.26-patched/include/linux/mtd/doc2000.h	2008-07-22 20:48:46.000000000 +0200
@@ -81,9 +81,15 @@
  * Others use readb/writeb
  */
 #if defined(__arm__)
+#if 1
+#define ReadDOC_(adr, reg)      ((unsigned char)(*(volatile __u16 *)(((unsigned long)adr)+((reg)<<1))))
+#define WriteDOC_(d, adr, reg)  do{ *(volatile __u16 *)(((unsigned long)adr)+((reg)<<1)) = (__u16)d; wmb();} while(0)
+#define DOC_IOREMAP_LEN 0x4000
+#else
 #define ReadDOC_(adr, reg)      ((unsigned char)(*(volatile __u32 *)(((unsigned long)adr)+((reg)<<2))))
 #define WriteDOC_(d, adr, reg)  do{ *(volatile __u32 *)(((unsigned long)adr)+((reg)<<2)) = (__u32)d; wmb();} while(0)
 #define DOC_IOREMAP_LEN 0x8000
+#endif
 #elif defined(__ppc__)
 #define ReadDOC_(adr, reg)      ((unsigned char)(*(volatile __u16 *)(((unsigned long)adr)+((reg)<<1))))
 #define WriteDOC_(d, adr, reg)  do{ *(volatile __u16 *)(((unsigned long)adr)+((reg)<<1)) = (__u16)d; wmb();} while(0)
