Loading drivers/gpu/drm/msm/dp/dp_ctrl.c +20 −42 Original line number Diff line number Diff line Loading @@ -1168,9 +1168,17 @@ static bool dp_ctrl_use_fixed_nvid(struct dp_ctrl_private *ctrl) return false; } static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl) static int dp_ctrl_link_maintenance(struct dp_ctrl *dp_ctrl) { int ret = 0; struct dp_ctrl_private *ctrl; if (!dp_ctrl) { pr_err("Invalid input data\n"); return -EINVAL; } ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); ctrl->dp_ctrl.push_idle(&ctrl->dp_ctrl); ctrl->dp_ctrl.reset(&ctrl->dp_ctrl); Loading Loading @@ -1214,9 +1222,17 @@ static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl) return ret; } static void dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl) static void dp_ctrl_process_phy_test_request(struct dp_ctrl *dp_ctrl) { int ret = 0; struct dp_ctrl_private *ctrl; if (!dp_ctrl) { pr_err("Invalid input data\n"); return; } ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); if (!ctrl->link->phy_params.phy_test_pattern_sel) { pr_debug("no test pattern selected by sink\n"); Loading Loading @@ -1294,45 +1310,6 @@ static void dp_ctrl_send_phy_test_pattern(struct dp_ctrl_private *ctrl) dp_link_get_phy_test_pattern(pattern_requested)); } static bool dp_ctrl_handle_sink_request(struct dp_ctrl *dp_ctrl) { struct dp_ctrl_private *ctrl; u32 sink_request = 0x0; bool req_handled = false; if (!dp_ctrl) { pr_err("invalid input\n"); goto end; } ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); sink_request = ctrl->link->sink_request; if (sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) { pr_info("PHY_TEST_PATTERN\n"); dp_ctrl_process_phy_test_request(ctrl); req_handled = true; } if (sink_request & DP_LINK_STATUS_UPDATED) { pr_info("DP_LINK_STATUS_UPDATED\n"); dp_ctrl_link_maintenance(ctrl); req_handled = true; } if (sink_request & DP_TEST_LINK_TRAINING) { pr_info("DP_TEST_LINK_TRAINING\n"); ctrl->link->send_test_response(ctrl->link); dp_ctrl_link_maintenance(ctrl); req_handled = true; } end: return req_handled; } static void dp_ctrl_reset(struct dp_ctrl *dp_ctrl) { struct dp_ctrl_private *ctrl; Loading Loading @@ -1505,7 +1482,8 @@ struct dp_ctrl *dp_ctrl_get(struct dp_ctrl_in *in) dp_ctrl->abort = dp_ctrl_abort; dp_ctrl->isr = dp_ctrl_isr; dp_ctrl->reset = dp_ctrl_reset; dp_ctrl->handle_sink_request = dp_ctrl_handle_sink_request; dp_ctrl->link_maintenance = dp_ctrl_link_maintenance; dp_ctrl->process_phy_test_request = dp_ctrl_process_phy_test_request; return dp_ctrl; error: Loading drivers/gpu/drm/msm/dp/dp_ctrl.h +2 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ struct dp_ctrl { void (*abort)(struct dp_ctrl *dp_ctrl); void (*isr)(struct dp_ctrl *dp_ctrl); bool (*handle_sink_request)(struct dp_ctrl *dp_ctrl); void (*process_phy_test_request)(struct dp_ctrl *dp_ctrl); int (*link_maintenance)(struct dp_ctrl *dp_ctrl); }; struct dp_ctrl_in { Loading drivers/gpu/drm/msm/dp/dp_display.c +28 −11 Original line number Diff line number Diff line Loading @@ -655,9 +655,23 @@ static int dp_display_usbpd_disconnect_cb(struct device *dev) return rc; } static void dp_display_handle_maintenance_req(struct dp_display_private *dp) { mutex_lock(&dp->audio->ops_lock); if (dp->audio_supported) dp->audio->off(dp->audio); dp->ctrl->link_maintenance(dp->ctrl); if (dp->audio_supported) dp->audio->on(dp->audio); mutex_unlock(&dp->audio->ops_lock); } static void dp_display_attention_work(struct work_struct *work) { bool req_handled; struct dp_display_private *dp = container_of(work, struct dp_display_private, attention_work); Loading Loading @@ -688,17 +702,20 @@ static void dp_display_attention_work(struct work_struct *work) return; } mutex_lock(&dp->audio->ops_lock); req_handled = dp->ctrl->handle_sink_request(dp->ctrl); mutex_unlock(&dp->audio->ops_lock); if (dp->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) { dp->ctrl->process_phy_test_request(dp->ctrl); return; } /* * reconfigure audio if test was executed * which could have changed the contoller's state */ if (req_handled && dp->audio_supported) { dp->audio->off(dp->audio); dp->audio->on(dp->audio); if (dp->link->sink_request & DP_LINK_STATUS_UPDATED) { dp_display_handle_maintenance_req(dp); return; } if (dp->link->sink_request & DP_TEST_LINK_TRAINING) { dp->link->send_test_response(dp->link); dp_display_handle_maintenance_req(dp); return; } } Loading Loading
drivers/gpu/drm/msm/dp/dp_ctrl.c +20 −42 Original line number Diff line number Diff line Loading @@ -1168,9 +1168,17 @@ static bool dp_ctrl_use_fixed_nvid(struct dp_ctrl_private *ctrl) return false; } static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl) static int dp_ctrl_link_maintenance(struct dp_ctrl *dp_ctrl) { int ret = 0; struct dp_ctrl_private *ctrl; if (!dp_ctrl) { pr_err("Invalid input data\n"); return -EINVAL; } ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); ctrl->dp_ctrl.push_idle(&ctrl->dp_ctrl); ctrl->dp_ctrl.reset(&ctrl->dp_ctrl); Loading Loading @@ -1214,9 +1222,17 @@ static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl) return ret; } static void dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl) static void dp_ctrl_process_phy_test_request(struct dp_ctrl *dp_ctrl) { int ret = 0; struct dp_ctrl_private *ctrl; if (!dp_ctrl) { pr_err("Invalid input data\n"); return; } ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); if (!ctrl->link->phy_params.phy_test_pattern_sel) { pr_debug("no test pattern selected by sink\n"); Loading Loading @@ -1294,45 +1310,6 @@ static void dp_ctrl_send_phy_test_pattern(struct dp_ctrl_private *ctrl) dp_link_get_phy_test_pattern(pattern_requested)); } static bool dp_ctrl_handle_sink_request(struct dp_ctrl *dp_ctrl) { struct dp_ctrl_private *ctrl; u32 sink_request = 0x0; bool req_handled = false; if (!dp_ctrl) { pr_err("invalid input\n"); goto end; } ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); sink_request = ctrl->link->sink_request; if (sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) { pr_info("PHY_TEST_PATTERN\n"); dp_ctrl_process_phy_test_request(ctrl); req_handled = true; } if (sink_request & DP_LINK_STATUS_UPDATED) { pr_info("DP_LINK_STATUS_UPDATED\n"); dp_ctrl_link_maintenance(ctrl); req_handled = true; } if (sink_request & DP_TEST_LINK_TRAINING) { pr_info("DP_TEST_LINK_TRAINING\n"); ctrl->link->send_test_response(ctrl->link); dp_ctrl_link_maintenance(ctrl); req_handled = true; } end: return req_handled; } static void dp_ctrl_reset(struct dp_ctrl *dp_ctrl) { struct dp_ctrl_private *ctrl; Loading Loading @@ -1505,7 +1482,8 @@ struct dp_ctrl *dp_ctrl_get(struct dp_ctrl_in *in) dp_ctrl->abort = dp_ctrl_abort; dp_ctrl->isr = dp_ctrl_isr; dp_ctrl->reset = dp_ctrl_reset; dp_ctrl->handle_sink_request = dp_ctrl_handle_sink_request; dp_ctrl->link_maintenance = dp_ctrl_link_maintenance; dp_ctrl->process_phy_test_request = dp_ctrl_process_phy_test_request; return dp_ctrl; error: Loading
drivers/gpu/drm/msm/dp/dp_ctrl.h +2 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,8 @@ struct dp_ctrl { void (*abort)(struct dp_ctrl *dp_ctrl); void (*isr)(struct dp_ctrl *dp_ctrl); bool (*handle_sink_request)(struct dp_ctrl *dp_ctrl); void (*process_phy_test_request)(struct dp_ctrl *dp_ctrl); int (*link_maintenance)(struct dp_ctrl *dp_ctrl); }; struct dp_ctrl_in { Loading
drivers/gpu/drm/msm/dp/dp_display.c +28 −11 Original line number Diff line number Diff line Loading @@ -655,9 +655,23 @@ static int dp_display_usbpd_disconnect_cb(struct device *dev) return rc; } static void dp_display_handle_maintenance_req(struct dp_display_private *dp) { mutex_lock(&dp->audio->ops_lock); if (dp->audio_supported) dp->audio->off(dp->audio); dp->ctrl->link_maintenance(dp->ctrl); if (dp->audio_supported) dp->audio->on(dp->audio); mutex_unlock(&dp->audio->ops_lock); } static void dp_display_attention_work(struct work_struct *work) { bool req_handled; struct dp_display_private *dp = container_of(work, struct dp_display_private, attention_work); Loading Loading @@ -688,17 +702,20 @@ static void dp_display_attention_work(struct work_struct *work) return; } mutex_lock(&dp->audio->ops_lock); req_handled = dp->ctrl->handle_sink_request(dp->ctrl); mutex_unlock(&dp->audio->ops_lock); if (dp->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) { dp->ctrl->process_phy_test_request(dp->ctrl); return; } /* * reconfigure audio if test was executed * which could have changed the contoller's state */ if (req_handled && dp->audio_supported) { dp->audio->off(dp->audio); dp->audio->on(dp->audio); if (dp->link->sink_request & DP_LINK_STATUS_UPDATED) { dp_display_handle_maintenance_req(dp); return; } if (dp->link->sink_request & DP_TEST_LINK_TRAINING) { dp->link->send_test_response(dp->link); dp_display_handle_maintenance_req(dp); return; } } Loading