target: add support to enable individual regulators

Add support to msm8994, msm8909, and msm8952 to
individually enable regulators.

Change-Id: Ia38b5a0b9d81658c01cccfcd25c59d0eb574b55c
diff --git a/platform/msm_shared/include/regulator.h b/platform/msm_shared/include/regulator.h
index 3c68a42..92d322e 100644
--- a/platform/msm_shared/include/regulator.h
+++ b/platform/msm_shared/include/regulator.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -30,6 +30,8 @@
 #ifndef __REGULATOR_H
 #define __REGULATOR_H
 
+#include <stdint.h>
+
 #define GENERIC_DISABLE 0
 #define GENERIC_ENABLE  1
 #define SW_MODE_LDO_IPEAK 1
@@ -63,7 +65,14 @@
 #define LNBB_CLK_ID                            0x8
 #define RPM_CLK_BUFFER_PIN_CONTROL_ENABLE_NONE 0x0
 
-void regulator_enable();
-void regulator_disable();
+#define REG_LDO2	BIT(1)
+#define REG_LDO6	BIT(5)
+#define REG_LDO12	BIT(11)
+#define REG_LDO14	BIT(13)
+#define REG_LDO17	BIT(16)
+#define REG_LDO28	BIT(27)
+
+void regulator_enable(uint32_t enable);
+void regulator_disable(uint32_t enable);
 
 #endif
diff --git a/target/msm8909/regulator.c b/target/msm8909/regulator.c
index e421b42..bbe83b4 100644
--- a/target/msm8909/regulator.c
+++ b/target/msm8909/regulator.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -29,6 +29,7 @@
 
 #include <regulator.h>
 #include <rpm-smd.h>
+#include <bits.h>
 #include <debug.h>
 
 static uint32_t ldo2[][11]=
@@ -83,12 +84,17 @@
 	},
 };
 
