]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
drm: xilinx: dp_sub: Clear the audio reset
authorHyun Kwon <hyun.kwon@xilinx.com>
Thu, 9 Mar 2017 16:51:53 +0000 (08:51 -0800)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 10 Mar 2017 09:28:35 +0000 (10:28 +0100)
The audio soft reset register is non-reset flop, and it doesn't get
reset to the default value. So the register needs to be probrammed
explicitly to be specific value. Otherwise, the value varies between
parts, which was resulting in audio not working on specific parts.

Signed-off-by: Hyun Kwon <hyun.kwon@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/gpu/drm/xilinx/xilinx_drm_dp_sub.c

index ec82684d1286ecba5be1d3c664e4808e0ad1cebd..6bb0956557153ab6dd1d3705d6dd58a76b736559 100644 (file)
 #define XILINX_DP_SUB_AUD_CH_B_DATA3                           0x44
 #define XILINX_DP_SUB_AUD_CH_B_DATA4                           0x48
 #define XILINX_DP_SUB_AUD_CH_B_DATA5                           0x4c
+#define XILINX_DP_SUB_AUD_SOFT_RESET                           0xc00
+#define XILINX_DP_SUB_AUD_SOFT_RESET_AUD_SRST                  BIT(0)
 
 #define XILINX_DP_SUB_AV_BUF_NUM_VID_GFX_BUFFERS               4
 #define XILINX_DP_SUB_AV_BUF_NUM_BUFFERS                       6
@@ -1098,12 +1100,27 @@ xilinx_drm_dp_sub_av_buf_init_sf(struct xilinx_drm_dp_sub_av_buf *av_buf,
  * xilinx_drm_dp_sub_aud_init - Initialize the audio
  * @aud: audio
  *
- * Initialize the audio with default mixer volume.
+ * Initialize the audio with default mixer volume. The de-assertion will
+ * initialize the audio states.
  */
 static void xilinx_drm_dp_sub_aud_init(struct xilinx_drm_dp_sub_aud *aud)
 {
-       xilinx_drm_set(aud->base, XILINX_DP_SUB_AUD_MIXER_VOLUME,
-                      XILINX_DP_SUB_AUD_MIXER_VOLUME_NO_SCALE);
+       xilinx_drm_clr(aud->base, XILINX_DP_SUB_AUD_SOFT_RESET,
+                      XILINX_DP_SUB_AUD_SOFT_RESET_AUD_SRST);
+       xilinx_drm_writel(aud->base, XILINX_DP_SUB_AUD_MIXER_VOLUME,
+                         XILINX_DP_SUB_AUD_MIXER_VOLUME_NO_SCALE);
+}
+
+/**
+ * xilinx_drm_dp_sub_aud_deinit - De-initialize the audio
+ * @aud: audio
+ *
+ * Put the audio in reset.
+ */
+static void xilinx_drm_dp_sub_aud_deinit(struct xilinx_drm_dp_sub_aud *aud)
+{
+       xilinx_drm_set(aud->base, XILINX_DP_SUB_AUD_SOFT_RESET,
+                      XILINX_DP_SUB_AUD_SOFT_RESET_AUD_SRST);
 }
 
 /* DP subsystem layer functions */
@@ -1504,6 +1521,7 @@ EXPORT_SYMBOL_GPL(xilinx_drm_dp_sub_enable);
  */
 void xilinx_drm_dp_sub_disable(struct xilinx_drm_dp_sub *dp_sub)
 {
+       xilinx_drm_dp_sub_aud_deinit(&dp_sub->aud);
        xilinx_drm_dp_sub_av_buf_disable_aud(&dp_sub->av_buf);
        xilinx_drm_dp_sub_av_buf_disable_buf(&dp_sub->av_buf);
        xilinx_drm_dp_sub_av_buf_disable(&dp_sub->av_buf);