These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / gpu / drm / radeon / dce6_afmt.c
index 44480c1..367a916 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)
@@ -282,6 +301,14 @@ void dce6_dp_audio_set_dto(struct radeon_device *rdev,
         * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator
         */
        if (ASIC_IS_DCE8(rdev)) {
+               unsigned int div = (RREG32(DENTIST_DISPCLK_CNTL) &
+                       DENTIST_DPREFCLK_WDIVIDER_MASK) >>
+                       DENTIST_DPREFCLK_WDIVIDER_SHIFT;
+               div = radeon_audio_decode_dfs_div(div);
+
+               if (div)
+                       clock = clock * 100 / div;
+
                WREG32(DCE8_DCCG_AUDIO_DTO1_PHASE, 24000);
                WREG32(DCE8_DCCG_AUDIO_DTO1_MODULE, clock);
        } else {