drm/i915: Fix for LVDS VBT change on IGDNG
authorZhenyu Wang <zhenyu.z.wang@intel.com>
Fri, 10 Jul 2009 06:39:59 +0000 (14:39 +0800)
committerEric Anholt <eric@anholt.net>
Fri, 10 Jul 2009 21:11:06 +0000 (14:11 -0700)
IGDNG mobile chip's LVDS data block removes panel fitting
register definition. So this fixes offset for LVDS timing
block parsing. Thanks for Michael Fu to catch this.

Signed-off-by: Zhenyu Wang <zhenyu.z.wang@intel.com>
Signed-off-by: Eric Anholt <eric@anholt.net>
drivers/gpu/drm/i915/intel_bios.c

index da22863c05c0a89e4874fd55b85c71953158ab1a..7cc447191028d70f11b6ea5c0082492d5d0247df 100644 (file)
@@ -97,6 +97,7 @@ static void
 parse_lfp_panel_data(struct drm_i915_private *dev_priv,
                            struct bdb_header *bdb)
 {
+       struct drm_device *dev = dev_priv->dev;
        struct bdb_lvds_options *lvds_options;
        struct bdb_lvds_lfp_data *lvds_lfp_data;
        struct bdb_lvds_lfp_data_ptrs *lvds_lfp_data_ptrs;
@@ -132,7 +133,14 @@ parse_lfp_panel_data(struct drm_i915_private *dev_priv,
        entry = (struct bdb_lvds_lfp_data_entry *)
                ((uint8_t *)lvds_lfp_data->data + (lfp_data_size *
                                                   lvds_options->panel_type));
-       dvo_timing = &entry->dvo_timing;
+
+       /* On IGDNG mobile, LVDS data block removes panel fitting registers.
+          So dec 2 dword from dvo_timing offset */
+       if (IS_IGDNG(dev))
+               dvo_timing = (struct lvds_dvo_timing *)
+                                       ((u8 *)&entry->dvo_timing - 8);
+       else
+               dvo_timing = &entry->dvo_timing;
 
        panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);