summaryrefslogtreecommitdiffstats
path: root/drivers/video/tegra/dc/dsi.c
diff options
context:
space:
mode:
authorAnimesh Kishore <ankishore@nvidia.com>2012-05-10 10:35:21 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:02:40 -0400
commitbc37a44a030cba827dac0742757d9deb94e1bf05 (patch)
tree9013cc61b38c8119c779b8a0181b4515bba4361d /drivers/video/tegra/dc/dsi.c
parent0f8eb388e977eb474686487dd24d82ca62fd1076 (diff)
video: tegra: dsi: Ganged mode sol delay
Remove hard coded sol delay with proper calculation. Bug 944115 Change-Id: I82ecddf68b06dba8615eacd9922a16a07889d0a0 Signed-off-by: Animesh Kishore <ankishore@nvidia.com> Reviewed-on: http://git-master/r/101788 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Jon Mayo <jmayo@nvidia.com> Rebase-Id: Re252bc3131622c78f93573b58717aef3a80ac6b3
Diffstat (limited to 'drivers/video/tegra/dc/dsi.c')
-rw-r--r--drivers/video/tegra/dc/dsi.c54
1 files changed, 48 insertions, 6 deletions
diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c
index 442c7280c..fd31c832b 100644
--- a/drivers/video/tegra/dc/dsi.c
+++ b/drivers/video/tegra/dc/dsi.c
@@ -1224,10 +1224,17 @@ static void tegra_dsi_set_sol_delay(struct tegra_dc *dc,
1224 struct tegra_dc_dsi_data *dsi) 1224 struct tegra_dc_dsi_data *dsi)
1225{ 1225{
1226 u32 sol_delay; 1226 u32 sol_delay;
1227 u32 internal_delay;
1228 u32 h_width_byte_clk;
1229 u32 h_width_pixels;
1230 u32 h_width_ganged_byte_clk;
1231 u8 n_data_lanes_this_cont = 0;
1232 u8 n_data_lanes_ganged = 0;
1227 1233
1234#ifndef CONFIG_TEGRA_DSI_GANGED_MODE
1228 if (dsi->info.video_burst_mode == TEGRA_DSI_VIDEO_NONE_BURST_MODE || 1235 if (dsi->info.video_burst_mode == TEGRA_DSI_VIDEO_NONE_BURST_MODE ||
1229 dsi->info.video_burst_mode == 1236 dsi->info.video_burst_mode ==
1230 TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END) { 1237 TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END) {
1231#define VIDEO_FIFO_LATENCY_PIXEL_CLK 8 1238#define VIDEO_FIFO_LATENCY_PIXEL_CLK 8
1232 sol_delay = VIDEO_FIFO_LATENCY_PIXEL_CLK * 1239 sol_delay = VIDEO_FIFO_LATENCY_PIXEL_CLK *
1233 dsi->pixel_scaler_mul / dsi->pixel_scaler_div; 1240 dsi->pixel_scaler_mul / dsi->pixel_scaler_div;
@@ -1237,14 +1244,49 @@ static void tegra_dsi_set_sol_delay(struct tegra_dc *dc,
1237 sol_delay = tegra_dsi_sol_delay_burst(dc, dsi); 1244 sol_delay = tegra_dsi_sol_delay_burst(dc, dsi);
1238 dsi->status.clk_burst = DSI_CLK_BURST_BURST_MODE; 1245 dsi->status.clk_burst = DSI_CLK_BURST_BURST_MODE;
1239 } 1246 }
1247#else
1248#define SOL_TO_VALID_PIX_CLK_DELAY 4
1249#define VALID_TO_FIFO_PIX_CLK_DELAY 4
1250#define FIFO_WR_PIX_CLK_DELAY 2
1251#define FIFO_RD_BYTE_CLK_DELAY 6
1252#define TOT_INTERNAL_PIX_DELAY (SOL_TO_VALID_PIX_CLK_DELAY + \
1253 VALID_TO_FIFO_PIX_CLK_DELAY + \
1254 FIFO_WR_PIX_CLK_DELAY)
1255
1256 internal_delay = DIV_ROUND_UP(
1257 TOT_INTERNAL_PIX_DELAY * dsi->pixel_scaler_mul,
1258 dsi->pixel_scaler_div * dsi->info.n_data_lanes) +
1259 FIFO_RD_BYTE_CLK_DELAY;
1260
1261 h_width_pixels = dc->mode.h_sync_width + dc->mode.h_back_porch +
1262 dc->mode.h_active + dc->mode.h_front_porch +
1263 dsi->correction_pix;
1264 h_width_byte_clk = DIV_ROUND_UP(h_width_pixels * dsi->pixel_scaler_mul,
1265 dsi->pixel_scaler_div * dsi->info.n_data_lanes);
1240 1266
1241#ifdef CONFIG_TEGRA_DSI_GANGED_MODE 1267 if (dsi->info.ganged_type == TEGRA_DSI_GANGED_SYMMETRIC_LEFT_RIGHT) {
1242 /* TODO: use proper algo */ 1268 n_data_lanes_this_cont = dsi->info.n_data_lanes / 2;
1243 sol_delay = 0xaa; 1269 n_data_lanes_ganged = dsi->info.n_data_lanes;
1244#endif 1270 }
1271
1272 h_width_ganged_byte_clk = DIV_ROUND_UP(
1273 n_data_lanes_this_cont * h_width_byte_clk,
1274 n_data_lanes_ganged);
1245 1275
1276 sol_delay = h_width_byte_clk - h_width_ganged_byte_clk +
1277 internal_delay;
1278 sol_delay = (dsi->info.video_data_type ==
1279 TEGRA_DSI_VIDEO_TYPE_COMMAND_MODE) ?
1280 sol_delay + 20: sol_delay;
1281
1282#undef SOL_TO_VALID_PIX_CLK_DELAY
1283#undef VALID_TO_FIFO_PIX_CLK_DELAY
1284#undef FIFO_WR_PIX_CLK_DELAY
1285#undef FIFO_RD_BYTE_CLK_DELAY
1286#undef TOT_INTERNAL_PIX_DELAY
1287#endif
1246 tegra_dsi_writel(dsi, DSI_SOL_DELAY_SOL_DELAY(sol_delay), 1288 tegra_dsi_writel(dsi, DSI_SOL_DELAY_SOL_DELAY(sol_delay),
1247 DSI_SOL_DELAY); 1289 DSI_SOL_DELAY);
1248} 1290}
1249 1291
1250static void tegra_dsi_set_timeout(struct tegra_dc_dsi_data *dsi) 1292static void tegra_dsi_set_timeout(struct tegra_dc_dsi_data *dsi)