Loading drivers/usb/gadget/ci13xxx_msm.c +21 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,23 @@ static void ci13xxx_msm_reset(void) } } static void ci13xxx_msm_mark_err_event(void) { struct ci13xxx *udc = _udc; struct msm_otg *otg; if (udc == NULL) return; if (udc->transceiver == NULL) return; otg = container_of(udc->transceiver, struct msm_otg, phy); /* This will trigger hardware reset before next connection */ otg->err_event_seen = true; } static void ci13xxx_msm_notify_event(struct ci13xxx *udc, unsigned event) { struct device *dev = udc->gadget.dev.parent; Loading @@ -199,6 +216,10 @@ static void ci13xxx_msm_notify_event(struct ci13xxx *udc, unsigned event) dev_info(dev, "CI13XXX_CONTROLLER_RESUME_EVENT received\n"); ci13xxx_msm_resume(); break; case CI13XXX_CONTROLLER_ERROR_EVENT: dev_info(dev, "CI13XXX_CONTROLLER_ERROR_EVENT received\n"); ci13xxx_msm_mark_err_event(); break; default: dev_dbg(dev, "unknown ci13xxx_udc event\n"); Loading drivers/usb/gadget/ci13xxx_udc.c +4 −0 Original line number Diff line number Diff line Loading @@ -481,6 +481,10 @@ static int hw_ep_flush(int num, int dir) dir ? "IN" : "OUT"); debug_ept_flush_info(num, dir); _udc->skip_flush = true; /* Notify to trigger h/w reset recovery later */ if (_udc->udc_driver->notify_event) _udc->udc_driver->notify_event(_udc, CI13XXX_CONTROLLER_ERROR_EVENT); return 0; } } Loading drivers/usb/gadget/ci13xxx_udc.h +1 −0 Original line number Diff line number Diff line Loading @@ -146,6 +146,7 @@ struct ci13xxx_udc_driver { #define CI13XXX_CONTROLLER_RESUME_EVENT 4 #define CI13XXX_CONTROLLER_DISCONNECT_EVENT 5 #define CI13XXX_CONTROLLER_UDC_STARTED_EVENT 6 #define CI13XXX_CONTROLLER_ERROR_EVENT 7 void (*notify_event) (struct ci13xxx *udc, unsigned event); bool (*in_lpm) (struct ci13xxx *udc); Loading drivers/usb/phy/phy-msm-usb.c +7 −5 Original line number Diff line number Diff line Loading @@ -649,13 +649,15 @@ static int msm_otg_reset(struct usb_phy *phy) * USB PHY and Link reset also reset the USB BAM. * Thus perform reset operation only once to avoid * USB BAM reset on other cases e.g. USB cable disconnections. * If hardware reported error then it must be reset for recovery. */ if (pdata->disable_reset_on_disconnect) { if (motg->reset_counter) if (motg->err_event_seen) { dev_info(phy->dev, "performing USB h/w reset for recovery\n"); motg->err_event_seen = false; } else if (pdata->disable_reset_on_disconnect && motg->reset_counter) { return 0; else motg->reset_counter++; } motg->reset_counter++; ret = msm_otg_phy_reset(motg); if (ret) { Loading include/linux/usb/msm_hsusb.h +1 −0 Original line number Diff line number Diff line Loading @@ -454,6 +454,7 @@ struct msm_otg { struct notifier_block pm_notify; atomic_t in_lpm; atomic_t set_fpr_with_lpm_exit; bool err_event_seen; int async_int; unsigned cur_power; struct delayed_work chg_work; Loading Loading
drivers/usb/gadget/ci13xxx_msm.c +21 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,23 @@ static void ci13xxx_msm_reset(void) } } static void ci13xxx_msm_mark_err_event(void) { struct ci13xxx *udc = _udc; struct msm_otg *otg; if (udc == NULL) return; if (udc->transceiver == NULL) return; otg = container_of(udc->transceiver, struct msm_otg, phy); /* This will trigger hardware reset before next connection */ otg->err_event_seen = true; } static void ci13xxx_msm_notify_event(struct ci13xxx *udc, unsigned event) { struct device *dev = udc->gadget.dev.parent; Loading @@ -199,6 +216,10 @@ static void ci13xxx_msm_notify_event(struct ci13xxx *udc, unsigned event) dev_info(dev, "CI13XXX_CONTROLLER_RESUME_EVENT received\n"); ci13xxx_msm_resume(); break; case CI13XXX_CONTROLLER_ERROR_EVENT: dev_info(dev, "CI13XXX_CONTROLLER_ERROR_EVENT received\n"); ci13xxx_msm_mark_err_event(); break; default: dev_dbg(dev, "unknown ci13xxx_udc event\n"); Loading
drivers/usb/gadget/ci13xxx_udc.c +4 −0 Original line number Diff line number Diff line Loading @@ -481,6 +481,10 @@ static int hw_ep_flush(int num, int dir) dir ? "IN" : "OUT"); debug_ept_flush_info(num, dir); _udc->skip_flush = true; /* Notify to trigger h/w reset recovery later */ if (_udc->udc_driver->notify_event) _udc->udc_driver->notify_event(_udc, CI13XXX_CONTROLLER_ERROR_EVENT); return 0; } } Loading
drivers/usb/gadget/ci13xxx_udc.h +1 −0 Original line number Diff line number Diff line Loading @@ -146,6 +146,7 @@ struct ci13xxx_udc_driver { #define CI13XXX_CONTROLLER_RESUME_EVENT 4 #define CI13XXX_CONTROLLER_DISCONNECT_EVENT 5 #define CI13XXX_CONTROLLER_UDC_STARTED_EVENT 6 #define CI13XXX_CONTROLLER_ERROR_EVENT 7 void (*notify_event) (struct ci13xxx *udc, unsigned event); bool (*in_lpm) (struct ci13xxx *udc); Loading
drivers/usb/phy/phy-msm-usb.c +7 −5 Original line number Diff line number Diff line Loading @@ -649,13 +649,15 @@ static int msm_otg_reset(struct usb_phy *phy) * USB PHY and Link reset also reset the USB BAM. * Thus perform reset operation only once to avoid * USB BAM reset on other cases e.g. USB cable disconnections. * If hardware reported error then it must be reset for recovery. */ if (pdata->disable_reset_on_disconnect) { if (motg->reset_counter) if (motg->err_event_seen) { dev_info(phy->dev, "performing USB h/w reset for recovery\n"); motg->err_event_seen = false; } else if (pdata->disable_reset_on_disconnect && motg->reset_counter) { return 0; else motg->reset_counter++; } motg->reset_counter++; ret = msm_otg_phy_reset(motg); if (ret) { Loading
include/linux/usb/msm_hsusb.h +1 −0 Original line number Diff line number Diff line Loading @@ -454,6 +454,7 @@ struct msm_otg { struct notifier_block pm_notify; atomic_t in_lpm; atomic_t set_fpr_with_lpm_exit; bool err_event_seen; int async_int; unsigned cur_power; struct delayed_work chg_work; Loading