Skip to content

Commit

Permalink
drm/omap: Allow HDMI audio setup even if we do not have video configured
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jyri Sarha authored and Tomi Valkeinen committed Mar 1, 2018
1 parent 1915d7f commit c1899cb
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 40 deletions.
33 changes: 14 additions & 19 deletions drivers/gpu/drm/omapdrm/dss/hdmi4.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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);
Expand Down Expand Up @@ -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);

Expand Down
37 changes: 16 additions & 21 deletions drivers/gpu/drm/omapdrm/dss/hdmi5.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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);
Expand All @@ -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);

Expand All @@ -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);

Expand Down

0 comments on commit c1899cb

Please sign in to comment.