drm/radeon/dpm: add new pre/post_set_power_state callbacks
authorAlex Deucher <alexander.deucher@amd.com>
Wed, 16 Jan 2013 17:52:04 +0000 (12:52 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 27 Jun 2013 23:16:16 +0000 (19:16 -0400)
Needed to properly handle dynamic state adjustment.

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

index a0ab625..c5d83c1 100644 (file)
@@ -1615,7 +1615,9 @@ struct radeon_asic {
                void (*setup_asic)(struct radeon_device *rdev);
                int (*enable)(struct radeon_device *rdev);
                void (*disable)(struct radeon_device *rdev);
+               int (*pre_set_power_state)(struct radeon_device *rdev);
                int (*set_power_state)(struct radeon_device *rdev);
+               void (*post_set_power_state)(struct radeon_device *rdev);
                void (*display_configuration_changed)(struct radeon_device *rdev);
                void (*fini)(struct radeon_device *rdev);
                u32 (*get_sclk)(struct radeon_device *rdev, bool low);
@@ -2328,7 +2330,9 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
 #define radeon_dpm_setup_asic(rdev) rdev->asic->dpm.setup_asic((rdev))
 #define radeon_dpm_enable(rdev) rdev->asic->dpm.enable((rdev))
 #define radeon_dpm_disable(rdev) rdev->asic->dpm.disable((rdev))
+#define radeon_dpm_pre_set_power_state(rdev) rdev->asic->dpm.pre_set_power_state((rdev))
 #define radeon_dpm_set_power_state(rdev) rdev->asic->dpm.set_power_state((rdev))
+#define radeon_dpm_post_set_power_state(rdev) rdev->asic->dpm.post_set_power_state((rdev))
 #define radeon_dpm_display_configuration_changed(rdev) rdev->asic->dpm.display_configuration_changed((rdev))
 #define radeon_dpm_fini(rdev) rdev->asic->dpm.fini((rdev))
 #define radeon_dpm_get_sclk(rdev, l) rdev->asic->dpm.get_sclk((rdev), (l))
index 7143c91..4e2ccc6 100644 (file)
@@ -700,6 +700,7 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
        int i;
        struct radeon_ps *ps;
        enum radeon_pm_state_type dpm_state;
+       int ret;
 
        /* if dpm init failed */
        if (!rdev->pm.dpm_enabled)
@@ -766,6 +767,12 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
        down_write(&rdev->pm.mclk_lock);
        mutex_lock(&rdev->ring_lock);
 
+       if (rdev->asic->dpm.pre_set_power_state) {
+               ret = radeon_dpm_pre_set_power_state(rdev);
+               if (ret)
+                       goto done;
+       }
+
        /* update display watermarks based on new power state */
        radeon_bandwidth_update(rdev);
        /* update displays */
@@ -787,6 +794,10 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
        /* update current power state */
        rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps;
 
+       if (rdev->asic->dpm.post_set_power_state)
+               radeon_dpm_post_set_power_state(rdev);
+
+done:
        mutex_unlock(&rdev->ring_lock);
        up_write(&rdev->pm.mclk_lock);
        mutex_unlock(&rdev->ddev->struct_mutex);