drm/radeon/kms/pm: restore default power state on exit
[pandora-kernel.git] / drivers / gpu / drm / radeon / radeon_pm.c
index a137ee2..23b79eb 100644 (file)
@@ -42,7 +42,7 @@ static const char *pm_state_names[4] = {
 };
 
 static const char *pm_state_types[5] = {
-       "Default",
+       "",
        "Powersave",
        "Battery",
        "Balanced",
@@ -64,7 +64,7 @@ static void radeon_print_power_mode_info(struct radeon_device *rdev)
                         pm_state_types[rdev->pm.power_state[i].type],
                         is_default ? "(default)" : "");
                if ((rdev->flags & RADEON_IS_PCIE) && !(rdev->flags & RADEON_IS_IGP))
-                       DRM_INFO("\t%d PCIE Lanes\n", rdev->pm.power_state[i].non_clock_info.pcie_lanes);
+                       DRM_INFO("\t%d PCIE Lanes\n", rdev->pm.power_state[i].pcie_lanes);
                if (rdev->pm.power_state[i].flags & RADEON_PM_SINGLE_DISPLAY_ONLY)
                        DRM_INFO("\tSingle display only\n");
                DRM_INFO("\t%d Clock Mode(s)\n", rdev->pm.power_state[i].num_clock_modes);
@@ -113,7 +113,7 @@ int radeon_pm_init(struct radeon_device *rdev)
 
        INIT_DELAYED_WORK(&rdev->pm.idle_work, radeon_pm_idle_work_handler);
 
-       if (radeon_dynpm != -1 && radeon_dynpm) {
+       if ((radeon_dynpm != -1 && radeon_dynpm) && (rdev->pm.num_power_states > 1)) {
                rdev->pm.state = PM_STATE_PAUSED;
                DRM_INFO("radeon: dynamic power management enabled\n");
        }
@@ -125,6 +125,15 @@ int radeon_pm_init(struct radeon_device *rdev)
 
 void radeon_pm_fini(struct radeon_device *rdev)
 {
+       if (rdev->pm.state != PM_STATE_DISABLED) {
+               /* cancel work */
+               cancel_delayed_work_sync(&rdev->pm.idle_work);
+               /* reset default clocks */
+               rdev->pm.state = PM_STATE_DISABLED;
+               rdev->pm.planned_action = PM_ACTION_DEFAULT;
+               radeon_pm_set_clocks(rdev);
+       }
+
        if (rdev->pm.i2c_bus)
                radeon_i2c_destroy(rdev->pm.i2c_bus);
 }