@@ -39,6 +39,7 @@
#include <mach/gpmc.h>
#include <mach/dma.h>
#include <mach/dmtimer.h>
+#include <mach/usb.h>
#include <asm/tlbflush.h>
@@ -496,6 +497,11 @@ void omap_sram_idle(void)
omap3_prcm_restore_context();
omap3_sram_restore_context();
omap2_sms_restore_context();
+ /*
+ * Errata 1.164 fix : OTG autoidle can prevent
+ * sleep
+ */
+ usb_musb_disable_autoidle();
}
omap_uart_resume_idle(0);
omap_uart_resume_idle(1);
@@ -44,10 +44,11 @@ static struct platform_device dummy_pdev = {
},
};
+static void __iomem *otg_base;
+static struct clk *otg_clk;
+
static void __init usb_musb_pm_init(void)
{
- void __iomem *otg_base;
- struct clk *otg_clk;
struct device *dev = &dummy_pdev.dev;
if (!cpu_is_omap34xx())
@@ -74,12 +75,13 @@ static void __init usb_musb_pm_init(void)
cpu_relax();
}
- if (otg_clk) {
+ if (otg_clk)
clk_disable(otg_clk);
- clk_put(otg_clk);
- }
+}
- iounmap(otg_base);
+void usb_musb_disable_autoidle(void)
+{
+ __raw_writel(0, otg_base + OTG_SYSCONFIG);
}
#ifdef CONFIG_USB_MUSB_SOC
@@ -46,6 +46,9 @@ extern void usb_musb_init(void);
extern void usb_ehci_init(struct ehci_hcd_omap_platform_data *pdata);
+/* This is needed for OMAP3 errata 1.164: enabled autoidle can prevent sleep */
+extern void usb_musb_disable_autoidle(void);
+
#endif
void omap_usb_init(struct omap_usb_config *pdata);