diff options
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, |