diff options
author | Jeng-Hung Chen <jeng-hung.chen@mediatek.com> | 2017-09-28 12:11:09 +0800 |
---|---|---|
committer | Ben Fennema <fennema@google.com> | 2017-10-02 22:15:35 +0000 |
commit | 1eeb4b1093e4f5f24a26524a8c08940a7fce0aef (patch) | |
tree | 5ee1dbfe3c6e1b34b73ea33d03254f587f4a9b07 | |
parent | 40f262dee0eee8825866771fab26bdabd84cb65d (diff) | |
download | mediatek-1eeb4b1093e4f5f24a26524a8c08940a7fce0aef.tar.gz |
usb: fix race hazard in usb clock switching
Description:
fix unpaired clock control of usb_enable_clock
Bug: 67076117
Change-Id: I8cf450b79de33fb44cd15440bf2904cfc6215593
-rw-r--r-- | drivers/misc/mediatek/usb20/mt2601/usb20.c | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/drivers/misc/mediatek/usb20/mt2601/usb20.c b/drivers/misc/mediatek/usb20/mt2601/usb20.c index 709e3b5d4361..b33e3b552f63 100644 --- a/drivers/misc/mediatek/usb20/mt2601/usb20.c +++ b/drivers/misc/mediatek/usb20/mt2601/usb20.c @@ -167,39 +167,38 @@ static void mt_usb_enable(struct musb *musb) unsigned long flags; DBG(0, "%d, %d\n", mtk_usb_power, musb->power); - if (musb->power == true) { return; } - + musb->power = true; flags = musb_readl(mtk_musb->mregs, USB_L1INTM); - - mdelay(10); - + /* mask ID pin, so "open clock" and "set flag" won't be interrupted. ISR may call clock_disable. */ + musb_writel(mtk_musb->mregs, USB_L1INTM, (~IDDIG_INT_STATUS)&flags); + if (down_interruptible(&power_clock_lock)) + { + xlog_printk(ANDROID_LOG_ERROR, "USB20", "%s: busy, Couldn't get power_clock_lock\n", __func__); + return; + } usb_phy_recover(); - mtk_usb_power = true; - musb->power = true; - - if (in_interrupt()) { - DBG(0, "in interrupt !!!!!!!!!!!!!!!\n"); - } - + up(&power_clock_lock); musb_writel(mtk_musb->mregs, USB_L1INTM, flags); } static void mt_usb_disable(struct musb *musb) { - pr_debug("%s, %d, %d\n", __func__, mtk_usb_power, musb->power); - if (musb->power == false) { return; } - + musb->power = false; + if (down_interruptible(&power_clock_lock)) + { + xlog_printk(ANDROID_LOG_ERROR, "USB20", "%s: busy, Couldn't get power_clock_lock\n", __func__); + return; + } usb_phy_savecurrent(); - mtk_usb_power = false; - musb->power = false; + up(&power_clock_lock); } /* ================================ */ |