struct radeon_connector *radeon_connector = NULL;
        struct radeon_connector_atom_dig *radeon_dig_connector = NULL;
        bool travis_quirk = false;
+       int encoder_mode;
 
        if (connector) {
                radeon_connector = to_radeon_connector(connector);
                }
                break;
        }
+
+       encoder_mode = atombios_get_encoder_mode(encoder);
+       if (radeon_audio != 0 &&
+               (encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode)))
+               radeon_audio_dpms(encoder, mode);
 }
 
 static void
        struct drm_device *dev = encoder->dev;
        struct radeon_device *rdev = dev->dev_private;
        struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
+       int encoder_mode;
 
        radeon_encoder->pixel_clock = adjusted_mode->clock;
 
        case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
        case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
                /* handled in dpms */
+               encoder_mode = atombios_get_encoder_mode(encoder);
+               if (radeon_audio != 0 &&
+                       (encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode)))
+                       radeon_audio_mode_set(encoder, adjusted_mode);
                break;
        case ENCODER_OBJECT_ID_INTERNAL_DDI:
        case ENCODER_OBJECT_ID_INTERNAL_DVO1:
        }
 
        atombios_apply_encoder_quirks(encoder, adjusted_mode);
-
-       if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
-               if (rdev->asic->display.hdmi_enable)
-                       radeon_hdmi_enable(rdev, encoder, true);
-               radeon_audio_mode_set(encoder, adjusted_mode);
-       }
 }
 
 static bool
 
 disable_done:
        if (radeon_encoder_is_digital(encoder)) {
-               if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) {
-                       if (rdev->asic->display.hdmi_enable)
-                               radeon_hdmi_enable(rdev, encoder, false);
-               }
                dig = radeon_encoder->enc_priv;
                dig->dig_encoder = -1;
        }
 
                .wait_for_vblank = &avivo_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &r600_hdmi_enable,
        },
        .copy = {
                .blit = &r100_copy_blit,
                .wait_for_vblank = &avivo_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &r600_hdmi_enable,
        },
        .copy = {
                .blit = &r100_copy_blit,
                .wait_for_vblank = &avivo_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &r600_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &avivo_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &r600_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &avivo_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &r600_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &avivo_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &r600_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &dce4_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &evergreen_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &dce4_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &evergreen_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &dce4_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &evergreen_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &dce4_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &evergreen_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &dce4_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &evergreen_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &dce4_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &evergreen_hdmi_enable,
        },
        .copy = {
                .blit = &r600_copy_cpdma,
                .wait_for_vblank = &dce4_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &evergreen_hdmi_enable,
        },
        .copy = {
                .blit = &cik_copy_cpdma,
                .wait_for_vblank = &dce4_wait_for_vblank,
                .set_backlight_level = &atombios_set_backlight_level,
                .get_backlight_level = &atombios_get_backlight_level,
-               .hdmi_enable = &evergreen_hdmi_enable,
        },
        .copy = {
                .blit = &cik_copy_cpdma,
 
 void r600_hdmi_audio_workaround(struct drm_encoder *encoder);
 int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder);
 void r600_hdmi_update_audio_settings(struct drm_encoder *encoder);
-void r600_hdmi_enable(struct drm_encoder *encoder, bool enable);
 int r600_mc_wait_for_idle(struct radeon_device *rdev);
 u32 r600_get_xclk(struct radeon_device *rdev);
 uint64_t r600_get_gpu_clock_counter(struct radeon_device *rdev);
                                        uint64_t src_offset, uint64_t dst_offset,
                                        unsigned num_gpu_pages,
                                        struct reservation_object *resv);
-void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable);
 int evergreen_get_temp(struct radeon_device *rdev);
 int sumo_get_temp(struct radeon_device *rdev);
 int tn_get_temp(struct radeon_device *rdev);
 
 void dce4_set_mute(struct drm_encoder *encoder, u32 offset, bool mute);
 static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder,
        struct drm_display_mode *mode);
+void r600_hdmi_enable(struct drm_encoder *encoder, bool enable);
+void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable);
 
 static const u32 pin_offsets[7] =
 {
        .set_audio_packet = r600_set_audio_packet,
        .set_mute = r600_set_mute,
        .mode_set = radeon_audio_hdmi_mode_set,
+       .dpms = r600_hdmi_enable,
 };
 
 static struct radeon_audio_funcs dce32_hdmi_funcs = {
        .set_audio_packet = dce3_2_set_audio_packet,
        .set_mute = dce3_2_set_mute,
        .mode_set = radeon_audio_hdmi_mode_set,
+       .dpms = r600_hdmi_enable,
 };
 
 static struct radeon_audio_funcs dce32_dp_funcs = {
        .set_audio_packet = dce4_set_audio_packet,
        .set_mute = dce4_set_mute,
        .mode_set = radeon_audio_hdmi_mode_set,
+       .dpms = evergreen_hdmi_enable,
 };
 
 static struct radeon_audio_funcs dce4_dp_funcs = {
        .set_audio_packet = dce4_set_audio_packet,
        .set_mute = dce4_set_mute,
        .mode_set = radeon_audio_hdmi_mode_set,
+       .dpms = evergreen_hdmi_enable,
 };
 
 static struct radeon_audio_funcs dce6_dp_funcs = {
        if (radeon_encoder->audio && radeon_encoder->audio->mode_set)
                radeon_encoder->audio->mode_set(encoder, mode);
 }
+
+void radeon_audio_dpms(struct drm_encoder *encoder, int mode)
+{
+       struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
+
+       if (radeon_encoder->audio && radeon_encoder->audio->dpms)
+               radeon_encoder->audio->dpms(encoder, mode == DRM_MODE_DPMS_ON);
+}
 
        void (*set_mute)(struct drm_encoder *encoder, u32 offset, bool mute);
        void (*mode_set)(struct drm_encoder *encoder,
                struct drm_display_mode *mode);
+       void (*dpms)(struct drm_encoder *encoder, bool mode);
 };
 
 int radeon_audio_init(struct radeon_device *rdev);
 void radeon_audio_fini(struct radeon_device *rdev);
 void radeon_audio_mode_set(struct drm_encoder *encoder,
        struct drm_display_mode *mode);
+void radeon_audio_dpms(struct drm_encoder *encoder, int mode);
 
 #endif