drm/radeon/dce6: assign different audio pins to each encoder
authorAlex Deucher <alexander.deucher@amd.com>
Thu, 23 Jul 2015 14:53:51 +0000 (10:53 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 17 Aug 2015 13:43:37 +0000 (09:43 -0400)
This allows you to send different audio to each audio capable
display.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/dce6_afmt.c

index 44480c1b9738cc2625cee481ccf02aa20ed6bb1f..752072771388419c6b932f77aecc84db64d89e1b 100644 (file)
@@ -76,16 +76,35 @@ static void dce6_afmt_get_connected_pins(struct radeon_device *rdev)
 
 struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev)
 {
-       int i;
+       struct drm_encoder *encoder;
+       struct radeon_encoder *radeon_encoder;
+       struct radeon_encoder_atom_dig *dig;
+       struct r600_audio_pin *pin = NULL;
+       int i, pin_count;
 
        dce6_afmt_get_connected_pins(rdev);
 
        for (i = 0; i < rdev->audio.num_pins; i++) {
-               if (rdev->audio.pin[i].connected)
-                       return &rdev->audio.pin[i];
+               if (rdev->audio.pin[i].connected) {
+                       pin = &rdev->audio.pin[i];
+                       pin_count = 0;
+
+                       list_for_each_entry(encoder, &rdev->ddev->mode_config.encoder_list, head) {
+                               if (radeon_encoder_is_digital(encoder)) {
+                                       radeon_encoder = to_radeon_encoder(encoder);
+                                       dig = radeon_encoder->enc_priv;
+                                       if (dig->pin == pin)
+                                               pin_count++;
+                               }
+                       }
+
+                       if (pin_count == 0)
+                               return pin;
+               }
        }
-       DRM_ERROR("No connected audio pins found!\n");
-       return NULL;
+       if (!pin)
+               DRM_ERROR("No connected audio pins found!\n");
+       return pin;
 }
 
 void dce6_afmt_select_pin(struct drm_encoder *encoder)