 arch/arm/configs/omap_3430ldp_defconfig |    3 ++-
 arch/arm/configs/omap_3430sdp_defconfig |    3 ++-
 arch/arm/mach-omap2/Kconfig             |   11 +++++++++++
 arch/arm/mach-omap2/io.c                |   16 ++++++++--------
 arch/arm/mach-omap2/pm_34xx.c           |    5 +++--
 arch/arm/mach-omap2/pm_34xx.h           |   21 +++++++++++++++------
 arch/arm/mach-omap2/pm_idle_34xx.c      |    6 +++---
 arch/arm/mach-omap2/pm_idle_34xx.h      |    2 +-
 arch/arm/mach-omap2/prcm_34xx.c         |   30 ++++++++++++++++++++++--------
 arch/arm/mm/mmu.c                       |    8 +++++++-
 arch/arm/plat-omap/gpio.c               |    4 ++++
 arch/arm/plat-omap/sram.c               |    5 +++--
 include/asm-arm/arch-omap/io.h          |   11 +++++++++++
 include/asm-arm/arch-omap/prcm_34xx.h   |    1 +
 include/asm-arm/mach/map.h              |    1 +
 15 files changed, 94 insertions(+), 33 deletions(-)

================================================================================

--- arch/arm/configs/omap_3430ldp_defconfig@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-12-03 15:30:49.000000000 -0600
+++ arch/arm/configs/omap_3430ldp_defconfig	2008-12-09 20:16:22.000000000 -0600
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.24.7-omap1-arm2
-# Fri Nov 28 22:36:13 2008
+# Tue Dec  9 20:53:43 2008
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -185,6 +185,7 @@ CONFIG_OMAP3430_ES2=y
 #
 # CONFIG_MACH_OMAP_3430SDP is not set
 CONFIG_MACH_OMAP_3430LABRADOR=y
+# CONFIG_INTERCONNECT_IO_POSTING is not set
 CONFIG_OMAP3_PM=y
 CONFIG_OMAP_VOLT_SR_BYPASS=y
 # CONFIG_OMAP_VOLT_SR is not set
--- arch/arm/configs/omap_3430sdp_defconfig@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-12-03 15:30:47.000000000 -0600
+++ arch/arm/configs/omap_3430sdp_defconfig	2008-12-09 20:16:26.000000000 -0600
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.24.7-omap1-arm2
-# Fri Nov 28 22:36:57 2008
+# Tue Dec  9 20:52:04 2008
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -198,6 +198,7 @@ CONFIG_OMAP3430_ES2=y
 #
 CONFIG_MACH_OMAP_3430SDP=y
 # CONFIG_MACH_OMAP_3430LABRADOR is not set
+# CONFIG_INTERCONNECT_IO_POSTING is not set
 CONFIG_OMAP3_PM=y
 CONFIG_OMAP_VOLT_SR_BYPASS=y
 # CONFIG_OMAP_VOLT_SR is not set
--- arch/arm/mach-omap2/Kconfig@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-11-06 21:38:43.000000000 -0600
+++ arch/arm/mach-omap2/Kconfig	2008-12-09 20:16:33.000000000 -0600
@@ -129,6 +129,17 @@ config MACH_OMAP_2430OSK
 	bool "OMAP 2430 OSK board"
 	depends on ARCH_OMAP2 && ARCH_OMAP24XX
 
+config INTERCONNECT_IO_POSTING
+	bool "Enable bus posting for PIO accesses"
+	depends on ARCH_OMAP34XX
+	default n
+	---help---
+	This option sets PIO access for internal OMAP3 registers to follow the
+	ARMv7 DEVICE attribute. For 3430 this will allow posted writes in the
+	interconnect. Software will need to synchronize writes to ensure
+	completion. When not set the attribute is Strongly Ordered which is
+	non-posted on the OMAP3 interconnect. 
+
 config OMAP3_PM
 	bool "Enable TI OMAP Power Management"
 	depends on ARCH_OMAP3
