Merge "msm: camera: Correct check for rdi res_id" into dev/msm-4.14-camx
diff --git a/Documentation/devicetree/bindings/media/video/msm-cam-cci.txt b/Documentation/devicetree/bindings/media/video/msm-cam-cci.txt
index 5e31fb1..59651a3 100644
--- a/Documentation/devicetree/bindings/media/video/msm-cam-cci.txt
+++ b/Documentation/devicetree/bindings/media/video/msm-cam-cci.txt
@@ -323,6 +323,11 @@
   Value type: <phandle>
   Definition: should contain regulator from which IO voltage is supplied
 
+- cam_bob-supply
+  Usage: optional
+  Value type: <phandle>
+  Definition: should contain regulator from which BoB voltage is supplied
+
 - regulator-names
   Usage: required
   Value type: <string>
@@ -387,6 +392,11 @@
   Value type: <u32>
   Definition: should contain regulator from which AF voltage is supplied
 
+- pwm-switch
+  Usage: optional
+  Value type: <boolean>
+  Definition: This property is required for regulator to switch into PWM mode.
+
 - gpios
   Usage: required
   Value type: <phandle>
@@ -764,14 +774,18 @@
          actuator-src = <&actuator0>;
          ois-src = <&ois0>;
          eeprom-src = <&eeprom0>;
-         cam_vdig-supply = <&pm845_s3>;
-         cam_vio-supply = <&pm845_lvs1>;
-         cam_vana-supply = <&pmi8998_bob>;
-         regulator-names = "cam_vdig", "cam_vio", "cam_vana";
+         cam_vdig-supply = <&pm8009_l2>;
+         cam_vio-supply = <&pm8009l_l1>;
+         cam_vana-supply = <&pm8009l_l5>;
+         cam_bob-supply = <&pm8150l_bob>;
+         cam_clk-supply = <&tital_top_gdsc>;
+         regulator-names = "cam_vio", "cam_vana", "cam_vdig",
+                "cam_clk", "cam_bob";
          rgltr-cntrl-support;
-         rgltr-min-voltage = <0 3312000 1352000>;
-         rgltr-max-voltage = <0 3312000 1352000>;
-         rgltr-load-current = <0 80000 105000>;
+         pwm-switch;
+         rgltr-min-voltage = <0 2800000 1200000 0 3008000>;
+         rgltr-max-voltage = <0 2800000 1200000 0 4000000>;
+         rgltr-load-current = <0 80000 1200000 0 2000000>;
          gpio-no-mux = <0>;
          pinctrl-names = "cam_default", "cam_suspend";
          pinctrl-0 = <&cam_sensor_mclk0_active
diff --git a/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-cdp.dtsi b/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-cdp.dtsi
index 8c43df1..2fcd47b 100644
--- a/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-cdp.dtsi
+++ b/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-cdp.dtsi
@@ -152,8 +152,8 @@
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
 			"cam_clk", "cam_vaf";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2850000 1200000 0 2856000>;
-		rgltr-max-voltage = <0 2850000 1200000 0 2856000>;
+		rgltr-min-voltage = <0 2856000 1200000 0 2856000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 2856000>;
 		rgltr-load-current = <0 80000 1200000 0 0>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
@@ -190,8 +190,8 @@
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
 			"cam_clk", "cam_vaf";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2850000 1200000 0 2856000>;
-		rgltr-max-voltage = <0 2850000 1200000 0 2856000>;
+		rgltr-min-voltage = <0 2856000 1200000 0 2856000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 2856000>;
 		rgltr-load-current = <0 80000 1200000 0 0>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
@@ -229,15 +229,17 @@
 		ois-src = <&ois_rear>;
 		eeprom-src = <&eeprom_rear>;
 		cam_vio-supply = <&pm8150l_l1>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vana-supply = <&pm8009_l5>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2800000 1200000 0>;
-		rgltr-max-voltage = <0 2800000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2800000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2800000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk0_active
@@ -271,16 +273,18 @@
 		actuator-src = <&actuator_rear_aux>;
 		led-flash-src = <&led_flash_rear_aux>;
 		eeprom-src = <&eeprom_rear_aux>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_vio-supply = <&pm8150l_l1>;
 		cam_vana-supply = <&pm8009_l6>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2856000 1200000 0>;
-		rgltr-max-voltage = <0 2856000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2856000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk1_active
@@ -314,15 +318,17 @@
 		eeprom-src = <&eeprom_front>;
 		actuator-src = <&actuator_front>;
 		cam_vio-supply = <&pm8150l_l1>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vana-supply = <&pm8009_l6>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2856000 1200000 0>;
-		rgltr-max-voltage = <0 2856000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2856000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk2_active
@@ -355,15 +361,17 @@
 		sensor-position-yaw = <0>;
 		led-flash-src = <&led_flash_iris>;
 		cam_vio-supply = <&pm8150l_l1>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vana-supply = <&pm8009_l5>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2800000 1200000 0>;
-		rgltr-max-voltage = <0 2800000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2800000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2800000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk3_active
diff --git a/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-mtp.dtsi b/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-mtp.dtsi
index 8c43df1..2fcd47b 100644
--- a/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-mtp.dtsi
+++ b/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-mtp.dtsi
@@ -152,8 +152,8 @@
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
 			"cam_clk", "cam_vaf";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2850000 1200000 0 2856000>;
-		rgltr-max-voltage = <0 2850000 1200000 0 2856000>;
+		rgltr-min-voltage = <0 2856000 1200000 0 2856000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 2856000>;
 		rgltr-load-current = <0 80000 1200000 0 0>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
@@ -190,8 +190,8 @@
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
 			"cam_clk", "cam_vaf";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2850000 1200000 0 2856000>;
-		rgltr-max-voltage = <0 2850000 1200000 0 2856000>;
+		rgltr-min-voltage = <0 2856000 1200000 0 2856000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 2856000>;
 		rgltr-load-current = <0 80000 1200000 0 0>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
@@ -229,15 +229,17 @@
 		ois-src = <&ois_rear>;
 		eeprom-src = <&eeprom_rear>;
 		cam_vio-supply = <&pm8150l_l1>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vana-supply = <&pm8009_l5>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2800000 1200000 0>;
-		rgltr-max-voltage = <0 2800000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2800000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2800000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk0_active
@@ -271,16 +273,18 @@
 		actuator-src = <&actuator_rear_aux>;
 		led-flash-src = <&led_flash_rear_aux>;
 		eeprom-src = <&eeprom_rear_aux>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_vio-supply = <&pm8150l_l1>;
 		cam_vana-supply = <&pm8009_l6>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2856000 1200000 0>;
-		rgltr-max-voltage = <0 2856000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2856000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk1_active
@@ -314,15 +318,17 @@
 		eeprom-src = <&eeprom_front>;
 		actuator-src = <&actuator_front>;
 		cam_vio-supply = <&pm8150l_l1>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vana-supply = <&pm8009_l6>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2856000 1200000 0>;
-		rgltr-max-voltage = <0 2856000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2856000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk2_active
@@ -355,15 +361,17 @@
 		sensor-position-yaw = <0>;
 		led-flash-src = <&led_flash_iris>;
 		cam_vio-supply = <&pm8150l_l1>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vana-supply = <&pm8009_l5>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2800000 1200000 0>;
-		rgltr-max-voltage = <0 2800000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2800000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2800000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk3_active
diff --git a/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-qrd.dtsi b/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-qrd.dtsi
index 1a13e57..a6dc553 100644
--- a/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-qrd.dtsi
+++ b/arch/arm64/boot/dts/qcom/sm8150-camera-sensor-qrd.dtsi
@@ -236,15 +236,17 @@
 		ois-src = <&ois_rear>;
 		eeprom-src = <&eeprom_rear>;
 		cam_vio-supply = <&pm8150l_l1>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vana-supply = <&pm8009_l5>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2800000 1200000 0>;
