summaryrefslogtreecommitdiffstats
path: root/drivers/video/tegra/dc/dsi.c
diff options
context:
space:
mode:
authorRakesh Iyer <riyer@nvidia.com>2013-02-05 19:04:03 -0500
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:04:01 -0400
commit9e6be7524d4c81446417316d0e636dc998b18546 (patch)
tree9562ed0ccd492eeee9add2986fae3a7faa4dd7cb /drivers/video/tegra/dc/dsi.c
parenta9856482c3375cfa401a3662e7e738607097ff13 (diff)
video: tegra: dsi: Dont program initialized panels
Do not program some panels that the bootloader has already initialized. This avoids periods of blanking during boot. Bug 1219004 Change-Id: Ie08b20a0892d62dc1b960d37f709eda933e886cc Signed-off-by: Rakesh Iyer <riyer@nvidia.com> Reviewed-on: http://git-master/r/197685 (cherry picked from commit 1d3bfb96cb6e6b09609cca842bb4cc5c90ee33c3) Reviewed-on: http://git-master/r/204247 Reviewed-by: Simone Willett <swillett@nvidia.com> Tested-by: Simone Willett <swillett@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/dc/dsi.c')
-rw-r--r--drivers/video/tegra/dc/dsi.c64
1 files changed, 57 insertions, 7 deletions
diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c
index 5a797f87d..5f8418aa7 100644
--- a/drivers/video/tegra/dc/dsi.c
+++ b/drivers/video/tegra/dc/dsi.c
@@ -3249,6 +3249,43 @@ static void tegra_dsi_send_dc_frames(struct tegra_dc *dc,
3249 } 3249 }
3250} 3250}
3251 3251
3252static void tegra_dsi_setup_initialized_panel(struct tegra_dc_dsi_data *dsi)
3253{
3254 regulator_enable(dsi->avdd_dsi_csi);
3255
3256 dsi->status.init = DSI_MODULE_INIT;
3257 dsi->status.lphs = DSI_LPHS_IN_HS_MODE;
3258 dsi->status.driven = DSI_DRIVEN_MODE_DC;
3259 dsi->driven_mode = TEGRA_DSI_DRIVEN_BY_DC;
3260 dsi->status.clk_out = DSI_PHYCLK_OUT_EN;
3261 dsi->status.lp_op = DSI_LP_OP_NOT_INIT;
3262 dsi->status.dc_stream = DSI_DC_STREAM_ENABLE;
3263
3264 if (dsi->info.video_clock_mode == TEGRA_DSI_VIDEO_CLOCK_CONTINUOUS)
3265 dsi->status.clk_mode = DSI_PHYCLK_CONTINUOUS;
3266 else
3267 dsi->status.clk_mode = DSI_PHYCLK_TX_ONLY;
3268
3269 if (!(dsi->info.ganged_type)) {
3270 if (dsi->info.video_burst_mode ==
3271 TEGRA_DSI_VIDEO_NONE_BURST_MODE ||
3272 dsi->info.video_burst_mode ==
3273 TEGRA_DSI_VIDEO_NONE_BURST_MODE_WITH_SYNC_END)
3274 dsi->status.clk_burst = DSI_CLK_BURST_NONE_BURST;
3275 else
3276 dsi->status.clk_burst = DSI_CLK_BURST_BURST_MODE;
3277 }
3278
3279 if (dsi->info.video_data_type == TEGRA_DSI_VIDEO_TYPE_COMMAND_MODE)
3280 dsi->status.vtype = DSI_VIDEO_TYPE_CMD_MODE;
3281 else
3282 dsi->status.vtype = DSI_VIDEO_TYPE_VIDEO_MODE;
3283
3284 tegra_dsi_clk_enable(dsi);
3285
3286 dsi->enabled = true;
3287}
3288
3252static void _tegra_dc_dsi_enable(struct tegra_dc *dc) 3289static void _tegra_dc_dsi_enable(struct tegra_dc *dc)
3253{ 3290{
3254 struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc); 3291 struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc);
@@ -3257,6 +3294,15 @@ static void _tegra_dc_dsi_enable(struct tegra_dc *dc)
3257 mutex_lock(&dsi->lock); 3294 mutex_lock(&dsi->lock);
3258 tegra_dc_io_start(dc); 3295 tegra_dc_io_start(dc);
3259 3296
3297 /*
3298 * Do not program this panel as the bootloader as has already
3299 * initialized it. This avoids periods of blanking during boot.
3300 */
3301 if (dc->out->flags & TEGRA_DC_OUT_INITIALIZED_MODE) {
3302 tegra_dsi_setup_initialized_panel(dsi);
3303 goto fail;
3304 }
3305
3260 /* Stop DC stream before configuring DSI registers 3306 /* Stop DC stream before configuring DSI registers
3261 * to avoid visible glitches on panel during transition 3307 * to avoid visible glitches on panel during transition
3262 * from bootloader to kernel driver 3308 * from bootloader to kernel driver
@@ -4187,6 +4233,16 @@ static long tegra_dc_dsi_setup_clk(struct tegra_dc *dc, struct clk *clk)
4187 struct clk *parent_clk; 4233 struct clk *parent_clk;
4188 struct clk *base_clk; 4234 struct clk *base_clk;
4189 4235
4236 /* divide by 1000 to avoid overflow */
4237 dc->mode.pclk /= 1000;
4238 rate = (dc->mode.pclk * dc->shift_clk_div.mul * 2)
4239 / dc->shift_clk_div.div;
4240 rate *= 1000;
4241 dc->mode.pclk *= 1000;
4242
4243 if (dc->out->flags & TEGRA_DC_OUT_INITIALIZED_MODE)
4244 goto skip_setup;
4245
4190 if (clk == dc->clk) { 4246 if (clk == dc->clk) {
4191 parent_clk = clk_get_sys(NULL, 4247 parent_clk = clk_get_sys(NULL,
4192 dc->out->parent_clk ? : "pll_d_out0"); 4248 dc->out->parent_clk ? : "pll_d_out0");
@@ -4209,19 +4265,13 @@ static long tegra_dc_dsi_setup_clk(struct tegra_dc *dc, struct clk *clk)
4209 } 4265 }
4210 } 4266 }
4211 4267
4212 /* divide by 1000 to avoid overflow */
4213 dc->mode.pclk /= 1000;
4214 rate = (dc->mode.pclk * dc->shift_clk_div.mul * 2)
4215 / dc->shift_clk_div.div;
4216 rate *= 1000;
4217 dc->mode.pclk *= 1000;
4218
4219 if (rate != clk_get_rate(base_clk)) 4268 if (rate != clk_get_rate(base_clk))
4220 clk_set_rate(base_clk, rate); 4269 clk_set_rate(base_clk, rate);
4221 4270
4222 if (clk_get_parent(clk) != parent_clk) 4271 if (clk_get_parent(clk) != parent_clk)
4223 clk_set_parent(clk, parent_clk); 4272 clk_set_parent(clk, parent_clk);
4224 4273
4274skip_setup:
4225 return tegra_dc_pclk_round_rate(dc, dc->mode.pclk); 4275 return tegra_dc_pclk_round_rate(dc, dc->mode.pclk);
4226} 4276}
4227 4277