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

Commit fb9ea90d authored by Sankeerth Billakanti's avatar Sankeerth Billakanti Committed by Gerrit - the friendly Code Review server
Browse files

disp: msm: dp: reset combo phy if peer_usb_comm is disabled



Some Type-C multi-port adapters which do not support usb connection
are advertising the multi-functionality in DP alt mode. If
multi-functionality is preferred, the DP driver assumes the adapter
supports usb connection and USB phy driver will program the PHY mode
to DP+USB.

In source mode, usb PD driver checks for the peer_usb_connection
of the adapter. If it does not support usb then it will stop usb stack
and update the PHY MODE to USB only mode from phy_suspend path.
The result is, usb may program the combo PHY to usb only mode when DP
is already connected. This is causing AUX read/write timeouts when DP
is trying to access the phy registers.

To fix this issue, a flag in SVID connect handler in usbpd driver to
notify peer_usb_comm support to the DP driver. DP driver will read this
flag and program the phy mode.

Change-Id: I0164b239bf2832d480795d90f5e9fc221bcc12ba
Signed-off-by: default avatarSankeerth Billakanti <sbillaka@codeaurora.org>
parent 1643b63b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1349,6 +1349,7 @@ static void dp_catalog_ctrl_usb_reset(struct dp_catalog_ctrl *ctrl, bool flip)

	io_data = catalog->io.usb3_dp_com;

	DP_DEBUG("Program PHYMODE to DP only\n");
	dp_write(USB3_DP_COM_RESET_OVRD_CTRL, 0x0a);
	dp_write(USB3_DP_COM_PHY_MODE_CTRL, 0x02);
	dp_write(USB3_DP_COM_SW_RESET, 0x01);
+2 −1
Original line number Diff line number Diff line
@@ -781,7 +781,8 @@ static void dp_display_host_init(struct dp_display_private *dp)
	if (dp->hpd->orientation == ORIENTATION_CC2)
		flip = true;

	reset = dp->debug->sim_mode ? false : !dp->hpd->multi_func;
	reset = dp->debug->sim_mode ? false :
		(!dp->hpd->multi_func || !dp->hpd->peer_usb_comm);

	dp->power->init(dp->power, flip);
	dp->hpd->host_init(dp->hpd, &dp->catalog->hpd);
+1 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ struct dp_hpd {
	bool hpd_irq;
	bool alt_mode_cfg_done;
	bool multi_func;
	bool peer_usb_comm;

	void (*isr)(struct dp_hpd *dp_hpd);
	int (*register_hpd)(struct dp_hpd *dp_hpd);
+4 −2
Original line number Diff line number Diff line
@@ -235,7 +235,8 @@ static void dp_usbpd_send_event(struct dp_usbpd_private *pd,
	}
}

static void dp_usbpd_connect_cb(struct usbpd_svid_handler *hdlr)
static void dp_usbpd_connect_cb(struct usbpd_svid_handler *hdlr,
		bool peer_usb_comm)
{
	struct dp_usbpd_private *pd;

@@ -245,7 +246,8 @@ static void dp_usbpd_connect_cb(struct usbpd_svid_handler *hdlr)
		return;
	}

	DP_DEBUG("\n");
	DP_DEBUG("peer_usb_comm: %d\n");
	pd->dp_usbpd.base.peer_usb_comm = peer_usb_comm;
	dp_usbpd_send_event(pd, DP_USBPD_EVT_DISCOVER);
}