diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2013-12-19 11:37:22 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2013-12-24 17:54:56 -0500 |
commit | 914a89872be27db59546525ea96be817c7b2509c (patch) | |
tree | 927b30218bcbc8439281e85cd1c71cc92a513cdb | |
parent | 01ac8794a77192236a4b91c33adf4177ac5a21f0 (diff) |
drm/radeon/dpm: add a late enable callback
Certain features need to be enabled after ring tests
(e.g., powergating, etc.). Add a function pointer
to split out late enable features.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 12 |
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 572476b61d89..869465aafbc5 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -252,6 +252,7 @@ struct radeon_clock { | |||
252 | * Power management | 252 | * Power management |
253 | */ | 253 | */ |
254 | int radeon_pm_init(struct radeon_device *rdev); | 254 | int radeon_pm_init(struct radeon_device *rdev); |
255 | int radeon_pm_late_init(struct radeon_device *rdev); | ||
255 | void radeon_pm_fini(struct radeon_device *rdev); | 256 | void radeon_pm_fini(struct radeon_device *rdev); |
256 | void radeon_pm_compute_clocks(struct radeon_device *rdev); | 257 | void radeon_pm_compute_clocks(struct radeon_device *rdev); |
257 | void radeon_pm_suspend(struct radeon_device *rdev); | 258 | void radeon_pm_suspend(struct radeon_device *rdev); |
@@ -1780,6 +1781,7 @@ struct radeon_asic { | |||
1780 | int (*init)(struct radeon_device *rdev); | 1781 | int (*init)(struct radeon_device *rdev); |
1781 | void (*setup_asic)(struct radeon_device *rdev); | 1782 | void (*setup_asic)(struct radeon_device *rdev); |
1782 | int (*enable)(struct radeon_device *rdev); | 1783 | int (*enable)(struct radeon_device *rdev); |
1784 | int (*late_enable)(struct radeon_device *rdev); | ||
1783 | void (*disable)(struct radeon_device *rdev); | 1785 | void (*disable)(struct radeon_device *rdev); |
1784 | int (*pre_set_power_state)(struct radeon_device *rdev); | 1786 | int (*pre_set_power_state)(struct radeon_device *rdev); |
1785 | int (*set_power_state)(struct radeon_device *rdev); | 1787 | int (*set_power_state)(struct radeon_device *rdev); |
@@ -2655,6 +2657,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v); | |||
2655 | #define radeon_dpm_init(rdev) rdev->asic->dpm.init((rdev)) | 2657 | #define radeon_dpm_init(rdev) rdev->asic->dpm.init((rdev)) |
2656 | #define radeon_dpm_setup_asic(rdev) rdev->asic->dpm.setup_asic((rdev)) | 2658 | #define radeon_dpm_setup_asic(rdev) rdev->asic->dpm.setup_asic((rdev)) |
2657 | #define radeon_dpm_enable(rdev) rdev->asic->dpm.enable((rdev)) | 2659 | #define radeon_dpm_enable(rdev) rdev->asic->dpm.enable((rdev)) |
2660 | #define radeon_dpm_late_enable(rdev) rdev->asic->dpm.late_enable((rdev)) | ||
2658 | #define radeon_dpm_disable(rdev) rdev->asic->dpm.disable((rdev)) | 2661 | #define radeon_dpm_disable(rdev) rdev->asic->dpm.disable((rdev)) |
2659 | #define radeon_dpm_pre_set_power_state(rdev) rdev->asic->dpm.pre_set_power_state((rdev)) | 2662 | #define radeon_dpm_pre_set_power_state(rdev) rdev->asic->dpm.pre_set_power_state((rdev)) |
2660 | #define radeon_dpm_set_power_state(rdev) rdev->asic->dpm.set_power_state((rdev)) | 2663 | #define radeon_dpm_set_power_state(rdev) rdev->asic->dpm.set_power_state((rdev)) |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 384758d011e4..d4e5bcfeb77d 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -1288,6 +1288,18 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
1288 | return radeon_pm_init_old(rdev); | 1288 | return radeon_pm_init_old(rdev); |
1289 | } | 1289 | } |
1290 | 1290 | ||
1291 | int radeon_pm_late_init(struct radeon_device *rdev) | ||
1292 | { | ||
1293 | int ret = 0; | ||
1294 | |||
1295 | if (rdev->pm.pm_method == PM_METHOD_DPM) { | ||
1296 | mutex_lock(&rdev->pm.mutex); | ||
1297 | ret = radeon_dpm_late_enable(rdev); | ||
1298 | mutex_unlock(&rdev->pm.mutex); | ||
1299 | } | ||
1300 | return ret; | ||
1301 | } | ||
1302 | |||
1291 | static void radeon_pm_fini_old(struct radeon_device *rdev) | 1303 | static void radeon_pm_fini_old(struct radeon_device *rdev) |
1292 | { | 1304 | { |
1293 | if (rdev->pm.num_power_states > 1) { | 1305 | if (rdev->pm.num_power_states > 1) { |