From 8faa1a66908b54c7ee2b2b577591546ebdd4294c Mon Sep 17 00:00:00 2001 From: CTCaer Date: Thu, 18 Dec 2025 09:54:26 +0200 Subject: [PATCH] bdk: display: use spare reg to store dcs bl duty And also remove backlight pwm restoring from coreboot hw deinit path. --- bdk/display/di.c | 20 +++++--------------- bdk/display/di.h | 24 +++++++++++++----------- bdk/soc/hw_init.c | 4 +--- 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/bdk/display/di.c b/bdk/display/di.c index f4cd382c..8ce5bc97 100644 --- a/bdk/display/di.c +++ b/bdk/display/di.c @@ -33,10 +33,9 @@ #include "di.inl" +static bool _nx_aula = false; +static u32 _panel_id = 0; static u32 _panel_id_raw = 0; -static u32 _panel_id = 0; -static u32 _dsi_bl = -1; -static bool _nx_aula = false; static void _display_panel_and_hw_end(bool no_panel_deinit); @@ -366,7 +365,7 @@ void display_init() CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = BIT(CLK_L_DISP1); CLOCK(CLK_RST_CONTROLLER_CLK_ENB_X_SET) = BIT(CLK_X_UART_FST_MIPI_CAL); - CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_UART_FST_MIPI_CAL) = CLK_SRC_DIV(6); // Set PLLP_OUT3 and div 6 (68MHz). + CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_UART_FST_MIPI_CAL) = CLK_SRC_DIV(6); // Set PLLP_OUT3 and div 6 (17MHz). CLOCK(CLK_RST_CONTROLLER_CLK_ENB_W_SET) = BIT(CLK_W_DSIA_LP); CLOCK(CLK_RST_CONTROLLER_CLK_SOURCE_DSIA_LP) = CLK_SRC_DIV(6); // Set PLLP_OUT and div 6 (68MHz). @@ -491,7 +490,6 @@ void display_init() DSI(_DSIREG(DSI_WR_DATA)) = 0x000051; // MIPI_DCS_SET_BRIGHTNESS 0000: 0%. FF07: 100%. DSI(_DSIREG(DSI_TRIGGER)) = DSI_TRIGGER_HOST; usleep(5000); - _dsi_bl = 0; break; case PANEL_JDI_XXX062M: @@ -608,7 +606,7 @@ void display_backlight(bool enable) static void _display_dsi_backlight_brightness(u32 duty) { - if (_dsi_bl == duty) + if (DISPLAY_A(_DIREG(DC_DISP_BACKLIGHT_DUTY)) == duty) return; // Convert duty to candela. @@ -621,7 +619,7 @@ static void _display_dsi_backlight_brightness(u32 duty) if (!duty) usleep(100000); - _dsi_bl = duty; + DISPLAY_A(_DIREG(DC_DISP_BACKLIGHT_DUTY)) = duty; } static void _display_pwm_backlight_brightness(u32 duty, u32 step_delay) @@ -661,14 +659,6 @@ void display_backlight_brightness(u32 brightness, u32 step_delay) _display_dsi_backlight_brightness(brightness); } -u32 display_get_backlight_brightness() -{ - if (_panel_id != PANEL_SAM_AMS699VC01) - return ((PWM(PWM_CONTROLLER_PWM_CSR_0) >> 16) & 0xFF); - else - return _dsi_bl; -} - static void _display_panel_and_hw_end(bool no_panel_deinit) { if (no_panel_deinit) diff --git a/bdk/display/di.h b/bdk/display/di.h index 2c3aa456..fe5eaa68 100644 --- a/bdk/display/di.h +++ b/bdk/display/di.h @@ -280,8 +280,8 @@ #define DC_DISP_CURSOR_BACKGROUND 0x43D #define CURSOR_COLOR(r,g,b) (((r) & 0xFF) | (((g) & 0xFF) << 8) | (((b) & 0xFF) << 16)) -#define DC_DISP_CURSOR_START_ADDR 0x43E -#define DC_DISP_CURSOR_START_ADDR_NS 0x43F +#define DC_DISP_CURSOR_START_ADDR 0x43E +#define DC_DISP_CURSOR_START_ADDR_NS 0x43F #define CURSOR_CLIPPING(w) ((w) << 28) #define CURSOR_CLIP_WIN_A 1 #define CURSOR_CLIP_WIN_B 2 @@ -290,11 +290,10 @@ #define CURSOR_SIZE_64 (1 << 24) #define CURSOR_SIZE_128 (2 << 24) #define CURSOR_SIZE_256 (3 << 24) -#define DC_DISP_CURSOR_POSITION 0x440 -#define DC_DISP_BLEND_BACKGROUND_COLOR 0x4E4 -#define DC_DISP_CURSOR_START_ADDR_HI 0x4EC +#define DC_DISP_CURSOR_POSITION 0x440 +#define DC_DISP_CURSOR_START_ADDR_HI 0x4EC #define DC_DISP_CURSOR_START_ADDR_HI_NS 0x4ED -#define DC_DISP_BLEND_CURSOR_CONTROL 0x4F1 +#define DC_DISP_BLEND_CURSOR_CONTROL 0x4F1 #define CURSOR_BLEND_2BIT (0 << 24) #define CURSOR_BLEND_R8G8B8A8 (1 << 24) #define CURSOR_BLEND_SRC_FACTOR(n) ((n) << 8) @@ -304,11 +303,15 @@ #define CURSOR_BLEND_NK1 2 // End of cursor cfg regs. -#define DC_DISP_DC_MCCIF_FIFOCTRL 0x480 -#define DC_DISP_SD_BL_PARAMETERS 0x4D7 -#define DC_DISP_SD_BL_CONTROL 0x4DC +#define DC_DISP_DC_MCCIF_FIFOCTRL 0x480 +#define DC_DISP_SD_BL_PARAMETERS 0x4D7 +#define DC_DISP_SD_BL_CONTROL 0x4DC #define DC_DISP_BLEND_BACKGROUND_COLOR 0x4E4 +#define DC_DISP_DISPLAY_SPARE0 0x4F7 // Used by SW. +#define DC_DISP_DISPLAY_SPARE1 0x4F8 +#define DC_DISP_BACKLIGHT_DUTY DC_DISP_DISPLAY_SPARE1 + #define DC_WINC_COLOR_PALETTE 0x500 #define COLOR_PALETTE_IDX(off) (DC_WINC_COLOR_PALETTE + (off)) #define COLOR_PALETTE_RGB(rgb) (byte_swap_32(rgb) >> 8) @@ -884,10 +887,9 @@ void display_dsi_vblank_write(u8 cmd, u32 len, void *data); /*! Show one single color on the display. */ void display_color_screen(u32 color); -/*! Switches screen backlight ON/OFF. */ +/*! Screen backlight ON/OFF or set via duty and fading. */ void display_backlight(bool enable); void display_backlight_brightness(u32 brightness, u32 step_delay); -u32 display_get_backlight_brightness(); u32 *display_init_window_a_pitch(); u32 *display_init_window_a_pitch_vic(); diff --git a/bdk/soc/hw_init.c b/bdk/soc/hw_init.c index 0b72e823..027e3c98 100644 --- a/bdk/soc/hw_init.c +++ b/bdk/soc/hw_init.c @@ -520,11 +520,9 @@ void hw_deinit(bool coreboot, u32 bl_magic) switch (bl_magic) { case BL_MAGIC_CRBOOT_SLD:; - // Set pwm to 0%, switch to gpio mode and restore pwm duty. - u32 brightness = display_get_backlight_brightness(); + // Set pwm to 0% and switch to gpio mode. display_backlight_brightness(0, 1000); gpio_config(GPIO_PORT_V, GPIO_PIN_0, GPIO_MODE_GPIO); - display_backlight_brightness(brightness, 0); break; case BL_MAGIC_L4TLDR_SLD: // Do not disable display or backlight at all.