--- arch/arm/mach-omap2/io.c@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-06-13 20:01:15.000000000 -0500
+++ arch/arm/mach-omap2/io.c	2008-12-09 20:16:30.000000000 -0600
@@ -125,49 +125,49 @@ static struct map_desc omap34xx_io_desc[
 		.virtual	= L3_34XX_VIRT,
 		.pfn		= __phys_to_pfn(L3_34XX_PHYS),
 		.length		= L3_34XX_SIZE,
-		.type		= MT_DEVICE
+		.type		= IO_MAP_TYPE
 	},
 	{
 		.virtual	= L4_34XX_VIRT,
 		.pfn		= __phys_to_pfn(L4_34XX_PHYS),
 		.length		= L4_34XX_SIZE,
-		.type		= MT_DEVICE
+		.type		= IO_MAP_TYPE
 	},
 	{
 		.virtual	= L4_WK_34XX_VIRT,
 		.pfn		= __phys_to_pfn(L4_WK_34XX_PHYS),
 		.length		= L4_WK_34XX_SIZE,
-		.type		= MT_DEVICE
+		.type		= IO_MAP_TYPE
 	},
 	{
 		.virtual	= OMAP34XX_GPMC_VIRT,
 		.pfn		= __phys_to_pfn(OMAP34XX_GPMC_PHYS),
 		.length		= OMAP34XX_GPMC_SIZE,
-		.type		= MT_DEVICE
+		.type		= IO_MAP_TYPE
 	},
 	{
 		.virtual	= OMAP343X_SMS_VIRT,
 		.pfn		= __phys_to_pfn(OMAP343X_SMS_PHYS),
 		.length		= OMAP343X_SMS_SIZE,
-		.type		= MT_DEVICE
+		.type		= IO_MAP_TYPE
 	},
 	{
 		.virtual	= OMAP343X_SDRC_VIRT,
 		.pfn		= __phys_to_pfn(OMAP343X_SDRC_PHYS),
 		.length		= OMAP343X_SDRC_SIZE,
-		.type		= MT_DEVICE
+		.type		= IO_MAP_TYPE
 	},
 	{
 		.virtual	= L4_PER_34XX_VIRT,
 		.pfn		= __phys_to_pfn(L4_PER_34XX_PHYS),
 		.length		= L4_PER_34XX_SIZE,
-		.type		= MT_DEVICE
+		.type		= IO_MAP_TYPE
 	},
 	{
 		.virtual	= L4_EMU_34XX_VIRT,
 		.pfn		= __phys_to_pfn(L4_EMU_34XX_PHYS),
 		.length		= L4_EMU_34XX_SIZE,
-		.type		= MT_DEVICE
+		.type		= IO_MAP_TYPE
 	},
 };
 #endif
--- arch/arm/mach-omap2/pm_34xx.c@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-12-05 12:22:20.000000000 -0600
+++ arch/arm/mach-omap2/pm_34xx.c	2008-12-09 20:16:35.000000000 -0600
@@ -213,6 +213,7 @@ void omap3_save_per_context(void)
 void omap3_restore_per_context(void)
 {
 	omap_gpio_restore();
+	prcm_wait_for_clock(PRCM_UART3);
 	omap_uart_restore_ctx(2);
 }
 
@@ -272,7 +273,7 @@ void omap3_restore_core_settings(void)
 
 }
 
-void memory_logic_res_seting(void)
+void memory_logic_res_setting(void)
 {
 	res1_level = resource_get_level(memret1);
 	res2_level = resource_get_level(memret2);
@@ -379,7 +380,7 @@ static int omap3_pm_suspend(void)
 	target_state.core_state = PRCM_CORE_CSWR_MEMRET;
 #endif
 	if (target_state.core_state == PRCM_CORE_CSWR_MEMRET) {
-		memory_logic_res_seting();
+		memory_logic_res_setting();
 	}
 	if (core_off_notification != NULL)
 		core_off_notification(PRCM_TRUE);
--- arch/arm/mach-omap2/pm_34xx.h@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-11-06 21:38:44.000000000 -0600
+++ arch/arm/mach-omap2/pm_34xx.h	2008-12-09 20:16:38.000000000 -0600
@@ -31,12 +31,21 @@
 /* Context memory: w/oETM->u32[61], w/ETM->u32[213] */
 u32 context_mem[256];
 
-#define SCRATCHPAD_ROM  0x48002860
-#define SCRATCHPAD      0x48002910
-#define SCRATHPAD_ROM_OFFSET    0x19C
-#define TABLE_ADDRESS_OFFSET    0x31
-#define TABLE_VALUE_OFFSET      0x30
-#define CONTROL_REG_VALUE_OFFSET        0x32
+/*
+ * Read-Only Pad conf:
+ *   0x4800 2600 -> 4800 28A0
+ *          2600 ->      286C (padconf SAR)
+ * Scratch PAD
+ *  Early errata requires clear on cold reset
+ *   0x4800 2870 ->      29FC (scratchpad)
+ *   0x4800 2894 (first writeable scratchpad)
+ */
+#define SCRATCHPAD_ROM            0x480028A4
+#define SCRATCHPAD                0x48002910
+#define SCRATHPAD_ROM_OFFSET      0x158 /* size to clear to 29fc */
+#define TABLE_ADDRESS_OFFSET      0x31
+#define TABLE_VALUE_OFFSET        0x30
+#define CONTROL_REG_VALUE_OFFSET  0x32
 
 struct system_power_state target_state;
 
--- arch/arm/mach-omap2/pm_idle_34xx.c@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-11-05 13:31:31.000000000 -0600
+++ arch/arm/mach-omap2/pm_idle_34xx.c	2008-12-09 20:16:40.000000000 -0600
@@ -450,7 +450,7 @@ static void correct_target_state(void)
 	} else
 		target_state.per_state = PRCM_ON;
 		if (target_state.core_state == PRCM_CORE_CSWR_MEMRET)
