[PATCH v4 10/15] drm: bridge/dw_hdmi: add audio sample channel status setting

2015-02-28 Thread Yakir Yang
From: Daniel Kurtz 

When transmitting IEC60985 linear PCM audio, we configure the
Audio Sample Channel Status information of all the channel
status bits in the IEC60958 frame.

Signed-off-by: Yakir Yang 
---
Changes in v4:
- Give HDMI_FC_AUD_SCHNL8 an readable value

Changes in v3:
- Determine whether sample channel should set by desig_id.

Changes in v2:
- Add audio sample channel status setting

 drivers/gpu/drm/bridge/dw_hdmi.c | 51 
 drivers/gpu/drm/bridge/dw_hdmi.h | 20 
 2 files changed, 71 insertions(+)

diff --git a/drivers/gpu/drm/bridge/dw_hdmi.c b/drivers/gpu/drm/bridge/dw_hdmi.c
index 8894e48..16b8098 100644
--- a/drivers/gpu/drm/bridge/dw_hdmi.c
+++ b/drivers/gpu/drm/bridge/dw_hdmi.c
@@ -197,6 +197,55 @@ static void hdmi_mask_writeb(struct dw_hdmi *hdmi, u8 
data, unsigned int reg,
hdmi_modb(hdmi, data << shift, mask, reg);
 }
 
+static void hdmi_set_schnl(struct dw_hdmi *hdmi)
+{
+   u8 aud_schnl_samplerate;
+   u8 aud_schnl_8;
+
+   if (hdmi->id.design != 0x20)
+   return;
+
+   switch (hdmi->sample_rate) {
+   case 32000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_32K;
+   break;
+   case 44100:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_44K1;
+   break;
+   case 48000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_48K;
+   break;
+   case 88200:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_88K2;
+   break;
+   case 96000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_96K;
+   break;
+   case 176400:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_176K4;
+   break;
+   case 192000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_192K;
+   break;
+   case 768000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_768K;
+   break;
+   default:
+   dev_warn(hdmi->dev, "Unsupported audio sample rate (%u)\n",
+   hdmi->sample_rate);
+   return;
+   }
+
+   /* set channel status register */
+   hdmi_modb(hdmi, aud_schnl_samplerate, HDMI_FC_AUDSCHNLS7_SMPRATE_MASK,
+ HDMI_FC_AUDSCHNLS7);
+
+   aud_schnl_8 = (~aud_schnl_samplerate) <<
+   HDMI_FC_AUDSCHNLS8_ORIGSAMPFREQ_OFFSET;
+   aud_schnl_8 |= 2 << HDMI_FC_AUDSCHNLS8_WORDLEGNTH_OFFSET;
+   hdmi_writeb(hdmi, aud_schnl_8, HDMI_FC_AUDSCHNLS8);
+}
+
 static void hdmi_set_clock_regenerator(struct dw_hdmi *hdmi,
   unsigned int n, unsigned int cts)
 {
@@ -443,6 +492,8 @@ static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi,
pixel_clk, clk_n, clk_cts);
 
hdmi_set_clock_regenerator(hdmi, clk_n, clk_cts);
+
+   hdmi_set_schnl(hdmi);
 }
 
 static void hdmi_init_clk_regenerator(struct dw_hdmi *hdmi)
diff --git a/drivers/gpu/drm/bridge/dw_hdmi.h b/drivers/gpu/drm/bridge/dw_hdmi.h
index 8e5ad50..23a5a62 100644
--- a/drivers/gpu/drm/bridge/dw_hdmi.h
+++ b/drivers/gpu/drm/bridge/dw_hdmi.h
@@ -162,6 +162,17 @@
 #define HDMI_FC_SPDDEVICEINF0x1062
 #define HDMI_FC_AUDSCONF0x1063
 #define HDMI_FC_AUDSSTAT0x1064
+#define HDMI_FC_AUDSV   0x1065
+#define HDMI_FC_AUDSU   0x1066
+#define HDMI_FC_AUDSCHNLS0  0x1067
+#define HDMI_FC_AUDSCHNLS1  0x1068
+#define HDMI_FC_AUDSCHNLS2  0x1069
+#define HDMI_FC_AUDSCHNLS3  0x106a
+#define HDMI_FC_AUDSCHNLS4  0x106b
+#define HDMI_FC_AUDSCHNLS5  0x106c
+#define HDMI_FC_AUDSCHNLS6  0x106d
+#define HDMI_FC_AUDSCHNLS7  0x106e
+#define HDMI_FC_AUDSCHNLS8  0x106f
 #define HDMI_FC_DATACH0FILL 0x1070
 #define HDMI_FC_DATACH1FILL 0x1071
 #define HDMI_FC_DATACH2FILL 0x1072
