Merge "platform: msm8994: Add support for crypto clock"
diff --git a/platform/msm_shared/include/smd.h b/platform/msm_shared/include/smd.h
index 0daaace..b8f645f 100644
--- a/platform/msm_shared/include/smd.h
+++ b/platform/msm_shared/include/smd.h
@@ -118,7 +118,7 @@
 
 int smd_init(smd_channel_info_t *ch, uint32_t ch_type);
 void smd_uninit(smd_channel_info_t *ch);
-uint8_t* smd_read(smd_channel_info_t *ch, uint32_t *len, int ch_type);
+void smd_read(smd_channel_info_t *ch, uint32_t *len, int ch_type, uint32_t *response);
 int smd_write(smd_channel_info_t *ch, void *data, uint32_t len, int type);
 int smd_get_channel_info(smd_channel_info_t *ch, uint32_t ch_type);
 void smd_get_channel_entry(smd_channel_info_t *ch, uint32_t ch_type);
diff --git a/platform/msm_shared/mipi_dsi.c b/platform/msm_shared/mipi_dsi.c
index 641c4d1..1932549 100644
--- a/platform/msm_shared/mipi_dsi.c
+++ b/platform/msm_shared/mipi_dsi.c
@@ -487,6 +487,51 @@
 	return 0;
 }
 