-		rgltr-max-voltage = <0 2800000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2800000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2800000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk0_active
@@ -279,16 +281,18 @@
 		actuator-src = <&actuator_rear_aux>;
 		led-flash-src = <&led_flash_rear_aux>;
 		eeprom-src = <&eeprom_rear_aux>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_vio-supply = <&pm8150l_l1>;
 		cam_vana-supply = <&pm8009_l6>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2856000 1200000 0>;
-		rgltr-max-voltage = <0 2856000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2856000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk1_active
@@ -323,15 +327,17 @@
 		eeprom-src = <&eeprom_front>;
 		actuator-src = <&actuator_front>;
 		cam_vio-supply = <&pm8150l_l1>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vana-supply = <&pm8009_l6>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2856000 1200000 0>;
-		rgltr-max-voltage = <0 2856000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2856000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2856000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk2_active
@@ -365,15 +371,17 @@
 		sensor-position-yaw = <0>;
 		led-flash-src = <&led_flash_iris>;
 		cam_vio-supply = <&pm8150l_l1>;
+		cam_bob-supply = <&pm8150l_bob>;
 		cam_vana-supply = <&pm8009_l5>;
 		cam_vdig-supply = <&pm8009_l2>;
 		cam_clk-supply = <&titan_top_gdsc>;
 		regulator-names = "cam_vio", "cam_vana", "cam_vdig",
-			"cam_clk";
+			"cam_clk", "cam_bob";
 		rgltr-cntrl-support;
-		rgltr-min-voltage = <0 2800000 1200000 0>;
-		rgltr-max-voltage = <0 2800000 1200000 0>;
-		rgltr-load-current = <0 80000 1200000 0>;
+		pwm-switch;
+		rgltr-min-voltage = <0 2800000 1200000 0 3008000>;
+		rgltr-max-voltage = <0 2800000 1200000 0 4000000>;
+		rgltr-load-current = <0 80000 1200000 0 2000000>;
 		gpio-no-mux = <0>;
 		pinctrl-names = "cam_default", "cam_suspend";
 		pinctrl-0 = <&cam_sensor_mclk3_active
