@@ -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)
+ 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;
drm_modeset_lock_all(drm_dev);
- 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 = drm_eld_size(eld);
- memcpy(buf, eld, min(max_bytes, ret));
- break;
+ if (connector) {
+ eld = connector->eld;
+ ret = drm_eld_size(eld);
+ memcpy(buf, eld, min(max_bytes, ret));
+ }
}
}
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@suse.de> --- drivers/gpu/drm/i915/intel_audio.c | 61 ++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 29 deletions(-)