|
@@ -97,14 +97,13 @@ 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;
|
|
|
struct bdb_lvds_lfp_data_entry *entry;
|
|
|
struct lvds_dvo_timing *dvo_timing;
|
|
|
struct drm_display_mode *panel_fixed_mode;
|
|
|
- int lfp_data_size;
|
|
|
+ int lfp_data_size, dvo_timing_offset;
|
|
|
|
|
|
/* Defaults if we can't find VBT info */
|
|
|
dev_priv->lvds_dither = 0;
|
|
@@ -133,14 +132,16 @@ 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_offset = lvds_lfp_data_ptrs->ptr[0].dvo_timing_offset -
|
|
|
+ lvds_lfp_data_ptrs->ptr[0].fp_timing_offset;
|
|
|
|
|
|
- /* 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;
|
|
|
+ /*
|
|
|
+ * the size of fp_timing varies on the different platform.
|
|
|
+ * So calculate the DVO timing relative offset in LVDS data
|
|
|
+ * entry to get the DVO timing entry
|
|
|
+ */
|
|
|
+ dvo_timing = (struct lvds_dvo_timing *)
|
|
|
+ ((unsigned char *)entry + dvo_timing_offset);
|
|
|
|
|
|
panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), GFP_KERNEL);
|
|
|
|