summaryrefslogtreecommitdiffstats
path: root/patches/linux-3.2.27/0013-Fix-32bpp-framebuffer-by-adding-alpha-bits.patch
blob: a56eb05a9f00f22ba6b3f6e5bfaec8f5bf9e15e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
From: Dom Cobley <dc4@broadcom.com>
Date: Wed, 7 Mar 2012 23:21:01 +0000
Subject: [PATCH] Fix 32bpp framebuffer by adding alpha bits

---
 drivers/video/bcm2708_fb.c |   65 ++++++++++++++++++--------------------------
 1 file changed, 26 insertions(+), 39 deletions(-)

diff --git a/drivers/video/bcm2708_fb.c b/drivers/video/bcm2708_fb.c
index 8612266..8512ce0 100644
--- a/drivers/video/bcm2708_fb.c
+++ b/drivers/video/bcm2708_fb.c
@@ -96,6 +96,7 @@ static int bcm2708_fb_set_bitfields(struct fb_var_screeninfo *var)
 		var->red.length = 8;
 		var->green.length = 8;
 		var->blue.length = 8;
+		var->transp.length = 8;
 		break;
 	default:
 		ret = -EINVAL;
@@ -111,6 +112,7 @@ static int bcm2708_fb_set_bitfields(struct fb_var_screeninfo *var)
 		var->blue.offset = 0;
 		var->green.offset = var->blue.offset + var->blue.length;
 		var->red.offset = var->green.offset + var->green.length;
+		var->transp.offset = var->red.offset + var->red.length;
 	}
 
 	return ret;
@@ -119,7 +121,6 @@ static int bcm2708_fb_set_bitfields(struct fb_var_screeninfo *var)
 static int bcm2708_fb_check_var(struct fb_var_screeninfo *var,
 				struct fb_info *info)
 {
-
 	/* info input, var output */
 	int yres;
 	/* memory size in pixels */
@@ -137,13 +138,12 @@ static int bcm2708_fb_check_var(struct fb_var_screeninfo *var,
 	if (!var->bits_per_pixel)
 		var->bits_per_pixel = 16;
 
-	if (0 && var->bits_per_pixel != 16 && var->bits_per_pixel != 32) {
-		pr_err("bcm2708_fb_check_var: ERROR: bits_per_pixel=%d\n",
-		       var->bits_per_pixel);
+	if (bcm2708_fb_set_bitfields(var) != 0) {
+		pr_err("bcm2708_fb_check_var: invalid bits_per_pixel %d\n",
+		     var->bits_per_pixel);
 		return -EINVAL;
 	}
 
-	bcm2708_fb_set_bitfields(var);
 
 	if (var->xres_virtual < var->xres)
 		var->xres_virtual = var->xres;
@@ -158,15 +158,6 @@ static int bcm2708_fb_check_var(struct fb_var_screeninfo *var,
 	if (var->yres_virtual < var->yres)
 		var->yres_virtual = var->yres;
 
-#if 0
-	if (var->xres_virtual * var->yres_virtual > pixels) {
-		pr_err("bcm2708_fb_check_var: mode %dx%dx%d rejected... "
-		       "virtual resolution too high to fit into video memory!\n",
-		       var->xres_virtual, var->yres_virtual,
-		       var->bits_per_pixel);
-		return -EINVAL;
-	}
-#endif
 	if (var->xoffset < 0)
 		var->xoffset = 0;
 	if (var->yoffset < 0)
@@ -178,11 +169,6 @@ static int bcm2708_fb_check_var(struct fb_var_screeninfo *var,
 	if (var->yoffset > var->yres_virtual - var->yres)
 		var->yoffset = var->yres_virtual - var->yres - 1;
 
-	var->red.msb_right =
-	    var->green.msb_right =
-	    var->blue.msb_right =
-	    var->transp.offset = var->transp.length = var->transp.msb_right = 0;
-
 	yres = var->yres;
 	if (var->vmode & FB_VMODE_DOUBLE)
 		yres *= 2;
@@ -230,28 +216,29 @@ static int bcm2708_fb_set_par(struct fb_info *info)
 	/* ensure GPU writes are visible to us */
 	rmb();
 
-	fb->fb.fix.line_length = fbinfo->pitch;
-
-	if (info->var.bits_per_pixel <= 8)
-		fb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR;
-	else
-		fb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
-
-	fb->fb.fix.smem_start = fbinfo->base;
-	fb->fb.fix.smem_len = fbinfo->pitch * fbinfo->yres_virtual;
-	fb->fb.screen_size = fbinfo->screen_size;
-	if (fb->fb.screen_base)
-		iounmap(fb->fb.screen_base);
-	fb->fb.screen_base =
-	    (void *)ioremap_nocache(fb->fb.fix.smem_start, fb->fb.screen_size);
-	if (!fb->fb.screen_base)
-		BUG();		/* what can we do here */
-
+        if (val == 0) {
+		fb->fb.fix.line_length = fbinfo->pitch;
+
+		if (info->var.bits_per_pixel <= 8)
+			fb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR;
+		else
+			fb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
+
+		fb->fb.fix.smem_start = fbinfo->base;
+		fb->fb.fix.smem_len = fbinfo->pitch * fbinfo->yres_virtual;
+		fb->fb.screen_size = fbinfo->screen_size;
+		if (fb->fb.screen_base)
+			iounmap(fb->fb.screen_base);
+		fb->fb.screen_base =
+			(void *)ioremap_wc(fb->fb.fix.smem_start, fb->fb.screen_size);
+		if (!fb->fb.screen_base)
+			BUG();		/* what can we do here */
+	}
 	pr_info
-	    ("BCM2708FB: start = %p,%p,%p width=%d, height=%d, bpp=%d, pitch=%d\n",
+	    ("BCM2708FB: start = %p,%p width=%d, height=%d, bpp=%d, pitch=%d size=%d success=%d\n",
 	     (void *)fb->fb.screen_base, (void *)fb->fb.fix.smem_start,
-	     (void *)val, fbinfo->xres, fbinfo->yres, fbinfo->bpp,
-	     fbinfo->pitch);
+	     fbinfo->xres, fbinfo->yres, fbinfo->bpp,
+	     fbinfo->pitch, fb->fb.screen_size, val);
 
 	return val;
 }