-			memory_logic_res_seting();
+			memory_logic_res_setting();
 }
 
 static int omap3_enter_idle(struct cpuidle_device *dev,
@@ -741,12 +741,12 @@ restore:
 
 		if (target_state.core_state >= PRCM_CORE_OSWR_MEMRET) {
 #ifdef CONFIG_OMAP34XX_OFFMODE
-		context_restore_update(DOM_CORE1);
+			context_restore_update(DOM_CORE1);
 #endif
 			prcm_restore_registers(&target_state);
 			prcm_restore_core_context(target_state.core_state);
 			omap3_restore_core_settings();
-			}
+		}
 		/* Errata 1.4
 		* if the timer device gets idled which is when we
 		* are cutting the timer ICLK which is when we try
--- arch/arm/mach-omap2/pm_idle_34xx.h@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-09-10 10:56:03.000000000 -0500
+++ arch/arm/mach-omap2/pm_idle_34xx.h	2008-12-09 20:16:43.000000000 -0600
@@ -21,7 +21,7 @@ extern void omap3_restore_neon_context(v
 extern void omap3_save_per_context(void);
 extern void omap3_restore_per_context(void);
 extern void omap3_push_sram_functions(void);
-extern void memory_logic_res_seting(void);
+extern void memory_logic_res_setting(void);
 extern void omap3_restore_core_settings(void);
 extern void enable_smartreflex(int srid);
 extern void disable_smartreflex(int srid);
--- arch/arm/mach-omap2/prcm_34xx.c@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-12-05 13:49:26.000000000 -0600
+++ arch/arm/mach-omap2/prcm_34xx.c	2008-12-09 20:16:45.000000000 -0600
@@ -1355,6 +1355,19 @@ int prcm_is_device_accessible(u32 device
 }
 
 /*============================================================================*/
+/*======================== WAIT FOR CLOCK  ===================================*/
+/*============================================================================*/
+/*= Provide simple dead wait for access on clocks.                           =*/
+/*============================================================================*/
+void prcm_wait_for_clock(u32 deviceid)
+{
+	u8 ok;
+	do {
+		prcm_is_device_accessible(deviceid, &ok);
+	} while (ok != PRCM_TRUE);
+}
+
+/*============================================================================*/
 /*======================== INTERFACE CLOCK AUTOIDLE  =========================*/
 /*============================================================================*/
 /*= This command will either enable or disable the interface clock AutoIdle  =*/
