drm/i915: make pipe/port based audio valid accessors easier to use
[deliverable/linux.git] / drivers / gpu / drm / i915 / intel_audio.c
index 5c2d06c71ae7f73111e00e508e24305fd5f4111b..9181b85d86c44ffcf3e3db01a91b223c4689c188 100644 (file)
@@ -93,6 +93,25 @@ static bool intel_eld_uptodate(struct drm_connector *connector,
        return true;
 }
 
+static void g4x_audio_codec_disable(struct intel_encoder *encoder)
+{
+       struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
+       uint32_t eldv, tmp;
+
+       DRM_DEBUG_KMS("Disable audio codec\n");
+
+       tmp = I915_READ(G4X_AUD_VID_DID);
+       if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
+               eldv = G4X_ELDV_DEVCL_DEVBLC;
+       else
+               eldv = G4X_ELDV_DEVCTG;
+
+       /* Invalidate ELD */
+       tmp = I915_READ(G4X_AUD_CNTL_ST);
+       tmp &= ~eldv;
+       I915_WRITE(G4X_AUD_CNTL_ST, tmp);
+}
+
 static void g4x_audio_codec_enable(struct drm_connector *connector,
                                   struct intel_encoder *encoder,
                                   struct drm_display_mode *mode)
@@ -103,6 +122,8 @@ static void g4x_audio_codec_enable(struct drm_connector *connector,
        uint32_t tmp;
        int len, i;
 
+       DRM_DEBUG_KMS("Enable audio codec, %u bytes ELD\n", eld[2]);
+
        tmp = I915_READ(G4X_AUD_VID_DID);
        if (tmp == INTEL_AUDIO_DEVBLC || tmp == INTEL_AUDIO_DEVCL)
                eldv = G4X_ELDV_DEVCL_DEVBLC;
@@ -151,7 +172,7 @@ static void hsw_audio_codec_disable(struct intel_encoder *encoder)
 
        /* Invalidate ELD */
        tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
-       tmp &= ~(AUDIO_ELD_VALID_A << (pipe * 4));
+       tmp &= ~AUDIO_ELD_VALID(pipe);
        I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
 }
 
@@ -171,8 +192,8 @@ static void hsw_audio_codec_enable(struct drm_connector *connector,
 
        /* Enable audio presence detect, invalidate ELD */
        tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
-       tmp |= AUDIO_OUTPUT_ENABLE_A << (pipe * 4);
-       tmp &= ~(AUDIO_ELD_VALID_A << (pipe * 4));
+       tmp |= AUDIO_OUTPUT_ENABLE(pipe);
+       tmp &= ~AUDIO_ELD_VALID(pipe);
        I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
 
        /*
@@ -194,7 +215,7 @@ static void hsw_audio_codec_enable(struct drm_connector *connector,
 
        /* ELD valid */
        tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
-       tmp |= AUDIO_ELD_VALID_A << (pipe * 4);
+       tmp |= AUDIO_ELD_VALID(pipe);
        I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
 
        /* Enable timestamps */
@@ -246,11 +267,10 @@ static void ilk_audio_codec_disable(struct intel_encoder *encoder)
        I915_WRITE(aud_config, tmp);
 
        if (WARN_ON(!port)) {
-               eldv = IBX_ELD_VALIDB;
-               eldv |= IBX_ELD_VALIDB << 4;
-               eldv |= IBX_ELD_VALIDB << 8;
+               eldv = IBX_ELD_VALID(PORT_B) | IBX_ELD_VALID(PORT_C) |
+                       IBX_ELD_VALID(PORT_D);
        } else {
-               eldv = IBX_ELD_VALIDB << ((port - 1) * 4);
+               eldv = IBX_ELD_VALID(port);
        }
 
        /* Invalidate ELD */
@@ -306,11 +326,10 @@ static void ilk_audio_codec_enable(struct drm_connector *connector,
        }
 
        if (WARN_ON(!port)) {
-               eldv = IBX_ELD_VALIDB;
-               eldv |= IBX_ELD_VALIDB << 4;
-               eldv |= IBX_ELD_VALIDB << 8;
+               eldv = IBX_ELD_VALID(PORT_B) | IBX_ELD_VALID(PORT_C) |
+                       IBX_ELD_VALID(PORT_D);
        } else {
-               eldv = IBX_ELD_VALIDB << ((port - 1) * 4);
+               eldv = IBX_ELD_VALID(port);
        }
 
        /* Invalidate ELD */
@@ -408,6 +427,7 @@ void intel_init_audio(struct drm_device *dev)
 
        if (IS_G4X(dev)) {
                dev_priv->display.audio_codec_enable = g4x_audio_codec_enable;
+               dev_priv->display.audio_codec_disable = g4x_audio_codec_disable;
        } else if (IS_VALLEYVIEW(dev)) {
                dev_priv->display.audio_codec_enable = ilk_audio_codec_enable;
                dev_priv->display.audio_codec_disable = ilk_audio_codec_disable;
This page took 0.039682 seconds and 5 git commands to generate.