diff options
author | Eric Anholt <eric@anholt.net> | 2006-12-05 10:01:31 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2006-12-05 12:15:34 -0800 |
commit | e777d38ce98d7220621b049b09df1deca5a5df42 (patch) | |
tree | 441a22533d263d5e1a2778f9bc560c99bcc54568 /src/i830_sdvo.c | |
parent | 81dde11d419c8f9198ab3502d9813d66d0bc6d6d (diff) |
WIP code to move mode set sequencing to XFree86 handlers.
It compiles. It definitely doesn't run.
Diffstat (limited to 'src/i830_sdvo.c')
-rw-r--r-- | src/i830_sdvo.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c index c75800d4..7755252a 100644 --- a/src/i830_sdvo.c +++ b/src/i830_sdvo.c @@ -534,15 +534,36 @@ i830_sdvo_set_clock_rate_mult(xf86OutputPtr output, CARD8 val) return TRUE; } +static Bool +i830_sdvo_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, + DisplayModePtr adjusted_mode) +{ + /* Make the CRTC code factor in the SDVO pixel multiplier. The SDVO + * device will be told of the multiplier during mode_set. + */ + adjusted_mode->Clock *= i830_sdvo_get_pixel_multiplier(mode); + + return TRUE; +} + static void -i830_sdvo_pre_set_mode(xf86OutputPtr output, DisplayModePtr mode) +i830_sdvo_mode_set(xf86OutputPtr output, DisplayModePtr mode, + DisplayModePtr adjusted_mode) { ScrnInfoPtr pScrn = output->scrn; I830Ptr pI830 = I830PTR(pScrn); I830OutputPrivatePtr intel_output = output->driver_private; struct i830_sdvo_priv *dev_priv = intel_output->dev_priv; - CARD16 width; - CARD16 height; + xf86CrtcPtr crtc = output->crtc; + I830CrtcPrivatePtr intel_crtc = crtc->driver_private; + Bool input1, input2; + CARD32 dpll, sdvox; + int dpll_reg = (intel_crtc->pipe == 0) ? DPLL_A : DPLL_B; + int dpll_md_reg = (intel_crtc->pipe == 0) ? DPLL_A_MD : DPLL_B_MD; + int sdvo_pixel_multiply; + int i; + CARD8 status; + CARD16 width, height; CARD16 h_blank_len, h_sync_len, v_blank_len, v_sync_len; CARD16 h_sync_offset, v_sync_offset; struct i830_sdvo_dtd output_dtd; @@ -633,26 +654,6 @@ i830_sdvo_pre_set_mode(xf86OutputPtr output, DisplayModePtr mode) break; } - OUTREG(dev_priv->output_device, INREG(dev_priv->output_device) & ~SDVO_ENABLE); -} - -static void -i830_sdvo_post_set_mode(xf86OutputPtr output, DisplayModePtr mode) -{ - ScrnInfoPtr pScrn = output->scrn; - I830OutputPrivatePtr intel_output = output->driver_private; - struct i830_sdvo_priv *dev_priv = intel_output->dev_priv; - xf86CrtcPtr crtc = output->crtc; - I830CrtcPrivatePtr intel_crtc = crtc->driver_private; - I830Ptr pI830 = I830PTR(pScrn); - Bool input1, input2; - CARD32 dpll, sdvox; - int dpll_reg = (intel_crtc->pipe == 0) ? DPLL_A : DPLL_B; - int dpll_md_reg = (intel_crtc->pipe == 0) ? DPLL_A_MD : DPLL_B_MD; - int sdvo_pixel_multiply; - int i; - CARD8 status; - /* Set the SDVO control regs. */ sdvox = INREG(dev_priv->output_device); switch (dev_priv->output_device) { @@ -663,7 +664,7 @@ i830_sdvo_post_set_mode(xf86OutputPtr output, DisplayModePtr mode) sdvox &= SDVOC_PRESERVE_MASK; break; } - sdvox |= SDVO_ENABLE | (9 << 19) | SDVO_BORDER_ENABLE; + sdvox |= (9 << 19) | SDVO_BORDER_ENABLE; if (intel_crtc->pipe == 1) sdvox |= SDVO_PIPE_B_SELECT; @@ -1014,8 +1015,8 @@ static const xf86OutputFuncsRec i830_sdvo_output_funcs = { .save = i830_sdvo_save, .restore = i830_sdvo_restore, .mode_valid = i830_sdvo_mode_valid, - .pre_set_mode = i830_sdvo_pre_set_mode, - .post_set_mode = i830_sdvo_post_set_mode, + .mode_fixup = i830_sdvo_mode_fixup, + .mode_set = i830_sdvo_mode_set, .detect = i830_sdvo_detect, .get_modes = i830_ddc_get_modes, .destroy = i830_sdvo_destroy |