summaryrefslogtreecommitdiff
path: root/src/mainboard/google/trogdor
diff options
context:
space:
mode:
authorVinod Polimera <vpolimer@codeaurora.org>2021-03-16 18:37:40 +0530
committerJulius Werner <jwerner@chromium.org>2021-08-03 21:22:26 +0000
commite8cd480046b2f8660c52d5503d5cc0cd4a5cd002 (patch)
treea736c1e6fe9c69b11a90c2be2fc53c737e82c05d /src/mainboard/google/trogdor
parent8ca68cf2ae8d172c237cf05d37f2b5c5a2775f9f (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/Kconfig4
-rw-r--r--src/mainboard/google/trogdor/Makefile.inc1
-rw-r--r--src/mainboard/google/trogdor/mainboard.c38
-rw-r--r--src/mainboard/google/trogdor/panel_driver.c45
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;
+}