On Mon, 30 Nov 2015 15:14:03 +0100, Daniel Vetter wrote: > > On Mon, Nov 30, 2015 at 02:37:47PM +0100, Takashi Iwai wrote: > > We have a common loop of encoder to look for the given audio port in > > two audio component functions. Split out a local helper function to > > do it for the code simplification. > > > > Signed-off-by: Takashi Iwai <tiwai@xxxxxxx> > > --- > > drivers/gpu/drm/i915/intel_audio.c | 61 ++++++++++++++++++++------------------ > > 1 file changed, 32 insertions(+), 29 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c > > index 6b318a8d5dc9..024e88ae6305 100644 > > --- a/drivers/gpu/drm/i915/intel_audio.c > > +++ b/drivers/gpu/drm/i915/intel_audio.c > > @@ -630,17 +630,33 @@ static int i915_audio_component_get_cdclk_freq(struct device *dev) > > return ret; > > } > > > > +static struct intel_encoder *audio_port_to_encoder(struct drm_device *drm_dev, > > + int port) > > +{ > > + struct intel_encoder *intel_encoder; > > + struct intel_digital_port *intel_dig_port; > > + > > + for_each_intel_encoder(drm_dev, intel_encoder) { > > + if (intel_encoder->type != INTEL_OUTPUT_HDMI && > > + intel_encoder->type != INTEL_OUTPUT_DISPLAYPORT) > > + continue; > > + intel_dig_port = enc_to_dig_port(&intel_encoder->base); > > + if (port == intel_dig_port->port) > > If this is static, maybe just maintain a snd_pin_to_port mapping in > dev_priv? That's the approach we're usually taking, and it has the benefit > of making it clear(er) that the binding is static ... Or is it not? Yes, I *guess* this is static, but need a double-check. The current patchset just derives from the existing code. thanks, Takashi > Makes sense otherwise. > -Daniel > > > + return intel_encoder; > > + } > > + return NULL; > > +} > > + > > static int i915_audio_component_sync_audio_rate(struct device *dev, > > int port, int rate) > > { > > struct drm_i915_private *dev_priv = dev_to_i915(dev); > > struct drm_device *drm_dev = dev_priv->dev; > > struct intel_encoder *intel_encoder; > > - struct intel_digital_port *intel_dig_port; > > struct intel_crtc *crtc; > > struct drm_display_mode *mode; > > struct i915_audio_component *acomp = dev_priv->audio_component; > > - enum pipe pipe = -1; > > + enum pipe pipe; > > u32 tmp; > > int n; > > > > @@ -652,22 +668,14 @@ static int i915_audio_component_sync_audio_rate(struct device *dev, > > > > mutex_lock(&dev_priv->av_mutex); > > /* 1. get the pipe */ > > - for_each_intel_encoder(drm_dev, intel_encoder) { > > - if (intel_encoder->type != INTEL_OUTPUT_HDMI) > > - continue; > > - intel_dig_port = enc_to_dig_port(&intel_encoder->base); > > - if (port == intel_dig_port->port) { > > - crtc = to_intel_crtc(intel_encoder->base.crtc); > > - pipe = crtc->pipe; > > - break; > > - } > > - } > > - > > - if (pipe == INVALID_PIPE) { > > + intel_encoder = audio_port_to_encoder(drm_dev, port); > > + if (!intel_encoder || intel_encoder->type != INTEL_OUTPUT_HDMI) { > > DRM_DEBUG_KMS("no pipe for the port %c\n", port_name(port)); > > mutex_unlock(&dev_priv->av_mutex); > > return -ENODEV; > > } > > + crtc = to_intel_crtc(intel_encoder->base.crtc); > > + pipe = crtc->pipe; > > DRM_DEBUG_KMS("pipe %c connects port %c\n", > > pipe_name(pipe), port_name(port)); > > mode = &crtc->config->base.adjusted_mode; > > @@ -717,23 +725,18 @@ static int i915_audio_component_get_eld(struct device *dev, int port, > > int ret = -EINVAL; > > > > mutex_lock(&dev_priv->av_mutex); > > - for_each_intel_encoder(drm_dev, intel_encoder) { > > - if (intel_encoder->type != INTEL_OUTPUT_DISPLAYPORT && > > - intel_encoder->type != INTEL_OUTPUT_HDMI) > > - continue; > > + intel_encoder = audio_port_to_encoder(drm_dev, port); > > + if (intel_encoder) { > > + ret = 0; > > intel_dig_port = enc_to_dig_port(&intel_encoder->base); > > - if (port == intel_dig_port->port) { > > - ret = 0; > > - *enabled = intel_dig_port->audio_enabled; > > - if (!*enabled) > > - break; > > + *enabled = intel_dig_port->audio_enabled; > > + if (*enabled) { > > connector = drm_select_eld(&intel_encoder->base); > > - if (!connector) > > - break; > > - eld = connector->eld; > > - ret = min(max_bytes, drm_eld_size(eld)); > > - memcpy(buf, eld, ret); > > - break; > > + if (connector) { > > + eld = connector->eld; > > + ret = min(max_bytes, drm_eld_size(eld)); > > + memcpy(buf, eld, ret); > > + } > > } > > } > > > > -- > > 2.6.3 > > > > _______________________________________________ > > Intel-gfx mailing list > > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > > http://lists.freedesktop.org/mailman/listinfo/intel-gfx > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx