From 683d3f2a8f3df1547715f784e6fde0a67d7c261a Mon Sep 17 00:00:00 2001 From: Sergey Kudakov Date: Thu, 21 Oct 2010 17:55:50 -0500 Subject: [PATCH] video: tegra: reset default window in release Change-Id: I242e9fac525472c5c20f213a6de516f95b2f6a12 Cc: Sergey Kudakov Signed-off-by: Erik Gilling --- drivers/video/tegra/fb.c | 44 ++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/video/tegra/fb.c b/drivers/video/tegra/fb.c index cc26c5977a20..5d6a11a4ba55 100644 --- a/drivers/video/tegra/fb.c +++ b/drivers/video/tegra/fb.c @@ -89,9 +89,27 @@ static int tegra_fb_open(struct fb_info *info, int user) static int tegra_fb_release(struct fb_info *info, int user) { struct tegra_fb_info *tegra_fb = info->par; + struct fb_var_screeninfo *var = &info->var; flush_workqueue(tegra_fb->flip_wq); + if (tegra_fb->win->cur_handle) { + nvmap_unpin(tegra_fb->fb_nvmap, tegra_fb->win->cur_handle); + nvmap_free(tegra_fb->fb_nvmap, tegra_fb->win->cur_handle); + + tegra_fb->win->cur_handle = NULL; + + tegra_fb->win->x = 0; + tegra_fb->win->y = 0; + tegra_fb->win->w = var->xres; + tegra_fb->win->h = var->yres; + tegra_fb->win->out_x = 0; + tegra_fb->win->out_y = 0; + tegra_fb->win->out_w = var->xres; + tegra_fb->win->out_h = var->yres; + tegra_fb->win->flags = TEGRA_WIN_FLAG_ENABLED; + } + if (tegra_fb->user_nvmap) { nvmap_client_put(tegra_fb->user_nvmap); tegra_fb->user_nvmap = NULL; @@ -247,25 +265,21 @@ static int tegra_fb_pan_display(struct fb_var_screeninfo *var, char __iomem *flush_end; u32 addr; - flush_start = info->screen_base + (var->yoffset * info->fix.line_length); - flush_end = flush_start + (var->yres * info->fix.line_length); - - info->var.xoffset = var->xoffset; - info->var.yoffset = var->yoffset; + if (!tegra_fb->win->cur_handle) { + flush_start = info->screen_base + (var->yoffset * info->fix.line_length); + flush_end = flush_start + (var->yres * info->fix.line_length); - addr = info->fix.smem_start + (var->yoffset * info->fix.line_length) + - (var->xoffset * (var->bits_per_pixel/8)); + info->var.xoffset = var->xoffset; + info->var.yoffset = var->yoffset; - tegra_fb->win->phys_addr = addr; - /* TODO: update virt_addr */ + addr = info->fix.smem_start + (var->yoffset * info->fix.line_length) + + (var->xoffset * (var->bits_per_pixel/8)); - tegra_dc_update_windows(&tegra_fb->win, 1); - tegra_dc_sync_windows(&tegra_fb->win, 1); + tegra_fb->win->phys_addr = addr; + /* TODO: update virt_addr */ - if (WARN_ON(tegra_fb->win->cur_handle)) { - nvmap_unpin(tegra_fb->fb_nvmap, tegra_fb->win->cur_handle); - nvmap_free(tegra_fb->fb_nvmap, tegra_fb->win->cur_handle); - tegra_fb->win->cur_handle = NULL; + tegra_dc_update_windows(&tegra_fb->win, 1); + tegra_dc_sync_windows(&tegra_fb->win, 1); } return 0; -- 2.34.1