intelfb: use firmware EDID for mode database
Use firmware EDID for the driver's private mode database. Signed-off-by: Antonino Daplas <adaplas@pol.net> Cc: Sylvain Meyer <sylvain.meyer@worldonline.fr> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Dave Airlie <airlied@linux.ie>
This commit is contained in:
		
					parent
					
						
							
								080a416802
							
						
					
				
			
			
				commit
				
					
						56e004e543
					
				
			
		
					 1 changed files with 36 additions and 6 deletions
				
			
		| 
						 | 
					@ -132,6 +132,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "intelfb.h"
 | 
					#include "intelfb.h"
 | 
				
			||||||
#include "intelfbhw.h"
 | 
					#include "intelfbhw.h"
 | 
				
			||||||
 | 
					#include "../edid.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __devinit get_initial_mode(struct intelfb_info *dinfo);
 | 
					static void __devinit get_initial_mode(struct intelfb_info *dinfo);
 | 
				
			||||||
static void update_dinfo(struct intelfb_info *dinfo,
 | 
					static void update_dinfo(struct intelfb_info *dinfo,
 | 
				
			||||||
| 
						 | 
					@ -1031,13 +1032,42 @@ intelfb_init_var(struct intelfb_info *dinfo)
 | 
				
			||||||
		       sizeof(struct fb_var_screeninfo));
 | 
							       sizeof(struct fb_var_screeninfo));
 | 
				
			||||||
		msrc = 5;
 | 
							msrc = 5;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		if (mode) {
 | 
							const u8 *edid_s = fb_firmware_edid(&dinfo->pdev->dev);
 | 
				
			||||||
			msrc = fb_find_mode(var, dinfo->info, mode,
 | 
							u8 *edid_d = NULL;
 | 
				
			||||||
					    vesa_modes, VESA_MODEDB_SIZE,
 | 
					
 | 
				
			||||||
					    NULL, 0);
 | 
							if (edid_s) {
 | 
				
			||||||
			if (msrc)
 | 
								edid_d = kmalloc(128, GFP_KERNEL);
 | 
				
			||||||
				msrc |= 8;
 | 
					
 | 
				
			||||||
 | 
								if (edid_d) {
 | 
				
			||||||
 | 
									memcpy(edid_d, edid_s, 128);
 | 
				
			||||||
 | 
									fb_edid_to_monspecs(edid_d,
 | 
				
			||||||
 | 
											    &dinfo->info->monspecs);
 | 
				
			||||||
 | 
									kfree(edid_d);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (mode) {
 | 
				
			||||||
 | 
								printk("intelfb: Looking for mode in private "
 | 
				
			||||||
 | 
								       "database\n");
 | 
				
			||||||
 | 
								msrc = fb_find_mode(var, dinfo->info, mode,
 | 
				
			||||||
 | 
										    dinfo->info->monspecs.modedb,
 | 
				
			||||||
 | 
										    dinfo->info->monspecs.modedb_len,
 | 
				
			||||||
 | 
										    NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (msrc && msrc > 1) {
 | 
				
			||||||
 | 
									printk("intelfb: No mode in private database, "
 | 
				
			||||||
 | 
									       "intelfb: looking for mode in global "
 | 
				
			||||||
 | 
									       "database ");
 | 
				
			||||||
 | 
									msrc = fb_find_mode(var, dinfo->info, mode,
 | 
				
			||||||
 | 
											    vesa_modes,
 | 
				
			||||||
 | 
											    VESA_MODEDB_SIZE, NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (msrc)
 | 
				
			||||||
 | 
										msrc |= 8;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!msrc) {
 | 
							if (!msrc) {
 | 
				
			||||||
			msrc = fb_find_mode(var, dinfo->info, PREFERRED_MODE,
 | 
								msrc = fb_find_mode(var, dinfo->info, PREFERRED_MODE,
 | 
				
			||||||
					    vesa_modes, VESA_MODEDB_SIZE,
 | 
										    vesa_modes, VESA_MODEDB_SIZE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue