diff options
author | Rakesh Iyer <riyer@nvidia.com> | 2013-02-05 19:04:03 -0500 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:04:01 -0400 |
commit | 9e6be7524d4c81446417316d0e636dc998b18546 (patch) | |
tree | 9562ed0ccd492eeee9add2986fae3a7faa4dd7cb /drivers/video/tegra/dc/dsi.c | |
parent | a9856482c3375cfa401a3662e7e738607097ff13 (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.c | 64 |
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 | ||
3252 | static 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 | |||
3252 | static void _tegra_dc_dsi_enable(struct tegra_dc *dc) | 3289 | static 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 | ||
4274 | skip_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 | ||