[Nouveau] [PATCH 2/7] drm/nouveau: collect switch blocks in nouveau_fbcon.c

Pekka Paalanen pq at iki.fi
Sat Aug 8 00:38:57 PDT 2009


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 <pq at iki.fi>
---
 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



More information about the Nouveau mailing list