static int imx135_platform_init(struct i2c_client *client)
{
	int ret;
	if (is_ctp()) {
		vemmc1_reg = regulator_get(&client->dev, "vemmc1");
		if (IS_ERR(vemmc1_reg)) {
			dev_err(&client->dev, "regulator_get failed\n");
			return PTR_ERR(vemmc1_reg);
		}
	}
	if (!is_victoriabay() && !is_moorefield()) {
		vprog1_reg = regulator_get(&client->dev, "vprog1");
		if (IS_ERR(vprog1_reg)) {
			dev_err(&client->dev, "regulator_get failed\n");
			return PTR_ERR(vprog1_reg);
		}
		ret = regulator_set_voltage(vprog1_reg, VPROG1_VAL, VPROG1_VAL);
		if (ret) {
			dev_err(&client->dev, "regulator voltage set failed\n");
			regulator_put(vprog1_reg);
		}
	}

	return 0;
}
static int imx135_platform_deinit(void)
{
	if (!is_victoriabay() && !is_moorefield())
		regulator_put(vprog1_reg);

	if (is_ctp())
		regulator_put(vemmc1_reg);

	return 0;
}
static int imx135_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	int ret = 0;

	if (is_moorefield()) {
#ifdef CONFIG_INTEL_SCU_IPC_UTIL
		ret = intel_scu_ipc_msic_vprog1(flag);
		if (ret) {
			pr_err("imx135 power failed\n");
			return ret;
		}
		ret = intel_scu_ipc_msic_vprog3(flag);
#else
		ret = -ENODEV;
#endif
		if (ret)
			pr_err("imx135 power failed\n");
		if (flag)
			usleep_range(1000, 1200);

		return ret;
	}

	if (flag) {
		if (is_ctp()) {
			if (!camera_vemmc1_on) {

				camera_vemmc1_on = 1;
				ret = regulator_enable(vemmc1_reg);
				if (ret) {
					dev_err(&client->dev,
						"Failed to enable regulator vemmc1\n");
					return ret;
				}

			}
			if (vprog1_reg && !camera_vprog1_on) {
				camera_vprog1_on = 1;
				ret = regulator_enable(vprog1_reg);
				if (ret) {
					dev_err(&client->dev,
						"Failed to enable regulator vprog1\n");
					return ret;
				}

			}
			if (!is_victoriabay()) {
				if (camera_power < 0) {
					ret = camera_sensor_gpio(-1,
						GP_CAMERA_1_POWER_DOWN,
						GPIOF_DIR_OUT, 1);
					if (ret < 0)
						return ret;
					camera_power = ret;
				}
				gpio_set_value(camera_power, 1);
			}
			/* min 250us -Initializing time of silicon */
			usleep_range(250, 300);
		} else {
			if (!camera_vprog1_on) {
				ret = regulator_enable(vprog1_reg);
				if (!ret) {
					/* imx1x5 VDIG rise to XCLR release */
					usleep_range(1000, 1200);
					camera_vprog1_on = 1;
				}
				return ret;
			}
		}
	} else {
		if (is_ctp()) {
			if (camera_vemmc1_on) {
				camera_vemmc1_on = 0;

				ret = regulator_disable(vemmc1_reg);
				if (ret) {
					dev_err(&client->dev,
						"Failed to disable regulator vemmc1\n");
					return ret;
				}
			}
			if (vprog1_reg && camera_vprog1_on) {
				camera_vprog1_on = 0;

				ret = regulator_disable(vprog1_reg);
				if (ret) {
					dev_err(&client->dev,
						"Failed to disable regulator vprog1\n");
					return ret;
				}
			}
		} else {
			if (camera_vprog1_on) {
				ret = regulator_disable(vprog1_reg);
				if (!ret)
					camera_vprog1_on = 0;
				return ret;
			}
		}
	}
	return 0;
}
static int t4k35_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	int ret = 0;
	int reset_gpio_pin, vcm_pd_gpio_pin;

	if (first_open) {
		camera_reset = -1;
		camera_power = -1;
		camera_vcm_pd = -1;
		camera_sensor_2_8v = -1;
		HW_ID = Read_HW_ID();
		first_open = false;
	}

	reset_gpio_pin = 177;
	vcm_pd_gpio_pin = 175;


	if (camera_reset < 0) {
		gpio_free(reset_gpio_pin);
		ret = camera_sensor_gpio(reset_gpio_pin, GP_CAMERA_0_RESET,
					GPIOF_DIR_OUT, 0);
		if (ret < 0) {
			pr_err("%s error\n", GP_CAMERA_0_RESET);
			return ret;
		}
		camera_reset = reset_gpio_pin;
	}
	
	if (camera_vcm_pd < 0) {
		ret = camera_sensor_gpio(vcm_pd_gpio_pin, GP_CAMERA_0_POWER_DOWN,
					GPIOF_DIR_OUT, 0);
		if (ret < 0) {
			pr_err("%s error\n", GP_CAMERA_0_POWER_DOWN);
			return ret;
		}
		camera_vcm_pd = reset_gpio_pin;
	}

	pr_info("[t4k35_platform] HW_ID = %d\n", HW_ID);
	if (camera_sensor_2_8v < 0 && HW_ID >= 3) { /*for PR HW change 2.8V*/
		ret = camera_sensor_gpio(-1, GP_CAMERA_1_2_8v,
				 GPIOF_DIR_OUT, 0);
		if (ret < 0) {
			pr_err("%s not available.\n", GP_CAMERA_1_2_8v);
			return ret;
		}
		camera_sensor_2_8v = GP_CORE_012;
	}
