提交 6d92f81d 编写于 作者: A Alex Deucher

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: NAlex Deucher <alexander.deucher@amd.com>
上级 2e3b3b10
...@@ -72,6 +72,18 @@ radeon_atom_set_backlight_level_to_reg(struct radeon_device *rdev, ...@@ -72,6 +72,18 @@ radeon_atom_set_backlight_level_to_reg(struct radeon_device *rdev,
WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch); WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
} }
u8
atombios_get_backlight_level(struct radeon_encoder *radeon_encoder)
{
struct drm_device *dev = radeon_encoder->base.dev;
struct radeon_device *rdev = dev->dev_private;
if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
return 0;
return radeon_atom_get_backlight_level_from_reg(rdev);
}
void void
atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level)
{ {
......
...@@ -1174,6 +1174,8 @@ struct radeon_asic { ...@@ -1174,6 +1174,8 @@ struct radeon_asic {
void (*wait_for_vblank)(struct radeon_device *rdev, int crtc); void (*wait_for_vblank)(struct radeon_device *rdev, int crtc);
/* set backlight level */ /* set backlight level */
void (*set_backlight_level)(struct radeon_encoder *radeon_encoder, u8 level); void (*set_backlight_level)(struct radeon_encoder *radeon_encoder, u8 level);
/* get backlight level */
u8 (*get_backlight_level)(struct radeon_encoder *radeon_encoder);
} display; } display;
/* copy functions for bo handling */ /* copy functions for bo handling */
struct { struct {
...@@ -1767,6 +1769,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v); ...@@ -1767,6 +1769,7 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
#define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev)) #define radeon_irq_process(rdev) (rdev)->asic->irq.process((rdev))
#define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc)) #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->display.get_vblank_counter((rdev), (crtc))
#define radeon_set_backlight_level(rdev, e, l) (rdev)->asic->display.set_backlight_level((e), (l)) #define radeon_set_backlight_level(rdev, e, l) (rdev)->asic->display.set_backlight_level((e), (l))
#define radeon_get_backlight_level(rdev, e) (rdev)->asic->display.get_backlight_level((e))
#define radeon_fence_ring_emit(rdev, r, fence) (rdev)->asic->ring[(r)].emit_fence((rdev), (fence)) #define radeon_fence_ring_emit(rdev, r, fence) (rdev)->asic->ring[(r)].emit_fence((rdev), (fence))
#define radeon_semaphore_ring_emit(rdev, r, cp, semaphore, emit_wait) (rdev)->asic->ring[(r)].emit_semaphore((rdev), (cp), (semaphore), (emit_wait)) #define radeon_semaphore_ring_emit(rdev, r, cp, semaphore, emit_wait) (rdev)->asic->ring[(r)].emit_semaphore((rdev), (cp), (semaphore), (emit_wait))
#define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy.blit((rdev), (s), (d), (np), (f)) #define radeon_copy_blit(rdev, s, d, np, f) (rdev)->asic->copy.blit((rdev), (s), (d), (np), (f))
......
...@@ -199,6 +199,7 @@ static struct radeon_asic r100_asic = { ...@@ -199,6 +199,7 @@ static struct radeon_asic r100_asic = {
.get_vblank_counter = &r100_get_vblank_counter, .get_vblank_counter = &r100_get_vblank_counter,
.wait_for_vblank = &r100_wait_for_vblank, .wait_for_vblank = &r100_wait_for_vblank,
.set_backlight_level = &radeon_legacy_set_backlight_level, .set_backlight_level = &radeon_legacy_set_backlight_level,
.get_backlight_level = &radeon_legacy_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -274,6 +275,7 @@ static struct radeon_asic r200_asic = { ...@@ -274,6 +275,7 @@ static struct radeon_asic r200_asic = {
.get_vblank_counter = &r100_get_vblank_counter, .get_vblank_counter = &r100_get_vblank_counter,
.wait_for_vblank = &r100_wait_for_vblank, .wait_for_vblank = &r100_wait_for_vblank,
.set_backlight_level = &radeon_legacy_set_backlight_level, .set_backlight_level = &radeon_legacy_set_backlight_level,
.get_backlight_level = &radeon_legacy_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -349,6 +351,7 @@ static struct radeon_asic r300_asic = { ...@@ -349,6 +351,7 @@ static struct radeon_asic r300_asic = {
.get_vblank_counter = &r100_get_vblank_counter, .get_vblank_counter = &r100_get_vblank_counter,
.wait_for_vblank = &r100_wait_for_vblank, .wait_for_vblank = &r100_wait_for_vblank,
.set_backlight_level = &radeon_legacy_set_backlight_level, .set_backlight_level = &radeon_legacy_set_backlight_level,
.get_backlight_level = &radeon_legacy_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -424,6 +427,7 @@ static struct radeon_asic r300_asic_pcie = { ...@@ -424,6 +427,7 @@ static struct radeon_asic r300_asic_pcie = {
.get_vblank_counter = &r100_get_vblank_counter, .get_vblank_counter = &r100_get_vblank_counter,
.wait_for_vblank = &r100_wait_for_vblank, .wait_for_vblank = &r100_wait_for_vblank,
.set_backlight_level = &radeon_legacy_set_backlight_level, .set_backlight_level = &radeon_legacy_set_backlight_level,
.get_backlight_level = &radeon_legacy_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -499,6 +503,7 @@ static struct radeon_asic r420_asic = { ...@@ -499,6 +503,7 @@ static struct radeon_asic r420_asic = {
.get_vblank_counter = &r100_get_vblank_counter, .get_vblank_counter = &r100_get_vblank_counter,
.wait_for_vblank = &r100_wait_for_vblank, .wait_for_vblank = &r100_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -574,6 +579,7 @@ static struct radeon_asic rs400_asic = { ...@@ -574,6 +579,7 @@ static struct radeon_asic rs400_asic = {
.get_vblank_counter = &r100_get_vblank_counter, .get_vblank_counter = &r100_get_vblank_counter,
.wait_for_vblank = &r100_wait_for_vblank, .wait_for_vblank = &r100_wait_for_vblank,
.set_backlight_level = &radeon_legacy_set_backlight_level, .set_backlight_level = &radeon_legacy_set_backlight_level,
.get_backlight_level = &radeon_legacy_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -649,6 +655,7 @@ static struct radeon_asic rs600_asic = { ...@@ -649,6 +655,7 @@ static struct radeon_asic rs600_asic = {
.get_vblank_counter = &rs600_get_vblank_counter, .get_vblank_counter = &rs600_get_vblank_counter,
.wait_for_vblank = &avivo_wait_for_vblank, .wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -724,6 +731,7 @@ static struct radeon_asic rs690_asic = { ...@@ -724,6 +731,7 @@ static struct radeon_asic rs690_asic = {
.bandwidth_update = &rs690_bandwidth_update, .bandwidth_update = &rs690_bandwidth_update,
.wait_for_vblank = &avivo_wait_for_vblank, .wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -799,6 +807,7 @@ static struct radeon_asic rv515_asic = { ...@@ -799,6 +807,7 @@ static struct radeon_asic rv515_asic = {
.bandwidth_update = &rv515_bandwidth_update, .bandwidth_update = &rv515_bandwidth_update,
.wait_for_vblank = &avivo_wait_for_vblank, .wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -874,6 +883,7 @@ static struct radeon_asic r520_asic = { ...@@ -874,6 +883,7 @@ static struct radeon_asic r520_asic = {
.get_vblank_counter = &rs600_get_vblank_counter, .get_vblank_counter = &rs600_get_vblank_counter,
.wait_for_vblank = &avivo_wait_for_vblank, .wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r100_copy_blit, .blit = &r100_copy_blit,
...@@ -948,6 +958,7 @@ static struct radeon_asic r600_asic = { ...@@ -948,6 +958,7 @@ static struct radeon_asic r600_asic = {
.get_vblank_counter = &rs600_get_vblank_counter, .get_vblank_counter = &rs600_get_vblank_counter,
.wait_for_vblank = &avivo_wait_for_vblank, .wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r600_copy_blit, .blit = &r600_copy_blit,
...@@ -1022,6 +1033,7 @@ static struct radeon_asic rs780_asic = { ...@@ -1022,6 +1033,7 @@ static struct radeon_asic rs780_asic = {
.get_vblank_counter = &rs600_get_vblank_counter, .get_vblank_counter = &rs600_get_vblank_counter,
.wait_for_vblank = &avivo_wait_for_vblank, .wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r600_copy_blit, .blit = &r600_copy_blit,
...@@ -1096,6 +1108,7 @@ static struct radeon_asic rv770_asic = { ...@@ -1096,6 +1108,7 @@ static struct radeon_asic rv770_asic = {
.get_vblank_counter = &rs600_get_vblank_counter, .get_vblank_counter = &rs600_get_vblank_counter,
.wait_for_vblank = &avivo_wait_for_vblank, .wait_for_vblank = &avivo_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r600_copy_blit, .blit = &r600_copy_blit,
...@@ -1170,6 +1183,7 @@ static struct radeon_asic evergreen_asic = { ...@@ -1170,6 +1183,7 @@ static struct radeon_asic evergreen_asic = {
.get_vblank_counter = &evergreen_get_vblank_counter, .get_vblank_counter = &evergreen_get_vblank_counter,
.wait_for_vblank = &dce4_wait_for_vblank, .wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r600_copy_blit, .blit = &r600_copy_blit,
...@@ -1244,6 +1258,7 @@ static struct radeon_asic sumo_asic = { ...@@ -1244,6 +1258,7 @@ static struct radeon_asic sumo_asic = {
.get_vblank_counter = &evergreen_get_vblank_counter, .get_vblank_counter = &evergreen_get_vblank_counter,
.wait_for_vblank = &dce4_wait_for_vblank, .wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r600_copy_blit, .blit = &r600_copy_blit,
...@@ -1318,6 +1333,7 @@ static struct radeon_asic btc_asic = { ...@@ -1318,6 +1333,7 @@ static struct radeon_asic btc_asic = {
.get_vblank_counter = &evergreen_get_vblank_counter, .get_vblank_counter = &evergreen_get_vblank_counter,
.wait_for_vblank = &dce4_wait_for_vblank, .wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r600_copy_blit, .blit = &r600_copy_blit,
...@@ -1422,6 +1438,7 @@ static struct radeon_asic cayman_asic = { ...@@ -1422,6 +1438,7 @@ static struct radeon_asic cayman_asic = {
.get_vblank_counter = &evergreen_get_vblank_counter, .get_vblank_counter = &evergreen_get_vblank_counter,
.wait_for_vblank = &dce4_wait_for_vblank, .wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r600_copy_blit, .blit = &r600_copy_blit,
...@@ -1526,6 +1543,7 @@ static struct radeon_asic trinity_asic = { ...@@ -1526,6 +1543,7 @@ static struct radeon_asic trinity_asic = {
.get_vblank_counter = &evergreen_get_vblank_counter, .get_vblank_counter = &evergreen_get_vblank_counter,
.wait_for_vblank = &dce4_wait_for_vblank, .wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = &r600_copy_blit, .blit = &r600_copy_blit,
...@@ -1630,6 +1648,7 @@ static struct radeon_asic si_asic = { ...@@ -1630,6 +1648,7 @@ static struct radeon_asic si_asic = {
.get_vblank_counter = &evergreen_get_vblank_counter, .get_vblank_counter = &evergreen_get_vblank_counter,
.wait_for_vblank = &dce4_wait_for_vblank, .wait_for_vblank = &dce4_wait_for_vblank,
.set_backlight_level = &atombios_set_backlight_level, .set_backlight_level = &atombios_set_backlight_level,
.get_backlight_level = &atombios_get_backlight_level,
}, },
.copy = { .copy = {
.blit = NULL, .blit = NULL,
......
...@@ -43,7 +43,9 @@ void radeon_atom_set_memory_clock(struct radeon_device *rdev, uint32_t mem_clock ...@@ -43,7 +43,9 @@ void radeon_atom_set_memory_clock(struct radeon_device *rdev, uint32_t mem_clock
void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable);
void atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); void atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level);
u8 atombios_get_backlight_level(struct radeon_encoder *radeon_encoder);
void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level); void radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level);
u8 radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder);
/* /*
......
...@@ -290,6 +290,19 @@ static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd) ...@@ -290,6 +290,19 @@ static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd)
return level; return level;
} }
u8
radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder)
{
struct drm_device *dev = radeon_encoder->base.dev;
struct radeon_device *rdev = dev->dev_private;
u8 backlight_level;
backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >>
RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff;
return backlight_level;
}
void void
radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册