target: disable continuous splash screen when display init fails

Once the DSI read is done in LK and read LCD ID fails,
display_shutdown gets executed. Kernel thinks continuous
splash is enabled as a result the clock remains stuck at off.
To avoid this mismatch pass kernel boot param no splash when read ID fails.
This can be done by disabling continuous splash when display init fails.

Change-Id: I38e177d2dd5aa5757006bd19621d73063c4127e6
diff --git a/dev/gcdb/display/gcdb_display.c b/dev/gcdb/display/gcdb_display.c
index 4a15406..785c2a9 100755
--- a/dev/gcdb/display/gcdb_display.c
+++ b/dev/gcdb/display/gcdb_display.c
@@ -168,7 +168,7 @@
 	char *default_str;
 	int panel_mode = SPLIT_DISPLAY_FLAG | DUAL_PIPE_FLAG;
 
-	if(panelstruct.paneldata)
+	if(panelstruct.paneldata && target_cont_splash_screen())
 	{
 		dsi_id = panelstruct.paneldata->panel_controller;
 		panel_node = panelstruct.paneldata->panel_node_id;
diff --git a/target/apq8084/init.c b/target/apq8084/init.c
index ac195da..5515bb5 100644
--- a/target/apq8084/init.c
+++ b/target/apq8084/init.c
@@ -262,23 +262,35 @@
 	}
 }
 
+static uint8_t splash_override;
 /* Returns 1 if target supports continuous splash screen. */
 int target_cont_splash_screen()
 {
-	switch(board_hardware_id())
-	{
-		case HW_PLATFORM_SURF:
-		case HW_PLATFORM_MTP:
-		case HW_PLATFORM_FLUID:
-		case HW_PLATFORM_LIQUID:
-			dprintf(SPEW, "Target_cont_splash=1\n");
-			return 1;
-		default:
-			dprintf(SPEW, "Target_cont_splash=0\n");
-			return 0;
+	uint8_t splash_screen = 0;
+	if(!splash_override) {
+		switch(board_hardware_id())
+		{
+			case HW_PLATFORM_SURF:
+			case HW_PLATFORM_MTP:
+			case HW_PLATFORM_FLUID:
+			case HW_PLATFORM_LIQUID:
+				dprintf(SPEW, "Target_cont_splash=1\n");
+				splash_screen = 1;
+				break;
+			default:
+				dprintf(SPEW, "Target_cont_splash=0\n");
+				splash_screen = 0;
+		}
 	}
+	return splash_screen;
 }
 
+void target_force_cont_splash_disable(uint8_t override)
+{
+	splash_override = override;
+}
+
+
 unsigned target_baseband()
 {
 	return board_baseband();
diff --git a/target/apq8084/target_display.c b/target/apq8084/target_display.c
index fd6f766..8af6d1b 100755
--- a/target/apq8084/target_display.c
+++ b/target/apq8084/target_display.c
@@ -247,6 +247,7 @@
 	uint32_t ret = 0;
 	ret = gcdb_display_init(panel_name, MDP_REV_50, MIPI_FB_ADDR);
 	if (ret) {
+		target_force_cont_splash_disable(true);
 		msm_display_off();
 	}
 }
diff --git a/target/msm8226/target_display.c b/target/msm8226/target_display.c
index a6475d8..d36ac56 100755
--- a/target/msm8226/target_display.c
+++ b/target/msm8226/target_display.c
@@ -392,13 +392,13 @@
         uint32_t ret = 0;
 
 	do {
+		target_force_cont_splash_disable(false);
 		ret = gcdb_display_init(panel_name, MDP_REV_50, MIPI_FB_ADDR);
 		if (!ret || ret == ERR_NOT_SUPPORTED) {
 			break;
 		} else {
 			target_force_cont_splash_disable(true);
 			msm_display_off();
-			target_force_cont_splash_disable(false);
 		}
 	} while (++panel_loop <= oem_panel_max_auto_detect_panels());
 
diff --git a/target/msm8610/init.c b/target/msm8610/init.c
index 5132aed..f64acc2 100644
--- a/target/msm8610/init.c
+++ b/target/msm8610/init.c
@@ -344,23 +344,31 @@
 	dprintf(CRITICAL, "Rebooting failed\n");
 }
 
+static uint8_t splash_override;
+
 int target_cont_splash_screen()
 {
-	int ret = 0;
-
-	switch(board_hardware_id())
-	{
-		case HW_PLATFORM_QRD:
-		case HW_PLATFORM_MTP:
-		case HW_PLATFORM_SURF:
-			dprintf(SPEW, "Target_cont_splash=1\n");
-			ret = 1;
-			break;
-		default:
-			dprintf(SPEW, "Target_cont_splash=0\n");
-			ret = 0;
+	uint8_t splash_screen = 0;
+	if(!splash_override) {
+		switch(board_hardware_id())
+		{
+			case HW_PLATFORM_QRD:
+			case HW_PLATFORM_MTP:
+			case HW_PLATFORM_SURF:
+				dprintf(SPEW, "Target_cont_splash=1\n");
+				splash_screen = 1;
+				break;
+			default:
+				dprintf(SPEW, "Target_cont_splash=0\n");
+				splash_screen = 0;
+		}
 	}
-	return ret;
+	return splash_screen;
+}
+
+void target_force_cont_splash_disable(uint8_t override)
+{
+        splash_override = override;
 }
 
 unsigned target_pause_for_battery_charge(void)
diff --git a/target/msm8610/target_display.c b/target/msm8610/target_display.c
index 4b963b8..b815501 100755
--- a/target/msm8610/target_display.c
+++ b/target/msm8610/target_display.c
@@ -164,7 +164,14 @@
 
 void target_display_init(const char *panel_name)
 {
-	gcdb_display_init(panel_name, MDP_REV_304, MIPI_FB_ADDR);
+	uint32_t ret = 0;
+
+	ret = gcdb_display_init(panel_name, MDP_REV_304, MIPI_FB_ADDR);
+	if(ret) {
+		/* Panel signature did not match, turn off the display */
+		target_force_cont_splash_disable(true);
+		msm_display_off();
+	}
 }
 
 void target_display_shutdown(void)
diff --git a/target/msm8974/target_display.c b/target/msm8974/target_display.c
index c89c483..56a03c1 100755
--- a/target/msm8974/target_display.c
+++ b/target/msm8974/target_display.c
@@ -384,6 +384,7 @@
 		break;
 	default:
 		do {
+			target_force_cont_splash_disable(false);
 			ret = gcdb_display_init(panel_name, MDP_REV_50,
 				MIPI_FB_ADDR);
 			if (!ret || ret == ERR_NOT_SUPPORTED) {
@@ -391,7 +392,6 @@
 			} else {
 				target_force_cont_splash_disable(true);
 				msm_display_off();
-				target_force_cont_splash_disable(false);
 			}
 		} while (++panel_loop <= oem_panel_max_auto_detect_panels());
 		break;