Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8973d21 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb: gadget: ci13xxx: Reset USB hardware on FLUSH failure"

parents 1a5ee7e4 fe8884c5
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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");
+4 −0
Original line number Diff line number Diff line
@@ -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;
			}
		}
+1 −0
Original line number Diff line number Diff line
@@ -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);
+7 −5
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
@@ -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;