diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2012-09-14 09:59:26 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2012-09-27 10:22:41 -0400 |
commit | 6d92f81dcf2d40b8ebb947bba5435642b830f649 (patch) | |
tree | 9a9f606f27c6e0007d473727326b5b761186c331 | |
parent | 2e3b3b105ab3bb5b6a37198da4f193cd13781d13 (diff) |
drm/radeon: add get_backlight_level callback
Read back the backlight level from the hw.
Needed for proper backlight restoration on resume.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_legacy_encoders.c | 13 |
5 files changed, 49 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index 266036b10fec..5ce13b8fbe6c 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -72,6 +72,18 @@ radeon_atom_set_backlight_level_to_reg(struct radeon_device *rdev, | |||
72 | WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch); | 72 | WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch); |
73 | } | 73 | } |
74 | 74 | ||
75 | u8 | ||
76 | atombios_get_backlight_level(struct radeon_encoder *radeon_encoder) | ||
77 | { | ||
78 | struct drm_device *dev = radeon_encoder->base.dev; | ||
79 | struct radeon_device *rdev = dev->dev_private; | ||
80 | |||
81 | if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU)) | ||
82 | return 0; | ||
83 | |||
84 | return radeon_atom_get_backlight_level_from_reg(rdev); | ||
85 | } | ||
86 | |||
75 | void | 87 | void |
76 | atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) | 88 | atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) |
77 | { | 89 | { |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 4d67f0f5a5a3..de86b8e259ce 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -1174,6 +1174,8 @@ struct radeon_asic { | |||
1174 | void (*wait_for_vblank)(struct radeon_device *rdev, int crtc); | 1174 | void (*wait_for_vblank)(struct radeon_device *rdev, int crtc); |
1175 | /* set backlight level */ | 1175 | /* set backlight level */ |
1176 | void (*set_backlight_level)(struct radeon_encoder *radeon_encoder, u8 level); | 1176 | void (*set_backlight_level)(struct radeon_encoder *radeon_encoder, u8 level); |
1177 | /* get backlight level */ | ||
1178 | u8 (*get_backlight_level)(struct radeon_encoder *radeon_encoder); | ||
1177 | } display; | 1179 | } display; |
1178 | /* copy functions for bo handling */ | 1180 | /* copy functions for bo handling */ |
1179 | struct { | 1181 | struct { |
@@ -1767,6 +1769,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v); | |||
1767 | #define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev)) | 1769 | #define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev)) |
1768 | #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc)) | 1770 | #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc)) |
1769 | #define radeon_set_backlight_level(rdev, e, l) (rdev)->asic->display.set_backlight_level((e), (l)) | 1771 | #define radeon_set_backlight_level(rdev, e, l) (rdev)->asic->display.set_backlight_level((e), (l)) |
1772 | #define radeon_get_backlight_level(rdev, e) (rdev)->asic->display.get_backlight_level((e)) | ||
1770 | #define radeon_fence_ring_emit(rdev, r, fence) (rdev)->asic->ring[(r)].emit_fence((rdev), (fence)) | 1773 | #define radeon_fence_ring_emit(rdev, r, fence) (rdev)->asic->ring[(r)].emit_fence((rdev), (fence)) |
1771 | #define radeon_semaphore_ring_emit(rdev, r, cp, semaphore, emit_wait) (rdev)->asic->ring[(r)].emit_semaphore((rdev), (cp), (semaphore), (emit_wait)) | 1774 | #define radeon_semaphore_ring_emit(rdev, r, cp, semaphore, emit_wait) (rdev)->asic->ring[(r)].emit_semaphore((rdev), (cp), (semaphore), (emit_wait)) |
1772 | #define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy.blit((rdev), (s), (d), (np), (f)) | 1775 | #define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy.blit((rdev), (s), (d), (np), (f)) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 2f7adeab049b..6225e1977700 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
@@ -199,6 +199,7 @@ static struct radeon_asic r100_asic = { | |||
199 | .get_vblank_counter = &r100_get_vblank_counter, | 199 | .get_vblank_counter = &r100_get_vblank_counter, |
200 | .wait_for_vblank = &r100_wait_for_vblank, | 200 | .wait_for_vblank = &r100_wait_for_vblank, |
201 | .set_backlight_level = &radeon_legacy_set_backlight_level, | 201 | .set_backlight_level = &radeon_legacy_set_backlight_level, |
202 | .get_backlight_level = &radeon_legacy_get_backlight_level, | ||
202 | }, | 203 | }, |
203 | .copy = { | 204 | .copy = { |
204 | .blit = &r100_copy_blit, | 205 | .blit = &r100_copy_blit, |
@@ -274,6 +275,7 @@ static struct radeon_asic r200_asic = { | |||
274 | .get_vblank_counter = &r100_get_vblank_counter, | 275 | .get_vblank_counter = &r100_get_vblank_counter, |
275 | .wait_for_vblank = &r100_wait_for_vblank, | 276 | .wait_for_vblank = &r100_wait_for_vblank, |
276 | .set_backlight_level = &radeon_legacy_set_backlight_level, | 277 | .set_backlight_level = &radeon_legacy_set_backlight_level, |
278 | .get_backlight_level = &radeon_legacy_get_backlight_level, | ||
277 | }, | 279 | }, |
278 | .copy = { | 280 | .copy = { |
279 | .blit = &r100_copy_blit, | 281 | .blit = &r100_copy_blit, |
@@ -349,6 +351,7 @@ static struct radeon_asic r300_asic = { | |||
349 | .get_vblank_counter = &r100_get_vblank_counter, | 351 | .get_vblank_counter = &r100_get_vblank_counter, |
350 | .wait_for_vblank = &r100_wait_for_vblank, | 352 | .wait_for_vblank = &r100_wait_for_vblank, |
351 | .set_backlight_level = &radeon_legacy_set_backlight_level, | 353 | .set_backlight_level = &radeon_legacy_set_backlight_level, |
354 | .get_backlight_level = &radeon_legacy_get_backlight_level, | ||
352 | }, | 355 | }, |
353 | .copy = { | 356 | .copy = { |
354 | .blit = &r100_copy_blit, | 357 | .blit = &r100_copy_blit, |
@@ -424,6 +427,7 @@ static struct radeon_asic r300_asic_pcie = { | |||
424 | .get_vblank_counter = &r100_get_vblank_counter, | 427 | .get_vblank_counter = &r100_get_vblank_counter, |
425 | .wait_for_vblank = &r100_wait_for_vblank, | 428 | .wait_for_vblank = &r100_wait_for_vblank, |
426 | .set_backlight_level = &radeon_legacy_set_backlight_level, | 429 | .set_backlight_level = &radeon_legacy_set_backlight_level, |
430 | .get_backlight_level = &radeon_legacy_get_backlight_level, | ||
427 | }, | 431 | }, |
428 | .copy = { | 432 | .copy = { |
429 | .blit = &r100_copy_blit, | 433 | .blit = &r100_copy_blit, |
@@ -499,6 +503,7 @@ static struct radeon_asic r420_asic = { | |||
499 | .get_vblank_counter = &r100_get_vblank_counter, | 503 | .get_vblank_counter = &r100_get_vblank_counter, |
500 | .wait_for_vblank = &r100_wait_for_vblank, | 504 | .wait_for_vblank = &r100_wait_for_vblank, |
501 | .set_backlight_level = &atombios_set_backlight_level, | 505 | .set_backlight_level = &atombios_set_backlight_level, |
506 | .get_backlight_level = &atombios_get_backlight_level, | ||
502 | }, | 507 | }, |
503 | .copy = { | 508 | .copy = { |
504 | .blit = &r100_copy_blit, | 509 | .blit = &r100_copy_blit, |
@@ -574,6 +579,7 @@ static struct radeon_asic rs400_asic = { | |||
574 | .get_vblank_counter = &r100_get_vblank_counter, | 579 | .get_vblank_counter = &r100_get_vblank_counter, |
575 | .wait_for_vblank = &r100_wait_for_vblank, | 580 | .wait_for_vblank = &r100_wait_for_vblank, |
576 | .set_backlight_level = &radeon_legacy_set_backlight_level, | 581 | .set_backlight_level = &radeon_legacy_set_backlight_level, |
582 | .get_backlight_level = &radeon_legacy_get_backlight_level, | ||
577 | }, | 583 | }, |
578 | .copy = { | 584 | .copy = { |
579 | .blit = &r100_copy_blit, | 585 | .blit = &r100_copy_blit, |
@@ -649,6 +655,7 @@ static struct radeon_asic rs600_asic = { | |||
649 | .get_vblank_counter = &rs600_get_vblank_counter, | 655 | .get_vblank_counter = &rs600_get_vblank_counter, |
650 | .wait_for_vblank = &avivo_wait_for_vblank, | 656 | .wait_for_vblank = &avivo_wait_for_vblank, |
651 | .set_backlight_level = &atombios_set_backlight_level, | 657 | .set_backlight_level = &atombios_set_backlight_level, |
658 | .get_backlight_level = &atombios_get_backlight_level, | ||
652 | }, | 659 | }, |
653 | .copy = { | 660 | .copy = { |
654 | .blit = &r100_copy_blit, | 661 | .blit = &r100_copy_blit, |
@@ -724,6 +731,7 @@ static struct radeon_asic rs690_asic = { | |||
724 | .bandwidth_update = &rs690_bandwidth_update, | 731 | .bandwidth_update = &rs690_bandwidth_update, |
725 | .wait_for_vblank = &avivo_wait_for_vblank, | 732 | .wait_for_vblank = &avivo_wait_for_vblank, |
726 | .set_backlight_level = &atombios_set_backlight_level, | 733 | .set_backlight_level = &atombios_set_backlight_level, |
734 | .get_backlight_level = &atombios_get_backlight_level, | ||
727 | }, | 735 | }, |
728 | .copy = { | 736 | .copy = { |
729 | .blit = &r100_copy_blit, | 737 | .blit = &r100_copy_blit, |
@@ -799,6 +807,7 @@ static struct radeon_asic rv515_asic = { | |||
799 | .bandwidth_update = &rv515_bandwidth_update, | 807 | .bandwidth_update = &rv515_bandwidth_update, |
800 | .wait_for_vblank = &avivo_wait_for_vblank, | 808 | .wait_for_vblank = &avivo_wait_for_vblank, |
801 | .set_backlight_level = &atombios_set_backlight_level, | 809 | .set_backlight_level = &atombios_set_backlight_level, |
810 | .get_backlight_level = &atombios_get_backlight_level, | ||
802 | }, | 811 | }, |
803 | .copy = { | 812 | .copy = { |
804 | .blit = &r100_copy_blit, | 813 | .blit = &r100_copy_blit, |
@@ -874,6 +883,7 @@ static struct radeon_asic r520_asic = { | |||
874 | .get_vblank_counter = &rs600_get_vblank_counter, | 883 | .get_vblank_counter = &rs600_get_vblank_counter, |
875 | .wait_for_vblank = &avivo_wait_for_vblank, | 884 | .wait_for_vblank = &avivo_wait_for_vblank, |
876 | .set_backlight_level = &atombios_set_backlight_level, | 885 | .set_backlight_level = &atombios_set_backlight_level, |
886 | .get_backlight_level = &atombios_get_backlight_level, | ||
877 | }, | 887 | }, |
878 | .copy = { | 888 | .copy = { |
879 | .blit = &r100_copy_blit, | 889 | .blit = &r100_copy_blit, |
@@ -948,6 +958,7 @@ static struct radeon_asic r600_asic = { | |||
948 | .get_vblank_counter = &rs600_get_vblank_counter, | 958 | .get_vblank_counter = &rs600_get_vblank_counter, |
949 | .wait_for_vblank = &avivo_wait_for_vblank, | 959 | .wait_for_vblank = &avivo_wait_for_vblank, |
950 | .set_backlight_level = &atombios_set_backlight_level, | 960 | .set_backlight_level = &atombios_set_backlight_level, |
961 | .get_backlight_level = &atombios_get_backlight_level, | ||
951 | }, | 962 | }, |
952 | .copy = { | 963 | .copy = { |
953 | .blit = &r600_copy_blit, | 964 | .blit = &r600_copy_blit, |
@@ -1022,6 +1033,7 @@ static struct radeon_asic rs780_asic = { | |||
1022 | .get_vblank_counter = &rs600_get_vblank_counter, | 1033 | .get_vblank_counter = &rs600_get_vblank_counter, |
1023 | .wait_for_vblank = &avivo_wait_for_vblank, | 1034 | .wait_for_vblank = &avivo_wait_for_vblank, |
1024 | .set_backlight_level = &atombios_set_backlight_level, | 1035 | .set_backlight_level = &atombios_set_backlight_level, |
1036 | .get_backlight_level = &atombios_get_backlight_level, | ||
1025 | }, | 1037 | }, |
1026 | .copy = { | 1038 | .copy = { |
1027 | .blit = &r600_copy_blit, | 1039 | .blit = &r600_copy_blit, |
@@ -1096,6 +1108,7 @@ static struct radeon_asic rv770_asic = { | |||
1096 | .get_vblank_counter = &rs600_get_vblank_counter, | 1108 | .get_vblank_counter = &rs600_get_vblank_counter, |
1097 | .wait_for_vblank = &avivo_wait_for_vblank, | 1109 | .wait_for_vblank = &avivo_wait_for_vblank, |
1098 | .set_backlight_level = &atombios_set_backlight_level, | 1110 | .set_backlight_level = &atombios_set_backlight_level, |
1111 | .get_backlight_level = &atombios_get_backlight_level, | ||
1099 | }, | 1112 | }, |
1100 | .copy = { | 1113 | .copy = { |
1101 | .blit = &r600_copy_blit, | 1114 | .blit = &r600_copy_blit, |
@@ -1170,6 +1183,7 @@ static struct radeon_asic evergreen_asic = { | |||
1170 | .get_vblank_counter = &evergreen_get_vblank_counter, | 1183 | .get_vblank_counter = &evergreen_get_vblank_counter, |
1171 | .wait_for_vblank = &dce4_wait_for_vblank, | 1184 | .wait_for_vblank = &dce4_wait_for_vblank, |
1172 | .set_backlight_level = &atombios_set_backlight_level, | 1185 | .set_backlight_level = &atombios_set_backlight_level, |
1186 | .get_backlight_level = &atombios_get_backlight_level, | ||
1173 | }, | 1187 | }, |
1174 | .copy = { | 1188 | .copy = { |
1175 | .blit = &r600_copy_blit, | 1189 | .blit = &r600_copy_blit, |
@@ -1244,6 +1258,7 @@ static struct radeon_asic sumo_asic = { | |||
1244 | .get_vblank_counter = &evergreen_get_vblank_counter, | 1258 | .get_vblank_counter = &evergreen_get_vblank_counter, |
1245 | .wait_for_vblank = &dce4_wait_for_vblank, | 1259 | .wait_for_vblank = &dce4_wait_for_vblank, |
1246 | .set_backlight_level = &atombios_set_backlight_level, | 1260 | .set_backlight_level = &atombios_set_backlight_level, |
1261 | .get_backlight_level = &atombios_get_backlight_level, | ||
1247 | }, | 1262 | }, |
1248 | .copy = { | 1263 | .copy = { |
1249 | .blit = &r600_copy_blit, | 1264 | .blit = &r600_copy_blit, |
@@ -1318,6 +1333,7 @@ static struct radeon_asic btc_asic = { | |||
1318 | .get_vblank_counter = &evergreen_get_vblank_counter, | 1333 | .get_vblank_counter = &evergreen_get_vblank_counter, |
1319 | .wait_for_vblank = &dce4_wait_for_vblank, | 1334 | .wait_for_vblank = &dce4_wait_for_vblank, |
1320 | .set_backlight_level = &atombios_set_backlight_level, | 1335 | .set_backlight_level = &atombios_set_backlight_level, |
1336 | .get_backlight_level = &atombios_get_backlight_level, | ||
1321 | }, | 1337 | }, |
1322 | .copy = { | 1338 | .copy = { |
1323 | .blit = &r600_copy_blit, | 1339 | .blit = &r600_copy_blit, |
@@ -1422,6 +1438,7 @@ static struct radeon_asic cayman_asic = { | |||
1422 | .get_vblank_counter = &evergreen_get_vblank_counter, | 1438 | .get_vblank_counter = &evergreen_get_vblank_counter, |
1423 | .wait_for_vblank = &dce4_wait_for_vblank, | 1439 | .wait_for_vblank = &dce4_wait_for_vblank, |
1424 | .set_backlight_level = &atombios_set_backlight_level, | 1440 | .set_backlight_level = &atombios_set_backlight_level, |
1441 | .get_backlight_level = &atombios_get_backlight_level, | ||
1425 | }, | 1442 | }, |
1426 | .copy = { | 1443 | .copy = { |
1427 | .blit = &r600_copy_blit, | 1444 | .blit = &r600_copy_blit, |
@@ -1526,6 +1543,7 @@ static struct radeon_asic trinity_asic = { | |||
1526 | .get_vblank_counter = &evergreen_get_vblank_counter, | 1543 | .get_vblank_counter = &evergreen_get_vblank_counter, |
1527 | .wait_for_vblank = &dce4_wait_for_vblank, | 1544 | .wait_for_vblank = &dce4_wait_for_vblank, |
1528 | .set_backlight_level = &atombios_set_backlight_level, | 1545 | .set_backlight_level = &atombios_set_backlight_level, |
1546 | .get_backlight_level = &atombios_get_backlight_level, | ||
1529 | }, | 1547 | }, |
1530 | .copy = { | 1548 | .copy = { |
1531 | .blit = &r600_copy_blit, | 1549 | .blit = &r600_copy_blit, |
@@ -1630,6 +1648,7 @@ static struct radeon_asic si_asic = { | |||
1630 | .get_vblank_counter = &evergreen_get_vblank_counter, | 1648 | .get_vblank_counter = &evergreen_get_vblank_counter, |
1631 | .wait_for_vblank = &dce4_wait_for_vblank, | 1649 | .wait_for_vblank = &dce4_wait_for_vblank, |
1632 | .set_backlight_level = &atombios_set_backlight_level, | 1650 | .set_backlight_level = &atombios_set_backlight_level, |
1651 | .get_backlight_level = &atombios_get_backlight_level, | ||
1633 | }, | 1652 | }, |
1634 | .copy = { | 1653 | .copy = { |
1635 | .blit = NULL, | 1654 | .blit = NULL, |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 29b3d0545f94..8251b44550b7 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -43,7 +43,9 @@ void radeon_atom_set_memory_clock(struct radeon_device *rdev, uint32_t mem_clock | |||
43 | void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); | 43 | void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); |
44 | 44 | ||
45 | void atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); | 45 | void atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); |
46 | u8 atombios_get_backlight_level(struct radeon_encoder *radeon_encoder); | ||
46 | void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); | 47 | void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); |
48 | u8 radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder); | ||
47 | 49 | ||
48 | 50 | ||
49 | /* | 51 | /* |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index ec00deaab9ca..8ad9c5f16014 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
@@ -290,6 +290,19 @@ static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd) | |||
290 | return level; | 290 | return level; |
291 | } | 291 | } |
292 | 292 | ||
293 | u8 | ||
294 | radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder) | ||
295 | { | ||
296 | struct drm_device *dev = radeon_encoder->base.dev; | ||
297 | struct radeon_device *rdev = dev->dev_private; | ||
298 | u8 backlight_level; | ||
299 | |||
300 | backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> | ||
301 | RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; | ||
302 | |||
303 | return backlight_level; | ||
304 | } | ||
305 | |||
293 | void | 306 | void |
294 | radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) | 307 | radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) |
295 | { | 308 | { |