#if 0
	if (is_moorefield()) {
#ifdef CONFIG_INTEL_SCU_IPC_UTIL
		ret = intel_scu_ipc_msic_vprog1(flag);
		if (ret) {
			pr_err("t4k35 power failed\n");
			return ret;
		}
		ret = intel_scu_ipc_msic_vprog3(flag);
#else
		ret = -ENODEV;
#endif
		if (ret)
			pr_err("t4k35 power failed\n");
		if (flag)
			usleep_range(1000, 1200);

		return ret;
	}
#endif
	if (flag) {
		gpio_set_value(camera_reset, 0);
		usleep_range(200, 300);
		pr_info("%s camera_reset is low\n", __func__);
		/* turn on VCM power 2.85V */
		if (!camera_vemmc1_on) {
			camera_vemmc1_on = 1;
			ret = regulator_enable(vemmc1_reg);
			/* ret = regulator_enable(vemmc1_reg); */
			if (!ret) {
				pr_info("%s enable regulator vemmc1 2.85V\n", __func__);
			} else {
				pr_err("%s Failed to enable regulator vemmc1\n", __func__);
			return ret;
			}
		}
		if (!camera_vprog2_on) {
			camera_vprog2_on = 1;
			ret = regulator_enable(vprog2_reg);
			if (!ret) {
				pr_info("%s enable regulator vprog2 1.2V\n", __func__);
			} else {
				pr_err("%s Failed to enable regulator vprog2\n", __func__);
			return ret;
			}
		}
		if (!camera_vprog1_on) {
			camera_vprog1_on = 1;
			ret = regulator_enable(vprog1_reg);
			if (!ret) {
				pr_info("%s enable regulator vprog1 1.8V\n", __func__);
			} else {
				pr_err("%s Failed to enable regulator vprog1\n", __func__);
				return ret;
			}
		}
		if (camera_sensor_2_8v >= 0) {
			gpio_set_value(camera_sensor_2_8v, 1);
			pr_err("<<< 2.8v = 1\n");
		}
	} else {
		if (camera_sensor_2_8v >= 0) {
			gpio_set_value(camera_sensor_2_8v, 0);
			pr_err("<<< 2.8v = 0\n");
			gpio_free(camera_sensor_2_8v);
			camera_sensor_2_8v = -1;
		}

		if (camera_vprog1_on) {
			camera_vprog1_on = 0;
			ret = regulator_disable(vprog1_reg);
			if (!ret) {
				pr_info("%s disable regulator vprog1 1.8V\n", __func__);
			} else {
				pr_err("%s Failed to disable regulator vprog1\n", __func__);
			return ret;
			}
		}
		if (camera_vprog2_on) {
			camera_vprog2_on = 0;
			ret = regulator_disable(vprog2_reg);
			if (!ret) {
				pr_info("%s disable regulator vprog2 1.2V\n", __func__);
			} else {
				pr_err("%s Failed to disable regulator vprog2\n", __func__);
			return ret;
			}
		}
		/* turn off VCM power 2.85V */
		if (camera_vemmc1_on) {
			camera_vemmc1_on = 0;
			ret = regulator_disable(vemmc1_reg);
			if (!ret) {
				pr_info("%s disable regulator vemmc1 2.85V\n", __func__);
			} else {
				pr_err("%s Failed to disable regulator vemmc1\n", __func__);
			return ret;
			}
		}
	}
	return 0;
}