aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>2010-03-10 18:21:34 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2010-03-12 18:52:33 -0500
commit5c9443ed284fc6ec8a4f702c66e9ad6bdf912c05 (patch)
tree3eee936484402bcaf06c99e593707ca256e305aa
parentee79d54db45bb5e6da3eb76bae162c920aeb9763 (diff)
viafb: make viafb_set_par more dual framebuffer compatible
This patch is an attempt to make viafb_set_par work correctly with more than one framebuffer. As modesetting is not (yet/easily) possible for each individual IGA it uses the (normally to be avoided) global variables viafbinfo{,1} to ensure that each function is called with the correct values. This patch (finally) allows usable dual framebuffer setups and should not affect non dual fb ones. It works in some (most?) configurations as sometimes the driver still gets device connections wrong. It can be worth to try the devices in reverse order (in viafb_active_dev). The user experience is still not very nice as: - on the second fb you'll normally have a garbled picture as long as no application draws to it goal: auto on/off devices depending on reference counting - as the whole machinery is always done you can see mode changes also in an unaffected framebuffer goal: split modesetting up for each individual IGA Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de> Cc: Scott Fang <ScottFang@viatech.com.cn> Cc: Joseph Chan <JosephChan@via.com.tw> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/video/via/viafbdev.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
index b417259868a8..b1569a73e4bd 100644
--- a/drivers/video/via/viafbdev.c
+++ b/drivers/video/via/viafbdev.c
@@ -160,11 +160,17 @@ static int viafb_set_par(struct fb_info *info)
160 DEBUG_MSG(KERN_INFO "viafb_set_par!\n"); 160 DEBUG_MSG(KERN_INFO "viafb_set_par!\n");
161 161
162 viapar->depth = fb_get_color_depth(&info->var, &info->fix); 162 viapar->depth = fb_get_color_depth(&info->var, &info->fix);
163 viafb_update_device_setting(info->var.xres, info->var.yres, 163 viafb_update_device_setting(viafbinfo->var.xres, viafbinfo->var.yres,
164 info->var.bits_per_pixel, viafb_refresh, 0); 164 viafbinfo->var.bits_per_pixel, viafb_refresh, 0);
165 165
166 vmode_entry = viafb_get_mode(info->var.xres, info->var.yres); 166 vmode_entry = viafb_get_mode(viafbinfo->var.xres, viafbinfo->var.yres);
167 if (viafb_SAMM_ON == 1) { 167 if (viafb_dual_fb) {
168 vmode_entry1 = viafb_get_mode(viafbinfo1->var.xres,
169 viafbinfo1->var.yres);
170 viafb_update_device_setting(viafbinfo1->var.xres,
171 viafbinfo1->var.yres, viafbinfo1->var.bits_per_pixel,
172 viafb_refresh1, 1);
173 } else if (viafb_SAMM_ON == 1) {
168 DEBUG_MSG(KERN_INFO 174 DEBUG_MSG(KERN_INFO
169 "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n", 175 "viafb_second_xres = %d, viafb_second_yres = %d, bpp = %d\n",
170 viafb_second_xres, viafb_second_yres, viafb_bpp1); 176 viafb_second_xres, viafb_second_yres, viafb_bpp1);
@@ -177,7 +183,11 @@ static int viafb_set_par(struct fb_info *info)
177 183
178 if (vmode_entry) { 184 if (vmode_entry) {
179 viafb_update_fix(info); 185 viafb_update_fix(info);
180 viafb_bpp = info->var.bits_per_pixel; 186 if (viafb_dual_fb && viapar->iga_path == IGA2)
187 viafb_bpp1 = info->var.bits_per_pixel;
188 else
189 viafb_bpp = info->var.bits_per_pixel;
190
181 if (info->var.accel_flags & FB_ACCELF_TEXT) 191 if (info->var.accel_flags & FB_ACCELF_TEXT)
182 info->flags &= ~FBINFO_HWACCEL_DISABLED; 192 info->flags &= ~FBINFO_HWACCEL_DISABLED;
183 else 193 else