summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/fb.c
diff options
context:
space:
mode:
authorKevin Huang <kevinh@nvidia.com>2012-04-09 18:03:51 -0700
committerSimone Willett <swillett@nvidia.com>2012-04-11 15:01:37 -0700
commit1827824d541eef3899122e9040e0662042d935d1 (patch)
treea2e2e69a5475cea3e28edbb6affe1261510da0f1 /drivers/video/tegra/fb.c
parent57b208f723b88520608beb37104acf7e264581b3 (diff)
video: tegra: fb: Add interface to nvdps.
Provide /sys/class/graphics/fb0/device/nvdps to change video mode on-the-fly without resetting window layout like fb_set_var(). This allows flicker free changes in refresh rate. nvdps sysfs file takes an integer, and selects the closest matching mode with the same or higher refresh rate. Reading the file displays the current refresh rate. Bug 560152 Change-Id: Id5c1eafaf338b99fa9742202b38ccbfc238b77d5 Signed-off-by: Kevin Huang <kevinh@nvidia.com> Reviewed-on: http://git-master/r/95473 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Jon Mayo <jmayo@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/fb.c')
-rw-r--r--drivers/video/tegra/fb.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/video/tegra/fb.c b/drivers/video/tegra/fb.c
index ac4c84ba9a1c..e24588bdd0b7 100644
--- a/drivers/video/tegra/fb.c
+++ b/drivers/video/tegra/fb.c
@@ -415,6 +415,41 @@ static int tegra_fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long
return 0;
}
+int tegra_fb_get_mode(struct tegra_dc *dc) {
+ return dc->fb->info->mode->refresh;
+}
+
+int tegra_fb_set_mode(struct tegra_dc *dc, int fps) {
+ size_t stereo;
+ struct list_head *pos;
+ struct fb_videomode *best_mode = NULL;
+ int curr_diff = INT_MAX; /* difference of best_mode refresh rate */
+ struct fb_modelist *modelist;
+ struct fb_info *info = dc->fb->info;
+
+ list_for_each(pos, &info->modelist) {
+ struct fb_videomode *mode;
+
+ modelist = list_entry(pos, struct fb_modelist, list);
+ mode = &modelist->mode;
+ if (fps <= mode->refresh && curr_diff > (mode->refresh - fps)) {
+ curr_diff = mode->refresh - fps;
+ best_mode = mode;
+ }
+ }
+ if (best_mode) {
+ info->mode = best_mode;
+ stereo = !!(info->var.vmode & info->mode->vmode &
+#ifndef CONFIG_TEGRA_HDMI_74MHZ_LIMIT
+ FB_VMODE_STEREO_FRAME_PACK);
+#else
+ FB_VMODE_STEREO_LEFT_RIGHT);
+#endif
+ return tegra_dc_set_fb_mode(dc, best_mode, stereo);
+ }
+ return -EIO;
+}
+
static struct fb_ops tegra_fb_ops = {
.owner = THIS_MODULE,
.fb_check_var = tegra_fb_check_var,
@@ -459,6 +494,7 @@ void tegra_fb_update_monspecs(struct tegra_fb_info *fb_info,
memcpy(&fb_info->info->monspecs, specs,
sizeof(fb_info->info->monspecs));
+ fb_info->info->mode = specs->modedb;
for (i = 0; i < specs->modedb_len; i++) {
if (mode_filter) {