From: Kim Kyuwon <[email protected]>

While waking up, musb can cause a kernel panic. This patch is fixing
it by enabling the clock in the resume_early method.

Signed-off-by: Kim Kyuwon <[email protected]>
---
 drivers/usb/musb/musb_core.c |   21 +++++++--------------
 1 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 2cc34fa..ae76ad7 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -2141,16 +2141,13 @@ static int __devexit musb_remove(struct
platform_device *pdev)

 #ifdef CONFIG_PM

-static int musb_suspend(struct platform_device *pdev, pm_message_t message)
+static int musb_suspend_late(struct platform_device *pdev, pm_message_t state)
 {
-       unsigned long   flags;
-       struct musb     *musb = dev_to_musb(&pdev->dev);
+       struct musb *musb = dev_to_musb(&pdev->dev);

        if (!musb->clock)
                return 0;

-       spin_lock_irqsave(&musb->lock, flags);
-
        if (is_peripheral_active(musb)) {
                /* FIXME force disconnect unless we know USB will wake
                 * the system up quickly enough to respond ...
@@ -2165,20 +2162,17 @@ static int musb_suspend(struct platform_device
*pdev, pm_message_t message)
                musb->set_clock(musb->clock, 0);
        else
                clk_disable(musb->clock);
-       spin_unlock_irqrestore(&musb->lock, flags);
+
        return 0;
 }

-static int musb_resume(struct platform_device *pdev)
+static int musb_resume_early(struct platform_device *pdev)
 {
-       unsigned long   flags;
-       struct musb     *musb = dev_to_musb(&pdev->dev);
+       struct musb *musb = dev_to_musb(&pdev->dev);

        if (!musb->clock)
                return 0;

-       spin_lock_irqsave(&musb->lock, flags);
-
        if (musb->set_clock)
                musb->set_clock(musb->clock, 1);
        else
@@ -2188,7 +2182,6 @@ static int musb_resume(struct platform_device *pdev)
         * unless for some reason the whole soc powered down and we're
         * not treating that as a whole-system restart (e.g. swsusp)
         */
-       spin_unlock_irqrestore(&musb->lock, flags);
        return 0;
 }

@@ -2205,8 +2198,8 @@ static struct platform_driver musb_driver = {
        },
        .remove         = __devexit_p(musb_remove),
        .shutdown       = musb_shutdown,
-       .suspend        = musb_suspend,
-       .resume         = musb_resume,
+       .suspend_late   = musb_suspend_late,
+       .resume_early   = musb_resume_early,
 };

 /*-------------------------------------------------------------------------*/
-- 
1.5.2.5


-- 
Kyuwon
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to