-void regulator_enable()
+void regulator_enable(uint32_t enable)
 {
-	rpm_send_data(&ldo2[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO2)
+		rpm_send_data(&ldo2[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
 
-	rpm_send_data(&ldo17[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO17)
+		rpm_send_data(&ldo17[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
 
-	rpm_send_data(&ldo6[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO6)
+		rpm_send_data(&ldo6[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+
+
 
 }
diff --git a/target/msm8909/target_display.c b/target/msm8909/target_display.c
index 7b7aea7..3f2a493 100755
--- a/target/msm8909/target_display.c
+++ b/target/msm8909/target_display.c
@@ -40,6 +40,7 @@
 #include <platform/gpio.h>
 #include <platform/iomap.h>
 #include <target/display.h>
+#include <regulator.h>
 
 #include "include/panel.h"
 #include "include/display_resource.h"
@@ -226,7 +227,7 @@
 int target_ldo_ctrl(uint8_t enable, struct msm_panel_info *pinfo)
 {
 	if (enable)
-		regulator_enable();     /* L2, L6, and L17 */
+		regulator_enable(REG_LDO2 | REG_LDO6 | REG_LDO17);
 
 	return NO_ERROR;
 }
diff --git a/target/msm8952/regulator.c b/target/msm8952/regulator.c
index 2e058bc..fae6cfb 100644
--- a/target/msm8952/regulator.c
+++ b/target/msm8952/regulator.c
@@ -29,6 +29,7 @@
 
 #include <regulator.h>
 #include <rpm-smd.h>
+#include <bits.h>
 #include <debug.h>
 
 static uint32_t ldo2[][11]=
@@ -83,20 +84,26 @@
 	},
 };
 
-void regulator_enable()
+void regulator_enable(uint32_t enable)
 {
-	rpm_send_data(&ldo2[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO2)
+		rpm_send_data(&ldo2[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
 
-	rpm_send_data(&ldo17[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO17)
+		rpm_send_data(&ldo17[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
 
-	rpm_send_data(&ldo6[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO6)
+		rpm_send_data(&ldo6[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
 }
 
-void regulator_disable()
+void regulator_disable(uint32_t enable)
 {
-	rpm_send_data(&ldo2[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO2)
+		rpm_send_data(&ldo2[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
 
-	rpm_send_data(&ldo17[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO2)
+		rpm_send_data(&ldo17[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
 
-	rpm_send_data(&ldo6[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO2)
+		rpm_send_data(&ldo6[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
 }
diff --git a/target/msm8994/regulator.c b/target/msm8994/regulator.c
index 51bd966..2bf7422 100644
--- a/target/msm8994/regulator.c
+++ b/target/msm8994/regulator.c
@@ -29,6 +29,8 @@
 
 #include <regulator.h>
 #include <rpm-ipc.h>
+#include <bits.h>
+#include <debug.h>
 
 static uint32_t ldo2[][11]=
 {
@@ -99,18 +101,32 @@
 
 };
 
-void regulator_enable()
+void regulator_enable(uint32_t enable)
 {
-	rpm_send_data(&ldo2[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO2)
+		rpm_send_data(&ldo2[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
 
-	rpm_send_data(&ldo12[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO12)
+		rpm_send_data(&ldo12[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
 
-	rpm_send_data(&ldo14[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO14)
+		rpm_send_data(&ldo14[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
 
-	rpm_send_data(&ldo28[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
+	if (enable & REG_LDO28)
+		rpm_send_data(&ldo28[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
 }
 
-void regulator_disable()
+void regulator_disable(uint32_t enable)
 {
+	if (enable & REG_LDO2)
+		rpm_send_data(&ldo2[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
 
+	if (enable & REG_LDO12)
+		rpm_send_data(&ldo12[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
+
+	if (enable & REG_LDO14)
+		rpm_send_data(&ldo14[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
+
+	if (enable & REG_LDO28)
+		rpm_send_data(&ldo28[GENERIC_DISABLE][0], 36, RPM_REQUEST_TYPE);
 }
diff --git a/target/msm8994/target_display.c b/target/msm8994/target_display.c
index 0b40e7d..07aba09 100644
--- a/target/msm8994/target_display.c
+++ b/target/msm8994/target_display.c
@@ -98,6 +98,45 @@
   "msmgpio", 34, 7, 0, 1, 1
 };
 
+
+static void target_hdmi_ldo_enable(uint8_t enable)
+{
+	if (enable)
+		regulator_enable(REG_LDO12);
+	else
+		regulator_disable(REG_LDO12);
+}
+
+static void target_hdmi_mpp4_enable(uint8_t enable)
+{
+	struct pm8x41_mpp mpp;
+
+	/* Enable MPP4 */
+	pmi8994_config_mpp_slave_id(0);
+
+        mpp.base = PM8x41_MMP4_BASE;
+	mpp.vin = MPP_VIN2;
+	mpp.mode = MPP_HIGH;;
+	if (enable) {
+		pm8x41_config_output_mpp(&mpp);
+		pm8x41_enable_mpp(&mpp, MPP_ENABLE);
+	} else {
+		pm8x41_enable_mpp(&mpp, MPP_DISABLE);
+	}
+
+	/* Need delay before power on regulators */
+	mdelay(20);
+}
+
+int target_hdmi_regulator_ctrl(uint8_t enable)
+{
+	target_hdmi_ldo_enable(enable);
+
+	target_hdmi_mpp4_enable(enable);
+
+	return 0;
+}
+
 int target_hdmi_gpio_ctrl(uint8_t enable)
 {
 	gpio_tlmm_config(hdmi_cec_gpio.pin_id, 1,	/* gpio 31, CEC */
@@ -467,7 +506,8 @@
 int target_ldo_ctrl(uint8_t enable, struct msm_panel_info *pinfo)
 {
 	if (enable) {
-		regulator_enable();	/* L2, L12, L14, and L28 */
+		regulator_enable(REG_LDO2 | REG_LDO12 |
+			REG_LDO14 | REG_LDO28);
 		mdelay(10);
 		wled_init(pinfo);
 		qpnp_ibb_enable(true);	/* +5V and -5V */
@@ -479,7 +519,8 @@
 		if (pinfo->lcd_reg_en)
 			lcd_reg_disable();
 
-		regulator_disable();
+		regulator_disable(REG_LDO2 | REG_LDO12 |
+			REG_LDO14 | REG_LDO28);
 	}
 
 	return NO_ERROR;