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: Sankeerth Billakanti <sbillaka@codeaurora.org>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
1643b63bd7
commit
fb9ea90d58
@@ -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;
|
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_RESET_OVRD_CTRL, 0x0a);
|
||||||
dp_write(USB3_DP_COM_PHY_MODE_CTRL, 0x02);
|
dp_write(USB3_DP_COM_PHY_MODE_CTRL, 0x02);
|
||||||
dp_write(USB3_DP_COM_SW_RESET, 0x01);
|
dp_write(USB3_DP_COM_SW_RESET, 0x01);
|
||||||
|
@@ -781,7 +781,8 @@ static void dp_display_host_init(struct dp_display_private *dp)
|
|||||||
if (dp->hpd->orientation == ORIENTATION_CC2)
|
if (dp->hpd->orientation == ORIENTATION_CC2)
|
||||||
flip = true;
|
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->power->init(dp->power, flip);
|
||||||
dp->hpd->host_init(dp->hpd, &dp->catalog->hpd);
|
dp->hpd->host_init(dp->hpd, &dp->catalog->hpd);
|
||||||
|
@@ -63,6 +63,7 @@ struct dp_hpd {
|
|||||||
bool hpd_irq;
|
bool hpd_irq;
|
||||||
bool alt_mode_cfg_done;
|
bool alt_mode_cfg_done;
|
||||||
bool multi_func;
|
bool multi_func;
|
||||||
|
bool peer_usb_comm;
|
||||||
|
|
||||||
void (*isr)(struct dp_hpd *dp_hpd);
|
void (*isr)(struct dp_hpd *dp_hpd);
|
||||||
int (*register_hpd)(struct dp_hpd *dp_hpd);
|
int (*register_hpd)(struct dp_hpd *dp_hpd);
|
||||||
|
@@ -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;
|
struct dp_usbpd_private *pd;
|
||||||
|
|
||||||
@@ -245,7 +246,8 @@ static void dp_usbpd_connect_cb(struct usbpd_svid_handler *hdlr)
|
|||||||
return;
|
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);
|
dp_usbpd_send_event(pd, DP_USBPD_EVT_DISCOVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user