diff options
author | Vinod Polimera <vpolimer@codeaurora.org> | 2021-03-16 18:37:40 +0530 |
---|---|---|
committer | Julius Werner <jwerner@chromium.org> | 2021-08-03 21:22:26 +0000 |
commit | e8cd480046b2f8660c52d5503d5cc0cd4a5cd002 (patch) | |
tree | a736c1e6fe9c69b11a90c2be2fc53c737e82c05d /src/mainboard/google/trogdor | |
parent | 8ca68cf2ae8d172c237cf05d37f2b5c5a2775f9f (diff) |
sc7180: Add display support for mipi panels
- configure TROGDOR_HAS_MIPI_PANEL to "n" by default, it can be updated for mipi panels.
- add simple rm69299 panel as an example to append new mipi panels.
- use existing edid struct to update mipi panel parameters.
- add dsi command tx interface for mipi panel on commands.
Change-Id: Id698265a4e2399ad1c26e026e9a5f8ecd305467f
Signed-off-by: Vinod Polimera <vpolimer@codeaurora.org>
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/52662
Reviewed-by: Shelley Chen <shchen@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/mainboard/google/trogdor')
-rw-r--r-- | src/mainboard/google/trogdor/Kconfig | 4 | ||||
-rw-r--r-- | src/mainboard/google/trogdor/Makefile.inc | 1 | ||||
-rw-r--r-- | src/mainboard/google/trogdor/mainboard.c | 38 | ||||
-rw-r--r-- | src/mainboard/google/trogdor/panel_driver.c | 45 |
4 files changed, 76 insertions, 12 deletions
diff --git a/src/mainboard/google/trogdor/Kconfig b/src/mainboard/google/trogdor/Kconfig index 1ef8398cc6..ad86a5344a 100644 --- a/src/mainboard/google/trogdor/Kconfig +++ b/src/mainboard/google/trogdor/Kconfig @@ -12,6 +12,10 @@ config TROGDOR_HAS_BRIDGE_BACKLIGHT default y if BOARD_GOOGLE_HOMESTAR default n +config TROGDOR_HAS_MIPI_PANEL + bool + default n + config TROGDOR_HAS_FINGERPRINT bool default y if BOARD_GOOGLE_COACHZ diff --git a/src/mainboard/google/trogdor/Makefile.inc b/src/mainboard/google/trogdor/Makefile.inc index 9a71ea5197..f42e1476c7 100644 --- a/src/mainboard/google/trogdor/Makefile.inc +++ b/src/mainboard/google/trogdor/Makefile.inc @@ -15,6 +15,7 @@ romstage-y += boardid.c romstage-y += chromeos.c ramstage-y += mainboard.c +ramstage-y += panel_driver.c ifneq ($(CONFIG_BOARD_GOOGLE_BUBS),y) ramstage-y += reset.c endif diff --git a/src/mainboard/google/trogdor/mainboard.c b/src/mainboard/google/trogdor/mainboard.c index 864bd6daa6..96751fede2 100644 --- a/src/mainboard/google/trogdor/mainboard.c +++ b/src/mainboard/google/trogdor/mainboard.c @@ -12,6 +12,7 @@ #include <soc/qupv3_config.h> #include <soc/qupv3_i2c.h> #include <soc/usb.h> +#include <types.h> #include "board.h" @@ -74,39 +75,52 @@ static void configure_display(void) gpio_output(GPIO_EN_PP3300_DX_EDP, 1); } -static void display_init(struct edid *edid) +static enum cb_err display_init(struct edid *edid, const struct panel_data *pinfo) { uint32_t dsi_bpp = 24; - uint32_t lanes = 4; + uint32_t lanes = pinfo ? pinfo->lanes : 4; if (mdss_dsi_config(edid, lanes, dsi_bpp)) - return; + return CB_ERR; + if (CONFIG(TROGDOR_HAS_MIPI_PANEL)) { + if (mdss_dsi_panel_initialize(pinfo)) + return CB_ERR; + } else { + sn65dsi86_bridge_configure(BRIDGE_BUS, BRIDGE_CHIP, edid, lanes, dsi_bpp); + } - sn65dsi86_bridge_configure(BRIDGE_BUS, BRIDGE_CHIP, edid, lanes, dsi_bpp); if (CONFIG(TROGDOR_HAS_BRIDGE_BACKLIGHT)) sn65dsi86_backlight_enable(BRIDGE_BUS, BRIDGE_CHIP); mdp_dsi_video_config(edid); mdss_dsi_video_mode_config(edid, dsi_bpp); mdp_dsi_video_on(); + + return CB_SUCCESS; } static void display_startup(void) { static struct edid ed; enum dp_pll_clk_src ref_clk = SN65_SEL_19MHZ; + const struct panel_data *pinfo = NULL; - i2c_init(QUPV3_0_SE2, I2C_SPEED_FAST); /* EDP Bridge I2C */ if (display_init_required()) { - configure_display(); - mdelay(250); /* Delay for the panel to be up */ - sn65dsi86_bridge_init(BRIDGE_BUS, BRIDGE_CHIP, ref_clk); - if (sn65dsi86_bridge_read_edid(BRIDGE_BUS, BRIDGE_CHIP, &ed) < 0) - return; + if (CONFIG(TROGDOR_HAS_MIPI_PANEL)) { + pinfo = get_panel_config(&ed); + } else { + i2c_init(QUPV3_0_SE2, I2C_SPEED_FAST); /* EDP Bridge I2C */ + configure_display(); + mdelay(250); /* Delay for the panel to be up */ + sn65dsi86_bridge_init(BRIDGE_BUS, BRIDGE_CHIP, ref_clk); + if (sn65dsi86_bridge_read_edid(BRIDGE_BUS, BRIDGE_CHIP, &ed) < 0) + return; + } printk(BIOS_INFO, "display init!\n"); - display_init(&ed); - fb_new_framebuffer_info_from_edid(&ed, (uintptr_t)0); + if (display_init(&ed, pinfo) == CB_SUCCESS) + fb_new_framebuffer_info_from_edid(&ed, (uintptr_t)0); + } else printk(BIOS_INFO, "Skipping display init.\n"); } diff --git a/src/mainboard/google/trogdor/panel_driver.c b/src/mainboard/google/trogdor/panel_driver.c new file mode 100644 index 0000000000..5da02098ec --- /dev/null +++ b/src/mainboard/google/trogdor/panel_driver.c @@ -0,0 +1,45 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <edid.h> +#include <string.h> +#include <types.h> +#include <soc/display/mipi_dsi.h> +#include <soc/display/panel.h> + +struct mipi_dsi_cmd visionox_init_cmds[] = { + {{0xFE, 0x00, 0x15, 0x80}, 0x4, 0}, + {{0xc2, 0x08, 0x15, 0x80}, 0x4, 0}, + {{0x35, 0x00, 0x15, 0x80}, 0x4, 0}, + {{0x51, 0xff, 0x15, 0x80}, 0x4, 0}, + {{0x11, 0x00, 0x05, 0x80}, 0x4, 150000}, + {{0x29, 0x00, 0x05, 0x80}, 0x4, 50000}, +}; + +static const struct edid visionox_edid = { + .ascii_string = "RM69299", + .manufacturer_name = "RM", + .panel_bits_per_color = 8, + .panel_bits_per_pixel = 24, + .mode = { + .pixel_clock = 158695, + .lvds_dual_channel = 0, + .refresh = 60, + .ha = 1080, .hbl = 64, .hso = 26, .hspw = 2, + .va = 2248, .vbl = 64, .vso = 56, .vspw = 4, + .phsync = '-', .pvsync = '-', + .x_mm = 74, .y_mm = 131, + }, +}; + +const struct panel_data panel_info = { + .lanes = 4, + .init_cmd = visionox_init_cmds, + .init_cmd_count = 6, +}; + +const struct panel_data *get_panel_config(struct edid *edid) +{ + memcpy(edid, &visionox_edid, sizeof(struct edid)); + edid_set_framebuffer_bits_per_pixel(edid, 32, 0); + return &panel_info; +} |