@@ -2152,6 +2152,7 @@ static int musb_suspend(struct device *dev)
{
struct musb *musb = dev_to_musb(dev);
unsigned long flags;
+ struct musb_hdrc_platform_data *plat = dev_get_platdata(dev);
spin_lock_irqsave(&musb->lock, flags);
@@ -2165,16 +2166,30 @@ static int musb_suspend(struct device *dev)
*/
}
+ if (plat->restore_after_suspend)
+ musb_save_context(musb);
+
spin_unlock_irqrestore(&musb->lock, flags);
return 0;
}
static int musb_resume_noirq(struct device *dev)
{
- /* for static cmos like DaVinci, register values were preserved
+ struct musb *musb = dev_to_musb(dev);
+ struct musb_hdrc_platform_data *plat = dev_get_platdata(dev);
+
+ /*
+ * For static cmos like DaVinci, register values were preserved
* unless for some reason the whole soc powered down or the USB
* module got reset through the PSC (vs just being disabled).
+ *
+ * The plaform data tells us about the necessity of saving and
+ * restoring the context across a suspend cycle.
*/
+
+ if (plat->restore_after_suspend)
+ musb_restore_context(musb);
+
return 0;
}
@@ -100,6 +100,7 @@ struct musb_hdrc_platform_data {
u8 mode;
u8 has_mailbox:1;
+ u8 restore_after_suspend:1;
/* for clk_get() */
const char *clock;
It appears not all platforms featuring a musb core need to save the musb core registers at suspend time and restore them on resume. The dsps platform does, however. So add a bit in struct musb_hdrc_platform_data to let platforms specify their need of such action being taken. Signed-off-by: Daniel Mack <zonque@gmail.com> --- drivers/usb/musb/musb_core.c | 17 ++++++++++++++++- include/linux/usb/musb.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-)