Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 269801
b: refs/heads/master
c: ebf33b1
h: refs/heads/master
i:
  269799: 49189ca
v: v3
  • Loading branch information
Keith Packard committed Oct 6, 2011
1 parent 5216782 commit 885128a
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7d639f35b7f6b218f7b58918fb6b1f028f869894
refs/heads/master: ebf33b18816d9755087474cda7761e5944dd56c1
39 changes: 26 additions & 13 deletions trunk/drivers/gpu/drm/i915/intel_dp.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,20 +283,34 @@ intel_hrawclk(struct drm_device *dev)
}
}

static bool ironlake_edp_have_panel_power(struct intel_dp *intel_dp)
{
struct drm_device *dev = intel_dp->base.base.dev;
struct drm_i915_private *dev_priv = dev->dev_private;

return (I915_READ(PCH_PP_STATUS) & PP_ON) != 0;
}

static bool ironlake_edp_have_panel_vdd(struct intel_dp *intel_dp)
{
struct drm_device *dev = intel_dp->base.base.dev;
struct drm_i915_private *dev_priv = dev->dev_private;

return (I915_READ(PCH_PP_CONTROL) & EDP_FORCE_VDD) != 0;
}

static void
intel_dp_check_edp(struct intel_dp *intel_dp)
{
struct drm_device *dev = intel_dp->base.base.dev;
struct drm_i915_private *dev_priv = dev->dev_private;
u32 pp_status, pp_control;

if (!is_edp(intel_dp))
return;
pp_status = I915_READ(PCH_PP_STATUS);
pp_control = I915_READ(PCH_PP_CONTROL);
if ((pp_status & PP_ON) == 0 && (pp_control & EDP_FORCE_VDD) == 0) {
if (!ironlake_edp_have_panel_power(intel_dp) && !ironlake_edp_have_panel_vdd(intel_dp)) {
WARN(1, "eDP powered off while attempting aux channel communication.\n");
DRM_DEBUG_KMS("Status 0x%08x Control 0x%08x\n",
pp_status,
I915_READ(PCH_PP_STATUS),
I915_READ(PCH_PP_CONTROL));
}
}
Expand Down Expand Up @@ -852,16 +866,11 @@ static void ironlake_edp_panel_vdd_on(struct intel_dp *intel_dp)
{
struct drm_device *dev = intel_dp->base.base.dev;
struct drm_i915_private *dev_priv = dev->dev_private;
u32 pp, pp_status;
u32 pp;

if (!is_edp(intel_dp))
return;
DRM_DEBUG_KMS("Turn eDP VDD on\n");
/*
* If the panel wasn't on, make sure there's not a currently
* active PP sequence before enabling AUX VDD.
*/
pp_status = I915_READ(PCH_PP_STATUS);

pp = I915_READ(PCH_PP_CONTROL);
pp &= ~PANEL_UNLOCK_MASK;
Expand All @@ -871,7 +880,11 @@ static void ironlake_edp_panel_vdd_on(struct intel_dp *intel_dp)
POSTING_READ(PCH_PP_CONTROL);
DRM_DEBUG_KMS("PCH_PP_STATUS: 0x%08x PCH_PP_CONTROL: 0x%08x\n",
I915_READ(PCH_PP_STATUS), I915_READ(PCH_PP_CONTROL));
if (!(pp_status & PP_ON)) {

/*
* If the panel wasn't on, delay before accessing aux channel
*/
if (!ironlake_edp_have_panel_power(intel_dp)) {
msleep(intel_dp->panel_power_up_delay);
DRM_DEBUG_KMS("eDP VDD was not on\n");
}
Expand Down Expand Up @@ -908,7 +921,7 @@ static void ironlake_edp_panel_on (struct intel_dp *intel_dp)

if (!is_edp(intel_dp))
return true;
if (I915_READ(PCH_PP_STATUS) & PP_ON)
if (ironlake_edp_have_panel_power(intel_dp))
return;

pp = I915_READ(PCH_PP_CONTROL);
Expand Down

0 comments on commit 885128a

Please sign in to comment.