diff --git a/arch/arm64/boot/dts/qcom/sm8150-camera.dtsi b/arch/arm64/boot/dts/qcom/sm8150-camera.dtsi
index 039944b..b4f6791 100644
--- a/arch/arm64/boot/dts/qcom/sm8150-camera.dtsi
+++ b/arch/arm64/boot/dts/qcom/sm8150-camera.dtsi
@@ -999,6 +999,9 @@
 	cam_ipe0: qcom,ipe0 {
 		cell-index = <0>;
 		compatible = "qcom,cam-ipe";
+		reg = <0xac87000 0x3000>;
+		reg-names = "ipe0_top";
+		reg-cam-base = <0x87000>;
 		regulator-names = "ipe0-vdd";
 		ipe0-vdd-supply = <&ipe_0_gdsc>;
 		clock-names =
@@ -1028,6 +1031,9 @@
 	cam_ipe1: qcom,ipe1 {
 		cell-index = <1>;
 		compatible = "qcom,cam-ipe";
+		reg = <0xac91000 0x3000>;
+		reg-names = "ipe1_top";
+		reg-cam-base = <0x91000>;
 		regulator-names = "ipe1-vdd";
 		ipe1-vdd-supply = <&ipe_1_gdsc>;
 		clock-names =
@@ -1057,6 +1063,9 @@
 	cam_bps: qcom,bps {
 		cell-index = <0>;
 		compatible = "qcom,cam-bps";
+		reg = <0xac6f000 0x3000>;
+		reg-names = "bps_top";
+		reg-cam-base = <0x6f000>;
 		regulator-names = "bps-vdd";
 		bps-vdd-supply = <&bps_gdsc>;
 		clock-names =
diff --git a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
index d222983..cadd627 100644
--- a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
+++ b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
@@ -940,9 +940,13 @@ static int cam_ife_mgr_acquire_cid_res(
 				hw_intf->hw_idx);
 
 			if (in_port->usage_type && acquired_cnt == 1 &&
-				((csid_path == CAM_IFE_PIX_PATH_RES_IPP) ||
-				(csid_path == CAM_IFE_PIX_PATH_RES_PPP)))
-				/* Continue to acquire Right */
+				csid_path == CAM_IFE_PIX_PATH_RES_IPP)
+				/*
+				 * Continue to acquire Right for IPP.
+				 * Dual IFE for RDI and PPP is not currently
+				 * supported.
+				 */
+
 				continue;
 
 			if (acquired_cnt)
@@ -990,8 +994,7 @@ static int cam_ife_mgr_acquire_cid_res(
 
 	/*
 	 * Acquire Right if not already acquired.
-	 * Dual IFE for RDI is not currently supported.
-	 * Only one IFE should be used for 2PD data.
+	 * Dual IFE for RDI and PPP is not currently supported.
 	 */
 	if (cid_res_temp->is_dual_vfe && csid_path
 		== CAM_IFE_PIX_PATH_RES_IPP && acquired_cnt == 1) {
@@ -1077,7 +1080,7 @@ static int cam_ife_hw_mgr_acquire_res_ife_csid_pxl(
 
 	csid_res->res_id = path_res_id;
 
-	if (in_port->usage_type)
+	if (in_port->usage_type && is_ipp)
 		csid_res->is_dual_vfe = 1;
 	else {
 		csid_res->is_dual_vfe = 0;
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c
index 6fe051a..223aba4 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c
@@ -17,7 +17,6 @@
 #include "cam_soc_util.h"
 #include "cam_trace.h"
 
-
 static void cam_sensor_update_req_mgr(
 	struct cam_sensor_ctrl_t *s_ctrl,
 	struct cam_packet *csl_packet)
@@ -962,6 +961,16 @@ int cam_sensor_power_up(struct cam_sensor_ctrl_t *s_ctrl)
 		return -EINVAL;
 	}
 
+	if (s_ctrl->bob_pwm_switch) {
+		rc = cam_sensor_bob_pwm_mode_switch(soc_info,
+			s_ctrl->bob_reg_index, true);
+		if (rc) {
+			CAM_WARN(CAM_SENSOR,
+			"BoB PWM setup failed rc: %d", rc);
+			rc = 0;
+		}
+	}
+
 	rc = cam_sensor_core_power_up(power_info, soc_info);
 	if (rc < 0) {
 		CAM_ERR(CAM_SENSOR, "power up the core is failed:%d", rc);
@@ -999,6 +1008,16 @@ int cam_sensor_power_down(struct cam_sensor_ctrl_t *s_ctrl)
 		return rc;
 	}
 
+	if (s_ctrl->bob_pwm_switch) {
+		rc = cam_sensor_bob_pwm_mode_switch(soc_info,
+			s_ctrl->bob_reg_index, false);
+		if (rc) {
+			CAM_WARN(CAM_SENSOR,
+				"BoB PWM setup failed rc: %d", rc);
+			rc = 0;
+		}
+	}
+
 	camera_io_release(&(s_ctrl->io_master_info));
 
 	return rc;
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_dev.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_dev.h
index 21cbbe9..8339d9b 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_dev.h
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_dev.h
@@ -92,6 +92,8 @@ struct intf_params {
  * @device_name: Sensor device structure
  * @streamon_count: Count to hold the number of times stream on called
  * @streamoff_count: Count to hold the number of times stream off called
+ * @bob_reg_index: Hold to BoB regulator index
+ * @bob_pwm_switch: Boolean flag to switch into PWM mode for BoB regulator
  */
 struct cam_sensor_ctrl_t {
 	struct platform_device *pdev;
@@ -114,6 +116,8 @@ struct cam_sensor_ctrl_t {
 	char device_name[20];
 	uint32_t streamon_count;
 	uint32_t streamoff_count;
+	int bob_reg_index;
+	bool bob_pwm_switch;
 };
 
 #endif /* _CAM_SENSOR_DEV_H_ */
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_soc.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_soc.c
index 5e0fa02..6d7d07c 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_soc.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_soc.c
@@ -104,6 +104,7 @@ int32_t cam_sensor_get_sub_module_index(struct device_node *of_node,
 static int32_t cam_sensor_driver_get_dt_data(struct cam_sensor_ctrl_t *s_ctrl)
 {
 	int32_t rc = 0;
+	int i = 0;
 	struct cam_sensor_board_info *sensordata = NULL;
 	struct device_node *of_node = s_ctrl->of_node;
 	struct cam_hw_soc_info *soc_info = &s_ctrl->soc_info;
@@ -136,6 +137,33 @@ static int32_t cam_sensor_driver_get_dt_data(struct cam_sensor_ctrl_t *s_ctrl)
 		goto FREE_SENSOR_DATA;
 	}
 
+	/* Store the index of BoB regulator if it is available */
+	for (i = 0; i < soc_info->num_rgltr; i++) {
+		if (!strcmp(soc_info->rgltr_name[i],
+			"cam_bob")) {
+			CAM_DBG(CAM_SENSOR,
+				"i: %d cam_bob", i);
+			s_ctrl->bob_reg_index = i;
+			soc_info->rgltr[i] = devm_regulator_get(soc_info->dev,
+				soc_info->rgltr_name[i]);
+			if (IS_ERR_OR_NULL(soc_info->rgltr[i])) {
+				CAM_WARN(CAM_SENSOR,
+					"Regulator: %s get failed",
+					soc_info->rgltr_name[i]);
+				soc_info->rgltr[i] = NULL;
+			} else {
+				if (!of_property_read_bool(of_node,
+					"pwm-switch")) {
+					CAM_DBG(CAM_SENSOR,
+					"No BoB PWM switch param defined");
+					s_ctrl->bob_pwm_switch = false;
+				} else {
+					s_ctrl->bob_pwm_switch = true;
+				}
+			}
+		}
+	}
+
 	/* Read subdev info */
 	rc = cam_sensor_get_sub_module_index(of_node, sensordata);
 	if (rc < 0) {
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c
index 6398256..e9ca7d4 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c
@@ -1219,6 +1219,24 @@ int msm_camera_pinctrl_init(
 	return 0;
 }
 
+int cam_sensor_bob_pwm_mode_switch(struct cam_hw_soc_info *soc_info,
+	int bob_reg_idx, bool flag)
+{
+	int rc = 0;
+	uint32_t op_current =
+		(flag == true) ? soc_info->rgltr_op_mode[bob_reg_idx] : 0;
+
+	if (soc_info->rgltr[bob_reg_idx] != NULL) {
+		rc = regulator_set_load(soc_info->rgltr[bob_reg_idx],
+			op_current);
+		if (rc)
+			CAM_WARN(CAM_SENSOR,
+				"BoB PWM SetLoad failed rc: %d", rc);
+	}
+
+	return rc;
+}
+
 int msm_cam_sensor_handle_reg_gpio(int seq_type,
 	struct msm_camera_gpio_num_info *gpio_num_info, int val)
 {
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h
index c9ccc5c..6c0287e 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h
@@ -58,4 +58,7 @@ int msm_camera_fill_vreg_params(struct cam_hw_soc_info *soc_info,
 
 int32_t cam_sensor_update_power_settings(void *cmd_buf,
 	int cmd_length, struct cam_sensor_power_ctrl_t *power_info);
+
+int cam_sensor_bob_pwm_mode_switch(struct cam_hw_soc_info *soc_info,
+	int bob_reg_idx, bool flag);
 #endif /* _CAM_SENSOR_UTIL_H_ */