target: msm8974: Add panel autodetection for 8974
Adding support for autodetecting 720p/1080p
panel for 8974 platform. This allows either
panel to be attached/replaced without any code change.
Change-Id: I2c605c80f92a0e924f39908b668c5c28d4ea33ba
diff --git a/target/msm8974/target_display.c b/target/msm8974/target_display.c
index e02ea22..92abb38 100644
--- a/target/msm8974/target_display.c
+++ b/target/msm8974/target_display.c
@@ -36,6 +36,7 @@
#include <pm8x41_wled.h>
#include <board.h>
#include <mdp5.h>
+#include <endian.h>
#include <platform/gpio.h>
#include <platform/clock.h>
#include <platform/iomap.h>
@@ -218,6 +219,33 @@
return NO_ERROR;
}
+static uint32_t response_value = 0;
+
+uint32_t target_read_panel_signature(uint32_t panel_signature)
+{
+ uint32_t rec_buf[1];
+ uint32_t *lp = rec_buf, data;
+ int ret = response_value;
+
+ if (ret && ret != panel_signature)
+ goto exit_read_signature;
+
+ ret = mipi_dsi_cmds_tx(&read_ddb_start_cmd, 1);
+ if (ret)
+ goto exit_read_signature;
+ if (!mdss_dsi_cmds_rx(&lp, 1, 1))
+ goto exit_read_signature;
+
+ data = ntohl(*lp);
+ data = data >> 8;
+ response_value = data;
+ if (response_value != panel_signature)
+ ret = response_value;
+
+exit_read_signature:
+ return ret;
+}
+
static int msm8974_mdss_edp_panel_clock(int enable)
{
if (enable) {
@@ -275,6 +303,8 @@
void display_init(void)
{
uint32_t hw_id = board_hardware_id();
+ uint32_t panel_loop = 0;
+ uint32_t ret = 0;
switch (hw_id) {
case HW_PLATFORM_LIQUID:
edp_panel_init(&(panel.panel_info));
@@ -292,7 +322,17 @@
edp_enable = 1;
break;
default:
- gcdb_display_init(MDP_REV_50, MIPI_FB_ADDR);
+ do {
+ ret = gcdb_display_init(MDP_REV_50, MIPI_FB_ADDR);
+ if (ret) {
+ target_force_cont_splash_disable(true);
+ msm_display_off();
+ target_force_cont_splash_disable(false);
+ }
+ else {
+ break;
+ }
+ } while (++panel_loop <= oem_panel_max_auto_detect_panels());
break;
}
}