arm: tegra: cardhu: Enabling all required rails properly for camera

Enabling all required power rails for camera. Also fixing the issue
with mutliple power on of rails.

bug 791239

Original-Change-Id: Iea6bb398ee490733b4b4749570d65300565fcc31
Reviewed-on: http://git-master/r/19435
Tested-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Prayas Mohanty <pmohanty@nvidia.com>
Tested-by: Prayas Mohanty <pmohanty@nvidia.com>
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Original-Change-Id: I91050df2b331da73bcf86674e73b2cd179270830

Rebase-Id: Rbf62b96827299d0b03447ec85ad1f47228537f80
diff --git a/arch/arm/mach-tegra/board-cardhu-sensors.c b/arch/arm/mach-tegra/board-cardhu-sensors.c
index 42e5728..d26a6b6 100644
--- a/arch/arm/mach-tegra/board-cardhu-sensors.c
+++ b/arch/arm/mach-tegra/board-cardhu-sensors.c
@@ -33,6 +33,7 @@
 #include "board-cardhu.h"
 
 static struct regulator *cardhu_1v8_cam1 = NULL;
+static struct regulator *cardhu_avdd_dsi_csi = NULL;
 
 #ifdef CONFIG_I2C_MUX_PCA954x
 static struct pca954x_platform_mode cardhu_pca954x_modes[] = {
@@ -120,12 +121,38 @@
 	else {
 		if (cardhu_1v8_cam1 == NULL) {
 			cardhu_1v8_cam1 = regulator_get(NULL, "vdd_1v8_cam1");
-			if (WARN_ON(IS_ERR(cardhu_1v8_cam1)))
+			if (WARN_ON(IS_ERR(cardhu_1v8_cam1))) {
 				pr_err("%s: couldn't get regulator vdd_1v8_cam1: %ld\n",
 					__func__, PTR_ERR(cardhu_1v8_cam1));
-			else
-				regulator_enable(cardhu_1v8_cam1);
+				goto reg_alloc_fail;
+			}
 		}
+
+		/* Enable AVDD_CSI_DSI */
+		if (cardhu_avdd_dsi_csi == NULL) {
+			cardhu_avdd_dsi_csi = regulator_get(NULL, "avdd_dsi_csi");
+			if (WARN_ON(IS_ERR(cardhu_avdd_dsi_csi))) {
+				pr_err("%s: couldn't get regulator avdd_dsi_csi: %ld\n",
+					__func__, PTR_ERR(cardhu_avdd_dsi_csi));
+				goto reg_alloc_fail;
+			}
+		}
+
+		regulator_enable(cardhu_1v8_cam1);
+		regulator_enable(cardhu_avdd_dsi_csi);
+		mdelay(5);
+		return 0;
+
+reg_alloc_fail:
+		if (cardhu_1v8_cam1) {
+			regulator_put(cardhu_1v8_cam1);
+			cardhu_1v8_cam1 = NULL;
+		}
+		if (cardhu_avdd_dsi_csi) {
+			regulator_put(cardhu_avdd_dsi_csi);
+			cardhu_avdd_dsi_csi = NULL;
+		}
+		return -ENODEV;
 	}
 
 	return 0;
@@ -146,6 +173,9 @@
 	else {
 		if (cardhu_1v8_cam1)
 			regulator_disable(cardhu_1v8_cam1);
+
+		if (cardhu_avdd_dsi_csi)
+			regulator_disable(cardhu_avdd_dsi_csi);
 	}
 
 	return 0;