diff -burN ./linux-2.6.35.3/arch/arm/mach-mx28/usb_dr.c /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/arch/arm/mach-mx28/usb_dr.c
--- ./linux-2.6.35.3/arch/arm/mach-mx28/usb_dr.c	2011-02-28 14:22:48.000000000 -0700
+++ /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/arch/arm/mach-mx28/usb_dr.c	2011-08-29 12:13:00.000000000 -0600
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2009-2011 Freescale Semiconductor, Inc. All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,6 +30,12 @@
 #include "usb.h"
 #include "mx28_pins.h"
 #define USB_POWER_ENABLE MXS_PIN_TO_GPIO(PINID_AUART2_TX)
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+static void fsl_safe_writel(u32 val32, volatile u32 *addr)
+{
+	__asm__ ("swp %0, %0, [%1]" : : "r"(val32), "r"(addr));
+}
+#endif
 
 extern int clk_get_usecount(struct clk *clk);
 static struct clk *usb_clk;
@@ -142,7 +148,12 @@
 	if (enable) {
 		tmp = __raw_readl(usb_reg + UOG_PORTSC1);
 		tmp |= PORTSC_PHCD;
+
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+		fsl_safe_writel(tmp, usb_reg + UOG_PORTSC1);
+#else
 		__raw_writel(tmp, usb_reg + UOG_PORTSC1);
+#endif
 
 		pr_debug("%s, Poweroff UTMI \n", __func__);
 
@@ -170,7 +181,13 @@
 
 		tmp = __raw_readl(usb_reg + UOG_PORTSC1);
 		tmp &= ~PORTSC_PHCD;
+		
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+		fsl_safe_writel(tmp, usb_reg + UOG_PORTSC1);
+#else
 		__raw_writel(tmp, usb_reg + UOG_PORTSC1);
+#endif
+
 	}
 }
 
@@ -307,7 +324,13 @@
 		pr_debug("otg host ID wakeup\n");
 		/* if host ID wakeup, we must clear the b session change sts */
 		__raw_writel(wakeup_irq_bits, phy_reg + HW_USBPHY_CTRL_CLR);
+
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+		fsl_safe_writel(otgsc & (~OTGSC_IS_USB_ID), usb_reg + UOG_OTGSC);
+#else
 		__raw_writel(otgsc & (~OTGSC_IS_USB_ID), usb_reg + UOG_OTGSC);
+#endif
+		
 		return true;
 	}
 	if (wakeup_req /*&& (!((otgsc & OTGSC_IS_B_SESSION_VALID)))*/ && (!((otgsc & OTGSC_STS_USB_ID)))) {
diff -burN ./linux-2.6.35.3/arch/arm/mach-mx28/usb_h1.c /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/arch/arm/mach-mx28/usb_h1.c
--- ./linux-2.6.35.3/arch/arm/mach-mx28/usb_h1.c	2011-02-28 14:22:49.000000000 -0700
+++ /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/arch/arm/mach-mx28/usb_h1.c	2011-08-29 12:12:48.000000000 -0600
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2009-2011 Freescale Semiconductor, Inc. All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -39,6 +39,15 @@
 }
 
 static int internal_phy_clk_already_on;
+
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+static void fsl_safe_writel(u32 val32, volatile u32 *addr)
+{
+	__asm__ ("swp %0, %0, [%1]" : : "r"(val32), "r"(addr));
+}
+#endif
+
+
 static void usbh1_internal_phy_clock_gate(bool on)
 {
 	u32 tmp;
@@ -89,7 +98,9 @@
 	if (on) {
 		clk_enable(usb_clk);
 		clk_enable(usb_phy_clk);
+		usbh1_internal_phy_clock_gate(on);
 	} else {
+		usbh1_internal_phy_clock_gate(on);
 		clk_disable(usb_phy_clk);
 		clk_disable(usb_clk);
 	}
@@ -134,7 +145,12 @@
 	if (enable) {
 		tmp = __raw_readl(usb_reg + UOG_PORTSC1);
 		tmp |= PORTSC_PHCD;
+		
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+		fsl_safe_writel(tmp, usb_reg + UOG_PORTSC1);
+#else
 		__raw_writel(tmp, usb_reg + UOG_PORTSC1);
+#endif
 
 		pr_debug("%s, Poweroff UTMI \n", __func__);
 
@@ -162,7 +178,13 @@
 
 		tmp = __raw_readl(usb_reg + UOG_PORTSC1);
 		tmp &= ~PORTSC_PHCD;
+
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+		fsl_safe_writel(tmp, usb_reg + UOG_PORTSC1);
+#else
 		__raw_writel(tmp, usb_reg + UOG_PORTSC1);
+#endif
+
 	}
 }
 