+void mdss_dsi_panel_shutdown(struct msm_panel_info *pinfo)
+{
+#if (DISPLAY_TYPE_MDSS == 1)
+	unsigned long read_val = 0;
+	if (pinfo->mipi.panel_off_cmds) {
+		/*
+		 * Once MDP TG is disabled, reset of DSI controller is
+		 * needed before we send panel OFF commands.
+		 */
+		if (pinfo->type == MIPI_VIDEO_PANEL) {
+			read_val = readl(MIPI_DSI0_BASE + CTRL);
+			writel((read_val & ~BIT(0)), MIPI_DSI0_BASE + CTRL);
+			writel(0x0001, MIPI_DSI0_BASE + SOFT_RESET);
+			dsb();
+			writel(0x0000, MIPI_DSI0_BASE + SOFT_RESET);
+			dsb();
+			/* Enable cmd mode only */
+			writel(((read_val & ~BIT(1)) | BIT(2)),
+						MIPI_DSI0_BASE + CTRL);
+		}
+
+		if (pinfo->mipi.broadcast) {
+			if (pinfo->type == MIPI_VIDEO_PANEL) {
+				read_val = readl(MIPI_DSI1_BASE + CTRL);
+				writel((read_val & ~BIT(0)),
+					MIPI_DSI1_BASE + CTRL);
+
+				writel(0x0001, MIPI_DSI1_BASE + SOFT_RESET);
+				dsb();
+				writel(0x0000, MIPI_DSI1_BASE + SOFT_RESET);
+				dsb();
+
+				writel(((read_val & ~BIT(1)) | BIT(2)),
+							MIPI_DSI1_BASE + CTRL);
+			}
+			mdss_dual_dsi_cmds_tx(pinfo->mipi.panel_off_cmds,
+					pinfo->mipi.num_of_panel_off_cmds);
+		} else {
+			mipi_dsi_cmds_tx(pinfo->mipi.panel_off_cmds,
+					pinfo->mipi.num_of_panel_off_cmds);
+		}
+	}
+#endif
+}
+
 int mdss_dsi_panel_initialize(struct mipi_dsi_panel_config *pinfo, uint32_t
 		broadcast)
 {
@@ -902,11 +947,8 @@
 {
 	if(!target_cont_splash_screen())
 	{
+		mdss_dsi_panel_shutdown(pinfo);
 		writel(0, DSI_CLK_CTRL);
-		writel(0x1F1, DSI_CTRL);
-		mdelay(10);
-		writel(0x0001, DSI_SOFT_RESET);
-		writel(0x0000, DSI_SOFT_RESET);
 		writel(0, DSI_CTRL);
 	}
 
diff --git a/platform/msm_shared/rpm-smd.c b/platform/msm_shared/rpm-smd.c
index d623542..0756bcd 100644
--- a/platform/msm_shared/rpm-smd.c
+++ b/platform/msm_shared/rpm-smd.c
@@ -133,8 +133,12 @@
 	rpm_ack_msg *resp;
 	msg_type type;
 	uint32_t ret = 0;
+	/* As per the current design rpm response does not exceed 20 bytes */
+	uint32_t response[5];
 
-	resp = (rpm_ack_msg*)smd_read(&ch, len, SMD_APPS_RPM);
+	smd_read(&ch, len, SMD_APPS_RPM, response);
+
+	resp = (rpm_ack_msg *)response;
 
 	arch_invalidate_cache_range((addr_t)resp, sizeof(rpm_gen_hdr));
 
diff --git a/platform/msm_shared/smd.c b/platform/msm_shared/smd.c
index 66b4b9f..3616e2b 100644
--- a/platform/msm_shared/smd.c
+++ b/platform/msm_shared/smd.c
@@ -209,12 +209,10 @@
 	ch_ptr->port_info->ch1.read_index = read_index;
 }
 
-uint8_t* smd_read(smd_channel_info_t *ch, uint32_t *len, int ch_type)
+void smd_read(smd_channel_info_t *ch, uint32_t *len, int ch_type, uint32_t *response)
 {
 	smd_pkt_hdr smd_hdr;
 	uint32_t size = 0;
-	/* Response as per the current design does not exceed 20 bytes */
-	uint32_t response[5];
 
 	/* Read the indices from smem */
 	ch->port_info = smem_get_alloc_entry(SMEM_SMD_BASE_ID + ch->alloc_entry.cid,
@@ -222,7 +220,7 @@
 	if(!ch->port_info->ch1.DTR_DSR)
 	{
 		dprintf(CRITICAL,"%s: DTR is off\n", __func__);
-		return -1;
+		return;
 	}
 
 	/* Wait until the data updated in the smd buffer is equal to smd packet header*/
@@ -247,9 +245,9 @@
 	}
 
 	/* We are good to return the response now */
-	memcpy_from_fifo(ch, response, sizeof(response));
+	memcpy_from_fifo(ch, response, smd_hdr.pkt_size);
 
-	arch_invalidate_cache_range((addr_t)response, sizeof(response));
+	arch_invalidate_cache_range((addr_t)response, smd_hdr.pkt_size);
 
 	return response;
 }
diff --git a/target/msm8994/oem_panel.c b/target/msm8994/oem_panel.c
index 020c81b..ec7a940 100644
--- a/target/msm8994/oem_panel.c
+++ b/target/msm8994/oem_panel.c
@@ -218,6 +218,7 @@
 			jdi_4k_dualdsi_video_timings, TIMING_SIZE);
 		memcpy(&panelstruct->fbcinfo, &jdi_4k_dualdsi_video_fbc,
 				sizeof(struct fb_compression));
+		break;
 	case JDI_1080P_VIDEO_PANEL:
 		pan_type = PANEL_TYPE_DSI;
 		pinfo->lcd_reg_en = 1;
diff --git a/target/msm8994/target_display.c b/target/msm8994/target_display.c
index bb22fa4..171f3d6 100644
--- a/target/msm8994/target_display.c
+++ b/target/msm8994/target_display.c
@@ -110,10 +110,8 @@
 {
 	uint8_t slave_id = 3;	/* pmi */
 
-	if (enable) {
-		pm8x41_wled_config_slave_id(slave_id);
-		qpnp_wled_enable_backlight(enable);
-	}
+	pm8x41_wled_config_slave_id(slave_id);
+	qpnp_wled_enable_backlight(enable);
 	qpnp_ibb_enable(enable);
 	return NO_ERROR;
 }