瀏覽代碼

drm/omap: Allow HDMI audio setup even if we do not have video configured

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>
Jyri Sarha 8 年之前
父節點
當前提交
c1899cb368
共有 2 個文件被更改,包括 30 次插入40 次删除
  1. 14 19
      drivers/gpu/drm/omapdrm/dss/hdmi4.c
  2. 16 21
      drivers/gpu/drm/omapdrm/dss/hdmi5.c

+ 14 - 19
drivers/gpu/drm/omapdrm/dss/hdmi4.c

@@ -615,21 +615,16 @@ static int hdmi_audio_startup(struct device *dev,
 			      void (*abort_cb)(struct device *dev))
 			      void (*abort_cb)(struct device *dev))
 {
 {
 	struct omap_hdmi *hd = dev_get_drvdata(dev);
 	struct omap_hdmi *hd = dev_get_drvdata(dev);
-	int ret = 0;
 
 
 	mutex_lock(&hd->lock);
 	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;
 	hd->audio_abort_cb = abort_cb;
 
 
-out:
 	mutex_unlock(&hd->lock);
 	mutex_unlock(&hd->lock);
 
 
-	return ret;
+	return 0;
 }
 }
 
 
 static int hdmi_audio_shutdown(struct device *dev)
 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);
 	struct omap_hdmi *hd = dev_get_drvdata(dev);
 	unsigned long flags;
 	unsigned long flags;
 
 
-	WARN_ON(!hdmi_mode_has_audio(&hd->cfg));
-
 	spin_lock_irqsave(&hd->audio_playing_lock, flags);
 	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);
 		hdmi_start_audio_stream(hd);
+	}
 	hd->audio_playing = true;
 	hd->audio_playing = true;
 
 
 	spin_unlock_irqrestore(&hd->audio_playing_lock, flags);
 	spin_unlock_irqrestore(&hd->audio_playing_lock, flags);
@@ -686,17 +683,15 @@ static int hdmi_audio_config(struct device *dev,
 
 
 	mutex_lock(&hd->lock);
 	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:
 out:
 	mutex_unlock(&hd->lock);
 	mutex_unlock(&hd->lock);
 
 

+ 16 - 21
drivers/gpu/drm/omapdrm/dss/hdmi5.c

@@ -606,21 +606,16 @@ static int hdmi_audio_startup(struct device *dev,
 			      void (*abort_cb)(struct device *dev))
 			      void (*abort_cb)(struct device *dev))
 {
 {
 	struct omap_hdmi *hd = dev_get_drvdata(dev);
 	struct omap_hdmi *hd = dev_get_drvdata(dev);
-	int ret = 0;
 
 
 	mutex_lock(&hd->lock);
 	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;
 	hd->audio_abort_cb = abort_cb;
 
 
-out:
 	mutex_unlock(&hd->lock);
 	mutex_unlock(&hd->lock);
 
 
-	return ret;
+	return 0;
 }
 }
 
 
 static int hdmi_audio_shutdown(struct device *dev)
 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);
 	struct omap_hdmi *hd = dev_get_drvdata(dev);
 	unsigned long flags;
 	unsigned long flags;
 
 
-	WARN_ON(!hdmi_mode_has_audio(&hd->cfg));
-
 	spin_lock_irqsave(&hd->audio_playing_lock, flags);
 	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);
 		hdmi_start_audio_stream(hd);
+	}
 	hd->audio_playing = true;
 	hd->audio_playing = true;
 
 
 	spin_unlock_irqrestore(&hd->audio_playing_lock, flags);
 	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);
 	struct omap_hdmi *hd = dev_get_drvdata(dev);
 	unsigned long flags;
 	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);
 	spin_lock_irqsave(&hd->audio_playing_lock, flags);
 
 
@@ -677,18 +675,15 @@ static int hdmi_audio_config(struct device *dev,
 
 
 	mutex_lock(&hd->lock);
 	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:
 out:
 	mutex_unlock(&hd->lock);
 	mutex_unlock(&hd->lock);