[Intel-gfx] [PATCH 6/8] drm/i915: move intel_update_lvds to intel_lvds->pre_pll_enable

Paulo Zanoni przanoni at gmail.com
Fri Nov 16 19:07:46 CET 2012


Hi

2012/11/5 Daniel Vetter <daniel.vetter at ffwll.ch>:
> A few things needed to change:
> - HAS_PCH_SPLIT since ilk+ is not yet converted to this.
> - s/LVDS/intel_lvds->reg/ to prep for ilk conversion
> - replace the clock.p2 == 7 check with a is_dual_link check
> - s/adjusted_mode/intel_lvds->fixed_mode
>
> v2: Rebase on top of Jani Nikula's panel rework. I'm wondering whether
> we shouldn't add an attached_panel pointer to intel_encoder, to
> replace the encoder private ->attached_connector pointers, since
> that's essentially what we need.
>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com>

> ---
>  drivers/gpu/drm/i915/intel_display.c | 59 ------------------------------------
>  drivers/gpu/drm/i915/intel_lvds.c    | 57 ++++++++++++++++++++++++++++++++++
>  2 files changed, 57 insertions(+), 59 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 7309790..bd3fa2b 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -4259,51 +4259,6 @@ static void i9xx_update_pll_dividers(struct drm_crtc *crtc,
>         }
>  }
>
> -static void intel_update_lvds(struct drm_crtc *crtc, intel_clock_t *clock,
> -                             struct drm_display_mode *adjusted_mode)
> -{
> -       struct drm_device *dev = crtc->dev;
> -       struct drm_i915_private *dev_priv = dev->dev_private;
> -       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> -       int pipe = intel_crtc->pipe;
> -       u32 temp;
> -
> -       temp = I915_READ(LVDS);
> -       temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP;
> -       if (pipe == 1) {
> -               temp |= LVDS_PIPEB_SELECT;
> -       } else {
> -               temp &= ~LVDS_PIPEB_SELECT;
> -       }
> -       /* set the corresponsding LVDS_BORDER bit */
> -       temp |= dev_priv->lvds_border_bits;
> -       /* Set the B0-B3 data pairs corresponding to whether we're going to
> -        * set the DPLLs for dual-channel mode or not.
> -        */
> -       if (clock->p2 == 7)
> -               temp |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP;
> -       else
> -               temp &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP);
> -
> -       /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP)
> -        * appropriately here, but we need to look more thoroughly into how
> -        * panels behave in the two modes.
> -        */
> -       /* set the dithering flag on LVDS as needed */
> -       if (INTEL_INFO(dev)->gen >= 4) {
> -               if (dev_priv->lvds_dither)
> -                       temp |= LVDS_ENABLE_DITHER;
> -               else
> -                       temp &= ~LVDS_ENABLE_DITHER;
> -       }
> -       temp &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY);
> -       if (adjusted_mode->flags & DRM_MODE_FLAG_NHSYNC)
> -               temp |= LVDS_HSYNC_POLARITY;
> -       if (adjusted_mode->flags & DRM_MODE_FLAG_NVSYNC)
> -               temp |= LVDS_VSYNC_POLARITY;
> -       I915_WRITE(LVDS, temp);
> -}
> -
>  static void vlv_update_pll(struct drm_crtc *crtc,
>                            struct drm_display_mode *mode,
>                            struct drm_display_mode *adjusted_mode,
> @@ -4486,13 +4441,6 @@ static void i9xx_update_pll(struct drm_crtc *crtc,
>                 if (encoder->pre_pll_enable)
>                         encoder->pre_pll_enable(encoder);
>
> -       /* The LVDS pin pair needs to be on before the DPLLs are enabled.
> -        * This is an exception to the general rule that mode_set doesn't turn
> -        * things on.
> -        */
> -       if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
> -               intel_update_lvds(crtc, clock, adjusted_mode);
> -
>         if (intel_pipe_has_type(crtc, INTEL_OUTPUT_DISPLAYPORT))
>                 intel_dp_set_m_n(crtc, mode, adjusted_mode);
>
> @@ -4568,13 +4516,6 @@ static void i8xx_update_pll(struct drm_crtc *crtc,
>                 if (encoder->pre_pll_enable)
>                         encoder->pre_pll_enable(encoder);
>
> -       /* The LVDS pin pair needs to be on before the DPLLs are enabled.
> -        * This is an exception to the general rule that mode_set doesn't turn
> -        * things on.
> -        */
> -       if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS))
> -               intel_update_lvds(crtc, clock, adjusted_mode);
> -
>         I915_WRITE(DPLL(pipe), dpll);
>
>         /* Wait for the clocks to stabilize. */
> diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
> index 972ef12..057e29a 100644
> --- a/drivers/gpu/drm/i915/intel_lvds.c
> +++ b/drivers/gpu/drm/i915/intel_lvds.c
> @@ -89,6 +89,62 @@ static bool intel_lvds_get_hw_state(struct intel_encoder *encoder,
>         return true;
>  }
>
> +/* The LVDS pin pair needs to be on before the DPLLs are enabled.
> + * This is an exception to the general rule that mode_set doesn't turn
> + * things on.
> + */
> +static void intel_pre_pll_enable_lvds(struct intel_encoder *encoder)
> +{
> +       struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(&encoder->base);
> +       struct drm_device *dev = encoder->base.dev;
> +       struct drm_i915_private *dev_priv = dev->dev_private;
> +       struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
> +       struct drm_display_mode *fixed_mode =
> +               lvds_encoder->attached_connector->base.panel.fixed_mode;
> +       int pipe = intel_crtc->pipe;
> +       u32 temp;
> +
> +       /* pch split platforms are not yet converted. */
> +       if (HAS_PCH_SPLIT(dev))
> +               return;
> +
> +       temp = I915_READ(lvds_encoder->reg);
> +       temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP;
> +       if (pipe == 1) {
> +               temp |= LVDS_PIPEB_SELECT;
> +       } else {
> +               temp &= ~LVDS_PIPEB_SELECT;
> +       }
> +       /* set the corresponsding LVDS_BORDER bit */
> +       temp |= dev_priv->lvds_border_bits;
> +       /* Set the B0-B3 data pairs corresponding to whether we're going to
> +        * set the DPLLs for dual-channel mode or not.
> +        */
> +       if (lvds_encoder->is_dual_link)
> +               temp |= LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP;
> +       else
> +               temp &= ~(LVDS_B0B3_POWER_UP | LVDS_CLKB_POWER_UP);
> +
> +       /* It would be nice to set 24 vs 18-bit mode (LVDS_A3_POWER_UP)
> +        * appropriately here, but we need to look more thoroughly into how
> +        * panels behave in the two modes.
> +        */
> +       /* set the dithering flag on LVDS as needed */
> +       if (INTEL_INFO(dev)->gen >= 4) {
> +               if (dev_priv->lvds_dither)
> +                       temp |= LVDS_ENABLE_DITHER;
> +               else
> +                       temp &= ~LVDS_ENABLE_DITHER;
> +       }
> +       temp &= ~(LVDS_HSYNC_POLARITY | LVDS_VSYNC_POLARITY);
> +       if (fixed_mode->flags & DRM_MODE_FLAG_NHSYNC)
> +               temp |= LVDS_HSYNC_POLARITY;
> +       if (fixed_mode->flags & DRM_MODE_FLAG_NVSYNC)
> +               temp |= LVDS_VSYNC_POLARITY;
> +
> +       I915_WRITE(lvds_encoder->reg, temp);
> +}
> +
>  /**
>   * Sets the power state for the panel.
>   */
> @@ -1038,6 +1094,7 @@ bool intel_lvds_init(struct drm_device *dev)
>                          DRM_MODE_ENCODER_LVDS);
>
>         intel_encoder->enable = intel_enable_lvds;
> +       intel_encoder->pre_pll_enable = intel_pre_pll_enable_lvds;
>         intel_encoder->disable = intel_disable_lvds;
>         intel_encoder->get_hw_state = intel_lvds_get_hw_state;
>         intel_connector->get_hw_state = intel_connector_get_hw_state;
> --
> 1.7.11.7
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Paulo Zanoni



More information about the Intel-gfx mailing list