diff -burN ./linux-2.6.35.3/arch/arm/plat-mxs/usb_common.c /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/arch/arm/plat-mxs/usb_common.c
--- ./linux-2.6.35.3/arch/arm/plat-mxs/usb_common.c	2011-02-28 14:22:07.000000000 -0700
+++ /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/arch/arm/plat-mxs/usb_common.c	2011-08-29 12:12:12.000000000 -0600
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2009-2011 Freescale Semiconductor, Inc. All Rights Reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,6 +49,13 @@
 #define MXC_NUMBER_USB_TRANSCEIVER 6
 struct fsl_xcvr_ops *g_xc_ops[MXC_NUMBER_USB_TRANSCEIVER] = { NULL };
 
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+static void fsl_safe_writel(u32 val32, volatile u32 *addr)
+{
+	__asm__ ("swp %0, %0, [%1]" : : "r"(val32), "r"(addr));
+}
+#endif
+
 void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops)
 {
 	int i;
@@ -228,12 +235,24 @@
 	usbcmd = usb_reg + UOG_USBCMD;
 	tmp = __raw_readl(usbcmd); /* usb command */
 	tmp &= ~UCMD_RUN_STOP;
+	
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+		fsl_safe_writel(tmp, usbcmd);
+#else
 	__raw_writel(tmp, usbcmd);
+#endif
+	
 	while (__raw_readl(usbcmd) & UCMD_RUN_STOP)
 		;
 
 	tmp |= UCMD_RESET;
+
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+		fsl_safe_writel(tmp, usbcmd);
+#else
 	__raw_writel(tmp, usbcmd);
+#endif
+	
 	while (__raw_readl(usbcmd) & UCMD_RESET)
 		;
 	mdelay(10);
@@ -263,7 +282,12 @@
 	tmp = __raw_readl(portsc);
 	tmp &=  ~PORTSC_PTS_MASK;
 	tmp |= (PORTSC_PTS_UTMI | PORTSC_PTW);
+
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+		fsl_safe_writel(tmp, portsc);
+#else
 	__raw_writel(tmp, portsc);
+#endif
 
 	/* Power up the PHY */
 	__raw_writel(0, phy_reg + HW_USBPHY_PWD);
diff -burN ./linux-2.6.35.3/drivers/usb/host/ehci.h /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/drivers/usb/host/ehci.h
--- ./linux-2.6.35.3/drivers/usb/host/ehci.h	2011-02-28 14:13:01.000000000 -0700
+++ /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/drivers/usb/host/ehci.h	2011-08-29 12:11:19.000000000 -0600
@@ -647,6 +647,13 @@
 #endif
 }
 
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+static void fsl_safe_writel(u32 val32, volatile u32 *addr)
+{
+	__asm__ ("swp %0, %0, [%1]" : : "r"(val32), "r"(addr));
+}
+#endif
+
 static inline void ehci_writel(const struct ehci_hcd *ehci,
 		const unsigned int val, __u32 __iomem *regs)
 {
@@ -655,8 +662,14 @@
 		writel_be(val, regs) :
 		writel(val, regs);
 #else
+
+#ifdef CONFIG_WORKAROUND_ARCUSB_REG_RW
+	fsl_safe_writel(val, regs);
+#else
 	writel(val, regs);
 #endif
+
+#endif
 }
 
 /*
diff -burN ./linux-2.6.35.3/drivers/usb/host/Kconfig /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/drivers/usb/host/Kconfig
--- ./linux-2.6.35.3/drivers/usb/host/Kconfig	2011-02-28 14:13:00.000000000 -0700
+++ /devel/L2.6.35/ltib/rpm/BUILD/linux-2.6.35.3/drivers/usb/host/Kconfig	2011-08-29 12:11:38.000000000 -0600
@@ -90,6 +90,13 @@
 	---help---
 	  Enable support for the USB OTG port in HS/FS Host mode.
 
+config WORKAROUND_ARCUSB_REG_RW
+	bool "Enable USB suspend and resume work around"
+	depends on USB_EHCI_ARC
+	default y
+	---help---
+	  Enables a fix provided by Freescale to address an issue with the USB failing during a suspend and resume.
+
 config USB_STATIC_IRAM
 	bool "Use IRAM for USB"
 	depends on USB_EHCI_ARC