@@ -754,6 +765,15 @@ enum {
 /* HDMI_FC_AUDSCHNLS7 field values */
HDMI_FC_AUDSCHNLS7_ACCURACY_OFFSET = 4,
HDMI_FC_AUDSCHNLS7_ACCURACY_MASK = 0x30,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_MASK = 0x0f,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_192K = 0xe,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_176K4 = 0xc,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_96K = 0xa,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_768K = 0x9,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_88K2 = 0x8,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_32K = 0x3,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_48K = 0x2,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_44K1 = 0x0,
 
 /* HDMI_FC_AUDSCHNLS8 field values */
HDMI_FC_AUDSCHNLS8_ORIGSAMPFREQ_MASK = 0xf0,
-- 
2.1.2


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a 

[PATCH v4 10/15] drm: bridge/dw_hdmi: add audio sample channel status setting

2015-02-28 Thread Yakir Yang
From: Daniel Kurtz djku...@chromium.org

When transmitting IEC60985 linear PCM audio, we configure the
Audio Sample Channel Status information of all the channel
status bits in the IEC60958 frame.

Signed-off-by: Yakir Yang y...@rock-chips.com
---
Changes in v4:
- Give HDMI_FC_AUD_SCHNL8 an readable value

Changes in v3:
- Determine whether sample channel should set by desig_id.

Changes in v2:
- Add audio sample channel status setting

 drivers/gpu/drm/bridge/dw_hdmi.c | 51 
 drivers/gpu/drm/bridge/dw_hdmi.h | 20 
 2 files changed, 71 insertions(+)

diff --git a/drivers/gpu/drm/bridge/dw_hdmi.c b/drivers/gpu/drm/bridge/dw_hdmi.c
index 8894e48..16b8098 100644
--- a/drivers/gpu/drm/bridge/dw_hdmi.c
+++ b/drivers/gpu/drm/bridge/dw_hdmi.c
@@ -197,6 +197,55 @@ static void hdmi_mask_writeb(struct dw_hdmi *hdmi, u8 
data, unsigned int reg,
hdmi_modb(hdmi, data  shift, mask, reg);
 }
 
+static void hdmi_set_schnl(struct dw_hdmi *hdmi)
+{
+   u8 aud_schnl_samplerate;
+   u8 aud_schnl_8;
+
+   if (hdmi-id.design != 0x20)
+   return;
+
+   switch (hdmi-sample_rate) {
+   case 32000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_32K;
+   break;
+   case 44100:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_44K1;
+   break;
+   case 48000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_48K;
+   break;
+   case 88200:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_88K2;
+   break;
+   case 96000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_96K;
+   break;
+   case 176400:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_176K4;
+   break;
+   case 192000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_192K;
+   break;
+   case 768000:
+   aud_schnl_samplerate = HDMI_FC_AUDSCHNLS7_SMPRATE_768K;
+   break;
+   default:
+   dev_warn(hdmi-dev, Unsupported audio sample rate (%u)\n,
+   hdmi-sample_rate);
+   return;
+   }
+
+   /* set channel status register */
+   hdmi_modb(hdmi, aud_schnl_samplerate, HDMI_FC_AUDSCHNLS7_SMPRATE_MASK,
+ HDMI_FC_AUDSCHNLS7);
+
+   aud_schnl_8 = (~aud_schnl_samplerate) 
+   HDMI_FC_AUDSCHNLS8_ORIGSAMPFREQ_OFFSET;
+   aud_schnl_8 |= 2  HDMI_FC_AUDSCHNLS8_WORDLEGNTH_OFFSET;
+   hdmi_writeb(hdmi, aud_schnl_8, HDMI_FC_AUDSCHNLS8);
+}
+
 static void hdmi_set_clock_regenerator(struct dw_hdmi *hdmi,
   unsigned int n, unsigned int cts)
 {
@@ -443,6 +492,8 @@ static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi,
pixel_clk, clk_n, clk_cts);
 
hdmi_set_clock_regenerator(hdmi, clk_n, clk_cts);
+
+   hdmi_set_schnl(hdmi);
 }
 
 static void hdmi_init_clk_regenerator(struct dw_hdmi *hdmi)
diff --git a/drivers/gpu/drm/bridge/dw_hdmi.h b/drivers/gpu/drm/bridge/dw_hdmi.h
index 8e5ad50..23a5a62 100644
--- a/drivers/gpu/drm/bridge/dw_hdmi.h
+++ b/drivers/gpu/drm/bridge/dw_hdmi.h
@@ -162,6 +162,17 @@
 #define HDMI_FC_SPDDEVICEINF0x1062
 #define HDMI_FC_AUDSCONF0x1063
 #define HDMI_FC_AUDSSTAT0x1064
+#define HDMI_FC_AUDSV   0x1065
+#define HDMI_FC_AUDSU   0x1066
+#define HDMI_FC_AUDSCHNLS0  0x1067
+#define HDMI_FC_AUDSCHNLS1  0x1068
+#define HDMI_FC_AUDSCHNLS2  0x1069
+#define HDMI_FC_AUDSCHNLS3  0x106a
+#define HDMI_FC_AUDSCHNLS4  0x106b
+#define HDMI_FC_AUDSCHNLS5  0x106c
+#define HDMI_FC_AUDSCHNLS6  0x106d
+#define HDMI_FC_AUDSCHNLS7  0x106e
+#define HDMI_FC_AUDSCHNLS8  0x106f
 #define HDMI_FC_DATACH0FILL 0x1070
 #define HDMI_FC_DATACH1FILL 0x1071
 #define HDMI_FC_DATACH2FILL 0x1072
@@ -754,6 +765,15 @@ enum {
 /* HDMI_FC_AUDSCHNLS7 field values */
HDMI_FC_AUDSCHNLS7_ACCURACY_OFFSET = 4,
HDMI_FC_AUDSCHNLS7_ACCURACY_MASK = 0x30,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_MASK = 0x0f,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_192K = 0xe,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_176K4 = 0xc,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_96K = 0xa,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_768K = 0x9,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_88K2 = 0x8,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_32K = 0x3,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_48K = 0x2,
+   HDMI_FC_AUDSCHNLS7_SMPRATE_44K1 = 0x0,
 
 /* HDMI_FC_AUDSCHNLS8 field values */
HDMI_FC_AUDSCHNLS8_ORIGSAMPFREQ_MASK = 0xf0,
-- 
2.1.2


--
To unsubscribe from this list: send the line unsubscribe