Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gma500: Oaktrail BIOS handling

Now that we pull the right BIOS data out of the hat we need to use it when
doing our panel setup.

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by

Alan Cox and committed by
Dave Airlie
1b22edfd aa0c45fd

+35 -11
+9 -2
drivers/gpu/drm/gma500/oaktrail_device.c
··· 457 457 } 458 458 459 459 460 - static void oaktrail_chip_setup(struct drm_device *dev) 460 + static int oaktrail_chip_setup(struct drm_device *dev) 461 461 { 462 - int ret = mid_chip_setup(dev); 462 + struct drm_psb_private *dev_priv = dev->dev_private; 463 + struct oaktrail_vbt *vbt = &dev_priv->vbt_data; 464 + int ret; 465 + 466 + ret = mid_chip_setup(dev); 463 467 if (ret < 0) 464 468 return ret; 465 469 if (vbt->size == 0) { ··· 476 472 477 473 static void oaktrail_teardown(struct drm_device *dev) 478 474 { 475 + struct drm_psb_private *dev_priv = dev->dev_private; 476 + struct oaktrail_vbt *vbt = &dev_priv->vbt_data; 477 + 479 478 oaktrail_hdmi_teardown(dev); 480 479 if (vbt->size == 0) 481 480 psb_intel_destroy_bios(dev);
+26 -9
drivers/gpu/drm/gma500/oaktrail_lvds.c
··· 228 228 229 229 /* Returns the panel fixed mode from configuration. */ 230 230 231 - static struct drm_display_mode * 232 - oaktrail_lvds_get_configuration_mode(struct drm_device *dev) 231 + static void oaktrail_lvds_get_configuration_mode(struct drm_device *dev, 232 + struct psb_intel_mode_device *mode_dev) 233 233 { 234 234 struct drm_display_mode *mode = NULL; 235 235 struct drm_psb_private *dev_priv = dev->dev_private; 236 236 struct oaktrail_timing_info *ti = &dev_priv->gct_data.DTD; 237 237 238 + mode_dev->panel_fixed_mode = NULL; 239 + 240 + /* Use the firmware provided data on Moorestown */ 238 241 if (dev_priv->vbt_data.size != 0x00) { /*if non-zero, then use vbt*/ 239 242 mode = kzalloc(sizeof(*mode), GFP_KERNEL); 240 243 if (!mode) 241 - return NULL; 244 + return; 242 245 243 246 mode->hdisplay = (ti->hactive_hi << 8) | ti->hactive_lo; 244 247 mode->vdisplay = (ti->vactive_hi << 8) | ti->vactive_lo; ··· 273 270 printk(KERN_INFO "vtotal is %d\n", mode->vtotal); 274 271 printk(KERN_INFO "clock is %d\n", mode->clock); 275 272 #endif 276 - } else 277 - mode = drm_mode_duplicate(dev, &lvds_configuration_modes[2]); 273 + mode_dev->panel_fixed_mode = mode; 274 + } 278 275 279 - drm_mode_set_name(mode); 280 - drm_mode_set_crtcinfo(mode, 0); 276 + /* Use the BIOS VBT mode if available */ 277 + if (mode_dev->panel_fixed_mode == NULL && mode_dev->vbt_mode) 278 + mode_dev->panel_fixed_mode = drm_mode_duplicate(dev, 279 + mode_dev->vbt_mode); 281 280 282 - return mode; 281 + /* Then try the LVDS VBT mode */ 282 + if (mode_dev->panel_fixed_mode == NULL) 283 + if (dev_priv->lfp_lvds_vbt_mode) 284 + mode_dev->panel_fixed_mode = 285 + drm_mode_duplicate(dev, 286 + dev_priv->lfp_lvds_vbt_mode); 287 + /* Then guess */ 288 + if (mode_dev->panel_fixed_mode == NULL) 289 + mode_dev->panel_fixed_mode 290 + = drm_mode_duplicate(dev, &lvds_configuration_modes[2]); 291 + 292 + drm_mode_set_name(mode_dev->panel_fixed_mode); 293 + drm_mode_set_crtcinfo(mode_dev->panel_fixed_mode, 0); 283 294 } 284 295 285 296 /** ··· 392 375 * If we didn't get EDID, try geting panel timing 393 376 * from configuration data 394 377 */ 395 - mode_dev->panel_fixed_mode = oaktrail_lvds_get_configuration_mode(dev); 378 + oaktrail_lvds_get_configuration_mode(dev, mode_dev); 396 379 397 380 if (mode_dev->panel_fixed_mode) { 398 381 mode_dev->panel_fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;