The two large switch blocks are refactored into a function. While doing
this, some inconsistencies are corrected:

- in nouveau_fbcon_check_var(), case 30 was writing to a wrong
  structure.

- in nouveau_fbcon_create(), case 16 was missing transp.length.

Signed-off-by: Pekka Paalanen <[email protected]>
---
 drivers/gpu/drm/nouveau/nouveau_fbcon.c |  156 ++++++++++---------------------
 1 files changed, 51 insertions(+), 105 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c 
b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
index bc229cb..7ccadc0 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
@@ -153,46 +153,15 @@ static int nouveau_fbcon_setcolreg(unsigned regno, 
unsigned red, unsigned green,
        return 0;
 }
 
-static int nouveau_fbcon_check_var(struct fb_var_screeninfo *var,
-                                  struct fb_info *info)
+static int nouveau_fbcon_set_color_fields(int depth,
+                                         struct fb_var_screeninfo *var)
 {
-       struct nouveau_fbcon_par *par = info->par;
-       struct nouveau_framebuffer *nouveau_fb = par->nouveau_fb;
-       struct drm_device *dev = par->dev;
-       struct drm_framebuffer *fb = &nouveau_fb->base;
-       int depth;
-
-       /* Need to resize the fb object !!! */
-       if (var->xres > fb->width || var->yres > fb->height) {
-               NV_ERROR(dev, "Requested width/height is greater than current 
fb object %dx%d > %dx%d\n",var->xres,var->yres,fb->width,fb->height);
-               NV_ERROR(dev, "Need resizing code.\n");
-               return -EINVAL;
-       }
-
-       switch (var->bits_per_pixel) {
-       case 16:
-               depth = (var->green.length == 6) ? 16 : 15;
-               break;
-       case 32:
-               if (var->transp.length == 2)
-                       depth = 30;
-               else
-               if (var->transp.length > 0)
-                       depth = 32;
-               else
-                       depth = 24;
-               break;
-       default:
-               depth = var->bits_per_pixel;
-               break;
-       }
-
        switch (depth) {
        case 8:
                var->red.offset = 0;
                var->green.offset = 0;
                var->blue.offset = 0;
-               var->red.length = 8;
+               var->red.length = 8; /* 8-bit DAC */
                var->green.length = 8;
                var->blue.length = 8;
                var->transp.length = 0;
@@ -229,14 +198,14 @@ static int nouveau_fbcon_check_var(struct 
fb_var_screeninfo *var,
                var->transp.offset = 0;
                break;
        case 30:
-               info->var.red.offset = 0;
-               info->var.green.offset = 10;
-               info->var.blue.offset = 20;
-               info->var.red.length = 10;
-               info->var.green.length = 10;
-               info->var.blue.length = 10;
-               info->var.transp.offset = 30;
-               info->var.transp.length = 2;
+               var->red.offset = 0;
+               var->green.offset = 10;
+               var->blue.offset = 20;
+               var->red.length = 10;
+               var->green.length = 10;
+               var->blue.length = 10;
+               var->transp.offset = 30;
+               var->transp.length = 2;
                break;
        case 32:
                var->red.offset = 16;
@@ -251,6 +220,45 @@ static int nouveau_fbcon_check_var(struct 
fb_var_screeninfo *var,
        default:
                return -EINVAL;
        }
+       return 0;
+}
+
+static int nouveau_fbcon_check_var(struct fb_var_screeninfo *var,
+                                  struct fb_info *info)
+{
+       struct nouveau_fbcon_par *par = info->par;
+       struct nouveau_framebuffer *nouveau_fb = par->nouveau_fb;
+       struct drm_device *dev = par->dev;
+       struct drm_framebuffer *fb = &nouveau_fb->base;
+       int depth;
+
+       /* Need to resize the fb object !!! */
+       if (var->xres > fb->width || var->yres > fb->height) {
+               NV_ERROR(dev, "Requested width/height is greater than current 
fb object %dx%d > %dx%d\n",var->xres,var->yres,fb->width,fb->height);
+               NV_ERROR(dev, "Need resizing code.\n");
+               return -EINVAL;
+       }
+
+       switch (var->bits_per_pixel) {
+       case 16:
+               depth = (var->green.length == 6) ? 16 : 15;
+               break;
+       case 32:
+               if (var->transp.length == 2)
+                       depth = 30;
+               else
+               if (var->transp.length > 0)
+                       depth = 32;
+               else
+                       depth = 24;
+               break;
+       default:
+               depth = var->bits_per_pixel;
+               break;
+       }
+
+       if (nouveau_fbcon_set_color_fields(depth, var))
+               return -EINVAL;
 
        return 0;
 }
@@ -606,69 +614,7 @@ static int nouveau_fbcon_create(struct drm_device *dev, 
uint32_t fb_width,
        info->pixmap.flags = FB_PIXMAP_SYSTEM;
        info->pixmap.scan_align = 1;
 
-       switch(fb->depth) {
-       case 8:
-               info->var.red.offset = 0;
-               info->var.green.offset = 0;
-               info->var.blue.offset = 0;
-               info->var.red.length = 8; /* 8bit DAC */
-               info->var.green.length = 8;
-               info->var.blue.length = 8;
-               info->var.transp.offset = 0;
-               info->var.transp.length = 0;
-               break;
-       case 15:
-               info->var.red.offset = 10;
-               info->var.green.offset = 5;
-               info->var.blue.offset = 0;
-               info->var.red.length = 5;
-               info->var.green.length = 5;
-               info->var.blue.length = 5;
-               info->var.transp.offset = 15;
-               info->var.transp.length = 1;
-               break;
-       case 16:
-               info->var.red.offset = 11;
-               info->var.green.offset = 5;
-               info->var.blue.offset = 0;
-               info->var.red.length = 5;
-               info->var.green.length = 6;
-               info->var.blue.length = 5;
-               info->var.transp.offset = 0;
-               break;
-       case 24:
-               info->var.red.offset = 16;
-               info->var.green.offset = 8;
-               info->var.blue.offset = 0;
-               info->var.red.length = 8;
-               info->var.green.length = 8;
-               info->var.blue.length = 8;
-               info->var.transp.offset = 0;
-               info->var.transp.length = 0;
-               break;
-       case 30:
-               info->var.red.offset = 0;
-               info->var.green.offset = 10;
-               info->var.blue.offset = 20;
-               info->var.red.length = 10;
-               info->var.green.length = 10;
-               info->var.blue.length = 10;
-               info->var.transp.offset = 30;
-               info->var.transp.length = 2;
-               break;
-       case 32:
-               info->var.red.offset = 16;
-               info->var.green.offset = 8;
-               info->var.blue.offset = 0;
-               info->var.red.length = 8;
-               info->var.green.length = 8;
-               info->var.blue.length = 8;
-               info->var.transp.offset = 24;
-               info->var.transp.length = 8;
-               break;
-       default:
-               break;
-       }
+       nouveau_fbcon_set_color_fields(fb->depth, &info->var);
 
        fb->fbdev = info;
 
-- 
1.6.3.3

_______________________________________________
Nouveau mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to