diff options
author | Animesh Kishore <ankishore@nvidia.com> | 2012-05-10 10:35:21 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:02:40 -0400 |
commit | bc37a44a030cba827dac0742757d9deb94e1bf05 (patch) | |
tree | 9013cc61b38c8119c779b8a0181b4515bba4361d /drivers/video/tegra/dc/dsi.c | |
parent | 0f8eb388e977eb474686487dd24d82ca62fd1076 (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.c | 54 |
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 | ||
1250 | static void tegra_dsi_set_timeout(struct tegra_dc_dsi_data *dsi) | 1292 | static void tegra_dsi_set_timeout(struct tegra_dc_dsi_data *dsi) |