drm/omap: Allow HDMI audio setup even if we do not have video configured
authorJyri Sarha <jsarha@ti.com>
Thu, 16 Mar 2017 10:05:04 +0000 (12:05 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 1 Mar 2018 07:18:18 +0000 (09:18 +0200)
Allow HDMI audio setup even if we do not have video configured. Audio
will get configured at the same time with video if the video is
configured soon enough. If it is not the audio DMA will timeout in
couple of seconds and audio playback will be aborted.

Signed-off-by: Jyri Sarha <jsarha@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/gpu/drm/omapdrm/dss/hdmi4.c
drivers/gpu/drm/omapdrm/dss/hdmi5.c

index 1f7897c58f2feb12f2c5b4e17e4d5b44e625c328..97c88861d67aaf3ca19bf8f60d648095dd4427da 100644 (file)
@@ -615,21 +615,16 @@ static int hdmi_audio_startup(struct device *dev,
                              void (*abort_cb)(struct device *dev))
 {
        struct omap_hdmi *hd = dev_get_drvdata(dev);
-       int ret = 0;
 
        mutex_lock(&hd->lock);
 
-       if (!hdmi_mode_has_audio(&hd->cfg) || !hd->display_enabled) {
-               ret = -EPERM;
-               goto out;
-       }
+       WARN_ON(hd->audio_abort_cb != NULL);
 
        hd->audio_abort_cb = abort_cb;
 
-out:
        mutex_unlock(&hd->lock);
 
-       return ret;
+       return 0;
 }
 
 static int hdmi_audio_shutdown(struct device *dev)
@@ -650,12 +645,14 @@ static int hdmi_audio_start(struct device *dev)
        struct omap_hdmi *hd = dev_get_drvdata(dev);
        unsigned long flags;
 
-       WARN_ON(!hdmi_mode_has_audio(&hd->cfg));
-
        spin_lock_irqsave(&hd->audio_playing_lock, flags);
 
-       if (hd->display_enabled)
+       if (hd->display_enabled) {
+               if (!hdmi_mode_has_audio(&hd->cfg))
+                       DSSERR("%s: Video mode does not support audio\n",
+                              __func__);
                hdmi_start_audio_stream(hd);
+       }
        hd->audio_playing = true;
 
        spin_unlock_irqrestore(&hd->audio_playing_lock, flags);
@@ -686,17 +683,15 @@ static int hdmi_audio_config(struct device *dev,
 
        mutex_lock(&hd->lock);
 
-       if (!hdmi_mode_has_audio(&hd->cfg) || !hd->display_enabled) {
-               ret = -EPERM;
-               goto out;
+       if (hd->display_enabled) {
+               ret = hdmi4_audio_config(&hd->core, &hd->wp, dss_audio,
+                                        hd->cfg.vm.pixelclock);
+               if (ret)
+                       goto out;
        }
 
-       ret = hdmi4_audio_config(&hd->core, &hd->wp, dss_audio,
-                                hd->cfg.vm.pixelclock);
-       if (!ret) {
-               hd->audio_configured = true;
-               hd->audio_config = *dss_audio;
-       }
+       hd->audio_configured = true;
+       hd->audio_config = *dss_audio;
 out:
        mutex_unlock(&hd->lock);
 
index 4a0178ab8016176627e6ad024a9741be1ec53fc7..d28da9ac3e900e57b2e6c762af197d9a04d0ea23 100644 (file)
@@ -606,21 +606,16 @@ static int hdmi_audio_startup(struct device *dev,
                              void (*abort_cb)(struct device *dev))
 {
        struct omap_hdmi *hd = dev_get_drvdata(dev);
-       int ret = 0;
 
        mutex_lock(&hd->lock);
 
-       if (!hdmi_mode_has_audio(&hd->cfg) || !hd->display_enabled) {
-               ret = -EPERM;
-               goto out;
-       }
+       WARN_ON(hd->audio_abort_cb != NULL);
 
        hd->audio_abort_cb = abort_cb;
 
-out:
        mutex_unlock(&hd->lock);
 
-       return ret;
+       return 0;
 }
 
 static int hdmi_audio_shutdown(struct device *dev)
@@ -641,12 +636,14 @@ static int hdmi_audio_start(struct device *dev)
        struct omap_hdmi *hd = dev_get_drvdata(dev);
        unsigned long flags;
 
-       WARN_ON(!hdmi_mode_has_audio(&hd->cfg));
-
        spin_lock_irqsave(&hd->audio_playing_lock, flags);
 
-       if (hd->display_enabled)
+       if (hd->display_enabled) {
+               if (!hdmi_mode_has_audio(&hd->cfg))
+                       DSSERR("%s: Video mode does not support audio\n",
+                              __func__);
                hdmi_start_audio_stream(hd);
+       }
        hd->audio_playing = true;
 
        spin_unlock_irqrestore(&hd->audio_playing_lock, flags);
@@ -658,7 +655,8 @@ static void hdmi_audio_stop(struct device *dev)
        struct omap_hdmi *hd = dev_get_drvdata(dev);
        unsigned long flags;
 
-       WARN_ON(!hdmi_mode_has_audio(&hd->cfg));
+       if (!hdmi_mode_has_audio(&hd->cfg))
+               DSSERR("%s: Video mode does not support audio\n", __func__);
 
        spin_lock_irqsave(&hd->audio_playing_lock, flags);
 
@@ -677,18 +675,15 @@ static int hdmi_audio_config(struct device *dev,
 
        mutex_lock(&hd->lock);
 
-       if (!hdmi_mode_has_audio(&hd->cfg) || !hd->display_enabled) {
-               ret = -EPERM;
-               goto out;
+       if (hd->display_enabled) {
+               ret = hdmi5_audio_config(&hd->core, &hd->wp, dss_audio,
+                                        hd->cfg.vm.pixelclock);
+               if (ret)
+                       goto out;
        }
 
-       ret = hdmi5_audio_config(&hd->core, &hd->wp, dss_audio,
-                                hd->cfg.vm.pixelclock);
-
-       if (!ret) {
-               hd->audio_configured = true;
-               hd->audio_config = *dss_audio;
-       }
+       hd->audio_configured = true;
+       hd->audio_config = *dss_audio;
 out:
        mutex_unlock(&hd->lock);