summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/fb.c
diff options
context:
space:
mode:
authorXin Xie <xxie@nvidia.com>2011-06-03 20:47:14 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:47:11 -0800
commitd21b89daf5e816d00855133f5e31cd40ce104d9b (patch)
treef0d6b5ce3ced33c0c7641016bf6edc4142b50ffc /drivers/video/tegra/fb.c
parentaf504e4dbb71172136b2db26b2911da57bffc72e (diff)
tegra: dc: set EMC clock dynamically
If the screen is idle (no POST for some time), reduce the DC EMC clock according the windows size. If external display connected, the EMC clock will not be reduced. BUG 828306 Original-Change-Id: I6fb62ce6baf3380737c76b71f16e38ad6465a667 Reviewed-on: http://git-master/r/37106 Reviewed-by: Niket Sirsi <nsirsi@nvidia.com> Tested-by: Niket Sirsi <nsirsi@nvidia.com> Rebase-Id: Re2b2c8b1a57c2a04b61c338b0b50e41d8c11ad65
Diffstat (limited to 'drivers/video/tegra/fb.c')
-rw-r--r--drivers/video/tegra/fb.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/video/tegra/fb.c b/drivers/video/tegra/fb.c
index 913feeb49796..2954661a4064 100644
--- a/drivers/video/tegra/fb.c
+++ b/drivers/video/tegra/fb.c
@@ -279,6 +279,8 @@ static int tegra_fb_pan_display(struct fb_var_screeninfo *var,
tegra_fb->win->phys_addr = addr;
/* TODO: update virt_addr */
+ tegra_dc_set_default_emc(tegra_fb->win->dc);
+ tegra_dc_set_dynamic_emc(&tegra_fb->win, 1);
tegra_dc_update_windows(&tegra_fb->win, 1);
tegra_dc_sync_windows(&tegra_fb->win, 1);
}
@@ -489,6 +491,7 @@ static void tegra_fb_flip_worker(struct work_struct *work)
#endif
}
+ tegra_dc_set_dynamic_emc(wins, nr_win);
tegra_dc_update_windows(wins, nr_win);
/* TODO: implement swapinterval here */
tegra_dc_sync_windows(wins, nr_win);
@@ -546,6 +549,12 @@ static int tegra_fb_flip(struct tegra_fb_info *tegra_fb,
queue_work(tegra_fb->flip_wq, &data->work);
+ /*
+ * Before the queued flip_wq get scheduled, we set the EMC clock to the
+ * default value in order to do FLIP without glitch.
+ */
+ tegra_dc_set_default_emc(tegra_fb->win->dc);
+
args->post_syncpt_val = syncpt_max;
args->post_syncpt_id = tegra_dc_get_syncpt_id(tegra_fb->win->dc);
@@ -840,6 +849,8 @@ struct tegra_fb_info *tegra_fb_register(struct nvhost_device *ndev,
dev_info(&ndev->dev, "probed\n");
if (fb_data->flags & TEGRA_FB_FLIP_ON_PROBE) {
+ tegra_dc_set_default_emc(tegra_fb->win->dc);
+ tegra_dc_set_dynamic_emc(&tegra_fb->win, 1);
tegra_dc_update_windows(&tegra_fb->win, 1);
tegra_dc_sync_windows(&tegra_fb->win, 1);
}