Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0ec8fd70 authored by Kim Kyuwon's avatar Kim Kyuwon Committed by Greg Kroah-Hartman
Browse files

USB: musb: fix possible panic while resuming



During driver resume processing, musb could cause a kernel panic.
Fix by enabling the clock earlier, with the resume_early method.

Signed-off-by: default avatarKim Kyuwon <q1.kim@samsung.com>
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 6b6e9710
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -2170,26 +2170,22 @@ static int musb_suspend(struct platform_device *pdev, pm_message_t message)
	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);

	if (!musb->clock)
		return 0;

	spin_lock_irqsave(&musb->lock, flags);

	if (musb->set_clock)
		musb->set_clock(musb->clock, 1);
	else
		clk_enable(musb->clock);

	/* for static cmos like DaVinci, register values were preserved
	 * unless for some reason the whole soc powered down and we're
	 * not treating that as a whole-system restart (e.g. swsusp)
	 * unless for some reason the whole soc powered down or the USB
	 * module got reset through the PSC (vs just being disabled).
	 */
	spin_unlock_irqrestore(&musb->lock, flags);
	return 0;
}

@@ -2207,7 +2203,7 @@ static struct platform_driver musb_driver = {
	.remove		= __devexit_p(musb_remove),
	.shutdown	= musb_shutdown,
	.suspend	= musb_suspend,
	.resume		= musb_resume,
	.resume_early	= musb_resume_early,
};

/*-------------------------------------------------------------------------*/