summaryrefslogtreecommitdiffstats
path: root/target/linux/brcm2708/patches-3.14/0054-fb-distinguish-physical-and-bus-addresses.patch
blob: 661bdc60d64dc76c6b97532a05daa3c073267c30 (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
From 2bdcc63f2648ad4dfa88aaf035e025b2b193a1cc Mon Sep 17 00:00:00 2001
From: popcornmix <popcornmix@gmail.com>
Date: Fri, 9 May 2014 15:45:13 +0100
Subject: [PATCH 54/54] fb: distinguish physical and bus addresses

---
 drivers/video/bcm2708_fb.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

--- a/drivers/video/bcm2708_fb.c
+++ b/drivers/video/bcm2708_fb.c
@@ -89,6 +89,7 @@ struct bcm2708_fb {
 	struct dentry *debugfs_dir;
 	wait_queue_head_t dma_waitq;
 	struct bcm2708_fb_stats stats;
+	unsigned long fb_bus_address;
 };
 
 #define to_bcm2708(info)	container_of(info, struct bcm2708_fb, fb)
@@ -314,13 +315,15 @@ static int bcm2708_fb_set_par(struct fb_
 		else
 			fb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
 
+		fb->fb_bus_address = fbinfo->base;
+		fbinfo->base &= ~0xc0000000;
 		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);
+			(void *)ioremap_wc(fbinfo->base, fb->fb.screen_size);
 		if (!fb->fb.screen_base) {
 			/* the console may currently be locked */
 			console_trylock();
@@ -331,7 +334,7 @@ static int bcm2708_fb_set_par(struct fb_
 	}
 	print_debug
 	    ("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 *)fb->fb.screen_base, (void *)fb->fb_bus_address,
 	     fbinfo->xres, fbinfo->yres, fbinfo->bpp,
 	     fbinfo->pitch, (int)fb->fb.screen_size, val);
 
@@ -457,11 +460,11 @@ static void bcm2708_fb_copyarea(struct f
 
 		for (y = 0; y < region->height; y += scanlines_per_cb) {
 			dma_addr_t src =
-				fb->fb.fix.smem_start +
+				fb->fb_bus_address +
 				bytes_per_pixel * region->sx +
 				(region->sy + y) * fb->fb.fix.line_length;
 			dma_addr_t dst =
-				fb->fb.fix.smem_start +
+				fb->fb_bus_address +
 				bytes_per_pixel * region->dx +
 				(region->dy + y) * fb->fb.fix.line_length;
 
@@ -499,10 +502,10 @@ static void bcm2708_fb_copyarea(struct f
 			stride = -fb->fb.fix.line_length;
 		}
 		set_dma_cb(cb, burst_size,
-			   fb->fb.fix.smem_start + dy * fb->fb.fix.line_length +
+			   fb->fb_bus_address + dy * fb->fb.fix.line_length +
 						   bytes_per_pixel * region->dx,
 			   stride,
-			   fb->fb.fix.smem_start + sy * fb->fb.fix.line_length +
+			   fb->fb_bus_address + sy * fb->fb.fix.line_length +
 						   bytes_per_pixel * region->sx,
 			   stride,
 			   region->width * bytes_per_pixel,