Lines Matching refs:ctrl

109 	struct dp_ctrl_private *ctrl;  in dp_ctrl_push_idle()  local
111 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_push_idle()
113 reinit_completion(&ctrl->idle_comp); in dp_ctrl_push_idle()
114 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_PUSH_IDLE); in dp_ctrl_push_idle()
116 if (!wait_for_completion_timeout(&ctrl->idle_comp, in dp_ctrl_push_idle()
120 drm_dbg_dp(ctrl->drm_dev, "mainlink off\n"); in dp_ctrl_push_idle()
123 static void dp_ctrl_config_ctrl(struct dp_ctrl_private *ctrl) in dp_ctrl_config_ctrl() argument
126 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_config_ctrl()
135 tbd = dp_link_get_test_bits_depth(ctrl->link, in dp_ctrl_config_ctrl()
136 ctrl->panel->dp_mode.bpp); in dp_ctrl_config_ctrl()
146 config |= ((ctrl->link->link_params.num_lanes - 1) in dp_ctrl_config_ctrl()
158 if (ctrl->panel->psr_cap.version) in dp_ctrl_config_ctrl()
161 dp_catalog_ctrl_config_ctrl(ctrl->catalog, config); in dp_ctrl_config_ctrl()
164 static void dp_ctrl_configure_source_params(struct dp_ctrl_private *ctrl) in dp_ctrl_configure_source_params() argument
168 dp_catalog_ctrl_lane_mapping(ctrl->catalog); in dp_ctrl_configure_source_params()
169 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, true); in dp_ctrl_configure_source_params()
171 dp_ctrl_config_ctrl(ctrl); in dp_ctrl_configure_source_params()
173 tb = dp_link_get_test_bits_depth(ctrl->link, in dp_ctrl_configure_source_params()
174 ctrl->panel->dp_mode.bpp); in dp_ctrl_configure_source_params()
175 cc = dp_link_get_colorimetry_config(ctrl->link); in dp_ctrl_configure_source_params()
176 dp_catalog_ctrl_config_misc(ctrl->catalog, cc, tb); in dp_ctrl_configure_source_params()
177 dp_panel_timing_cfg(ctrl->panel); in dp_ctrl_configure_source_params()
612 static void _dp_ctrl_calc_tu(struct dp_ctrl_private *ctrl, in _dp_ctrl_calc_tu() argument
697 drm_dbg_dp(ctrl->drm_dev, in _dp_ctrl_calc_tu()
733 drm_dbg_dp(ctrl->drm_dev, in _dp_ctrl_calc_tu()
928 drm_dbg_dp(ctrl->drm_dev, "TU: valid_boundary_link: %d\n", in _dp_ctrl_calc_tu()
930 drm_dbg_dp(ctrl->drm_dev, "TU: delay_start_link: %d\n", in _dp_ctrl_calc_tu()
932 drm_dbg_dp(ctrl->drm_dev, "TU: boundary_moderation_en: %d\n", in _dp_ctrl_calc_tu()
934 drm_dbg_dp(ctrl->drm_dev, "TU: valid_lower_boundary_link: %d\n", in _dp_ctrl_calc_tu()
936 drm_dbg_dp(ctrl->drm_dev, "TU: upper_boundary_count: %d\n", in _dp_ctrl_calc_tu()
938 drm_dbg_dp(ctrl->drm_dev, "TU: lower_boundary_count: %d\n", in _dp_ctrl_calc_tu()
940 drm_dbg_dp(ctrl->drm_dev, "TU: tu_size_minus1: %d\n", in _dp_ctrl_calc_tu()
946 static void dp_ctrl_calc_tu_parameters(struct dp_ctrl_private *ctrl, in dp_ctrl_calc_tu_parameters() argument
952 drm_mode = &ctrl->panel->dp_mode.drm_mode; in dp_ctrl_calc_tu_parameters()
954 in.lclk = ctrl->link->link_params.rate / 1000; in dp_ctrl_calc_tu_parameters()
958 in.nlanes = ctrl->link->link_params.num_lanes; in dp_ctrl_calc_tu_parameters()
959 in.bpp = ctrl->panel->dp_mode.bpp; in dp_ctrl_calc_tu_parameters()
967 _dp_ctrl_calc_tu(ctrl, &in, tu_table); in dp_ctrl_calc_tu_parameters()
970 static void dp_ctrl_setup_tr_unit(struct dp_ctrl_private *ctrl) in dp_ctrl_setup_tr_unit() argument
977 dp_ctrl_calc_tu_parameters(ctrl, &tu_calc_table); in dp_ctrl_setup_tr_unit()
993 dp_catalog_ctrl_update_transfer_unit(ctrl->catalog, in dp_ctrl_setup_tr_unit()
997 static int dp_ctrl_wait4video_ready(struct dp_ctrl_private *ctrl) in dp_ctrl_wait4video_ready() argument
1001 if (!wait_for_completion_timeout(&ctrl->video_comp, in dp_ctrl_wait4video_ready()
1009 static int dp_ctrl_update_vx_px(struct dp_ctrl_private *ctrl) in dp_ctrl_update_vx_px() argument
1011 struct dp_link *link = ctrl->link; in dp_ctrl_update_vx_px()
1018 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_update_vx_px()
1021 ret = dp_catalog_ctrl_update_vx_px(ctrl->catalog, in dp_ctrl_update_vx_px()
1028 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_update_vx_px()
1035 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_update_vx_px()
1043 lane_cnt = ctrl->link->link_params.num_lanes; in dp_ctrl_update_vx_px()
1048 drm_dbg_dp(ctrl->drm_dev, "sink: p|v=0x%x\n", in dp_ctrl_update_vx_px()
1050 ret = drm_dp_dpcd_write(ctrl->aux, DP_TRAINING_LANE0_SET, in dp_ctrl_update_vx_px()
1058 static bool dp_ctrl_train_pattern_set(struct dp_ctrl_private *ctrl, in dp_ctrl_train_pattern_set() argument
1064 drm_dbg_dp(ctrl->drm_dev, "sink: pattern=%x\n", pattern); in dp_ctrl_train_pattern_set()
1071 ret = drm_dp_dpcd_writeb(ctrl->aux, DP_TRAINING_PATTERN_SET, buf); in dp_ctrl_train_pattern_set()
1075 static int dp_ctrl_read_link_status(struct dp_ctrl_private *ctrl, in dp_ctrl_read_link_status() argument
1080 len = drm_dp_dpcd_read_link_status(ctrl->aux, link_status); in dp_ctrl_read_link_status()
1089 static int dp_ctrl_link_train_1(struct dp_ctrl_private *ctrl, in dp_ctrl_link_train_1() argument
1096 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_link_train_1()
1100 ret = dp_catalog_ctrl_set_pattern_state_bit(ctrl->catalog, 1); in dp_ctrl_link_train_1()
1103 dp_ctrl_train_pattern_set(ctrl, DP_TRAINING_PATTERN_1 | in dp_ctrl_link_train_1()
1106 ret = dp_ctrl_update_vx_px(ctrl); in dp_ctrl_link_train_1()
1111 old_v_level = ctrl->link->phy_params.v_level; in dp_ctrl_link_train_1()
1113 drm_dp_link_train_clock_recovery_delay(ctrl->aux, ctrl->panel->dpcd); in dp_ctrl_link_train_1()
1115 ret = dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_link_train_1()
1120 ctrl->link->link_params.num_lanes)) { in dp_ctrl_link_train_1()
1124 if (ctrl->link->phy_params.v_level >= in dp_ctrl_link_train_1()
1130 if (old_v_level != ctrl->link->phy_params.v_level) { in dp_ctrl_link_train_1()
1132 old_v_level = ctrl->link->phy_params.v_level; in dp_ctrl_link_train_1()
1135 dp_link_adjust_levels(ctrl->link, link_status); in dp_ctrl_link_train_1()
1136 ret = dp_ctrl_update_vx_px(ctrl); in dp_ctrl_link_train_1()
1145 static int dp_ctrl_link_rate_down_shift(struct dp_ctrl_private *ctrl) in dp_ctrl_link_rate_down_shift() argument
1149 switch (ctrl->link->link_params.rate) { in dp_ctrl_link_rate_down_shift()
1151 ctrl->link->link_params.rate = 540000; in dp_ctrl_link_rate_down_shift()
1154 ctrl->link->link_params.rate = 270000; in dp_ctrl_link_rate_down_shift()
1157 ctrl->link->link_params.rate = 162000; in dp_ctrl_link_rate_down_shift()
1166 drm_dbg_dp(ctrl->drm_dev, "new rate=0x%x\n", in dp_ctrl_link_rate_down_shift()
1167 ctrl->link->link_params.rate); in dp_ctrl_link_rate_down_shift()
1173 static int dp_ctrl_link_lane_down_shift(struct dp_ctrl_private *ctrl) in dp_ctrl_link_lane_down_shift() argument
1176 if (ctrl->link->link_params.num_lanes == 1) in dp_ctrl_link_lane_down_shift()
1179 ctrl->link->link_params.num_lanes /= 2; in dp_ctrl_link_lane_down_shift()
1180 ctrl->link->link_params.rate = ctrl->panel->link_info.rate; in dp_ctrl_link_lane_down_shift()
1182 ctrl->link->phy_params.p_level = 0; in dp_ctrl_link_lane_down_shift()
1183 ctrl->link->phy_params.v_level = 0; in dp_ctrl_link_lane_down_shift()
1188 static void dp_ctrl_clear_training_pattern(struct dp_ctrl_private *ctrl) in dp_ctrl_clear_training_pattern() argument
1190 dp_ctrl_train_pattern_set(ctrl, DP_TRAINING_PATTERN_DISABLE); in dp_ctrl_clear_training_pattern()
1191 drm_dp_link_train_channel_eq_delay(ctrl->aux, ctrl->panel->dpcd); in dp_ctrl_clear_training_pattern()
1194 static int dp_ctrl_link_train_2(struct dp_ctrl_private *ctrl, in dp_ctrl_link_train_2() argument
1203 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_link_train_2()
1207 if (drm_dp_tps4_supported(ctrl->panel->dpcd)) { in dp_ctrl_link_train_2()
1210 } else if (drm_dp_tps3_supported(ctrl->panel->dpcd)) { in dp_ctrl_link_train_2()
1218 ret = dp_catalog_ctrl_set_pattern_state_bit(ctrl->catalog, state_ctrl_bit); in dp_ctrl_link_train_2()
1222 dp_ctrl_train_pattern_set(ctrl, pattern); in dp_ctrl_link_train_2()
1225 drm_dp_link_train_channel_eq_delay(ctrl->aux, ctrl->panel->dpcd); in dp_ctrl_link_train_2()
1227 ret = dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_link_train_2()
1232 ctrl->link->link_params.num_lanes)) { in dp_ctrl_link_train_2()
1236 dp_link_adjust_levels(ctrl->link, link_status); in dp_ctrl_link_train_2()
1237 ret = dp_ctrl_update_vx_px(ctrl); in dp_ctrl_link_train_2()
1246 static int dp_ctrl_link_train(struct dp_ctrl_private *ctrl, in dp_ctrl_link_train() argument
1250 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_link_train()
1255 dp_ctrl_config_ctrl(ctrl); in dp_ctrl_link_train()
1257 link_info.num_lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_link_train()
1258 link_info.rate = ctrl->link->link_params.rate; in dp_ctrl_link_train()
1261 dp_aux_link_configure(ctrl->aux, &link_info); in dp_ctrl_link_train()
1267 drm_dp_dpcd_write(ctrl->aux, DP_DOWNSPREAD_CTRL, encoding, 2); in dp_ctrl_link_train()
1271 drm_dp_dpcd_write(ctrl->aux, DP_EDP_CONFIGURATION_SET, in dp_ctrl_link_train()
1275 ret = dp_ctrl_link_train_1(ctrl, training_step); in dp_ctrl_link_train()
1282 drm_dbg_dp(ctrl->drm_dev, "link training #1 successful\n"); in dp_ctrl_link_train()
1284 ret = dp_ctrl_link_train_2(ctrl, training_step); in dp_ctrl_link_train()
1291 drm_dbg_dp(ctrl->drm_dev, "link training #2 successful\n"); in dp_ctrl_link_train()
1294 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_link_train()
1299 static int dp_ctrl_setup_main_link(struct dp_ctrl_private *ctrl, in dp_ctrl_setup_main_link() argument
1304 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, true); in dp_ctrl_setup_main_link()
1306 if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) in dp_ctrl_setup_main_link()
1315 ret = dp_ctrl_link_train(ctrl, training_step); in dp_ctrl_setup_main_link()
1320 static void dp_ctrl_set_clock_rate(struct dp_ctrl_private *ctrl, in dp_ctrl_set_clock_rate() argument
1323 u32 num = ctrl->parser->mp[module].num_clk; in dp_ctrl_set_clock_rate()
1324 struct clk_bulk_data *cfg = ctrl->parser->mp[module].clocks; in dp_ctrl_set_clock_rate()
1331 drm_dbg_dp(ctrl->drm_dev, "setting rate=%lu on clk=%s\n", in dp_ctrl_set_clock_rate()
1341 static int dp_ctrl_enable_mainlink_clocks(struct dp_ctrl_private *ctrl) in dp_ctrl_enable_mainlink_clocks() argument
1344 struct dp_io *dp_io = &ctrl->parser->io; in dp_ctrl_enable_mainlink_clocks()
1347 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_enable_mainlink_clocks()
1349 opts_dp->lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_enable_mainlink_clocks()
1350 opts_dp->link_rate = ctrl->link->link_params.rate / 100; in dp_ctrl_enable_mainlink_clocks()
1356 dev_pm_opp_set_rate(ctrl->dev, ctrl->link->link_params.rate * 1000); in dp_ctrl_enable_mainlink_clocks()
1357 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, true); in dp_ctrl_enable_mainlink_clocks()
1361 drm_dbg_dp(ctrl->drm_dev, "link rate=%d\n", ctrl->link->link_params.rate); in dp_ctrl_enable_mainlink_clocks()
1368 struct dp_ctrl_private *ctrl; in dp_ctrl_reset_irq_ctrl() local
1370 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_reset_irq_ctrl()
1372 dp_catalog_ctrl_reset(ctrl->catalog); in dp_ctrl_reset_irq_ctrl()
1380 dp_catalog_ctrl_enable_irq(ctrl->catalog, enable); in dp_ctrl_reset_irq_ctrl()
1386 struct dp_ctrl_private *ctrl = container_of(dp_ctrl, in dp_ctrl_config_psr() local
1389 if (!ctrl->panel->psr_cap.version) in dp_ctrl_config_psr()
1392 dp_catalog_ctrl_config_psr(ctrl->catalog); in dp_ctrl_config_psr()
1395 drm_dp_dpcd_write(ctrl->aux, DP_PSR_EN_CFG, &cfg, 1); in dp_ctrl_config_psr()
1400 struct dp_ctrl_private *ctrl = container_of(dp_ctrl, in dp_ctrl_set_psr() local
1403 if (!ctrl->panel->psr_cap.version) in dp_ctrl_set_psr()
1417 reinit_completion(&ctrl->psr_op_comp); in dp_ctrl_set_psr()
1418 dp_catalog_ctrl_set_psr(ctrl->catalog, true); in dp_ctrl_set_psr()
1420 if (!wait_for_completion_timeout(&ctrl->psr_op_comp, in dp_ctrl_set_psr()
1423 dp_catalog_ctrl_set_psr(ctrl->catalog, false); in dp_ctrl_set_psr()
1428 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_set_psr()
1430 dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, false); in dp_ctrl_set_psr()
1432 dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, true); in dp_ctrl_set_psr()
1434 dp_catalog_ctrl_set_psr(ctrl->catalog, false); in dp_ctrl_set_psr()
1435 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); in dp_ctrl_set_psr()
1436 dp_ctrl_wait4video_ready(ctrl); in dp_ctrl_set_psr()
1437 dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); in dp_ctrl_set_psr()
1443 struct dp_ctrl_private *ctrl; in dp_ctrl_phy_init() local
1447 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_phy_init()
1448 dp_io = &ctrl->parser->io; in dp_ctrl_phy_init()
1451 dp_catalog_ctrl_phy_reset(ctrl->catalog); in dp_ctrl_phy_init()
1454 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_phy_init()
1460 struct dp_ctrl_private *ctrl; in dp_ctrl_phy_exit() local
1464 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_phy_exit()
1465 dp_io = &ctrl->parser->io; in dp_ctrl_phy_exit()
1468 dp_catalog_ctrl_phy_reset(ctrl->catalog); in dp_ctrl_phy_exit()
1470 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_phy_exit()
1474 static bool dp_ctrl_use_fixed_nvid(struct dp_ctrl_private *ctrl) in dp_ctrl_use_fixed_nvid() argument
1476 const u8 *dpcd = ctrl->panel->dpcd; in dp_ctrl_use_fixed_nvid()
1483 return (drm_dp_has_quirk(&ctrl->panel->desc, in dp_ctrl_use_fixed_nvid()
1489 static int dp_ctrl_reinitialize_mainlink(struct dp_ctrl_private *ctrl) in dp_ctrl_reinitialize_mainlink() argument
1492 struct dp_io *dp_io = &ctrl->parser->io; in dp_ctrl_reinitialize_mainlink()
1496 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_reinitialize_mainlink()
1497 opts_dp->lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_reinitialize_mainlink()
1504 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_reinitialize_mainlink()
1505 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_reinitialize_mainlink()
1514 ret = dp_ctrl_enable_mainlink_clocks(ctrl); in dp_ctrl_reinitialize_mainlink()
1523 static int dp_ctrl_deinitialize_mainlink(struct dp_ctrl_private *ctrl) in dp_ctrl_deinitialize_mainlink() argument
1529 dp_io = &ctrl->parser->io; in dp_ctrl_deinitialize_mainlink()
1532 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_deinitialize_mainlink()
1534 dp_catalog_ctrl_reset(ctrl->catalog); in dp_ctrl_deinitialize_mainlink()
1536 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_deinitialize_mainlink()
1537 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_deinitialize_mainlink()
1548 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_deinitialize_mainlink()
1553 static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl) in dp_ctrl_link_maintenance() argument
1558 dp_ctrl_push_idle(&ctrl->dp_ctrl); in dp_ctrl_link_maintenance()
1560 ctrl->link->phy_params.p_level = 0; in dp_ctrl_link_maintenance()
1561 ctrl->link->phy_params.v_level = 0; in dp_ctrl_link_maintenance()
1563 ret = dp_ctrl_setup_main_link(ctrl, &training_step); in dp_ctrl_link_maintenance()
1567 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_link_maintenance()
1569 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); in dp_ctrl_link_maintenance()
1571 ret = dp_ctrl_wait4video_ready(ctrl); in dp_ctrl_link_maintenance()
1576 static bool dp_ctrl_send_phy_test_pattern(struct dp_ctrl_private *ctrl) in dp_ctrl_send_phy_test_pattern() argument
1580 u32 pattern_requested = ctrl->link->phy_params.phy_test_pattern_sel; in dp_ctrl_send_phy_test_pattern()
1582 drm_dbg_dp(ctrl->drm_dev, "request: 0x%x\n", pattern_requested); in dp_ctrl_send_phy_test_pattern()
1584 if (dp_catalog_ctrl_update_vx_px(ctrl->catalog, in dp_ctrl_send_phy_test_pattern()
1585 ctrl->link->phy_params.v_level, in dp_ctrl_send_phy_test_pattern()
1586 ctrl->link->phy_params.p_level)) { in dp_ctrl_send_phy_test_pattern()
1590 dp_catalog_ctrl_send_phy_pattern(ctrl->catalog, pattern_requested); in dp_ctrl_send_phy_test_pattern()
1591 dp_ctrl_update_vx_px(ctrl); in dp_ctrl_send_phy_test_pattern()
1592 dp_link_send_test_response(ctrl->link); in dp_ctrl_send_phy_test_pattern()
1594 pattern_sent = dp_catalog_ctrl_read_phy_pattern(ctrl->catalog); in dp_ctrl_send_phy_test_pattern()
1623 drm_dbg_dp(ctrl->drm_dev, "%s: test->0x%x\n", in dp_ctrl_send_phy_test_pattern()
1628 static int dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl) in dp_ctrl_process_phy_test_request() argument
1633 if (!ctrl->link->phy_params.phy_test_pattern_sel) { in dp_ctrl_process_phy_test_request()
1634 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_process_phy_test_request()
1644 ret = dp_ctrl_off(&ctrl->dp_ctrl); in dp_ctrl_process_phy_test_request()
1650 ret = dp_ctrl_on_link(&ctrl->dp_ctrl); in dp_ctrl_process_phy_test_request()
1656 pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; in dp_ctrl_process_phy_test_request()
1657 dp_ctrl_set_clock_rate(ctrl, DP_STREAM_PM, "stream_pixel", pixel_rate * 1000); in dp_ctrl_process_phy_test_request()
1659 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, true); in dp_ctrl_process_phy_test_request()
1665 dp_ctrl_send_phy_test_pattern(ctrl); in dp_ctrl_process_phy_test_request()
1672 struct dp_ctrl_private *ctrl; in dp_ctrl_handle_sink_request() local
1680 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_handle_sink_request()
1681 sink_request = ctrl->link->sink_request; in dp_ctrl_handle_sink_request()
1684 drm_dbg_dp(ctrl->drm_dev, "PHY_TEST_PATTERN request\n"); in dp_ctrl_handle_sink_request()
1685 if (dp_ctrl_process_phy_test_request(ctrl)) { in dp_ctrl_handle_sink_request()
1692 if (dp_ctrl_link_maintenance(ctrl)) { in dp_ctrl_handle_sink_request()
1699 dp_link_send_test_response(ctrl->link); in dp_ctrl_handle_sink_request()
1700 if (dp_ctrl_link_maintenance(ctrl)) { in dp_ctrl_handle_sink_request()
1726 static bool dp_ctrl_channel_eq_ok(struct dp_ctrl_private *ctrl) in dp_ctrl_channel_eq_ok() argument
1729 int num_lanes = ctrl->link->link_params.num_lanes; in dp_ctrl_channel_eq_ok()
1731 dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_channel_eq_ok()
1739 struct dp_ctrl_private *ctrl; in dp_ctrl_on_link() local
1750 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_on_link()
1752 rate = ctrl->panel->link_info.rate; in dp_ctrl_on_link()
1753 pixel_rate = ctrl->panel->dp_mode.drm_mode.clock; in dp_ctrl_on_link()
1755 dp_power_clk_enable(ctrl->power, DP_CORE_PM, true); in dp_ctrl_on_link()
1757 if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) { in dp_ctrl_on_link()
1758 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_on_link()
1763 ctrl->link->link_params.rate = rate; in dp_ctrl_on_link()
1764 ctrl->link->link_params.num_lanes = in dp_ctrl_on_link()
1765 ctrl->panel->link_info.num_lanes; in dp_ctrl_on_link()
1768 drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n", in dp_ctrl_on_link()
1769 ctrl->link->link_params.rate, ctrl->link->link_params.num_lanes, in dp_ctrl_on_link()
1772 rc = dp_ctrl_enable_mainlink_clocks(ctrl); in dp_ctrl_on_link()
1778 rc = dp_ctrl_setup_main_link(ctrl, &training_step); in dp_ctrl_on_link()
1784 if (!dp_catalog_link_is_connected(ctrl->catalog)) in dp_ctrl_on_link()
1787 dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_on_link()
1789 rc = dp_ctrl_link_rate_down_shift(ctrl); in dp_ctrl_on_link()
1792 ctrl->link->link_params.num_lanes)) { in dp_ctrl_on_link()
1797 rc = dp_ctrl_link_lane_down_shift(ctrl); in dp_ctrl_on_link()
1809 if (!dp_catalog_link_is_connected(ctrl->catalog)) in dp_ctrl_on_link()
1812 dp_ctrl_read_link_status(ctrl, link_status); in dp_ctrl_on_link()
1815 ctrl->link->link_params.num_lanes)) in dp_ctrl_on_link()
1816 rc = dp_ctrl_link_rate_down_shift(ctrl); in dp_ctrl_on_link()
1818 rc = dp_ctrl_link_lane_down_shift(ctrl); in dp_ctrl_on_link()
1826 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_on_link()
1829 rc = dp_ctrl_reinitialize_mainlink(ctrl); in dp_ctrl_on_link()
1836 if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) in dp_ctrl_on_link()
1850 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_on_link()
1852 dp_ctrl_deinitialize_mainlink(ctrl); in dp_ctrl_on_link()
1859 static int dp_ctrl_link_retrain(struct dp_ctrl_private *ctrl) in dp_ctrl_link_retrain() argument
1863 return dp_ctrl_setup_main_link(ctrl, &training_step); in dp_ctrl_link_retrain()
1870 struct dp_ctrl_private *ctrl; in dp_ctrl_on_stream() local
1877 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_on_stream()
1879 pixel_rate = pixel_rate_orig = ctrl->panel->dp_mode.drm_mode.clock; in dp_ctrl_on_stream()
1884 drm_dbg_dp(ctrl->drm_dev, "rate=%d, num_lanes=%d, pixel_rate=%lu\n", in dp_ctrl_on_stream()
1885 ctrl->link->link_params.rate, in dp_ctrl_on_stream()
1886 ctrl->link->link_params.num_lanes, pixel_rate); in dp_ctrl_on_stream()
1888 if (!dp_power_clk_status(ctrl->power, DP_CTRL_PM)) { /* link clk is off */ in dp_ctrl_on_stream()
1889 ret = dp_ctrl_enable_mainlink_clocks(ctrl); in dp_ctrl_on_stream()
1896 dp_ctrl_set_clock_rate(ctrl, DP_STREAM_PM, "stream_pixel", pixel_rate * 1000); in dp_ctrl_on_stream()
1898 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, true); in dp_ctrl_on_stream()
1904 if (force_link_train || !dp_ctrl_channel_eq_ok(ctrl)) in dp_ctrl_on_stream()
1905 dp_ctrl_link_retrain(ctrl); in dp_ctrl_on_stream()
1908 dp_ctrl_clear_training_pattern(ctrl); in dp_ctrl_on_stream()
1914 reinit_completion(&ctrl->video_comp); in dp_ctrl_on_stream()
1916 dp_ctrl_configure_source_params(ctrl); in dp_ctrl_on_stream()
1918 dp_catalog_ctrl_config_msa(ctrl->catalog, in dp_ctrl_on_stream()
1919 ctrl->link->link_params.rate, in dp_ctrl_on_stream()
1920 pixel_rate_orig, dp_ctrl_use_fixed_nvid(ctrl)); in dp_ctrl_on_stream()
1922 dp_ctrl_setup_tr_unit(ctrl); in dp_ctrl_on_stream()
1924 dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); in dp_ctrl_on_stream()
1926 ret = dp_ctrl_wait4video_ready(ctrl); in dp_ctrl_on_stream()
1930 mainlink_ready = dp_catalog_ctrl_mainlink_ready(ctrl->catalog); in dp_ctrl_on_stream()
1931 drm_dbg_dp(ctrl->drm_dev, in dp_ctrl_on_stream()
1940 struct dp_ctrl_private *ctrl; in dp_ctrl_off_link_stream() local
1945 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_off_link_stream()
1946 dp_io = &ctrl->parser->io; in dp_ctrl_off_link_stream()
1950 dp_link_psm_config(ctrl->link, &ctrl->panel->link_info, true); in dp_ctrl_off_link_stream()
1952 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_off_link_stream()
1954 if (dp_power_clk_status(ctrl->power, DP_STREAM_PM)) { in dp_ctrl_off_link_stream()
1955 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, false); in dp_ctrl_off_link_stream()
1962 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_off_link_stream()
1963 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_off_link_stream()
1975 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_off_link_stream()
1982 struct dp_ctrl_private *ctrl; in dp_ctrl_off_link() local
1987 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_off_link()
1988 dp_io = &ctrl->parser->io; in dp_ctrl_off_link()
1991 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_off_link()
1993 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_off_link()
2011 struct dp_ctrl_private *ctrl; in dp_ctrl_off() local
2019 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_off()
2020 dp_io = &ctrl->parser->io; in dp_ctrl_off()
2023 dp_catalog_ctrl_mainlink_ctrl(ctrl->catalog, false); in dp_ctrl_off()
2025 dp_catalog_ctrl_reset(ctrl->catalog); in dp_ctrl_off()
2027 ret = dp_power_clk_enable(ctrl->power, DP_STREAM_PM, false); in dp_ctrl_off()
2031 dev_pm_opp_set_rate(ctrl->dev, 0); in dp_ctrl_off()
2032 ret = dp_power_clk_enable(ctrl->power, DP_CTRL_PM, false); in dp_ctrl_off()
2038 drm_dbg_dp(ctrl->drm_dev, "phy=%p init=%d power_on=%d\n", in dp_ctrl_off()
2046 struct dp_ctrl_private *ctrl; in dp_ctrl_isr() local
2053 ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); in dp_ctrl_isr()
2055 if (ctrl->panel->psr_cap.version) { in dp_ctrl_isr()
2056 isr = dp_catalog_ctrl_read_psr_interrupt_status(ctrl->catalog); in dp_ctrl_isr()
2059 complete(&ctrl->psr_op_comp); in dp_ctrl_isr()
2062 drm_dbg_dp(ctrl->drm_dev, "PSR exit done\n"); in dp_ctrl_isr()
2065 drm_dbg_dp(ctrl->drm_dev, "PSR frame update done\n"); in dp_ctrl_isr()
2068 drm_dbg_dp(ctrl->drm_dev, "PSR frame capture done\n"); in dp_ctrl_isr()
2071 isr = dp_catalog_ctrl_get_interrupt(ctrl->catalog); in dp_ctrl_isr()
2075 drm_dbg_dp(ctrl->drm_dev, "dp_video_ready\n"); in dp_ctrl_isr()
2076 complete(&ctrl->video_comp); in dp_ctrl_isr()
2081 drm_dbg_dp(ctrl->drm_dev, "idle_patterns_sent\n"); in dp_ctrl_isr()
2082 complete(&ctrl->idle_comp); in dp_ctrl_isr()
2094 struct dp_ctrl_private *ctrl; in dp_ctrl_get() local
2103 ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL); in dp_ctrl_get()
2104 if (!ctrl) { in dp_ctrl_get()
2121 init_completion(&ctrl->idle_comp); in dp_ctrl_get()
2122 init_completion(&ctrl->psr_op_comp); in dp_ctrl_get()
2123 init_completion(&ctrl->video_comp); in dp_ctrl_get()
2126 ctrl->parser = parser; in dp_ctrl_get()
2127 ctrl->panel = panel; in dp_ctrl_get()
2128 ctrl->power = power; in dp_ctrl_get()
2129 ctrl->aux = aux; in dp_ctrl_get()
2130 ctrl->link = link; in dp_ctrl_get()
2131 ctrl->catalog = catalog; in dp_ctrl_get()
2132 ctrl->dev = dev; in dp_ctrl_get()
2134 return &ctrl->dp_ctrl; in dp_ctrl_get()