aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2012-09-14 09:59:26 -0400
committerAlex Deucher <alexander.deucher@amd.com>2012-09-27 10:22:41 -0400
commit6d92f81dcf2d40b8ebb947bba5435642b830f649 (patch)
tree9a9f606f27c6e0007d473727326b5b761186c331
parent2e3b3b105ab3bb5b6a37198da4f193cd13781d13 (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.c12
-rw-r--r--drivers/gpu/drm/radeon/radeon.h3
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.c19
-rw-r--r--drivers/gpu/drm/radeon/radeon_asic.h2
-rw-r--r--drivers/gpu/drm/radeon/radeon_legacy_encoders.c13
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
75u8
76atombios_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
75void 87void
76atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) 88atombios_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
43void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); 43void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable);
44 44
45void atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); 45void atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level);
46u8 atombios_get_backlight_level(struct radeon_encoder *radeon_encoder);
46void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); 47void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level);
48u8 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
293u8
294radeon_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
293void 306void
294radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) 307radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level)
295{ 308{