lkml.org 
[lkml]   [2011]   [Sep]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 8/9] drm/i915: Move eDP panel fixed mode from dev_priv to intel_dp
    Date
    This value doesn't come directly from the VBT, and so is rather
    specific to the particular DP output.

    Signed-off-by: Keith Packard <keithp@keithp.com>
    ---
    drivers/gpu/drm/i915/i915_drv.h | 1 -
    drivers/gpu/drm/i915/intel_dp.c | 35 ++++++++++++++++-------------------
    2 files changed, 16 insertions(+), 20 deletions(-)

    diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
    index bcdf58b..e6dd19e 100644
    --- a/drivers/gpu/drm/i915/i915_drv.h
    +++ b/drivers/gpu/drm/i915/i915_drv.h
    @@ -347,7 +347,6 @@ typedef struct drm_i915_private {
    /* LVDS info */
    int backlight_level; /* restore backlight to this value */
    bool backlight_enabled;
    - struct drm_display_mode *panel_fixed_mode;
    struct drm_display_mode *lfp_lvds_vbt_mode; /* if any */
    struct drm_display_mode *sdvo_lvds_vbt_mode; /* if any */

    diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
    index f1d6105..5bc30f9 100644
    --- a/drivers/gpu/drm/i915/intel_dp.c
    +++ b/drivers/gpu/drm/i915/intel_dp.c
    @@ -61,6 +61,7 @@ struct intel_dp {
    uint8_t link_status[DP_LINK_STATUS_SIZE];
    int panel_power_up_delay;
    int panel_power_down_delay;
    + struct drm_display_mode *panel_fixed_mode; /* for eDP */
    };

    /**
    @@ -202,16 +203,14 @@ intel_dp_mode_valid(struct drm_connector *connector,
    struct drm_display_mode *mode)
    {
    struct intel_dp *intel_dp = intel_attached_dp(connector);
    - struct drm_device *dev = connector->dev;
    - struct drm_i915_private *dev_priv = dev->dev_private;
    int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp));
    int max_lanes = intel_dp_max_lane_count(intel_dp);

    - if (is_edp(intel_dp) && dev_priv->panel_fixed_mode) {
    - if (mode->hdisplay > dev_priv->panel_fixed_mode->hdisplay)
    + if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) {
    + if (mode->hdisplay > intel_dp->panel_fixed_mode->hdisplay)
    return MODE_PANEL;

    - if (mode->vdisplay > dev_priv->panel_fixed_mode->vdisplay)
    + if (mode->vdisplay > intel_dp->panel_fixed_mode->vdisplay)
    return MODE_PANEL;
    }

    @@ -630,22 +629,21 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
    struct drm_display_mode *adjusted_mode)
    {
    struct drm_device *dev = encoder->dev;
    - struct drm_i915_private *dev_priv = dev->dev_private;
    struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
    int lane_count, clock;
    int max_lane_count = intel_dp_max_lane_count(intel_dp);
    int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0;
    static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 };

    - if (is_edp(intel_dp) && dev_priv->panel_fixed_mode) {
    - intel_fixed_panel_mode(dev_priv->panel_fixed_mode, adjusted_mode);
    + if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) {
    + intel_fixed_panel_mode(intel_dp->panel_fixed_mode, adjusted_mode);
    intel_pch_panel_fitting(dev, DRM_MODE_SCALE_FULLSCREEN,
    mode, adjusted_mode);
    /*
    * the mode->clock is used to calculate the Data&Link M/N
    * of the pipe. For the eDP the fixed clock should be used.
    */
    - mode->clock = dev_priv->panel_fixed_mode->clock;
    + mode->clock = intel_dp->panel_fixed_mode->clock;
    }

    for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) {
    @@ -1812,35 +1810,34 @@ static int intel_dp_get_modes(struct drm_connector *connector)

    ret = intel_dp_get_edid_modes(connector, &intel_dp->adapter);
    if (ret) {
    - if (is_edp(intel_dp) && !dev_priv->panel_fixed_mode) {
    + if (is_edp(intel_dp) && !intel_dp->panel_fixed_mode) {
    struct drm_display_mode *newmode;
    list_for_each_entry(newmode, &connector->probed_modes,
    head) {
    - if (newmode->type & DRM_MODE_TYPE_PREFERRED) {
    - dev_priv->panel_fixed_mode =
    + if ((newmode->type & DRM_MODE_TYPE_PREFERRED)) {
    + intel_dp->panel_fixed_mode =
    drm_mode_duplicate(dev, newmode);
    break;
    }
    }
    }
    -
    return ret;
    }

    /* if eDP has no EDID, try to use fixed panel mode from VBT */
    if (is_edp(intel_dp)) {
    /* initialize panel mode from VBT if available for eDP */
    - if (dev_priv->panel_fixed_mode == NULL && dev_priv->lfp_lvds_vbt_mode != NULL) {
    - dev_priv->panel_fixed_mode =
    + if (intel_dp->panel_fixed_mode == NULL && dev_priv->lfp_lvds_vbt_mode != NULL) {
    + intel_dp->panel_fixed_mode =
    drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
    - if (dev_priv->panel_fixed_mode) {
    - dev_priv->panel_fixed_mode->type |=
    + if (intel_dp->panel_fixed_mode) {
    + intel_dp->panel_fixed_mode->type |=
    DRM_MODE_TYPE_PREFERRED;
    }
    }
    - if (dev_priv->panel_fixed_mode) {
    + if (intel_dp->panel_fixed_mode) {
    struct drm_display_mode *mode;
    - mode = drm_mode_duplicate(dev, dev_priv->panel_fixed_mode);
    + mode = drm_mode_duplicate(dev, intel_dp->panel_fixed_mode);
    drm_mode_probed_add(connector, mode);
    return 1;
    }
    --
    1.7.6.3


    \
     
     \ /
      Last update: 2011-09-20 00:25    [W:0.024 / U:0.168 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site