Revert "usb: dwc3: Ensure blocking_sync waits until host mode starts or stops"

This reverts commit 7bb30153e7.

Signed-off-by: UtsavBalar1231 <utsavbalar1231@gmail.com>
This commit is contained in:
UtsavBalar1231 2021-07-24 09:37:26 +02:00 committed by spakkkk
parent af37cd44b2
commit 62bcc2b4da
2 changed files with 32 additions and 29 deletions

View File

@ -49,7 +49,6 @@
#include "xhci.h"
#define SDP_CONNETION_CHECK_TIME 10000 /* in ms */
#define EXTCON_SYNC_EVENT_TIMEOUT_MS 1500 /* in ms */
/* time out to wait for USB cable status notification (in ms)*/
#define SM_INIT_TIMEOUT 30000
@ -4550,40 +4549,47 @@ static int dwc3_otg_start_peripheral(struct dwc3_msm *mdwc, int on)
return 0;
}
/**
* dwc3_usb_blocking_sync - Waits until event is completed or maximum upto 1.5
* secs.
*
* @host_enable_event: Event can be start usb host or stop usb host.
*/
static int dwc3_usb_blocking_sync(struct notifier_block *nb,
unsigned long host_enable_event, void *ptr)
unsigned long event, void *ptr)
{
struct dwc3 *dwc;
struct extcon_dev *edev = ptr;
struct extcon_nb *enb = container_of(nb, struct extcon_nb,
blocking_sync_nb);
struct dwc3_msm *mdwc = enb->mdwc;
unsigned long timeout_ms = jiffies +
msecs_to_jiffies(EXTCON_SYNC_EVENT_TIMEOUT_MS);
int ret = 0;
if (!edev || !mdwc)
return NOTIFY_DONE;
dwc = platform_get_drvdata(mdwc->dwc3);
dbg_event(0xFF, "fw_blocksync", 0);
flush_work(&mdwc->resume_work);
drain_workqueue(mdwc->sm_usb_wq);
do {
if (mdwc->drd_state == (host_enable_event ? DRD_STATE_HOST
: DRD_STATE_IDLE))
break;
msleep(50);
} while (time_before(jiffies, timeout_ms));
if (!mdwc->in_host_mode && !mdwc->in_device_mode) {
dbg_event(0xFF, "lpm_state", atomic_read(&dwc->in_lpm));
if (!time_before(jiffies, timeout_ms))
dev_err(mdwc->dev, "TIMEOUT when changing the state\n");
/*
* stop host mode functionality performs autosuspend with mdwc
* device, and it may take sometime to call PM runtime suspend.
* Hence call pm_runtime_suspend() API to invoke PM runtime
* suspend immediately to put USB controller and PHYs into
* suspend.
*/
ret = pm_runtime_suspend(mdwc->dev);
dbg_event(0xFF, "pm_runtime_sus", ret);
return 0;
/*
* If mdwc device is already suspended, pm_runtime_suspend() API
* returns 1, which is not error. Overwrite with zero if it is.
*/
if (ret > 0)
ret = 0;
}
return ret;
}
static int get_psy_type(struct dwc3_msm *mdwc)
@ -4805,6 +4811,8 @@ static void dwc3_otg_sm_work(struct work_struct *w)
mdwc->vbus_retry_count = 0;
work = 1;
} else {
mdwc->drd_state = DRD_STATE_HOST;
ret = dwc3_otg_start_host(mdwc, 1);
if ((ret == -EPROBE_DEFER) &&
mdwc->vbus_retry_count < 3) {
@ -4812,15 +4820,15 @@ static void dwc3_otg_sm_work(struct work_struct *w)
* Get regulator failed as regulator driver is
* not up yet. Will try to start host after 1sec
*/
mdwc->drd_state = DRD_STATE_HOST_IDLE;
dev_dbg(mdwc->dev, "Unable to get vbus regulator. Retrying...\n");
delay = VBUS_REG_CHECK_DELAY;
work = 1;
mdwc->vbus_retry_count++;
} else if (ret) {
dev_err(mdwc->dev, "unable to start host\n");
mdwc->drd_state = DRD_STATE_HOST_IDLE;
goto ret;
} else {
mdwc->drd_state = DRD_STATE_HOST;
}
}
break;

View File

@ -348,10 +348,6 @@ static void *usbpd_ipc_log;
#define ID_HDR_PRODUCT_AMA 5
#define ID_HDR_PRODUCT_VPD 6
/* params for usb_blocking_sync */
#define STOP_USB_HOST 0
#define START_USB_HOST 1
#define PD_MIN_SINK_CURRENT 900
#define PD_VBUS_MAX_VOLTAGE_LIMIT 9000000
@ -591,7 +587,7 @@ static inline void start_usb_host(struct usbpd *pd, bool ss)
extcon_set_state_sync(pd->extcon, EXTCON_USB_HOST, 1);
/* blocks until USB host is completely started */
ret = extcon_blocking_sync(pd->extcon, EXTCON_USB_HOST, START_USB_HOST);
ret = extcon_blocking_sync(pd->extcon, EXTCON_USB_HOST, 1);
if (ret) {
usbpd_err(&pd->dev, "err(%d) starting host", ret);
return;
@ -675,7 +671,7 @@ static int usbpd_release_ss_lane(struct usbpd *pd,
stop_usb_host(pd);
/* blocks until USB host is completely stopped */
ret = extcon_blocking_sync(pd->extcon, EXTCON_USB_HOST, STOP_USB_HOST);
ret = extcon_blocking_sync(pd->extcon, EXTCON_USB_HOST, 0);
if (ret) {
usbpd_err(&pd->dev, "err(%d) stopping host", ret);
goto err_exit;
@ -2134,8 +2130,7 @@ static void dr_swap(struct usbpd *pd)
typec_set_data_role(pd->typec_port, TYPEC_HOST);
/* ensure host is started before allowing DP */
extcon_blocking_sync(pd->extcon, EXTCON_USB_HOST,
START_USB_HOST);
extcon_blocking_sync(pd->extcon, EXTCON_USB_HOST, 0);
usbpd_send_svdm(pd, USBPD_SID, USBPD_SVDM_DISCOVER_IDENTITY,
SVDM_CMD_TYPE_INITIATOR, 0, NULL, 0);