]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/radeon/r100.c
drm/radeon/kms/pm: rework power management
[karo-tx-linux.git] / drivers / gpu / drm / radeon / r100.c
index 2106ac66eb3239654439d9bcd7465b18592f6819..7675827c3a8d50d024fbcba002e511521d1447b1 100644 (file)
@@ -145,7 +145,7 @@ void r100_get_power_state(struct radeon_device *rdev,
                 pcie_lanes);
 }
 
-void r100_set_power_state(struct radeon_device *rdev)
+void r100_set_power_state(struct radeon_device *rdev, bool static_switch)
 {
        u32 sclk, mclk;
 
@@ -167,33 +167,51 @@ void r100_set_power_state(struct radeon_device *rdev)
                if (rdev->pm.active_crtc_count > 1)
                        mclk = rdev->clock.default_mclk;
 
-               /* set pcie lanes */
-               /* TODO */
+               /* voltage, pcie lanes, etc.*/
+               radeon_pm_misc(rdev);
 
-               /* set voltage */
-               /* TODO */
-
-               /* set engine clock */
-               if (sclk != rdev->pm.current_sclk) {
-                       radeon_sync_with_vblank(rdev);
-                       radeon_pm_debug_check_in_vbl(rdev, false);
-                       radeon_set_engine_clock(rdev, sclk);
-                       radeon_pm_debug_check_in_vbl(rdev, true);
-                       rdev->pm.current_sclk = sclk;
-                       DRM_INFO("Setting: e: %d\n", sclk);
-               }
+               if (static_switch) {
+                       radeon_pm_prepare(rdev);
+                       /* set engine clock */
+                       if (sclk != rdev->pm.current_sclk) {
+                               radeon_set_engine_clock(rdev, sclk);
+                               rdev->pm.current_sclk = sclk;
+                               DRM_INFO("Setting: e: %d\n", sclk);
+                       }
+#if 0
+                       /* set memory clock */
+                       if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
+                               radeon_set_memory_clock(rdev, mclk);
+                               rdev->pm.current_mclk = mclk;
+                               DRM_INFO("Setting: m: %d\n", mclk);
+                       }
+#endif
+                       radeon_pm_finish(rdev);
+               } else {
+                       /* set engine clock */
+                       if (sclk != rdev->pm.current_sclk) {
+                               radeon_sync_with_vblank(rdev);
+                               radeon_pm_debug_check_in_vbl(rdev, false);
+                               radeon_set_engine_clock(rdev, sclk);
+                               radeon_pm_debug_check_in_vbl(rdev, true);
+                               rdev->pm.current_sclk = sclk;
+                               DRM_INFO("Setting: e: %d\n", sclk);
+                       }
 
 #if 0
-               /* set memory clock */
-               if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
-                       radeon_sync_with_vblank(rdev);
-                       radeon_pm_debug_check_in_vbl(rdev, false);
-                       radeon_set_memory_clock(rdev, mclk);
-                       radeon_pm_debug_check_in_vbl(rdev, true);
-                       rdev->pm.current_mclk = mclk;
-                       DRM_INFO("Setting: m: %d\n", mclk);
-               }
+                       /* set memory clock */
+                       if (rdev->asic->set_memory_clock && (mclk != rdev->pm.current_mclk)) {
+                               radeon_sync_with_vblank(rdev);
+                               radeon_pm_debug_check_in_vbl(rdev, false);
+                               radeon_pm_prepare(rdev);
+                               radeon_set_memory_clock(rdev, mclk);
+                               radeon_pm_finish(rdev);
+                               radeon_pm_debug_check_in_vbl(rdev, true);
+                               rdev->pm.current_mclk = mclk;
+                               DRM_INFO("Setting: m: %d\n", mclk);
+                       }
 #endif
+               }
 
                rdev->pm.current_power_state_index = rdev->pm.requested_power_state_index;
                rdev->pm.current_clock_mode_index = rdev->pm.requested_clock_mode_index;