74606f9f9286798d083cf36b205d95513e326629
[openwrt/openwrt.git] / target / linux / brcm2708 / patches-3.14 / 0054-fb-distinguish-physical-and-bus-addresses.patch
1 From 2bdcc63f2648ad4dfa88aaf035e025b2b193a1cc Mon Sep 17 00:00:00 2001
2 From: popcornmix <popcornmix@gmail.com>
3 Date: Fri, 9 May 2014 15:45:13 +0100
4 Subject: [PATCH 54/54] fb: distinguish physical and bus addresses
5
6 ---
7 drivers/video/bcm2708_fb.c | 15 +++++++++------
8 1 file changed, 9 insertions(+), 6 deletions(-)
9
10 diff --git a/drivers/video/bcm2708_fb.c b/drivers/video/bcm2708_fb.c
11 index 798eb52..b3b1e04 100644
12 --- a/drivers/video/bcm2708_fb.c
13 +++ b/drivers/video/bcm2708_fb.c
14 @@ -89,6 +89,7 @@ struct bcm2708_fb {
15 struct dentry *debugfs_dir;
16 wait_queue_head_t dma_waitq;
17 struct bcm2708_fb_stats stats;
18 + unsigned long fb_bus_address;
19 };
20
21 #define to_bcm2708(info) container_of(info, struct bcm2708_fb, fb)
22 @@ -314,13 +315,15 @@ static int bcm2708_fb_set_par(struct fb_info *info)
23 else
24 fb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
25
26 + fb->fb_bus_address = fbinfo->base;
27 + fbinfo->base &= ~0xc0000000;
28 fb->fb.fix.smem_start = fbinfo->base;
29 fb->fb.fix.smem_len = fbinfo->pitch * fbinfo->yres_virtual;
30 fb->fb.screen_size = fbinfo->screen_size;
31 if (fb->fb.screen_base)
32 iounmap(fb->fb.screen_base);
33 fb->fb.screen_base =
34 - (void *)ioremap_wc(fb->fb.fix.smem_start, fb->fb.screen_size);
35 + (void *)ioremap_wc(fbinfo->base, fb->fb.screen_size);
36 if (!fb->fb.screen_base) {
37 /* the console may currently be locked */
38 console_trylock();
39 @@ -331,7 +334,7 @@ static int bcm2708_fb_set_par(struct fb_info *info)
40 }
41 print_debug
42 ("BCM2708FB: start = %p,%p width=%d, height=%d, bpp=%d, pitch=%d size=%d success=%d\n",
43 - (void *)fb->fb.screen_base, (void *)fb->fb.fix.smem_start,
44 + (void *)fb->fb.screen_base, (void *)fb->fb_bus_address,
45 fbinfo->xres, fbinfo->yres, fbinfo->bpp,
46 fbinfo->pitch, (int)fb->fb.screen_size, val);
47
48 @@ -457,11 +460,11 @@ static void bcm2708_fb_copyarea(struct fb_info *info,
49
50 for (y = 0; y < region->height; y += scanlines_per_cb) {
51 dma_addr_t src =
52 - fb->fb.fix.smem_start +
53 + fb->fb_bus_address +
54 bytes_per_pixel * region->sx +
55 (region->sy + y) * fb->fb.fix.line_length;
56 dma_addr_t dst =
57 - fb->fb.fix.smem_start +
58 + fb->fb_bus_address +
59 bytes_per_pixel * region->dx +
60 (region->dy + y) * fb->fb.fix.line_length;
61
62 @@ -499,10 +502,10 @@ static void bcm2708_fb_copyarea(struct fb_info *info,
63 stride = -fb->fb.fix.line_length;
64 }
65 set_dma_cb(cb, burst_size,
66 - fb->fb.fix.smem_start + dy * fb->fb.fix.line_length +
67 + fb->fb_bus_address + dy * fb->fb.fix.line_length +
68 bytes_per_pixel * region->dx,
69 stride,
70 - fb->fb.fix.smem_start + sy * fb->fb.fix.line_length +
71 + fb->fb_bus_address + sy * fb->fb.fix.line_length +
72 bytes_per_pixel * region->sx,
73 stride,
74 region->width * bytes_per_pixel,
75 --
76 1.9.1
77