On Wed, Jan 06, 2016 at 10:26:41AM +0800, libin.yang@xxxxxxxxxxxxxxx wrote: > From: Libin Yang <libin.yang@xxxxxxxxxxxxxxx> > > For DP MST, use enc_to_mst(encoder)->primary to get intel_digital_port, > instead of using enc_to_dig_port(encoder). > > Signed-off-by: Libin Yang <libin.yang@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/intel_audio.c | 21 +++++++++++++++++---- > 1 file changed, 17 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c > index 31f6d21..431487a0 100644 > --- a/drivers/gpu/drm/i915/intel_audio.c > +++ b/drivers/gpu/drm/i915/intel_audio.c > @@ -187,6 +187,16 @@ static bool intel_eld_uptodate(struct drm_connector *connector, > return true; > } > > +static struct intel_digital_port * > +intel_encoder_to_dig_port(struct intel_encoder *intel_encoder) > +{ > + struct drm_encoder *encoder = &intel_encoder->base; > + > + if (intel_encoder->type == INTEL_OUTPUT_DP_MST) > + return enc_to_mst(encoder)->primary; > + return enc_to_dig_port(encoder); > +} > + > static void g4x_audio_codec_disable(struct intel_encoder *encoder) > { > struct drm_i915_private *dev_priv = encoder->base.dev->dev_private; > @@ -286,7 +296,7 @@ static void hsw_audio_codec_enable(struct drm_connector *connector, > struct i915_audio_component *acomp = dev_priv->audio_component; > const uint8_t *eld = connector->eld; > struct intel_digital_port *intel_dig_port = > - enc_to_dig_port(&encoder->base); > + intel_encoder_to_dig_port(encoder); This hunk makes sense since we just look at intel_dig_port->port. Might make sense to entirely eliminate the local inte_dig_port variable from these hooks so that there's no confusion whether it points at the fake or primary encoder. > enum port port = intel_dig_port->port; > uint32_t tmp; > int len, i; > @@ -500,7 +510,8 @@ void intel_audio_codec_enable(struct intel_encoder *intel_encoder) > 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); > + struct intel_digital_port *intel_dig_port = > + intel_encoder_to_dig_port(intel_encoder); > enum port port = intel_dig_port->port; > > connector = drm_select_eld(encoder); > @@ -546,7 +557,8 @@ void intel_audio_codec_disable(struct intel_encoder *intel_encoder) > 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); > + struct intel_digital_port *intel_dig_port = > + intel_encoder_to_dig_port(intel_encoder); > enum port port = intel_dig_port->port; > > if (dev_priv->display.audio_codec_disable) > @@ -724,7 +736,8 @@ static int i915_audio_component_get_eld(struct device *dev, int port, > /* intel_encoder might be NULL for DP MST */ > if (intel_encoder) { > ret = 0; > - intel_dig_port = enc_to_dig_port(&intel_encoder->base); > + intel_dig_port = > + intel_encoder_to_dig_port(intel_encoder); > *enabled = intel_dig_port->audio_connector != NULL; These not so much. We'd clobber 'intel_dig_port->audio_connector' for the primary encoder whenever a new MST stream is enabled. Was the intention just to fix the port information passed to .pin_eld_notify()? This whole thing seems highlight a rather big issue with the current component stuff; How do you tell the streams apart when all are using the same DDI port? > if (*enabled) { > eld = intel_dig_port->audio_connector->eld; > -- > 1.9.1 -- Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx