|
@@ -2057,6 +2057,7 @@ static void dp_mst_display_hpd_irq(void *dp_display)
|
|
struct dp_display *dp = dp_display;
|
|
struct dp_display *dp = dp_display;
|
|
struct dp_mst_private *mst = dp->dp_mst_prv_info;
|
|
struct dp_mst_private *mst = dp->dp_mst_prv_info;
|
|
u8 esi[14];
|
|
u8 esi[14];
|
|
|
|
+ u8 ack[8] = {};
|
|
unsigned int esi_res = DP_SINK_COUNT_ESI + 1;
|
|
unsigned int esi_res = DP_SINK_COUNT_ESI + 1;
|
|
bool handled;
|
|
bool handled;
|
|
|
|
|
|
@@ -2075,17 +2076,19 @@ static void dp_mst_display_hpd_irq(void *dp_display)
|
|
DP_MST_DEBUG("mst irq: esi1[0x%x] esi2[0x%x] esi3[%x]\n",
|
|
DP_MST_DEBUG("mst irq: esi1[0x%x] esi2[0x%x] esi3[%x]\n",
|
|
esi[1], esi[2], esi[3]);
|
|
esi[1], esi[2], esi[3]);
|
|
|
|
|
|
- rc = drm_dp_mst_hpd_irq(&mst->mst_mgr, esi, &handled);
|
|
|
|
|
|
+ rc = drm_dp_mst_hpd_irq_handle_event(&mst->mst_mgr, esi, ack, &handled);
|
|
|
|
|
|
/* ack the request */
|
|
/* ack the request */
|
|
if (handled) {
|
|
if (handled) {
|
|
- rc = drm_dp_dpcd_write(mst->caps.drm_aux, esi_res, &esi[1], 3);
|
|
|
|
|
|
+ rc = drm_dp_dpcd_writeb(mst->caps.drm_aux, esi_res, ack[1]);
|
|
|
|
|
|
if (esi[1] & DP_UP_REQ_MSG_RDY)
|
|
if (esi[1] & DP_UP_REQ_MSG_RDY)
|
|
dp_mst_clear_edid_cache(dp);
|
|
dp_mst_clear_edid_cache(dp);
|
|
|
|
|
|
- if (rc != 3)
|
|
|
|
|
|
+ if (rc != 1)
|
|
DP_ERR("dpcd esi_res failed. rlen=%d\n", rc);
|
|
DP_ERR("dpcd esi_res failed. rlen=%d\n", rc);
|
|
|
|
+ else
|
|
|
|
+ drm_dp_mst_hpd_irq_send_new_request(&mst->mst_mgr);
|
|
}
|
|
}
|
|
|
|
|
|
DP_MST_DEBUG("mst display hpd_irq handled:%d rc:%d\n", handled, rc);
|
|
DP_MST_DEBUG("mst display hpd_irq handled:%d rc:%d\n", handled, rc);
|