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

Commit 88731b25 authored by Pratham Pratap's avatar Pratham Pratap Committed by Gerrit - the friendly Code Review server
Browse files

usb: pd: Add flag to notify peer_usb_comm support to dp



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: Iae6a9596000313ede51d8af3c4989c74ac2f0b10
Signed-off-by: default avatarPratham Pratap <prathampratap@codeaurora.org>
parent eca47d45
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -1305,7 +1305,9 @@ int usbpd_register_svid(struct usbpd *pd, struct usbpd_svid_handler *hdlr)

		for (i = 0; i < pd->num_svids; i++) {
			if (pd->discovered_svids[i] == hdlr->svid) {
				hdlr->connect(hdlr);
				usbpd_dbg(&pd->dev, "Notify SVID: 0x%04x disconnect\n",
						hdlr->svid);
				hdlr->connect(hdlr, pd->peer_usb_comm);
				hdlr->discovered = true;
				break;
			}
@@ -1501,7 +1503,10 @@ static void handle_vdm_resp_ack(struct usbpd *pd, u32 *vdos, u8 num_vdos,
			if (svid) {
				handler = find_svid_handler(pd, svid);
				if (handler) {
					handler->connect(handler);
					usbpd_dbg(&pd->dev, "Notify SVID: 0x%04x disconnect\n",
							handler->svid);
					handler->connect(handler,
							pd->peer_usb_comm);
					handler->discovered = true;
				}
			}
@@ -1709,6 +1714,8 @@ static void reset_vdm_state(struct usbpd *pd)
	mutex_lock(&pd->svid_handler_lock);
	list_for_each_entry(handler, &pd->svid_handlers, entry) {
		if (handler->discovered) {
			usbpd_dbg(&pd->dev, "Notify SVID: 0x%04x disconnect\n",
					handler->svid);
			handler->disconnect(handler);
			handler->discovered = false;
		}
+2 −1
Original line number Diff line number Diff line
@@ -37,7 +37,8 @@ struct usbpd_svid_handler {
	u16 svid;

	/* Notified when VDM session established/reset; must be implemented */
	void (*connect)(struct usbpd_svid_handler *hdlr);
	void (*connect)(struct usbpd_svid_handler *hdlr,
			bool supports_usb_comm);
	void (*disconnect)(struct usbpd_svid_handler *hdlr);

	/* DP driver -> PE driver for requesting USB SS lanes */