diff options
author | Li Jun <jun.li@freescale.com> | 2015-02-11 18:32:33 +0800 |
---|---|---|
committer | Peter Chen <peter.chen@freescale.com> | 2015-02-13 10:03:43 +0800 |
commit | a95e6f53b8c4e24b34352555bda69d311358ecaa (patch) | |
tree | 6dc24a978e174d982178a97e1d5c809afb5d0cde | |
parent | 925e7db9d925fb64cb971b1de12353103b7374e1 (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)
-rw-r--r-- | drivers/usb/chipidea/udc.c | 14 |
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); } |