diff options
author | Ingo Molnar <mingo@kernel.org> | 2016-09-15 02:24:53 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-09-15 02:24:53 -0400 |
commit | d4b80afbba49e968623330f1336da8c724da8aad (patch) | |
tree | a9478bd77d8b001a6a7119328d34e9666d7bfe93 /drivers/usb/chipidea/udc.c | |
parent | fcd709ef20a9d83bdb7524d27cd6719dac8690a0 (diff) | |
parent | 4cea8776571b18db7485930cb422faa739580c8c (diff) |
Merge branch 'linus' into x86/asm, to pick up recent fixes
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/usb/chipidea/udc.c')
-rw-r--r-- | drivers/usb/chipidea/udc.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 065f5d97aa67..b93356834bb5 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
@@ -949,6 +949,15 @@ static int isr_setup_status_phase(struct ci_hdrc *ci) | |||
949 | int retval; | 949 | int retval; |
950 | struct ci_hw_ep *hwep; | 950 | struct ci_hw_ep *hwep; |
951 | 951 | ||
952 | /* | ||
953 | * Unexpected USB controller behavior, caused by bad signal integrity | ||
954 | * or ground reference problems, can lead to isr_setup_status_phase | ||
955 | * being called with ci->status equal to NULL. | ||
956 | * If this situation occurs, you should review your USB hardware design. | ||
957 | */ | ||
958 | if (WARN_ON_ONCE(!ci->status)) | ||
959 | return -EPIPE; | ||
960 | |||
952 | hwep = (ci->ep0_dir == TX) ? ci->ep0out : ci->ep0in; | 961 | hwep = (ci->ep0_dir == TX) ? ci->ep0out : ci->ep0in; |
953 | ci->status->context = ci; | 962 | ci->status->context = ci; |
954 | ci->status->complete = isr_setup_status_complete; | 963 | ci->status->complete = isr_setup_status_complete; |
@@ -1596,8 +1605,11 @@ static int ci_udc_pullup(struct usb_gadget *_gadget, int is_on) | |||
1596 | { | 1605 | { |
1597 | struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget); | 1606 | struct ci_hdrc *ci = container_of(_gadget, struct ci_hdrc, gadget); |
1598 | 1607 | ||
1599 | /* Data+ pullup controlled by OTG state machine in OTG fsm mode */ | 1608 | /* |
1600 | if (ci_otg_is_fsm_mode(ci)) | 1609 | * Data+ pullup controlled by OTG state machine in OTG fsm mode; |
1610 | * and don't touch Data+ in host mode for dual role config. | ||
1611 | */ | ||
1612 | if (ci_otg_is_fsm_mode(ci) || ci->role == CI_ROLE_HOST) | ||
1601 | return 0; | 1613 | return 0; |
1602 | 1614 | ||
1603 | pm_runtime_get_sync(&ci->gadget.dev); | 1615 | pm_runtime_get_sync(&ci->gadget.dev); |