Tero Kristo <tero.kristo@xxxxxxxxx> writes: > From: Tero Kristo <tero.kristo@xxxxxxxxx> > > OMAP3 sleep can be prevented in some cases where OTG autoidle is enabled. > This patch force disables autoidle during wakeup from off-mode. See omap > errata 1.164. > > This fix can't be done in driver level, as off-mode entry resets and enables > the autoidle bit, and driver does not access the register after each off-mode > entry even if it is loaded. > > Signed-off-by: Tero Kristo <tero.kristo@xxxxxxxxx> Thanks Tero for the updated changelog. Applying to PM branch reluctantly and with grumbles. I sure hope someone in TI is reporting all these ROM code issues to the ROM code team so they get appropriate fixes. Kevin > --- > arch/arm/mach-omap2/pm34xx.c | 6 ++++++ > arch/arm/mach-omap2/usb-musb.c | 14 ++++++++------ > arch/arm/plat-omap/include/plat/usb.h | 3 +++ > 3 files changed, 17 insertions(+), 6 deletions(-) > > diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c > index 2f9f4a0..ab7b30f 100644 > --- a/arch/arm/mach-omap2/pm34xx.c > +++ b/arch/arm/mach-omap2/pm34xx.c > @@ -37,6 +37,7 @@ > #include <plat/gpmc.h> > #include <plat/dma.h> > #include <plat/dmtimer.h> > +#include <plat/usb.h> > > #include <plat/resource.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); > diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c > index f5364b8..bb3cee4 100644 > --- a/arch/arm/mach-omap2/usb-musb.c > +++ b/arch/arm/mach-omap2/usb-musb.c > @@ -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 > diff --git a/arch/arm/plat-omap/include/plat/usb.h b/arch/arm/plat-omap/include/plat/usb.h > index 33a500e..31b13bc 100644 > --- a/arch/arm/plat-omap/include/plat/usb.h > +++ b/arch/arm/plat-omap/include/plat/usb.h > @@ -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); > -- > 1.5.4.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html