target: msm8952: add support for hx8399a panel for msm8976 SKUN
HX8399A 1080p video mode panel is the default panel for msm8976
SKUN EVT2. Add support for this.
Change-Id: I12432651398ebf60fd2585ae8104d70029528480
diff --git a/target/msm8952/include/target/display.h b/target/msm8952/include/target/display.h
index 5c02765..87cbc3a 100644
--- a/target/msm8952/include/target/display.h
+++ b/target/msm8952/include/target/display.h
@@ -91,8 +91,6 @@
#define MIPI_VSYNC_BACK_PORCH_LINES 3
#define MIPI_VSYNC_FRONT_PORCH_LINES 9
-#endif
-
/*---------------------------------------------------------------------------*/
/* Functions */
/*---------------------------------------------------------------------------*/
@@ -104,3 +102,6 @@
int target_display_get_base_offset(uint32_t base);
void target_force_cont_splash_disable(uint8_t override);
uint8_t target_panel_auto_detect_enabled();
+uint32_t oem_panel_max_auto_detect_panels();
+
+#endif
diff --git a/target/msm8952/init.c b/target/msm8952/init.c
index 99550f5..e1a61c4 100644
--- a/target/msm8952/init.c
+++ b/target/msm8952/init.c
@@ -503,6 +503,23 @@
splash_override = override;
}
+uint8_t target_panel_auto_detect_enabled()
+{
+ uint8_t ret = 0;
+
+ switch(board_hardware_id())
+ {
+ case HW_PLATFORM_QRD:
+ ret = platform_is_msm8956() ? 1 : 0;
+ break;
+ case HW_PLATFORM_SURF:
+ case HW_PLATFORM_MTP:
+ default:
+ ret = 0;
+ }
+ return ret;
+}
+
/* Do any target specific intialization needed before entering fastboot mode */
void target_fastboot_init(void)
{
diff --git a/target/msm8952/oem_panel.c b/target/msm8952/oem_panel.c
index b64ac32..845cee3 100644
--- a/target/msm8952/oem_panel.c
+++ b/target/msm8952/oem_panel.c
@@ -49,6 +49,7 @@
#include "include/panel_sharp_1080p_cmd.h"
#include "include/panel_nt35597_wqxga_dualdsi_video.h"
#include "include/panel_nt35597_wqxga_dualdsi_cmd.h"
+#include "include/panel_hx8399a_1080p_video.h"
/*---------------------------------------------------------------------------*/
/* static panel selection variable */
@@ -60,6 +61,7 @@
SHARP_1080P_CMD_PANEL,
NT35597_WQXGA_DUALDSI_VIDEO_PANEL,
NT35597_WQXGA_DUALDSI_CMD_PANEL,
+ HX8399A_1080P_VIDEO_PANEL,
UNKNOWN_PANEL
};
@@ -77,6 +79,8 @@
{"sharp_1080p_cmd", SHARP_1080P_CMD_PANEL},
{"nt35597_wqxga_dualdsi_video", NT35597_WQXGA_DUALDSI_VIDEO_PANEL},
{"nt35597_wqxga_dualdsi_cmd", NT35597_WQXGA_DUALDSI_CMD_PANEL},
+ {"otm1906c_1080p_cmd", OTM1906C_1080P_CMD_PANEL},
+ {"hx8399a_1080p_video", HX8399A_1080P_VIDEO_PANEL},
};
static uint32_t panel_id;
@@ -198,6 +202,31 @@
otm1906c_1080p_cmd_timings, TIMING_SIZE);
pinfo->mipi.signature = OTM1906C_1080P_CMD_SIGNATURE;
break;
+ case HX8399A_1080P_VIDEO_PANEL:
+ panelstruct->paneldata = &hx8399a_1080p_video_panel_data;
+ panelstruct->panelres = &hx8399a_1080p_video_panel_res;
+ panelstruct->color = &hx8399a_1080p_video_color;
+ panelstruct->videopanel = &hx8399a_1080p_video_video_panel;
+ panelstruct->commandpanel = &hx8399a_1080p_video_command_panel;
+ panelstruct->state = &hx8399a_1080p_video_state;
+ panelstruct->laneconfig = &hx8399a_1080p_video_lane_config;
+ panelstruct->paneltiminginfo
+ = &hx8399a_1080p_video_timing_info;
+ panelstruct->panelresetseq
+ = &hx8399a_1080p_video_reset_seq;
+ panelstruct->backlightinfo = &hx8399a_1080p_video_backlight;
+ pinfo->mipi.panel_on_cmds
+ = hx8399a_1080p_video_on_command;
+ pinfo->mipi.num_of_panel_on_cmds
+ = HX8399A_1080P_VIDEO_ON_COMMAND;
+ pinfo->mipi.panel_off_cmds
+ = hx8399a_1080p_video_off_command;
+ pinfo->mipi.num_of_panel_off_cmds
+ = HX8399A_1080P_VIDEO_OFF_COMMAND;
+ memcpy(phy_db->timing,
+ hx8399a_1080p_video_timings, TIMING_SIZE);
+ pinfo->mipi.signature = HX8399A_1080P_VIDEO_SIGNATURE;
+ break;
case SHARP_1080P_CMD_PANEL:
panelstruct->paneldata = &sharp_1080p_cmd_panel_data;
panelstruct->panelres = &sharp_1080p_cmd_panel_res;
@@ -302,6 +331,15 @@
return pan_type;
}
+#define DISPLAY_MAX_PANEL_DETECTION 2
+static uint32_t auto_pan_loop = 0;
+
+uint32_t oem_panel_max_auto_detect_panels()
+{
+ return target_panel_auto_detect_enabled() ?
+ DISPLAY_MAX_PANEL_DETECTION : 0;
+}
+
int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
struct msm_panel_info *pinfo,
struct mdss_dsi_phy_ctrl *phy_db)
@@ -341,6 +379,24 @@
break;
case HW_PLATFORM_QRD:
panel_id = OTM1906C_1080P_CMD_PANEL;
+
+ /* QRD EVT1 uses OTM1906C, and EVT2 uses HX8399A */
+ if (platform_is_msm8956()) {
+ switch (auto_pan_loop) {
+ case 0:
+ panel_id = HX8399A_1080P_VIDEO_PANEL;
+ break;
+ case 1:
+ panel_id = OTM1906C_1080P_CMD_PANEL;
+ break;
+ default:
+ panel_id = UNKNOWN_PANEL;
+ dprintf(CRITICAL, "Unknown panel\n");
+ return PANEL_TYPE_UNKNOWN;
+ }
+ auto_pan_loop++;
+ }
+
break;
default:
dprintf(CRITICAL, "Display not enabled for %d HW type\n",
diff --git a/target/msm8952/target_display.c b/target/msm8952/target_display.c
index e89beb5..adc5815 100644
--- a/target/msm8952/target_display.c
+++ b/target/msm8952/target_display.c
@@ -522,6 +522,8 @@
void target_display_init(const char *panel_name)
{
struct oem_panel_data oem;
+ int32_t ret = 0;
+ uint32_t panel_loop = 0;
set_panel_cmd_string(panel_name);
oem = mdss_dsi_get_oem_data();
@@ -535,10 +537,16 @@
return;
}
- if (gcdb_display_init(oem.panel, MDP_REV_50, (void *)MIPI_FB_ADDR)) {
- target_force_cont_splash_disable(true);
- msm_display_off();
- }
+ do {
+ target_force_cont_splash_disable(false);
+ ret = gcdb_display_init(oem.panel, MDP_REV_50, (void *)MIPI_FB_ADDR);
+ if (!ret || ret == ERR_NOT_SUPPORTED) {
+ break;
+ } else {
+ target_force_cont_splash_disable(true);
+ msm_display_off();
+ }
+ } while (++panel_loop <= oem_panel_max_auto_detect_panels());
if (!oem.cont_splash) {
dprintf(INFO, "Forcing continuous splash disable\n");