aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2011-09-29 18:53:27 -0400
committerKeith Packard <keithp@keithp.com>2011-10-06 11:57:01 -0400
commitebf33b18816d9755087474cda7761e5944dd56c1 (patch)
tree4291cb1bc15ec585efd0c11c4c5a78944705266f
parent7d639f35b7f6b218f7b58918fb6b1f028f869894 (diff)
drm/i915: Create helper functions to determine eDP power state
We need to check eDP VDD force and panel on in several places, so create some simple helper functions to avoid duplicating code. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index fee6050eb907..ecb976451a21 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -283,20 +283,34 @@ intel_hrawclk(struct drm_device *dev)
283 } 283 }
284} 284}
285 285
286static bool ironlake_edp_have_panel_power(struct intel_dp *intel_dp)
287{
288 struct drm_device *dev = intel_dp->base.base.dev;
289 struct drm_i915_private *dev_priv = dev->dev_private;
290
291 return (I915_READ(PCH_PP_STATUS) & PP_ON) != 0;
292}
293
294static bool ironlake_edp_have_panel_vdd(struct intel_dp *intel_dp)
295{
296 struct drm_device *dev = intel_dp->base.base.dev;
297 struct drm_i915_private *dev_priv = dev->dev_private;
298
299 return (I915_READ(PCH_PP_CONTROL) & EDP_FORCE_VDD) != 0;
300}
301
286static void 302static void
287intel_dp_check_edp(struct intel_dp *intel_dp) 303intel_dp_check_edp(struct intel_dp *intel_dp)
288{ 304{
289 struct drm_device *dev = intel_dp->base.base.dev; 305 struct drm_device *dev = intel_dp->base.base.dev;
290 struct drm_i915_private *dev_priv = dev->dev_private; 306 struct drm_i915_private *dev_priv = dev->dev_private;
291 u32 pp_status, pp_control; 307
292 if (!is_edp(intel_dp)) 308 if (!is_edp(intel_dp))
293 return; 309 return;
294 pp_status = I915_READ(PCH_PP_STATUS); 310 if (!ironlake_edp_have_panel_power(intel_dp) && !ironlake_edp_have_panel_vdd(intel_dp)) {
295 pp_control = I915_READ(PCH_PP_CONTROL);
296 if ((pp_status & PP_ON) == 0 && (pp_control & EDP_FORCE_VDD) == 0) {
297 WARN(1, "eDP powered off while attempting aux channel communication.\n"); 311 WARN(1, "eDP powered off while attempting aux channel communication.\n");
298 DRM_DEBUG_KMS("Status 0x%08x Control 0x%08x\n", 312 DRM_DEBUG_KMS("Status 0x%08x Control 0x%08x\n",
299 pp_status, 313 I915_READ(PCH_PP_STATUS),
300 I915_READ(PCH_PP_CONTROL)); 314 I915_READ(PCH_PP_CONTROL));
301 } 315 }
302} 316}
@@ -852,16 +866,11 @@ static void ironlake_edp_panel_vdd_on(struct intel_dp *intel_dp)
852{ 866{
853 struct drm_device *dev = intel_dp->base.base.dev; 867 struct drm_device *dev = intel_dp->base.base.dev;
854 struct drm_i915_private *dev_priv = dev->dev_private; 868 struct drm_i915_private *dev_priv = dev->dev_private;
855 u32 pp, pp_status; 869 u32 pp;
856 870
857 if (!is_edp(intel_dp)) 871 if (!is_edp(intel_dp))
858 return; 872 return;
859 DRM_DEBUG_KMS("Turn eDP VDD on\n"); 873 DRM_DEBUG_KMS("Turn eDP VDD on\n");
860 /*
861 * If the panel wasn't on, make sure there's not a currently
862 * active PP sequence before enabling AUX VDD.
863 */
864 pp_status = I915_READ(PCH_PP_STATUS);
865 874
866 pp = I915_READ(PCH_PP_CONTROL); 875 pp = I915_READ(PCH_PP_CONTROL);
867 pp &= ~PANEL_UNLOCK_MASK; 876 pp &= ~PANEL_UNLOCK_MASK;
@@ -871,7 +880,11 @@ static void ironlake_edp_panel_vdd_on(struct intel_dp *intel_dp)
871 POSTING_READ(PCH_PP_CONTROL); 880 POSTING_READ(PCH_PP_CONTROL);
872 DRM_DEBUG_KMS("PCH_PP_STATUS: 0x%08x PCH_PP_CONTROL: 0x%08x\n", 881 DRM_DEBUG_KMS("PCH_PP_STATUS: 0x%08x PCH_PP_CONTROL: 0x%08x\n",
873 I915_READ(PCH_PP_STATUS), I915_READ(PCH_PP_CONTROL)); 882 I915_READ(PCH_PP_STATUS), I915_READ(PCH_PP_CONTROL));
874 if (!(pp_status & PP_ON)) { 883
884 /*
885 * If the panel wasn't on, delay before accessing aux channel
886 */
887 if (!ironlake_edp_have_panel_power(intel_dp)) {
875 msleep(intel_dp->panel_power_up_delay); 888 msleep(intel_dp->panel_power_up_delay);
876 DRM_DEBUG_KMS("eDP VDD was not on\n"); 889 DRM_DEBUG_KMS("eDP VDD was not on\n");
877 } 890 }
@@ -908,7 +921,7 @@ static void ironlake_edp_panel_on (struct intel_dp *intel_dp)
908 921
909 if (!is_edp(intel_dp)) 922 if (!is_edp(intel_dp))
910 return true; 923 return true;
911 if (I915_READ(PCH_PP_STATUS) & PP_ON) 924 if (ironlake_edp_have_panel_power(intel_dp))
912 return; 925 return;
913 926
914 pp = I915_READ(PCH_PP_CONTROL); 927 pp = I915_READ(PCH_PP_CONTROL);