summaryrefslogtreecommitdiffstats
path: root/meta/recipes-kernel/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-kernel/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch')
-rw-r--r--meta/recipes-kernel/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch236
1 files changed, 236 insertions, 0 deletions
diff --git a/meta/recipes-kernel/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch b/meta/recipes-kernel/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch
new file mode 100644
index 0000000000..6400da3c24
--- /dev/null
+++ b/meta/recipes-kernel/linux/linux-omap-2.6.29/dss2/0028-DSS2-OMAPFB-Added-support-for-the-YUV-VRFB-rotatio.patch
@@ -0,0 +1,236 @@
1From c09f1a0642fd58a1b081594ea36dfd1bf71aec52 Mon Sep 17 00:00:00 2001
2From: Hardik Shah <hardik.shah@ti.com>
3Date: Thu, 9 Apr 2009 12:13:07 +0530
4Subject: [PATCH] DSS2: OMAPFB: Added support for the YUV VRFB rotation and mirroring.
5
6DSS2 now requires roatation_type to be specified by driver.
7Added support for that.
8DSS2 OMAPFB: Modified to pass the dss mode to omap_vrfb_setup function.
9
10VRFB size register requires the width to be halved when the
11mode is YUV or UYVY. So VRFB is modifed to pass the mode to omap_vrfb_setup
12function.
13
14Few changes done by Tim Yamin
15Signed-off-by: Tim Yamin <plasm@roo.me.uk>
16Signed-off-by: Hardik Shah <hardik.shah@ti.com>
17---
18 arch/arm/plat-omap/vrfb.c | 4 +-
19 drivers/video/omap2/omapfb/omapfb-main.c | 59 ++++++++++++++----------------
20 drivers/video/omap2/omapfb/omapfb.h | 7 +---
21 3 files changed, 30 insertions(+), 40 deletions(-)
22
23diff --git a/arch/arm/plat-omap/vrfb.c b/arch/arm/plat-omap/vrfb.c
24index 2f08f6d..2ae0d68 100644
25--- a/arch/arm/plat-omap/vrfb.c
26+++ b/arch/arm/plat-omap/vrfb.c
27@@ -88,9 +88,9 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
28 color_mode == OMAP_DSS_COLOR_UYVY)
29 width >>= 1;
30
31- if (bytespp == 4) {
32+ if (bytespp == 4)
33 pixel_size_exp = 2;
34- } else if (bytespp == 2)
35+ else if (bytespp == 2)
36 pixel_size_exp = 1;
37 else
38 BUG();
39diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
40index 67c67c2..57f5900 100644
41--- a/drivers/video/omap2/omapfb/omapfb-main.c
42+++ b/drivers/video/omap2/omapfb/omapfb-main.c
43@@ -176,15 +176,9 @@ static unsigned omapfb_get_vrfb_offset(struct omapfb_info *ofbi, int rot)
44
45 static u32 omapfb_get_region_rot_paddr(struct omapfb_info *ofbi)
46 {
47- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) {
48- unsigned offset;
49- int rot;
50-
51- rot = ofbi->rotation;
52-
53- offset = omapfb_get_vrfb_offset(ofbi, rot);
54-
55- return ofbi->region.vrfb.paddr[rot] + offset;
56+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
57+ return ofbi->region.vrfb.paddr[ofbi->rotation]
58+ + omapfb_get_vrfb_offset(ofbi, ofbi->rotation);
59 } else {
60 return ofbi->region.paddr;
61 }
62@@ -192,7 +186,7 @@ static u32 omapfb_get_region_rot_paddr(struct omapfb_info *ofbi)
63
64 u32 omapfb_get_region_paddr(struct omapfb_info *ofbi)
65 {
66- if (ofbi->rotation_type == OMAPFB_ROT_VRFB)
67+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB)
68 return ofbi->region.vrfb.paddr[0];
69 else
70 return ofbi->region.paddr;
71@@ -200,7 +194,7 @@ u32 omapfb_get_region_paddr(struct omapfb_info *ofbi)
72
73 void __iomem *omapfb_get_region_vaddr(struct omapfb_info *ofbi)
74 {
75- if (ofbi->rotation_type == OMAPFB_ROT_VRFB)
76+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB)
77 return ofbi->region.vrfb.vaddr[0];
78 else
79 return ofbi->region.vaddr;
80@@ -398,7 +392,7 @@ void set_fb_fix(struct fb_info *fbi)
81 fbi->screen_base = (char __iomem *)omapfb_get_region_vaddr(ofbi);
82
83 /* used by mmap in fbmem.c */
84- if (ofbi->rotation_type == OMAPFB_ROT_VRFB)
85+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB)
86 fix->line_length =
87 (OMAP_VRFB_LINE_LEN * var->bits_per_pixel) >> 3;
88 else
89@@ -434,11 +428,14 @@ void set_fb_fix(struct fb_info *fbi)
90 fix->xpanstep = 1;
91 fix->ypanstep = 1;
92
93- if (rg->size) {
94- if (ofbi->rotation_type == OMAPFB_ROT_VRFB)
95- omap_vrfb_setup(&rg->vrfb, rg->paddr,
96- var->xres_virtual, var->yres_virtual,
97- var->bits_per_pixel >> 3);
98+ if (rg->size && ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
99+ enum omap_color_mode mode = 0;
100+ mode = fb_mode_to_dss_mode(var);
101+
102+ omap_vrfb_setup(&rg->vrfb, rg->paddr,
103+ var->xres_virtual,
104+ var->yres_virtual,
105+ mode);
106 }
107 }
108
109@@ -527,7 +524,7 @@ int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var)
110 if (var->yres > var->yres_virtual)
111 var->yres = var->yres_virtual;
112
113- if (ofbi->rotation_type == OMAPFB_ROT_VRFB)
114+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB)
115 line_size = OMAP_VRFB_LINE_LEN * bytespp;
116 else
117 line_size = var->xres_virtual * bytespp;
118@@ -549,7 +546,7 @@ int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var)
119
120 if (line_size * var->yres_virtual > max_frame_size) {
121 DBG("can't fit FB into memory, reducing x\n");
122- if (ofbi->rotation_type == OMAPFB_ROT_VRFB)
123+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB)
124 return -EINVAL;
125
126 var->xres_virtual = max_frame_size / var->yres_virtual /
127@@ -672,7 +669,7 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl,
128 struct omap_overlay_info info;
129 int xres, yres;
130 int screen_width;
131- int rot, mirror;
132+ int mirror;
133
134 DBG("setup_overlay %d, posx %d, posy %d, outw %d, outh %d\n", ofbi->id,
135 posx, posy, outw, outh);
136@@ -688,7 +685,7 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl,
137 offset = ((var->yoffset * var->xres_virtual +
138 var->xoffset) * var->bits_per_pixel) >> 3;
139
140- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) {
141+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
142 data_start_p = omapfb_get_region_rot_paddr(ofbi);
143 data_start_v = NULL;
144 } else {
145@@ -711,13 +708,10 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl,
146
147 ovl->get_overlay_info(ovl, &info);
148
149- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) {
150- rot = 0;
151+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB)
152 mirror = 0;
153- } else {
154- rot = ofbi->rotation;
155+ else
156 mirror = ofbi->mirror;
157- }
158
159 info.paddr = data_start_p;
160 info.vaddr = data_start_v;
161@@ -725,7 +719,8 @@ static int omapfb_setup_overlay(struct fb_info *fbi, struct omap_overlay *ovl,
162 info.width = xres;
163 info.height = yres;
164 info.color_mode = mode;
165- info.rotation = rot;
166+ info.rotation_type = ofbi->rotation_type;
167+ info.rotation = ofbi->rotation;
168 info.mirror = mirror;
169
170 info.pos_x = posx;
171@@ -1121,7 +1116,7 @@ static void omapfb_free_fbmem(struct fb_info *fbi)
172 if (rg->vaddr)
173 iounmap(rg->vaddr);
174
175- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) {
176+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
177 /* unmap the 0 angle rotation */
178 if (rg->vrfb.vaddr[0]) {
179 iounmap(rg->vrfb.vaddr[0]);
180@@ -1181,7 +1176,7 @@ static int omapfb_alloc_fbmem(struct fb_info *fbi, unsigned long size,
181 return -ENOMEM;
182 }
183
184- if (ofbi->rotation_type != OMAPFB_ROT_VRFB) {
185+ if (ofbi->rotation_type != OMAP_DSS_ROT_VRFB) {
186 vaddr = ioremap_wc(paddr, size);
187
188 if (!vaddr) {
189@@ -1260,7 +1255,7 @@ static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size,
190
191 display->get_resolution(display, &w, &h);
192
193- if (ofbi->rotation_type == OMAPFB_ROT_VRFB) {
194+ if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) {
195 #ifdef DEBUG
196 int oldw = w, oldh = h;
197 #endif
198@@ -1701,8 +1696,8 @@ static int omapfb_create_framebuffers(struct omapfb2_device *fbdev)
199 ofbi->id = i;
200
201 /* assign these early, so that fb alloc can use them */
202- ofbi->rotation_type = def_vrfb ? OMAPFB_ROT_VRFB :
203- OMAPFB_ROT_DMA;
204+ ofbi->rotation_type = def_vrfb ? OMAP_DSS_ROT_VRFB :
205+ OMAP_DSS_ROT_DMA;
206 ofbi->rotation = def_rotate;
207 ofbi->mirror = def_mirror;
208
209diff --git a/drivers/video/omap2/omapfb/omapfb.h b/drivers/video/omap2/omapfb/omapfb.h
210index 2607def..43f6922 100644
211--- a/drivers/video/omap2/omapfb/omapfb.h
212+++ b/drivers/video/omap2/omapfb/omapfb.h
213@@ -53,11 +53,6 @@ struct omapfb2_mem_region {
214 bool map; /* kernel mapped by the driver */
215 };
216
217-enum omapfb_rotation_type {
218- OMAPFB_ROT_DMA = 0,
219- OMAPFB_ROT_VRFB = 1,
220-};
221-
222 /* appended to fb_info */
223 struct omapfb_info {
224 int id;
225@@ -66,7 +61,7 @@ struct omapfb_info {
226 int num_overlays;
227 struct omap_overlay *overlays[OMAPFB_MAX_OVL_PER_FB];
228 struct omapfb2_device *fbdev;
229- enum omapfb_rotation_type rotation_type;
230+ enum omap_dss_rotation_type rotation_type;
231 u8 rotation;
232 bool mirror;
233 };
234--
2351.5.6.5
236