Skip to content

Commit 3d6c916

Browse files
committed
drm/amdgpu/display: add helper functions to get/set backlight (v2)
And cache the value. These can be used by the backlight callbacks and modesetting functions. v2: rebase on latest backlight changes. Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1337 Reviewed-by: Harry Wentland <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 1f62565 commit 3d6c916

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3467,26 +3467,28 @@ static u32 convert_brightness_to_user(const struct amdgpu_dm_backlight_caps *cap
34673467
max - min);
34683468
}
34693469

3470-
static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
3470+
static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
3471+
u32 user_brightness)
34713472
{
3472-
struct amdgpu_display_manager *dm = bl_get_data(bd);
34733473
struct amdgpu_dm_backlight_caps caps;
34743474
struct dc_link *link[AMDGPU_DM_MAX_NUM_EDP];
3475-
u32 brightness;
3475+
u32 brightness[AMDGPU_DM_MAX_NUM_EDP];
34763476
bool rc;
34773477
int i;
34783478

34793479
amdgpu_dm_update_backlight_caps(dm);
34803480
caps = dm->backlight_caps;
34813481

3482-
for (i = 0; i < dm->num_of_edps; i++)
3482+
for (i = 0; i < dm->num_of_edps; i++) {
3483+
dm->brightness[i] = user_brightness;
3484+
brightness[i] = convert_brightness_from_user(&caps, dm->brightness[i]);
34833485
link[i] = (struct dc_link *)dm->backlight_link[i];
3486+
}
34843487

3485-
brightness = convert_brightness_from_user(&caps, bd->props.brightness);
3486-
// Change brightness based on AUX property
3488+
/* Change brightness based on AUX property */
34873489
if (caps.aux_support) {
34883490
for (i = 0; i < dm->num_of_edps; i++) {
3489-
rc = dc_link_set_backlight_level_nits(link[i], true, brightness,
3491+
rc = dc_link_set_backlight_level_nits(link[i], true, brightness[i],
34903492
AUX_BL_DEFAULT_TRANSITION_TIME_MS);
34913493
if (!rc) {
34923494
DRM_ERROR("DM: Failed to update backlight via AUX on eDP[%d]\n", i);
@@ -3495,7 +3497,7 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
34953497
}
34963498
} else {
34973499
for (i = 0; i < dm->num_of_edps; i++) {
3498-
rc = dc_link_set_backlight_level(dm->backlight_link[i], brightness, 0);
3500+
rc = dc_link_set_backlight_level(dm->backlight_link[i], brightness[i], 0);
34993501
if (!rc) {
35003502
DRM_ERROR("DM: Failed to update backlight on eDP[%d]\n", i);
35013503
break;
@@ -3506,9 +3508,17 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
35063508
return rc ? 0 : 1;
35073509
}
35083510

3509-
static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd)
3511+
static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
35103512
{
35113513
struct amdgpu_display_manager *dm = bl_get_data(bd);
3514+
3515+
amdgpu_dm_backlight_set_level(dm, bd->props.brightness);
3516+
3517+
return 0;
3518+
}
3519+
3520+
static u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm)
3521+
{
35123522
struct amdgpu_dm_backlight_caps caps;
35133523

35143524
amdgpu_dm_update_backlight_caps(dm);
@@ -3521,17 +3531,24 @@ static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd)
35213531

35223532
rc = dc_link_get_backlight_level_nits(link, &avg, &peak);
35233533
if (!rc)
3524-
return bd->props.brightness;
3534+
return dm->brightness[0];
35253535
return convert_brightness_to_user(&caps, avg);
35263536
} else {
35273537
int ret = dc_link_get_backlight_level(dm->backlight_link[0]);
35283538

35293539
if (ret == DC_ERROR_UNEXPECTED)
3530-
return bd->props.brightness;
3540+
return dm->brightness[0];
35313541
return convert_brightness_to_user(&caps, ret);
35323542
}
35333543
}
35343544

3545+
static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd)
3546+
{
3547+
struct amdgpu_display_manager *dm = bl_get_data(bd);
3548+
3549+
return amdgpu_dm_backlight_get_level(dm);
3550+
}
3551+
35353552
static const struct backlight_ops amdgpu_dm_backlight_ops = {
35363553
.options = BL_CORE_SUSPENDRESUME,
35373554
.get_brightness = amdgpu_dm_backlight_get_brightness,
@@ -3543,8 +3560,11 @@ amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
35433560
{
35443561
char bl_name[16];
35453562
struct backlight_properties props = { 0 };
3563+
int i;
35463564

35473565
amdgpu_dm_update_backlight_caps(dm);
3566+
for (i = 0; i < dm->num_of_edps; i++)
3567+
dm->brightness[i] = AMDGPU_MAX_BL_LEVEL;
35483568

35493569
props.max_brightness = AMDGPU_MAX_BL_LEVEL;
35503570
props.brightness = AMDGPU_MAX_BL_LEVEL;

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,13 @@ struct amdgpu_display_manager {
436436
*/
437437
struct list_head da_list;
438438
struct completion dmub_aux_transfer_done;
439+
440+
/**
441+
* @brightness:
442+
*
443+
* cached backlight values.
444+
*/
445+
u32 brightness[AMDGPU_DM_MAX_NUM_EDP];
439446
};
440447

441448
enum dsc_clock_force_state {

0 commit comments

Comments
 (0)