msm_fb: display: Move MDP footswitch control to early suspend/resume

Move MDP footswitch control from pipe_ctrl to early suspend/resume
and fix boot related DSI command mode. This patch resolves the side
effects caused by 716e97e704c6591f05f5b88743fca7770f0c61cd on 7x30

CRs-Fixed: 306221
Signed-off-by: Ravishangar Kalyanam <rkalya@codeaurora.org>
diff --git a/drivers/video/msm/mdp.c b/drivers/video/msm/mdp.c
index e60b8c6..cc17595 100644
--- a/drivers/video/msm/mdp.c
+++ b/drivers/video/msm/mdp.c
@@ -51,7 +51,7 @@
 static struct clk *mdp_lut_clk;
 int mdp_rev;
 
-struct regulator *footswitch;
+static struct regulator *footswitch;
 
 struct completion mdp_ppp_comp;
 struct semaphore mdp_ppp_mutex;
@@ -706,8 +706,6 @@
 				}
 				if (mdp_lut_clk != NULL)
 					clk_disable(mdp_lut_clk);
-				if (footswitch != NULL)
-					regulator_disable(footswitch);
 			} else {
 				/* send workqueue to turn off mdp power */
 				queue_delayed_work(mdp_pipe_ctrl_wq,
@@ -718,8 +716,6 @@
 		} else if ((!mdp_all_blocks_off) && (!mdp_current_clk_on)) {
 			mdp_current_clk_on = TRUE;
 			/* turn on MDP clks */
-			if (footswitch != NULL)
-				regulator_enable(footswitch);
 			for (i = 0; i < pdev_list_cnt; i++) {
 				pdata = (struct msm_fb_panel_data *)
 					pdev_list[i]->dev.platform_data;
@@ -1028,9 +1024,13 @@
 static int mdp_on(struct platform_device *pdev)
 {
 	int ret = 0;
+
 #ifdef CONFIG_FB_MSM_MDP40
+	struct msm_fb_data_type *mfd;
 	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
 	if (is_mdp4_hw_reset()) {
+		mfd = platform_get_drvdata(pdev);
+		mdp_vsync_cfg_regs(mfd, FALSE);
 		mdp4_hw_init();
 		outpdw(MDP_BASE + 0x0038, mdp4_display_intf);
 	}
@@ -1203,6 +1203,8 @@
 	footswitch = regulator_get(NULL, "fs_mdp");
 	if (IS_ERR(footswitch))
 		footswitch = NULL;
+	else
+		regulator_enable(footswitch);
 
 	mdp_clk = clk_get(NULL, "mdp_clk");
 	if (IS_ERR(mdp_clk)) {
@@ -1290,7 +1292,6 @@
 		/* initializing mdp hw */
 #ifdef CONFIG_FB_MSM_MDP40
 		mdp4_hw_init();
-		mdp4_fetch_cfg(clk_get_rate(mdp_clk));
 #else
 		mdp_hw_init();
 #endif
@@ -1619,10 +1620,15 @@
 static void mdp_early_suspend(struct early_suspend *h)
 {
 	mdp_suspend_sub();
+	if (footswitch && mdp_rev > MDP_REV_40)
+		regulator_disable(footswitch);
 }
 
 static void mdp_early_resume(struct early_suspend *h)
 {
+	if (footswitch && mdp_rev > MDP_REV_40)
+		regulator_enable(footswitch);
+
 	mutex_lock(&mdp_suspend_mutex);
 	mdp_suspended = FALSE;
 	mutex_unlock(&mdp_suspend_mutex);
diff --git a/drivers/video/msm/mdp.h b/drivers/video/msm/mdp.h
index 165502c..d2a2cf8 100644
--- a/drivers/video/msm/mdp.h
+++ b/drivers/video/msm/mdp.h
@@ -641,6 +641,8 @@
 void mdp_lcd_update_workqueue_handler(struct work_struct *work);
 void mdp_vsync_resync_workqueue_handler(struct work_struct *work);
 void mdp_dma2_update(struct msm_fb_data_type *mfd);
+void mdp_vsync_cfg_regs(struct msm_fb_data_type *mfd,
+	boolean first_time);
 void mdp_config_vsync(struct msm_fb_data_type *);
 uint32 mdp_get_lcd_line_counter(struct msm_fb_data_type *mfd);
 enum hrtimer_restart mdp_dma2_vsync_hrtimer_handler(struct hrtimer *ht);
diff --git a/drivers/video/msm/mdp4_overlay_dsi_cmd.c b/drivers/video/msm/mdp4_overlay_dsi_cmd.c
index 433ac23..0b28c8b 100644
--- a/drivers/video/msm/mdp4_overlay_dsi_cmd.c
+++ b/drivers/video/msm/mdp4_overlay_dsi_cmd.c
@@ -160,18 +160,16 @@
 		src = (uint8 *) iBuf->buf;
 		writeback_offset = mdp4_overlay_writeback_setup(
 						fbi, pipe, src, bpp);
-
-		/*
-		 * configure dsi stream id
-		 * dma_p = 0, dma_s = 1
-		 */
-		MDP_OUTP(MDP_BASE + 0x000a0, 0x10);
-		/* enable dsi trigger on dma_p */
-		MDP_OUTP(MDP_BASE + 0x000a4, 0x01);
 	} else {
 		pipe = dsi_pipe;
 	}
-
+	/*
+	 * configure dsi stream id
+	 * dma_p = 0, dma_s = 1
+	 */
+	MDP_OUTP(MDP_BASE + 0x000a0, 0x10);
+	/* enable dsi trigger on dma_p */
+	MDP_OUTP(MDP_BASE + 0x000a4, 0x01);
 	/* whole screen for base layer */
 	src = (uint8 *) iBuf->buf;
 
diff --git a/drivers/video/msm/mdp4_util.c b/drivers/video/msm/mdp4_util.c
index 438cce5..fb0d771 100644
--- a/drivers/video/msm/mdp4_util.c
+++ b/drivers/video/msm/mdp4_util.c
@@ -242,6 +242,7 @@
 void mdp4_hw_init(void)
 {
 	ulong bits;
+	uint32 clk_rate;
 
 	/* MDP cmd block enable */
 	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON, FALSE);
@@ -321,13 +322,16 @@
 	mdp4_overlay_cfg(MDP4_MIXER1, OVERLAY_MODE_BLT, 0, 0);
 #endif
 
-	/* MDP cmd block disable */
-	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
+	clk_rate = mdp_get_core_clk();
+	mdp4_fetch_cfg(clk_rate);
 
 	/* Mark hardware as initialized. Only revisions > v2.1 have a register
 	 * for tracking core reset status. */
 	if (mdp_hw_revision > MDP4_REVISION_V2_1)
 		outpdw(MDP_BASE + 0x003c, 1);
+
+	/* MDP cmd block disable */
+	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
 }
 
 
diff --git a/drivers/video/msm/mdp_vsync.c b/drivers/video/msm/mdp_vsync.c
index 8fe4809..7500513 100644
--- a/drivers/video/msm/mdp_vsync.c
+++ b/drivers/video/msm/mdp_vsync.c
@@ -71,6 +71,7 @@
 static struct clk *mdp_vsync_clk;
 static struct msm_fb_data_type *vsync_mfd;
 static unsigned char timer_shutdown_flag;
+static uint32 vsync_cnt_cfg;
 
 void mdp_hw_vsync_clk_enable(struct msm_fb_data_type *mfd)
 {
@@ -101,9 +102,8 @@
 {
 	if (vsync_mfd) {
 		mdp_hw_vsync_clk_enable(vsync_mfd);
-		if (!vsync_mfd->vsync_resync_timer.function) {
+		if (!vsync_mfd->vsync_resync_timer.function)
 			mdp_set_vsync((unsigned long) vsync_mfd);
-		}
 	}
 }
 
@@ -234,6 +234,61 @@
 	MDP_OUTP(MDP_BASE + MDP_SYNC_CFG_1, cfg);
 }
 #endif
+
+void mdp_vsync_cfg_regs(struct msm_fb_data_type *mfd,
+	boolean first_time)
+{
+	/* MDP cmd block enable */
+	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON,
+			  FALSE);
+	if (first_time)
+		mdp_hw_vsync_clk_enable(mfd);
+
+	mdp_set_sync_cfg_0(mfd, vsync_cnt_cfg);
+
+#ifdef CONFIG_FB_MSM_MDP40
+	if (mdp_hw_revision < MDP4_REVISION_V2_1)
+		mdp_set_sync_cfg_1(mfd, vsync_cnt_cfg);
+#endif
+
+	/*
+	 * load the last line + 1 to be in the
+	 * safety zone
+	 */
+	vsync_load_cnt = mfd->panel_info.yres;
+
+	/* line counter init value at the next pulse */
+	MDP_OUTP(MDP_BASE + MDP_PRIM_VSYNC_INIT_VAL,
+		vsync_load_cnt);
+#ifdef CONFIG_FB_MSM_MDP40
+	if (mdp_hw_revision < MDP4_REVISION_V2_1) {
+		MDP_OUTP(MDP_BASE +	MDP_SEC_VSYNC_INIT_VAL,
+			vsync_load_cnt);
+	}
+#endif
+
+	/*
+	 * external vsync source pulse width and
+	 * polarity flip
+	 */
+	MDP_OUTP(MDP_BASE + MDP_PRIM_VSYNC_OUT_CTRL, BIT(0));
+#ifdef CONFIG_FB_MSM_MDP40
+	if (mdp_hw_revision < MDP4_REVISION_V2_1) {
+		MDP_OUTP(MDP_BASE +	MDP_SEC_VSYNC_OUT_CTRL, BIT(0));
+		MDP_OUTP(MDP_BASE +	MDP_VSYNC_SEL, 0x20);
+	}
+#endif
+
+	/* threshold */
+	MDP_OUTP(MDP_BASE + 0x200, (vsync_above_th << 16) |
+		 (vsync_start_th));
+
+	if (first_time)
+		mdp_hw_vsync_clk_disable(mfd);
+
+	/* MDP cmd block disable */
+	mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_OFF, FALSE);
+}
 #endif
 
 void mdp_config_vsync(struct msm_fb_data_type *mfd)
@@ -268,7 +323,7 @@
 			mfd->use_mdp_vsync = 1;
 
 		if (mfd->use_mdp_vsync) {
-			uint32 vsync_cnt_cfg, vsync_cnt_cfg_dem;
+			uint32 vsync_cnt_cfg_dem;
 			uint32 mdp_vsync_clk_speed_hz;
 
 			mdp_vsync_clk_speed_hz = clk_get_rate(mdp_vsync_clk);
@@ -286,60 +341,7 @@
 				vsync_cnt_cfg =
 				    (mdp_vsync_clk_speed_hz) /
 				    vsync_cnt_cfg_dem;
-
-				/* MDP cmd block enable */
-				mdp_pipe_ctrl(MDP_CMD_BLOCK, MDP_BLOCK_POWER_ON,
-					      FALSE);
-				mdp_hw_vsync_clk_enable(mfd);
-
-				mdp_set_sync_cfg_0(mfd, vsync_cnt_cfg);
-
-
-#ifdef CONFIG_FB_MSM_MDP40
-				if (mdp_hw_revision < MDP4_REVISION_V2_1)
-					mdp_set_sync_cfg_1(mfd, vsync_cnt_cfg);
-#endif
-
-				/*
-				 * load the last line + 1 to be in the
-				 * safety zone
-				 */
-				vsync_load_cnt = mfd->panel_info.yres;
-
-				/* line counter init value at the next pulse */
-				MDP_OUTP(MDP_BASE + MDP_PRIM_VSYNC_INIT_VAL,
-							vsync_load_cnt);
-#ifdef CONFIG_FB_MSM_MDP40
-				if (mdp_hw_revision < MDP4_REVISION_V2_1) {
-					MDP_OUTP(MDP_BASE +
-					MDP_SEC_VSYNC_INIT_VAL, vsync_load_cnt);
-				}
-#endif
-
-				/*
-				 * external vsync source pulse width and
-				 * polarity flip
-				 */
-				MDP_OUTP(MDP_BASE + MDP_PRIM_VSYNC_OUT_CTRL,
-							BIT(0));
-#ifdef CONFIG_FB_MSM_MDP40
-				if (mdp_hw_revision < MDP4_REVISION_V2_1) {
-					MDP_OUTP(MDP_BASE +
-					MDP_SEC_VSYNC_OUT_CTRL, BIT(0));
-					MDP_OUTP(MDP_BASE +
-						MDP_VSYNC_SEL, 0x20);
-				}
-#endif
-
-				/* threshold */
-				MDP_OUTP(MDP_BASE + 0x200,
-					 (vsync_above_th << 16) |
-					 (vsync_start_th));
-
-				mdp_hw_vsync_clk_disable(mfd);
-				/* MDP cmd block disable */
-				mdp_pipe_ctrl(MDP_CMD_BLOCK,
-					      MDP_BLOCK_POWER_OFF, FALSE);
+				mdp_vsync_cfg_regs(mfd, TRUE);
 			}
 		}
 #else