diff options
author | Rakesh Iyer <riyer@nvidia.com> | 2012-06-19 17:46:00 -0700 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-07-01 09:14:56 -0700 |
commit | 39885f81c383e7df335753730d12e1c293af9b0c (patch) | |
tree | 756e8b05c843d0ef0b650aefb14dc989d7178a22 /drivers/video/tegra/dc | |
parent | 8484091b29b9f4a7f0e305fa4e1085a66753393e (diff) |
video: tegra: dsi: 720p panel power fix
Send specified DC frames to 720p panel during power up/down sequencing.
Bug 997484.
Change-Id: I3927e98322ec93f68cabf635c71485b64750d7f9
Signed-off-by: Rakesh Iyer <riyer@nvidia.com>
Reviewed-on: http://git-master/r/109917
(cherry picked from commit e1d10bc056031fbc2f68101978d76317c44fc7af)
Reviewed-on: http://git-master/r/111944
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Animesh Kishore <ankishore@nvidia.com>
Reviewed-by: Jon Mayo <jmayo@nvidia.com>
GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/video/tegra/dc')
-rw-r--r-- | drivers/video/tegra/dc/dsi.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c index e8e7eceeeaf8..3c00b3150f47 100644 --- a/drivers/video/tegra/dc/dsi.c +++ b/drivers/video/tegra/dc/dsi.c @@ -2615,6 +2615,53 @@ fail: } +static void tegra_dsi_send_dc_frames(struct tegra_dc *dc, + struct tegra_dc_dsi_data *dsi, + int no_of_frames) +{ + int err; + u32 frame_period = DIV_ROUND_UP(S_TO_MS(1), dsi->info.refresh_rate); + u8 lp_op = dsi->status.lp_op; + bool switch_to_lp = (dsi->status.lphs == DSI_LPHS_IN_LP_MODE); + + if (dsi->status.lphs != DSI_LPHS_IN_HS_MODE) { + err = tegra_dsi_set_to_hs_mode(dc, dsi); + if (err < 0) { + dev_err(&dc->ndev->dev, + "Switch to HS host mode failed\n"); + return; + } + } + + /* + * Some panels need DC frames be sent under certain + * conditions. We are working on the right fix for this + * requirement, while using this current fix. + */ + tegra_dsi_start_dc_stream(dc, dsi); + + /* + * Send frames in Continuous or One-shot mode. + */ + if (dc->out->flags & TEGRA_DC_OUT_ONE_SHOT_MODE) { + while (no_of_frames--) { + tegra_dc_writel(dc, GENERAL_ACT_REQ | NC_HOST_TRIG, + DC_CMD_STATE_CONTROL); + mdelay(frame_period); + } + } else + mdelay(no_of_frames * frame_period); + + tegra_dsi_stop_dc_stream_at_frame_end(dc, dsi); + + if (switch_to_lp) { + err = tegra_dsi_set_to_lp_mode(dc, dsi, lp_op); + if (err < 0) + dev_err(&dc->ndev->dev, + "DSI failed to go to LP mode\n"); + } +} + static void tegra_dc_dsi_enable(struct tegra_dc *dc) { struct tegra_dc_dsi_data *dsi = tegra_dc_get_outdata(dc); @@ -2642,6 +2689,13 @@ static void tegra_dc_dsi_enable(struct tegra_dc *dc) } if (dsi->info.panel_reset) { + /* + * Certain panels need dc frames be sent before + * waking panel. + */ + if (dsi->info.panel_send_dc_frames) + tegra_dsi_send_dc_frames(dc, dsi, 2); + err = tegra_dsi_send_panel_cmd(dc, dsi, dsi->info.dsi_init_cmd, dsi->info.n_init_cmd); @@ -2695,6 +2749,13 @@ static void tegra_dc_dsi_enable(struct tegra_dc *dc) } } + /* + * Certain panels need dc frames be sent before + * waking panel. + */ + if (dsi->info.panel_send_dc_frames) + tegra_dsi_send_dc_frames(dc, dsi, 2); + err = tegra_dsi_set_to_lp_mode(dc, dsi, DSI_LP_OP_WRITE); if (err < 0) { dev_err(&dc->ndev->dev, @@ -3065,6 +3126,13 @@ static int tegra_dsi_deep_sleep(struct tegra_dc *dc, err = tegra_dsi_send_panel_cmd(dc, dsi, dsi->info.dsi_suspend_cmd, dsi->info.n_suspend_cmd); + /* + * Certain panels need dc frames be sent after + * putting panel to sleep. + */ + if (dsi->info.panel_send_dc_frames) + tegra_dsi_send_dc_frames(dc, dsi, 2); + if (err < 0) { dev_err(&dc->ndev->dev, "dsi: Error sending suspend cmd\n"); |