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@suse.de
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) {
intel_dig_port = enc_to_dig_port(&intel_encoder->base);ret = 0;
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@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx
-- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch