OMAPDSS: HDMI: Create function to enable HDMI audio
authorRicardo Neri <ricardo.neri@ti.com>
Sun, 27 Nov 2011 22:09:58 +0000 (16:09 -0600)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 5 Jan 2012 08:34:48 +0000 (10:34 +0200)
In order to separate clearly IP-specific code from general DSS code,
a function for OMAP4 audio enable is created. This function is
included in the HDMI IP ops to align with the current implementation
of the DSS HDMI driver. This function is to be used by the ASoC
HDMI audio codec.

Signed-off-by: Ricardo Neri <ricardo.neri@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/video/omap2/dss/dss_features.c
drivers/video/omap2/dss/ti_hdmi.h
drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c

index 5e4b829605da209fac9f6205b9e554b93167887a..afcb59301c3727d20149d1b112fa8596cbf3127f 100644 (file)
@@ -472,6 +472,10 @@ static const struct ti_hdmi_ip_ops omap4_hdmi_functions = {
        .dump_core              =       ti_hdmi_4xxx_core_dump,
        .dump_pll               =       ti_hdmi_4xxx_pll_dump,
        .dump_phy               =       ti_hdmi_4xxx_phy_dump,
+#if defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI) || \
+       defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI_MODULE)
+       .audio_enable           =       ti_hdmi_4xxx_wp_audio_enable,
+#endif
 
 };
 
index 2c3443dabb14c3505087fec3dd045d109cceabd9..7503f7f619a7fe43b7be266f04e9bf4cd7c8579a 100644 (file)
@@ -110,6 +110,11 @@ struct ti_hdmi_ip_ops {
 
        void (*dump_phy)(struct hdmi_ip_data *ip_data, struct seq_file *s);
 
+#if defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI) || \
+       defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI_MODULE)
+       void (*audio_enable)(struct hdmi_ip_data *ip_data, bool start);
+#endif
+
 };
 
 struct hdmi_ip_data {
@@ -134,5 +139,8 @@ void ti_hdmi_4xxx_wp_dump(struct hdmi_ip_data *ip_data, struct seq_file *s);
 void ti_hdmi_4xxx_pll_dump(struct hdmi_ip_data *ip_data, struct seq_file *s);
 void ti_hdmi_4xxx_core_dump(struct hdmi_ip_data *ip_data, struct seq_file *s);
 void ti_hdmi_4xxx_phy_dump(struct hdmi_ip_data *ip_data, struct seq_file *s);
-
+#if defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI) || \
+       defined(CONFIG_SND_OMAP_SOC_OMAP4_HDMI_MODULE)
+void ti_hdmi_4xxx_wp_audio_enable(struct hdmi_ip_data *ip_data, bool enable);
+#endif
 #endif
index 3f74f55269bd0bbd86df557d3f8cc0f1f773dfd2..220e0ce5e5effdc95280d96e1c32e274a833bfbb 100644 (file)
@@ -1204,35 +1204,41 @@ int hdmi_config_audio_acr(struct hdmi_ip_data *ip_data,
        return 0;
 }
 
+void ti_hdmi_4xxx_wp_audio_enable(struct hdmi_ip_data *ip_data, bool enable)
+{
+       REG_FLD_MOD(hdmi_av_base(ip_data),
+                               HDMI_CORE_AV_AUD_MODE, enable, 0, 0);
+       REG_FLD_MOD(hdmi_wp_base(ip_data),
+                               HDMI_WP_AUDIO_CTRL, enable, 31, 31);
+       REG_FLD_MOD(hdmi_wp_base(ip_data),
+                               HDMI_WP_AUDIO_CTRL, enable, 30, 30);
+}
+
 int hdmi_audio_trigger(struct snd_pcm_substream *substream, int cmd,
                                struct snd_soc_dai *dai)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
        struct snd_soc_codec *codec = rtd->codec;
+       struct platform_device *pdev = to_platform_device(codec->dev);
        struct hdmi_ip_data *ip_data = snd_soc_codec_get_drvdata(codec);
        int err = 0;
 
+       if (!(ip_data->ops) && !(ip_data->ops->audio_enable)) {
+               dev_err(&pdev->dev, "Cannot enable/disable audio\n");
+               return -ENODEV;
+       }
+
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
        case SNDRV_PCM_TRIGGER_RESUME:
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-               REG_FLD_MOD(hdmi_av_base(ip_data),
-                                       HDMI_CORE_AV_AUD_MODE, 1, 0, 0);
-               REG_FLD_MOD(hdmi_wp_base(ip_data),
-                                       HDMI_WP_AUDIO_CTRL, 1, 31, 31);
-               REG_FLD_MOD(hdmi_wp_base(ip_data),
-                                       HDMI_WP_AUDIO_CTRL, 1, 30, 30);
+               ip_data->ops->audio_enable(ip_data, true);
                break;
 
        case SNDRV_PCM_TRIGGER_STOP:
        case SNDRV_PCM_TRIGGER_SUSPEND:
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-               REG_FLD_MOD(hdmi_av_base(ip_data),
-                                       HDMI_CORE_AV_AUD_MODE, 0, 0, 0);
-               REG_FLD_MOD(hdmi_wp_base(ip_data),
-                                       HDMI_WP_AUDIO_CTRL, 0, 30, 30);
-               REG_FLD_MOD(hdmi_wp_base(ip_data),
-                                       HDMI_WP_AUDIO_CTRL, 0, 31, 31);
+               ip_data->ops->audio_enable(ip_data, false);
                break;
        default:
                err = -EINVAL;