@@ -4639,14 +4652,6 @@ int prcm_save_registers(struct system_po
 /* Restore registers */
 int prcm_restore_registers(struct system_power_state *target_state)
 {
-	PRCM_RESTORE(INTC_MIR_0);
-	PRCM_RESTORE(INTC_MIR_1);
-	PRCM_RESTORE(INTC_MIR_2);
-	PRCM_RESTORE(CONTROL_PADCONF_SYS_NIRQ);
-	PRCM_RESTORE(GPIO1_IRQENABLE1);
-	PRCM_RESTORE(GPIO1_WAKEUPENABLE);
-	PRCM_RESTORE(GPIO1_FALLINGDETECT);
-
 	PRCM_RESTORE(CM_CLKSEL2_PLL_IVA2);
 	PRCM_RESTORE(CM_SYSCONFIG);
 
@@ -4783,6 +4788,15 @@ int prcm_restore_registers(struct system
 	PRCM_RESTORE(PM_IVA2GRPSEL_USBHOST);
 #endif
 	PRCM_RESTORE(PM_WKEN_WKUP);
+
+	PRCM_RESTORE(INTC_MIR_0);
+	PRCM_RESTORE(INTC_MIR_1);
+	PRCM_RESTORE(INTC_MIR_2);
+	PRCM_RESTORE(CONTROL_PADCONF_SYS_NIRQ);
+	PRCM_RESTORE(GPIO1_IRQENABLE1);
+	PRCM_RESTORE(GPIO1_WAKEUPENABLE);
+	PRCM_RESTORE(GPIO1_FALLINGDETECT);
+
 	return PRCM_PASS;
 }
 
--- arch/arm/mm/mmu.c@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-05-07 14:13:00.000000000 -0500
+++ arch/arm/mm/mmu.c	2008-12-09 20:16:48.000000000 -0600
@@ -231,7 +231,13 @@ static struct mem_type mem_types[] = {
 		.domain    = DOMAIN_USER,
 	},
 	[MT_MEMORY_SO] = {
-		.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_UNCACHED,
+		.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE |
+				PMD_SECT_UNCACHED | PMD_SECT_XN,
+		.domain    = DOMAIN_KERNEL,
+	},
+	[MT_MEMORY_SO_EXE] = {
+		.prot_sect = PMD_TYPE_SECT | PMD_SECT_AP_WRITE |
+				PMD_SECT_UNCACHED,
 		.domain    = DOMAIN_KERNEL,
 	},
 	[MT_MEMORY] = {
--- arch/arm/plat-omap/gpio.c@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-12-05 12:22:50.000000000 -0600
+++ arch/arm/plat-omap/gpio.c	2008-12-09 20:16:51.000000000 -0600
@@ -1505,7 +1505,11 @@ static int __init _omap_gpio_init(void)
 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
 		if (bank->method == METHOD_GPIO_24XX) {
 			static const u32 non_wakeup_gpios[] = {
+#if defined(CONFIG_ARCH_OMAP24XX)
 				0xe203ffc0, 0x08700040
+#else
+				0
+#endif
 			};
 
 			__raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_IRQENABLE1);
--- arch/arm/plat-omap/sram.c@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-10-02 05:20:19.000000000 -0500
+++ arch/arm/plat-omap/sram.c	2008-12-09 20:16:54.000000000 -0600
@@ -195,7 +195,7 @@ static struct map_desc omap_sram_io_desc
 	{	/* .length gets filled in at runtime */
 		.virtual	= OMAP1_SRAM_VA,
 		.pfn		= __phys_to_pfn(OMAP1_SRAM_PA),
-		.type		= MT_MEMORY_SO
+		.type		= MT_MEMORY_SO_EXE
 	}
 };
 
@@ -258,7 +258,8 @@ void * omap_sram_push(void * start, unsi
 	omap_sram_ceil -= size;
 	omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *));
 	memcpy((void *)omap_sram_ceil, start, size);
-	flush_icache_range((unsigned long)start, (unsigned long)(start + size));
+	flush_icache_range((unsigned long)omap_sram_ceil,
+			(unsigned long)(omap_sram_ceil + size));
 
 	return (void *)omap_sram_ceil;
 }
--- include/asm-arm/arch-omap/io.h@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-04-04 01:26:58.000000000 -0500
+++ include/asm-arm/arch-omap/io.h	2008-12-09 20:16:56.000000000 -0600
@@ -107,6 +107,17 @@
 
 #elif defined(CONFIG_ARCH_OMAP3)
 
+/* Select ARM view IO behavior */
+#ifdef CONFIG_INTERCONNECT_IO_POSTING
+/* ARM writes to devices are postable.  Further software 
+ * sychronization neeed ex: DSB or register read back 
+ */
+#define IO_MAP_TYPE	MT_DEVICE
+#else
+/* ARM writes to devices are sychronized */
+#define IO_MAP_TYPE	MT_MEMORY_SO
+#endif
+
 /* We map both L3 and L4 on OMAP3 */
 #define L3_34XX_PHYS		L3_34XX_BASE	/* 0x68000000 */
 #define L3_34XX_VIRT		0xf8000000
--- include/asm-arm/arch-omap/prcm_34xx.h@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-11-05 13:31:35.000000000 -0600
+++ include/asm-arm/arch-omap/prcm_34xx.h	2008-12-09 20:16:59.000000000 -0600
@@ -1273,6 +1273,7 @@ extern struct dvfs_config omap3_vdd2_con
 extern int prcm_clock_control(u32 deviceid, u8 clk_type, u8 control,
 			      u8 checkaccessibility);
 extern int prcm_is_device_accessible(u32 deviceid, u8 *result);
+extern void prcm_wait_for_clock(u32 deviceid);
 extern int prcm_interface_clock_autoidle(u32 deviceid, u8 control);
 extern int prcm_wakeup_event_control(u32 deviceid, u8 control);
 
--- include/asm-arm/mach/map.h@@/LINUX-GIT-2.6K_INT_FLOAT_4.0	2008-04-11 23:03:54.000000000 -0500
+++ include/asm-arm/mach/map.h	2008-12-09 20:17:02.000000000 -0600
@@ -26,6 +26,7 @@ struct map_desc {
 #define MT_MEMORY		8
 #define MT_ROM			9
 #define MT_MEMORY_SO		10
+#define MT_MEMORY_SO_EXE	11
 
 #define MT_NONSHARED_DEVICE	MT_DEVICE_NONSHARED
 #define MT_IXP2000_DEVICE	MT_DEVICE_IXP2000
