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;
}
Exemplo n.º 2
0
static int imx135_platform_deinit(void)
{
	regulator_put(vprog1_reg);

	if (is_ctp())
		regulator_put(vemmc1_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;
}