diff options
author | Ma Ling <ling.ma@intel.com> | 2009-06-01 17:13:53 +0800 |
---|---|---|
committer | Zhenyu Wang <zhenyu.z.wang@intel.com> | 2009-06-03 09:49:29 +0800 |
commit | ea0b00e675281b2914450992501566122f9affe0 (patch) | |
tree | 46e0116b0cb1ef4a92526785953c5e3ac22cbe1e | |
parent | 9e7ee50bea5f65003f1d70cc06d8c1ace1282548 (diff) |
Provide mode line from VBT to xorg.
If sdvo get modes function can't find modes from EDID,
transmit sdvo lvds modes from VBT to xorg.
Signed-off-by: Ma Ling <ling.ma@intel.com>
-rw-r--r-- | src/i830_sdvo.c | 60 |
1 files changed, 45 insertions, 15 deletions
diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c index a4c9120e..cfba482c 100644 --- a/src/i830_sdvo.c +++ b/src/i830_sdvo.c @@ -91,6 +91,10 @@ struct i830_sdvo_priv { * This is set if we treat the device as HDMI, instead of DVI. */ Bool is_hdmi; + /** + * This is set if we detect output of sdvo device as LVDS. + */ + Bool is_lvds; /** * Returned SDTV resolutions allowed for the current format, if the @@ -1550,6 +1554,31 @@ i830_sdvo_check_hdmi_encode (xf86OutputPtr output) return FALSE; } +/* This function will try to fetch native modes for sdvo lvds output*/ +static DisplayModePtr i830_sdvo_lvds_fetch_modes(xf86OutputPtr output) +{ + I830Ptr pI830 = I830PTR(output->scrn); + DisplayModePtr modes; + + /* + * Attempt to get the mode list from DDC. + * Assume that the preferred modes are + * arranged in priority order, + */ + modes = i830_ddc_get_modes(output); + if (modes != NULL) + goto end; + + if (pI830->sdvo_lvds_fixed_mode != NULL) + modes = xf86DuplicateModes(output->scrn, pI830->sdvo_lvds_fixed_mode); + +end: + /* Guarantee the the first preferred mode is chosen by xserver */ + if (modes != NULL) + modes->type |= (M_T_DRIVER | M_T_PREFERRED); + return modes; +} + static void i830_sdvo_select_ddc_bus(struct i830_sdvo_priv *dev_priv); static Bool @@ -1568,6 +1597,7 @@ i830_sdvo_output_setup (xf86OutputPtr output, uint16_t flag) /* clear up privates */ dev_priv->is_tv = FALSE; intel_output->needs_tv_clock = FALSE; + dev_priv->is_lvds = FALSE; if (flag & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { @@ -1608,14 +1638,14 @@ i830_sdvo_output_setup (xf86OutputPtr output, uint16_t flag) dev_priv->controlled_output = SDVO_OUTPUT_RGB1; output->subpixel_order = SubPixelHorizontalRGB; name_prefix="VGA"; - } else if (flag & SDVO_OUTPUT_LVDS0) { - dev_priv->controlled_output = SDVO_OUTPUT_LVDS0; - output->subpixel_order = SubPixelHorizontalRGB; - name_prefix="LVDS"; - } else if (flag & SDVO_OUTPUT_LVDS1) { - dev_priv->controlled_output = SDVO_OUTPUT_LVDS1; - output->subpixel_order = SubPixelHorizontalRGB; - name_prefix="LVDS"; + } else if (flag & (SDVO_OUTPUT_LVDS0 | SDVO_OUTPUT_LVDS1)) { + if (flag & SDVO_OUTPUT_LVDS0) + dev_priv->controlled_output = SDVO_OUTPUT_LVDS0; + else + dev_priv->controlled_output = SDVO_OUTPUT_LVDS1; + output->subpixel_order = SubPixelHorizontalRGB; + name_prefix="LVDS"; + dev_priv->is_lvds = TRUE; } else { unsigned char bytes[2]; @@ -1746,11 +1776,15 @@ i830_sdvo_get_ddc_modes(xf86OutputPtr output) xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); DisplayModePtr modes = NULL; xf86OutputPtr crt; - I830OutputPrivatePtr intel_output; + I830OutputPrivatePtr intel_output =output->driver_private; xf86MonPtr edid_mon = NULL; - struct i830_sdvo_priv *dev_priv; + struct i830_sdvo_priv *dev_priv = intel_output->dev_priv; + + if (dev_priv->is_lvds) + modes = i830_sdvo_lvds_fetch_modes(output); + else + modes = i830_ddc_get_modes(output); - modes = i830_ddc_get_modes(output); if (modes != NULL) goto check_hdmi; @@ -1774,9 +1808,6 @@ i830_sdvo_get_ddc_modes(xf86OutputPtr output) check_hdmi: /* Check if HDMI encode, setup it and set the flag for HDMI audio */ - intel_output = output->driver_private; - dev_priv = intel_output->dev_priv; - if (dev_priv->caps.output_flags & (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_TMDS1)) { if (!i830_sdvo_check_hdmi_encode(output)) { @@ -2105,7 +2136,6 @@ i830_sdvo_select_ddc_bus(struct i830_sdvo_priv *dev_priv) dev_priv->ddc_bus = 1 << num_bits; } - Bool i830_sdvo_init(ScrnInfoPtr pScrn, int output_device) { |