OMAPDSS: HDMI: OMAP4: Expand configuration for IEC-60958 audio
authorRicardo Neri <ricardo.neri@ti.com>
Mon, 19 Mar 2012 18:27:41 +0000 (12:27 -0600)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 11 May 2012 12:15:23 +0000 (15:15 +0300)
Utilize a snd_aes_iec958 struct to write the parameters of the IEC-60958
channel status word into the HDMI IP registers. Hence, the user of the
driver has full control of what parameters are written in the word.

Also, some of the parameters of the I2S structure have been removed
as they are actually IEC-60958 parameters.

Signed-off-by: Ricardo Neri <ricardo.neri@ti.com>
drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c
drivers/video/omap2/dss/ti_hdmi_4xxx_ip.h

index f503c9d12b2f55a782b76a978415da876d090575..b572101c1d036d894a9e916adad2a3aaa61ef0b4 100644 (file)
@@ -1112,10 +1112,25 @@ void hdmi_core_audio_config(struct hdmi_ip_data *ip_data,
        REG_FLD_MOD(av_base, HDMI_CORE_AV_SPDIF_CTRL,
                                                cfg->fs_override, 1, 1);
 
-       /* I2S parameters */
-       REG_FLD_MOD(av_base, HDMI_CORE_AV_I2S_CHST4,
-                                               cfg->freq_sample, 3, 0);
-
+       /*
+        * Set IEC-60958-3 channel status word. It is passed to the IP
+        * just as it is received. The user of the driver is responsible
+        * for its contents.
+        */
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST0,
+                      cfg->iec60958_cfg->status[0]);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST1,
+                      cfg->iec60958_cfg->status[1]);
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST2,
+                      cfg->iec60958_cfg->status[2]);
+       /* yes, this is correct: status[3] goes to CHST4 register */
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST4,
+                      cfg->iec60958_cfg->status[3]);
+       /* yes, this is correct: status[4] goes to CHST5 register */
+       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST5,
+                      cfg->iec60958_cfg->status[4]);
+
+       /* set I2S parameters */
        r = hdmi_read_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL);
        r = FLD_MOD(r, cfg->i2s_cfg.sck_edge_mode, 6, 6);
        r = FLD_MOD(r, cfg->i2s_cfg.vbit, 4, 4);
@@ -1124,12 +1139,6 @@ void hdmi_core_audio_config(struct hdmi_ip_data *ip_data,
        r = FLD_MOD(r, cfg->i2s_cfg.shift, 0, 0);
        hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_IN_CTRL, r);
 
-       r = hdmi_read_reg(av_base, HDMI_CORE_AV_I2S_CHST5);
-       r = FLD_MOD(r, cfg->freq_sample, 7, 4);
-       r = FLD_MOD(r, cfg->i2s_cfg.word_length, 3, 1);
-       r = FLD_MOD(r, cfg->i2s_cfg.word_max_length, 0, 0);
-       hdmi_write_reg(av_base, HDMI_CORE_AV_I2S_CHST5, r);
-
        REG_FLD_MOD(av_base, HDMI_CORE_AV_I2S_IN_LEN,
                        cfg->i2s_cfg.in_length_bits, 3, 0);
 
index 914be3dbf71ddb178341d8bda56a8e65d363be95..4510edba4406901bfe878af888695e59e9294bcd 100644 (file)
@@ -407,8 +407,6 @@ struct hdmi_audio_dma {
 };
 
 struct hdmi_core_audio_i2s_config {
-       u8 word_max_length;
-       u8 word_length;
        u8 in_length_bits;
        u8 justification;
        u8 sck_edge_mode;
@@ -420,7 +418,7 @@ struct hdmi_core_audio_i2s_config {
 
 struct hdmi_core_audio_config {
        struct hdmi_core_audio_i2s_config       i2s_cfg;
-       u32                                     freq_sample;
+       struct snd_aes_iec958                   *iec60958_cfg;
        bool                                    fs_override;
        u32                                     n;
        u32                                     cts;