Skip to content

Commit

Permalink
drm/i915: Call audio pin/ELD notify function
Browse files Browse the repository at this point in the history
When the audio codec is enabled or disabled, notify the audio driver.
This will enable the audio driver to get the notification at all times
(even when audio is in different powersave states).

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Acked-by: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
David Henningsson authored and Takashi Iwai committed Sep 2, 2015
1 parent 2a8ceed commit 51e1d83
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
1 change: 1 addition & 0 deletions drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -1809,6 +1809,7 @@ struct drm_i915_private {
struct drm_property *force_audio_property;

/* hda/i915 audio component */
struct i915_audio_component *audio_component;
bool audio_component_registered;

uint32_t hw_context_size;
Expand Down
23 changes: 20 additions & 3 deletions drivers/gpu/drm/i915/intel_audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,9 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
struct drm_connector *connector;
struct drm_device *dev = encoder->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct i915_audio_component *acomp = dev_priv->audio_component;
struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
enum port port = intel_dig_port->port;

connector = drm_select_eld(encoder, mode);
if (!connector)
Expand All @@ -419,6 +422,9 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)

if (dev_priv->display.audio_codec_enable)
dev_priv->display.audio_codec_enable(connector, intel_encoder, mode);

if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port, 0);
}

/**
Expand All @@ -428,13 +434,20 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder)
* The disable sequences must be performed before disabling the transcoder or
* port.
*/
void intel_audio_codec_disable(struct intel_encoder *encoder)
void intel_audio_codec_disable(struct intel_encoder *intel_encoder)
{
struct drm_device *dev = encoder->base.dev;
struct drm_encoder *encoder = &intel_encoder->base;
struct drm_device *dev = encoder->dev;
struct drm_i915_private *dev_priv = dev->dev_private;
struct i915_audio_component *acomp = dev_priv->audio_component;
struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
enum port port = intel_dig_port->port;

if (dev_priv->display.audio_codec_disable)
dev_priv->display.audio_codec_disable(encoder);
dev_priv->display.audio_codec_disable(intel_encoder);

if (acomp && acomp->audio_ops && acomp->audio_ops->pin_eld_notify)
acomp->audio_ops->pin_eld_notify(acomp->audio_ops->audio_ptr, (int) port, 0);
}

/**
Expand Down Expand Up @@ -525,12 +538,14 @@ static int i915_audio_component_bind(struct device *i915_dev,
struct device *hda_dev, void *data)
{
struct i915_audio_component *acomp = data;
struct drm_i915_private *dev_priv = dev_to_i915(i915_dev);

if (WARN_ON(acomp->ops || acomp->dev))
return -EEXIST;

acomp->ops = &i915_audio_component_ops;
acomp->dev = i915_dev;
dev_priv->audio_component = acomp;

return 0;
}
Expand All @@ -539,9 +554,11 @@ static void i915_audio_component_unbind(struct device *i915_dev,
struct device *hda_dev, void *data)
{
struct i915_audio_component *acomp = data;
struct drm_i915_private *dev_priv = dev_to_i915(i915_dev);

acomp->ops = NULL;
acomp->dev = NULL;
dev_priv->audio_component = NULL;
}

static const struct component_ops i915_audio_component_bind_ops = {
Expand Down

0 comments on commit 51e1d83

Please sign in to comment.