tc358767.c (5761a259aa9efc61b3253675643a87b3092e90b5) | tc358767.c (80d57245063f8cb133a50943a021a8789460101e) |
---|---|
1/* 2 * tc358767 eDP bridge driver 3 * 4 * Copyright (C) 2016 CogentEmbedded Inc 5 * Author: Andrey Gusakov <andrey.gusakov@cogentembedded.com> 6 * 7 * Copyright (C) 2016 Pengutronix, Philipp Zabel <p.zabel@pengutronix.de> 8 * --- 1000 unchanged lines hidden (view full) --- 1009 dev_err(tc->dev, "Failed to read DPCD: %d\n", ret); 1010 return ret; 1011err_dpcd_write: 1012 dev_err(tc->dev, "Failed to write DPCD: %d\n", ret); 1013err: 1014 return ret; 1015} 1016 | 1/* 2 * tc358767 eDP bridge driver 3 * 4 * Copyright (C) 2016 CogentEmbedded Inc 5 * Author: Andrey Gusakov <andrey.gusakov@cogentembedded.com> 6 * 7 * Copyright (C) 2016 Pengutronix, Philipp Zabel <p.zabel@pengutronix.de> 8 * --- 1000 unchanged lines hidden (view full) --- 1009 dev_err(tc->dev, "Failed to read DPCD: %d\n", ret); 1010 return ret; 1011err_dpcd_write: 1012 dev_err(tc->dev, "Failed to write DPCD: %d\n", ret); 1013err: 1014 return ret; 1015} 1016 |
1017static int tc_main_link_stream(struct tc_data *tc, int state) | 1017static int tc_stream_enable(struct tc_data *tc) |
1018{ 1019 int ret; 1020 u32 value; 1021 | 1018{ 1019 int ret; 1020 u32 value; 1021 |
1022 dev_dbg(tc->dev, "stream: %d\n", state); | 1022 dev_dbg(tc->dev, "enable video stream\n"); |
1023 | 1023 |
1024 if (state) { 1025 ret = tc_set_video_mode(tc, tc->mode); 1026 if (ret) 1027 goto err; | 1024 ret = tc_set_video_mode(tc, tc->mode); 1025 if (ret) 1026 return ret; |
1028 | 1027 |
1029 /* Set M/N */ 1030 ret = tc_stream_clock_calc(tc); 1031 if (ret) 1032 goto err; | 1028 /* Set M/N */ 1029 ret = tc_stream_clock_calc(tc); 1030 if (ret) 1031 return ret; |
1033 | 1032 |
1034 value = VID_MN_GEN | DP_EN; 1035 if (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) 1036 value |= EF_EN; 1037 tc_write(DP0CTL, value); 1038 /* 1039 * VID_EN assertion should be delayed by at least N * LSCLK 1040 * cycles from the time VID_MN_GEN is enabled in order to 1041 * generate stable values for VID_M. LSCLK is 270 MHz or 1042 * 162 MHz, VID_N is set to 32768 in tc_stream_clock_calc(), 1043 * so a delay of at least 203 us should suffice. 1044 */ 1045 usleep_range(500, 1000); 1046 value |= VID_EN; 1047 tc_write(DP0CTL, value); 1048 /* Set input interface */ 1049 value = DP0_AUDSRC_NO_INPUT; 1050 if (tc_test_pattern) 1051 value |= DP0_VIDSRC_COLOR_BAR; 1052 else 1053 value |= DP0_VIDSRC_DPI_RX; 1054 tc_write(SYSCTRL, value); 1055 } else { 1056 tc_write(DP0CTL, 0); 1057 } | 1033 value = VID_MN_GEN | DP_EN; 1034 if (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) 1035 value |= EF_EN; 1036 tc_write(DP0CTL, value); 1037 /* 1038 * VID_EN assertion should be delayed by at least N * LSCLK 1039 * cycles from the time VID_MN_GEN is enabled in order to 1040 * generate stable values for VID_M. LSCLK is 270 MHz or 1041 * 162 MHz, VID_N is set to 32768 in tc_stream_clock_calc(), 1042 * so a delay of at least 203 us should suffice. 1043 */ 1044 usleep_range(500, 1000); 1045 value |= VID_EN; 1046 tc_write(DP0CTL, value); 1047 /* Set input interface */ 1048 value = DP0_AUDSRC_NO_INPUT; 1049 if (tc_test_pattern) 1050 value |= DP0_VIDSRC_COLOR_BAR; 1051 else 1052 value |= DP0_VIDSRC_DPI_RX; 1053 tc_write(SYSCTRL, value); |
1058 1059 return 0; 1060err: 1061 return ret; 1062} 1063 | 1054 1055 return 0; 1056err: 1057 return ret; 1058} 1059 |
1060static int tc_stream_disable(struct tc_data *tc) 1061{ 1062 int ret; 1063 1064 dev_dbg(tc->dev, "disable video stream\n"); 1065 1066 tc_write(DP0CTL, 0); 1067 1068 return 0; 1069err: 1070 return ret; 1071} 1072 |
|
1064static void tc_bridge_pre_enable(struct drm_bridge *bridge) 1065{ 1066 struct tc_data *tc = bridge_to_tc(bridge); 1067 1068 drm_panel_prepare(tc->panel); 1069} 1070 1071static void tc_bridge_enable(struct drm_bridge *bridge) 1072{ 1073 struct tc_data *tc = bridge_to_tc(bridge); 1074 int ret; 1075 1076 ret = tc_main_link_setup(tc); 1077 if (ret < 0) { 1078 dev_err(tc->dev, "main link setup error: %d\n", ret); 1079 return; 1080 } 1081 | 1073static void tc_bridge_pre_enable(struct drm_bridge *bridge) 1074{ 1075 struct tc_data *tc = bridge_to_tc(bridge); 1076 1077 drm_panel_prepare(tc->panel); 1078} 1079 1080static void tc_bridge_enable(struct drm_bridge *bridge) 1081{ 1082 struct tc_data *tc = bridge_to_tc(bridge); 1083 int ret; 1084 1085 ret = tc_main_link_setup(tc); 1086 if (ret < 0) { 1087 dev_err(tc->dev, "main link setup error: %d\n", ret); 1088 return; 1089 } 1090 |
1082 ret = tc_main_link_stream(tc, 1); | 1091 ret = tc_stream_enable(tc); |
1083 if (ret < 0) { 1084 dev_err(tc->dev, "main link stream start error: %d\n", ret); 1085 return; 1086 } 1087 1088 drm_panel_enable(tc->panel); 1089} 1090 1091static void tc_bridge_disable(struct drm_bridge *bridge) 1092{ 1093 struct tc_data *tc = bridge_to_tc(bridge); 1094 int ret; 1095 1096 drm_panel_disable(tc->panel); 1097 | 1092 if (ret < 0) { 1093 dev_err(tc->dev, "main link stream start error: %d\n", ret); 1094 return; 1095 } 1096 1097 drm_panel_enable(tc->panel); 1098} 1099 1100static void tc_bridge_disable(struct drm_bridge *bridge) 1101{ 1102 struct tc_data *tc = bridge_to_tc(bridge); 1103 int ret; 1104 1105 drm_panel_disable(tc->panel); 1106 |
1098 ret = tc_main_link_stream(tc, 0); | 1107 ret = tc_stream_disable(tc); |
1099 if (ret < 0) 1100 dev_err(tc->dev, "main link stream stop error: %d\n", ret); 1101} 1102 1103static void tc_bridge_post_disable(struct drm_bridge *bridge) 1104{ 1105 struct tc_data *tc = bridge_to_tc(bridge); 1106 --- 309 unchanged lines hidden --- | 1108 if (ret < 0) 1109 dev_err(tc->dev, "main link stream stop error: %d\n", ret); 1110} 1111 1112static void tc_bridge_post_disable(struct drm_bridge *bridge) 1113{ 1114 struct tc_data *tc = bridge_to_tc(bridge); 1115 --- 309 unchanged lines hidden --- |