drm/i915: Enable VLV audio chicken bit for LPE audio
authorTakashi Iwai <tiwai@suse.de>
Thu, 2 Feb 2017 10:03:48 +0000 (11:03 +0100)
committerTakashi Iwai <tiwai@suse.de>
Fri, 3 Feb 2017 15:19:08 +0000 (16:19 +0100)
The audio chicken bit (register offset 0x62f38) seems required to make
DP audio working on some machines.  At least, on Dell Wyse 3040, I
failed to get the audio unless this bit is set once.

Strangely, the bit seems necessary only once, and it persists after
that, even some power-off cycles.  The register is supposedly
write-only, so it's no evidence whether the bit keeps effect
persistently.  But, judging from the experiment, it looks enough to
set it up once at the device initialization.

The patch is basically a cut from the original patch by Pierre-Louis
Bossart.

v1->v2: drop read since it's a write-only reg.

Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_lpe_audio.c

index 4e24ba0..4f15a3d 100644 (file)
@@ -2062,6 +2062,9 @@ enum skl_disp_power_wells {
 #define I915_HDMI_LPE_AUDIO_SIZE       0x1000
 
 /* DisplayPort Audio w/ LPE */
+#define VLV_AUD_CHICKEN_BIT_REG                _MMIO(VLV_DISPLAY_BASE + 0x62F38)
+#define VLV_CHICKEN_BIT_DBG_ENABLE     (1 << 0)
+
 #define _VLV_AUD_PORT_EN_B_DBG         (VLV_DISPLAY_BASE + 0x62F20)
 #define _VLV_AUD_PORT_EN_C_DBG         (VLV_DISPLAY_BASE + 0x62F30)
 #define _VLV_AUD_PORT_EN_D_DBG         (VLV_DISPLAY_BASE + 0x62F34)
index d3ffe00..7a5b41b 100644 (file)
@@ -248,6 +248,11 @@ static int lpe_audio_setup(struct drm_i915_private *dev_priv)
                goto err_free_irq;
        }
 
+       /* enable chicken bit; at least this is required for Dell Wyse 3040
+        * with DP outputs (but only sometimes by some reason!)
+        */
+       I915_WRITE(VLV_AUD_CHICKEN_BIT_REG, VLV_CHICKEN_BIT_DBG_ENABLE);
+
        return 0;
 err_free_irq:
        irq_free_desc(dev_priv->lpe_audio.irq);