summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLi Jun <jun.li@freescale.com>2015-02-11 18:32:33 +0800
committerPeter Chen <peter.chen@freescale.com>2015-02-13 10:03:43 +0800
commita95e6f53b8c4e24b34352555bda69d311358ecaa (patch)
tree6dc24a978e174d982178a97e1d5c809afb5d0cde /drivers
parent925e7db9d925fb64cb971b1de12353103b7374e1 (diff)
MLK-10243 usb: chipidea: udc: enable and disable BSV irq only for ID change
Since BSV irq is only used for B-device, this patch correct the setting of BSVIE of otgsc only for case of ID change, that is: - In otg fsm mode, ID change from 0 to 1 means otg state from A_IDLE to B_IDLE; ID change from 1 to 0 means otg state from B_IDLE to A_IDLE, so only disable BSVIE if the current state is B_IDLE(to be update to A_IDLE), only enable BSVIE if the current state is A_IDLE(to be update to B_IDLE). - In non-otg-fsm mode, it's already correct. This fix the bug of MLK-10243. Signed-off-by: Li Jun <jun.li@freescale.com> Signed-off-by: Peter Chen <peter.chen@freescale.com> (cherry picked from commit c6151e8cc4a01128cbab4b26c09f859cfcd7ff39)
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/chipidea/udc.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 68fe3bf356a5..21c7903a3256 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1941,9 +1941,12 @@ static int udc_id_switch_for_device(struct ci_hdrc *ci)
if (!ci->is_otg)
return 0;
- /* Clear and enable BSV irq for peripheral or OTG B-device */
+ /*
+ * Clear and enable BSV irq for A-device switch to B-device
+ * (in otg fsm mode, means A_IDLE->B_DILE) due to ID change.
+ */
if (!ci_otg_is_fsm_mode(ci) ||
- ci->fsm.otg->state <= OTG_STATE_B_HOST)
+ ci->fsm.otg->state == OTG_STATE_A_IDLE)
hw_write_otgsc(ci, OTGSC_BSVIS | OTGSC_BSVIE,
OTGSC_BSVIS | OTGSC_BSVIE);
@@ -1954,12 +1957,13 @@ static void udc_id_switch_for_host(struct ci_hdrc *ci)
{
if (!ci->is_otg)
return;
+
/*
- * Host or OTG A-device doesn't care B_SESSION_VALID event
- * so clear and disbale BSV irq
+ * Clear and disbale BSV irq for B-device switch to A-device
+ * (in otg fsm mode, means B_IDLE->A_IDLE) due to ID change.
*/
if (!ci_otg_is_fsm_mode(ci) ||
- ci->fsm.otg->state > OTG_STATE_B_HOST)
+ ci->fsm.otg->state == OTG_STATE_B_IDLE)
hw_write_otgsc(ci, OTGSC_BSVIE | OTGSC_BSVIS, OTGSC_BSVIS);
}