msm_fb: display: Enable H/W vsync in msm7x27a

Enable tearing effect control in msm7x27a using gpio.

CRs-Fixed: 289024
Signed-off-by: Jeevan Shriram <jshriram@codeaurora.org>
diff --git a/drivers/video/msm/mipi_dsi.c b/drivers/video/msm/mipi_dsi.c
index 61bb345..c3927c4 100644
--- a/drivers/video/msm/mipi_dsi.c
+++ b/drivers/video/msm/mipi_dsi.c
@@ -37,6 +37,8 @@
 
 u32 dsi_irq;
 
+static boolean tlmm_settings = FALSE;
+
 static int mipi_dsi_probe(struct platform_device *pdev);
 static int mipi_dsi_remove(struct platform_device *pdev);
 
@@ -98,9 +100,10 @@
 
 	if (mfd->panel_info.type == MIPI_CMD_PANEL) {
 		if (pinfo->lcd.vsync_enable) {
-			if (pinfo->lcd.hw_vsync_mode && vsync_gpio > 0)
-				gpio_free(vsync_gpio);
-
+			if (pinfo->lcd.hw_vsync_mode && vsync_gpio > 0) {
+				if (MDP_REV_303 != mdp_rev)
+					gpio_free(vsync_gpio);
+			}
 			mipi_dsi_set_tear_off(mfd);
 		}
 	}
@@ -250,11 +253,45 @@
 	if (mfd->panel_info.type == MIPI_CMD_PANEL) {
 		if (pinfo->lcd.vsync_enable) {
 			if (pinfo->lcd.hw_vsync_mode && vsync_gpio > 0) {
-				if (gpio_request(vsync_gpio, "MDP_VSYNC") == 0)
-					gpio_direction_input(vsync_gpio);
-				else
-					pr_err("%s: unable to request gpio=%d\n",
-						__func__, vsync_gpio);
+				if (mdp_rev >= MDP_REV_41) {
+					if (gpio_request(vsync_gpio,
+						"MDP_VSYNC") == 0)
+						gpio_direction_input(
+							vsync_gpio);
+					else
+						pr_err("%s: unable to \
+							request gpio=%d\n",
+							__func__, vsync_gpio);
+				} else if (mdp_rev == MDP_REV_303) {
+					if (!tlmm_settings && gpio_request(
+						vsync_gpio, "MDP_VSYNC") == 0) {
+						ret = gpio_tlmm_config(
+							GPIO_CFG(
+							vsync_gpio, 1,
+							GPIO_CFG_INPUT,
+							GPIO_CFG_PULL_DOWN,
+							GPIO_CFG_2MA),
+							GPIO_CFG_ENABLE);
+
+						if (ret) {
+							pr_err(
+							"%s: unable to config \
+							tlmm = %d\n",
+							__func__, vsync_gpio);
+						}
+						tlmm_settings = TRUE;
+
+						gpio_direction_input(
+							vsync_gpio);
+					} else {
+						if (!tlmm_settings) {
+							pr_err(
+							"%s: unable to request \
+							gpio=%d\n",
+							__func__, vsync_gpio);
+						}
+					}
+				}
 			}
 			mipi_dsi_set_tear_on(mfd);
 		}