mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Certain OLED devices malfunction on specific brightness levels. Specifically, when DP_SOURCE_BACKLIGHT_LEVEL is written to with the first byte being 0x00 and sometimes 0x01, the panel forcibly turns off until the device sleeps again. Below are some examples. This was found by iterating over brighness ranges while printing DP_SOURCE_BACKLIGHT_LEVEL. It was found that the screen would malfunction on specific values, and some of them were collected. Therefore, introduce a quirk where the minor byte of brightness is OR'd with 0x03 to avoid the range of invalid values. This quirk was tested by removing the workarounds and iterating from 0 to 50_000 value ranges with a cadence of 0.2s/it. The range of the panel is 1000...400_000, so the values were slightly interpolated during testing. The custom brightness curve added on 6.15 was disabled. 86016: 10101000000000000 86272: 10101000100000000 87808: 10101011100000000 251648: 111101011100000000 251649: 111101011100000001 86144: 10101000010000000 87809: 10101011100000001 251650: 111101011100000010 Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3803 Tested-by: Philip Müller <philm@manjaro.org> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev> Link: https://lore.kernel.org/r/20250829145541.512671-5-lkml@antheas.dev Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
30 lines
706 B
C
30 lines
706 B
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Function prototypes for misc. drm utility functions.
|
|
* Specifically this file is for function prototypes for functions which
|
|
* may also be used outside of drm code (e.g. in fbdev drivers).
|
|
*
|
|
* Copyright (C) 2017 Hans de Goede <hdegoede@redhat.com>
|
|
*/
|
|
|
|
#ifndef __DRM_UTILS_H__
|
|
#define __DRM_UTILS_H__
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct drm_edid;
|
|
|
|
int drm_get_panel_orientation_quirk(int width, int height);
|
|
|
|
struct drm_panel_backlight_quirk {
|
|
u16 min_brightness;
|
|
u32 brightness_mask;
|
|
};
|
|
|
|
const struct drm_panel_backlight_quirk *
|
|
drm_get_panel_backlight_quirk(const struct drm_edid *edid);
|
|
|
|
signed long drm_timeout_abs_to_jiffies(int64_t timeout_nsec);
|
|
|
|
#endif
|