diff options
author | David Schalig <dschalig@nvidia.com> | 2011-10-25 19:28:24 +0900 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:49:35 -0800 |
commit | f80e81610f4e2e3a9051b465a9176ac70f6913f1 (patch) | |
tree | 87e9e17de05b511dc97b6c1c9a0fb3b92ee69732 /drivers/video/tegra/fb.c | |
parent | c48cfa76bc9c61ae99b663519075283bd8e290c1 (diff) |
video: tegra: dc: support global fbdev gamma table
Add support to set a global gamma correction table via fbdev cmap
API. The 3 Tegra DC windows have their own local gamma tables, which
can either override or alter the global table.
Bug 868060
Change-Id: I0be1c5e4afa8fd8c010b772c7808c883c0848ab4
Reviewed-on: http://git-master/r/60201
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Tested-by: Varun Colbert <vcolbert@nvidia.com>
Rebase-Id: R7e613b1c8ac469242172bd81db9dfba25176e0c3
Diffstat (limited to 'drivers/video/tegra/fb.c')
-rw-r--r-- | drivers/video/tegra/fb.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/drivers/video/tegra/fb.c b/drivers/video/tegra/fb.c index 7b01f1ef72a2..44be01013beb 100644 --- a/drivers/video/tegra/fb.c +++ b/drivers/video/tegra/fb.c @@ -146,27 +146,28 @@ static int tegra_fb_set_par(struct fb_info *info) return 0; } -static int tegra_fb_setcolreg(unsigned regno, unsigned red, unsigned green, - unsigned blue, unsigned transp, struct fb_info *info) +static int tegra_fb_setcmap(struct fb_cmap *cmap, struct fb_info *info) { - struct fb_var_screeninfo *var = &info->var; + struct tegra_fb_info *tegra_fb = info->par; + struct tegra_dc *dc = tegra_fb->win->dc; + int i; + u16 *red = cmap->red; + u16 *green = cmap->green; + u16 *blue = cmap->blue; + int start = cmap->start; + + if (((unsigned)start > 255) || ((start + cmap->len) > 255)) + return -EINVAL; if (info->fix.visual == FB_VISUAL_TRUECOLOR || info->fix.visual == FB_VISUAL_DIRECTCOLOR) { - u32 v; - - if (regno >= 16) - return -EINVAL; - - red = (red >> (16 - info->var.red.length)); - green = (green >> (16 - info->var.green.length)); - blue = (blue >> (16 - info->var.blue.length)); - - v = (red << var->red.offset) | - (green << var->green.offset) | - (blue << var->blue.offset); + for (i = 0; i < cmap->len; i++) { + dc->fb_lut.r[start+i] = *red++ >> 8; + dc->fb_lut.g[start+i] = *green++ >> 8; + dc->fb_lut.b[start+i] = *blue++ >> 8; + } - ((u32 *)info->pseudo_palette)[regno] = v; + tegra_dc_update_lut(dc, -1, -1); } return 0; @@ -302,7 +303,7 @@ static struct fb_ops tegra_fb_ops = { .owner = THIS_MODULE, .fb_check_var = tegra_fb_check_var, .fb_set_par = tegra_fb_set_par, - .fb_setcolreg = tegra_fb_setcolreg, + .fb_setcmap = tegra_fb_setcmap, .fb_blank = tegra_fb_blank, .fb_pan_display = tegra_fb_pan_display, .fb_fillrect = tegra_fb_fillrect, |