コード例 #1
0
static int mt9v113_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;

	if (camera_power_down < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_1_POWER_DOWN,
					 GPIOF_DIR_OUT, 1);
		if (ret < 0) {
			pr_err("%s not available.", GP_CAMERA_1_POWER_DOWN);
			return ret;
		}
		camera_power_down = ret;
	}

	if (camera_1p8 < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_1P8,
					 GPIOF_DIR_OUT, 1);
		if (ret < 0) {
			pr_err("%s not available.", GP_CAMERA_1P8);
			return ret;
		}
		camera_1p8 = ret;
	}

	if (flag) {
		if (camera_power_down >= 0)
			gpio_set_value(camera_power_down, 0);
		if (camera_1p8 >= 0)
			gpio_set_value(camera_1p8, 0);
		if (!camera_vprog1_on) {
			camera_vprog1_on = 1;
			intel_scu_ipc_msic_vprog1(1);
		}
	} else {
		/* Put sensor into HW standby mode */
		if (camera_power_down >= 0)
			gpio_set_value(camera_power_down, 1);
		if (camera_vprog1_on) {
			camera_vprog1_on = 0;
			intel_scu_ipc_msic_vprog1(0);
		}
		if (camera_1p8 >= 0)
			gpio_set_value(camera_1p8, 1);
		/* Release the standby */
		if (camera_power_down >= 0)
			gpio_set_value(camera_power_down, 0);

		/*
		 * camera_1p8 is shared pin, so should free it
		 * when don't use it.
		 */
		gpio_free(camera_1p8);
		camera_1p8 = -1;
	}

	return 0;
}
コード例 #2
0
/*
 * MFLD PR2 secondary camera sensor - gc2155 platform data
 */
static int gc2155_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;

	pr_info("%s - E, flag: %d\n", __func__, flag);

	if (gpio_cam_pwdn < 0) {
	    ret = camera_sensor_gpio(-1, "SUB_CAM_PWDN",
						GPIOF_DIR_OUT, 0);
		if (ret < 0)
			return ret;
		gpio_cam_pwdn = GP_CORE_064;
		/* set camera pwdn pin mode to gpio */
		lnw_gpio_set_alt(gpio_cam_pwdn, LNW_GPIO);
	}
	
	if (camera_reset < 0) {	
			ret = camera_sensor_gpio(-1, "SUB_CAM_RST#_R",
						GPIOF_DIR_OUT, 0);
		if (ret < 0)
			return ret;
		camera_reset = GP_CORE_080;
		/* set camera reset pin mode to gpio */
		lnw_gpio_set_alt(camera_reset, LNW_GPIO);
	}

	if (flag) {
		//gc2155 Power up:
		pr_info("%s(%d): pwdn(0)\n", __func__, __LINE__);
		gpio_set_value(gpio_cam_pwdn, 0);
		
		msleep(2);
		
		pr_info("%s(%d): reset(1)\n", __func__, __LINE__);
		gpio_set_value(camera_reset, 1);
	} else {
		// gc2155 Power down: 
		pr_info("%s(%d): pwdn(1)\n", __func__, __LINE__);
		gpio_set_value(gpio_cam_pwdn, 1);
		gpio_free(gpio_cam_pwdn);
		gpio_cam_pwdn = -1;

		msleep(2);

		pr_info("%s(%d): reset(0)\n", __func__, __LINE__);
		gpio_set_value(camera_reset, 0);
		gpio_free(camera_reset);
		camera_reset = -1;
	}

	return 0;
}
コード例 #3
0
ファイル: platform_t4k35.c プロジェクト: BORETS24/za580
static int t4k35_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;

	if (camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_0_RESET,
					GPIOF_DIR_OUT, 0);
		printk("%s: request gpio camera_reset = %d, flag = %d\n", __func__, ret, flag);
		if (ret < 0)
			return ret;
		camera_reset = ret;
	}

	if (flag) {
		gpio_set_value(camera_reset, 1);
		printk("%s: camera_reset = 1\n", __func__);	
	} else {
		gpio_set_value(camera_reset, 0);
		printk("%s: camera_reset = 0\n", __func__);
		gpio_free(camera_reset);
		printk("%s: gpio free camera_reset = %d\n", __func__, camera_reset);
		camera_reset = -1;		
	}
	/* min 250us -Initializing time of silicon */
	usleep_range(10000, 15000);

	return 0;
}
コード例 #4
0
static int t4k35_180_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;
	printk("%s: ++\n",__func__);

	if (camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_0_RESET,	GPIOF_DIR_OUT, 0);
		if (ret < 0){
			printk("camera_reset not available.\n");
			return ret;
        }
		camera_reset = ret;
	}

	if (flag) {
		gpio_set_value(camera_reset, 1);
		printk("<<< camera_reset = 1\n");
		/* min 250us -Initializing time of silicon */
        usleep_range(4000, 4500);

	} else {
		gpio_set_value(camera_reset, 0);
		printk("<<< camera_reset = 0\n");
		usleep_range(250, 300);
	}

	return 0;
}
コード例 #5
0
static int ov9724_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;

	if (camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_1_RESET,
					GPIOF_DIR_OUT, 1);
		if (ret < 0)
			return ret;
		camera_reset = ret;
	}

	if (flag) {
		gpio_set_value(camera_reset, 1);
		/* ov9724 initializing time - t1+t2
		 * 427us(t1) - 8192 mclk(19.2Mhz) before sccb communication
		 * 1ms(t2) - sccb stable time when using internal dvdd
		 */
		usleep_range(1500, 1500);
	} else {
		gpio_set_value(camera_reset, 0);
	}

	return 0;
}
コード例 #6
0
static int ov5670_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;
	/*
	 * FIXME: WA using hardcoded GPIO value here.
	 * The GPIO value would be provided by ACPI table, which is
	 * not implemented currently.
	 */
   if (xshutdown < 0) {
        ret = camera_sensor_gpio(-1,"SUB_CAM_PWDN", GPIOF_DIR_OUT, 0);
        if (ret < 0){
            printk("SUB_CAM_PWDN not available.\n");
            return ret;
        }
        xshutdown = ret;
        printk(KERN_INFO "ov5670, gpio number, xshutdown is %d\n", xshutdown);
    }

    if(flag){
	if (xshutdown >= 0)
		gpio_set_value(xshutdown, 1);
    }else{
	if (xshutdown >= 0)
		gpio_set_value(xshutdown, 0);
    }
    return 0;
}
コード例 #7
0
static int gc0310_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret = 0;
	
	printk("%s: ++\n",__func__);

	int camera_power_down_local = camera_power_down;
    printk(KERN_INFO "camera_power_down_local is %d\n", camera_power_down_local);
   	if (camera_power_down_local < 0) {
		ret = camera_sensor_gpio(GP_CORE_080, "SUB_CAM_PWDN", GPIOF_DIR_OUT, 0);
		if (ret < 0){
		    printk("camera_power_down not available.\n");
		    return ret;
		}
        camera_power_down = camera_power_down_local = ret;
	}

	if (flag) {
		  gpio_set_value(camera_power_down_local, 0);
		  msleep(1);
          gpio_set_value(camera_power_down_local, 1);
          usleep_range(10, 20);	
          gpio_set_value(camera_power_down_local, 0);
	} else {
	       gpio_set_value(camera_power_down, 1);
		   usleep_range(10, 20);	
	}
    return 0;
}
コード例 #8
0
static int imx134_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;

	if (!IS_BYT) {
		if (camera_reset < 0) {
			ret = camera_sensor_gpio(-1, GP_CAMERA_0_RESET,
					GPIOF_DIR_OUT, 1);
			if (ret < 0)
				return ret;
			camera_reset = ret;
		}
	} else {
		/*
		 * FIXME: WA using hardcoded GPIO value here.
		 * The GPIO value would be provided by ACPI table, which is
		 * not implemented currently
		 */
		if (camera_reset < 0) {
			if (spid.hardware_id == BYT_TABLET_BLK_CRV2)
				camera_reset = CAMERA_0_RESET_CRV2;
			else
				camera_reset = CAMERA_0_RESET;

			ret = gpio_request(camera_reset, "camera_reset");
			if (ret) {
				pr_err("%s: failed to request gpio(pin %d)\n",
				__func__, CAMERA_0_RESET);
				return -EINVAL;
			}
		}

		ret = gpio_direction_output(camera_reset, 1);
		if (ret) {
			pr_err("%s: failed to set gpio(pin %d) direction\n",
				__func__, camera_reset);
			gpio_free(camera_reset);
		}
	}
	if (flag) {
		gpio_set_value(camera_reset, 1);
		/* imx134 core silicon initializing time - t1+t2+t3
		 * 400us(t1) - Time to VDDL is supplied after REGEN high
		 * 600us(t2) - imx134 core Waking up time
		 * 459us(t3, 8825clocks) -Initializing time of silicon
		 */
		usleep_range(1500, 1600);

	} else {
		gpio_set_value(camera_reset, 0);
		/* 1us - Falling time of REGEN after XCLR H -> L */
		udelay(1);

		gpio_free(camera_reset);
		camera_reset = -1;
	}

	return 0;
}
コード例 #9
0
static int gc0339_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret = 0;

	printk("%s: ++\n",__func__);

	if (camera_reset < 0) {
		ret = camera_sensor_gpio(GP_CORE_077, "SUB_CAM_RST#", GPIOF_DIR_OUT, 0);
		if (ret < 0){
		    printk("camera_reset not available.\n");
		    return ret;
		}
		camera_reset = ret;
	}
	if (camera_power_down < 0) {
		ret = camera_sensor_gpio(GP_CORE_080, "SUB_CAM_PWDN", GPIOF_DIR_OUT, 0);
		if (ret < 0){
		    printk("camera_power_down not available.\n");
		    return ret;
		}
		camera_power_down = ret;
	}

	if (flag) {
		gpio_set_value(camera_reset, 1);
		usleep_range(150, 200);
	} else {
		gpio_set_value(camera_reset, 1);
		msleep(1);
		gpio_set_value(camera_power_down, 0);
		msleep(1);
	}

	if (camera_reset >= 0){
		gpio_free(camera_reset);
		camera_reset = -1;
	}

	if (camera_power_down >= 0){
		gpio_free(camera_power_down);
		camera_power_down = -1;
	}

	return 0;
}
コード例 #10
0
ファイル: platform_ov5670.c プロジェクト: BORETS24/za580
static int ov5670_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;
	
	if (offset_3 == 0) {
		if (camera_reset < 0) {
			ret = camera_sensor_gpio(-1, "GP_SUB_CAM_PWDN",
						GPIOF_DIR_OUT, 0);
			printk("%s: request gpio camera_reset = %d, flag = %d\n", __func__, ret, flag);
			if (ret < 0)
				return ret;
			camera_reset = ret;/*48*/
			printk("%s: 8M sku offset_3 = %d\n", __func__, offset_3);
		}
	} else {
		if (camera_reset < 0) {
			ret = camera_sensor_gpio(-1, GP_CAMERA_0_RESET,
						GPIOF_DIR_OUT, 0);
			printk("%s: request gpio camera_reset = %d, flag = %d\n", __func__, ret, flag);
			if (ret < 0)
				return ret;
			camera_reset = ret; /*9*/
			printk("%s: 5M sku offset_3 = %d\n", __func__, offset_3);
		}
	}

	if (flag) {
		gpio_set_value(camera_reset, 1);
		printk("%s: camera_reset = 1\n", __func__);
		usleep_range(6000, 6500);
	} else {
		gpio_set_value(camera_reset, 0);
		printk("%s: camera_reset = 0\n", __func__);
		if (offset_3 == 0) {
			gpio_free(camera_reset);
			printk("%s: gpio free camera_reset = %d\n", __func__, camera_reset);
			camera_reset = -1;
		}
		/* 1us - Falling time of REGEN after XCLR H -> L */
		udelay(1);
	}

	return 0;
}
コード例 #11
0
static int hm2056_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
    int ret;
    printk("%s: ++ on/off = %d\n",__func__, flag);

    if (camera_reset < 0) {
        ret = camera_sensor_gpio(GP_CORE_077, "SUB_CAM_RST#", GPIOF_DIR_OUT, 0);
        if (ret < 0){
            printk("camera_reset not available.\n");
            return ret;
        }
        camera_reset = ret;
    }
    printk("<< camera_reset:%d, flag:%d\n", camera_reset, flag);

    if (camera_power_down < 0) {
        ret = camera_sensor_gpio(GP_CORE_080, "SUB_CAM_PWDN", GPIOF_DIR_OUT, 0);
        if (ret < 0){
            printk("camera_power_down not available.\n");
            return ret;
        }
        camera_power_down = ret;
    }
    printk("<< camera_power_down:%d, flag:%d\n", camera_power_down, flag);

	if (flag){
		gpio_set_value(camera_reset, 1);
        printk("<<< camera_reset = 1\n");
        mdelay(10);
		gpio_set_value(camera_reset, 0);
        mdelay(10);
		gpio_set_value(camera_reset, 1);
    }
    else{
        gpio_set_value(camera_power_down, 1);
        printk("<<< camera_power_down = 1\n");
        mdelay(10);
		gpio_set_value(camera_reset, 0);
        printk("<<< camera_reset = 0\n");
    }
    mdelay(1);

	return 0;
}
コード例 #12
0
/*
 * Ext-ISP m10mo platform data
 */
static int m10mo_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;

	if (camera_reset < 0) {
#ifndef CONFIG_ACPI
		ret = camera_sensor_gpio(9, "RSTX", GPIOF_DIR_OUT, 0);
		if (ret < 0)
			return ret;
		camera_reset = ret;
#else
		camera_reset = acpi_get_gpio("\\_SB.GPO1", 52);

		pr_info("%s: camera_reset is %d\n", __func__, camera_reset);

		ret = gpio_request(camera_reset, GP_CAMERA_0_RESET);

		if (ret) {
			pr_err("%s: failed to request reset pin\n", __func__);
			return -EINVAL;
		}

		ret = gpio_direction_output(camera_reset, 1);
		if (ret) {
			pr_err("%s: failed to set direction for reset pin\n",
				__func__);
			gpio_free(camera_reset);
		}
#endif
	}

	if (flag) {
		/* reset = 0 is requied in case of ESD failure */
		gpio_set_value(camera_reset, 0);

		usleep_range(100, 200);
        printk("@%s %d, project zx550ml pull up GPIO%d\n", __func__, __LINE__, camera_reset);
		gpio_set_value(camera_reset, 1);

		usleep_range(1000, 1500);
	} else {
        gpio_set_value(camera_reset, 0);
	}

	return 0;
}
コード例 #13
0
/*
 * MFLD PR2 primary camera sensor - MT9V113 platform data
 */
static int mt9v113_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;

	if (camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_1_RESET,
					 GPIOF_DIR_OUT, 1);
		if (ret < 0)
			return ret;
		camera_reset = ret;
	}

	if (flag)
		gpio_set_value(camera_reset, 1);
	else
		gpio_set_value(camera_reset, 0);

	return 0;
}
コード例 #14
0
static int ov8858_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;
	if (camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_0_RESET,
					GPIOF_DIR_OUT, 0);
		if (ret < 0)
			return ret;
		camera_reset = ret;
	}

	if (flag) {
		gpio_set_value(camera_reset, 0);
		msleep(20); /* Wait for power lines to stabilize */
		gpio_set_value(camera_reset, 1);
	} else {
		gpio_set_value(camera_reset, 0);
	}

	return 0;
}
コード例 #15
0
static int imx135_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;

	if (camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_0_RESET,
					GPIOF_DIR_OUT, 1);
		if (ret < 0)
			return ret;
		camera_reset = ret;
	}

	if (flag) {
		gpio_set_value(camera_reset, 1);
		/* min 250us -Initializing time of silicon */
		usleep_range(250, 300);

	} else {
		gpio_set_value(camera_reset, 0);
	}

	return 0;
}
コード例 #16
0
/*
 * MFLD PR2 secondary camera sensor - MT9M114 platform data
 */
static int mt9m114_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;

	if (mt9m114_camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_1_RESET,
					 GPIOF_DIR_OUT, 1);
		if (ret < 0)
			return ret;
		mt9m114_camera_reset = ret;
	}

	if (flag) {
#ifdef CONFIG_BOARD_CTP
		gpio_set_value(mt9m114_camera_reset, 0);
		msleep(60);
#endif
		gpio_set_value(mt9m114_camera_reset, 1);
	} else
		gpio_set_value(mt9m114_camera_reset, 0);

	return 0;
}
コード例 #17
0
static int mt9m114_power_ctrl(struct v4l2_subdev *sd, int flag)
{
#ifdef CONFIG_BOARD_CTP
	int reg_err;
#endif
#ifndef CONFIG_BOARD_CTP
	int ret;

	/* The camera powering is different on RedHookBay and VictoriaBay
	 * On RHB, vprog1 is at 2.8V and supplies both cameras
	 * On VB, vprog1 supplies the 2nd camera and must not rise over 1.2V
	 * Check if the RHB SW has accidentally been flashed to VB
	 * If yes, don't turn on the regulator. The VB secondary camera will
	 * be permanently damaged by the too high voltage
	 */
	if (INTEL_MID_BOARD(2, PHONE, CLVTP, VB, PRO) ||
	    INTEL_MID_BOARD(2, PHONE, CLVTP, VB, ENG)) {
		printk(KERN_ALERT \
		"Aborted vprog1 enable to protect VictoriaBay 2nd camera HW\n");
		return -ENODEV;
	}

	/* Note here, there maybe a workaround to avoid I2C SDA issue */
	if (camera_power_down < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_1_POWER_DOWN,
					GPIOF_DIR_OUT, 1);
#ifndef CONFIG_BOARD_REDRIDGE
		if (ret < 0)
			return ret;
#endif
		camera_power_down = ret;
	}

	if (camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_1_RESET,
					 GPIOF_DIR_OUT, 1);
		if (ret < 0)
			return ret;
		camera_reset = ret;
	}
#endif
	if (flag) {
#ifndef CONFIG_BOARD_CTP
		if (!mt9e013_reset_value) {
			if (mt9e013_reset)
				mt9e013_reset(sd);
			mt9e013_reset_value = 1;
		}
#ifdef CONFIG_BOARD_REDRIDGE
		gpio_direction_output(camera_reset, 0);
#endif
		gpio_set_value(camera_reset, 0);
#endif
		if (!camera_vprog1_on) {
			camera_vprog1_on = 1;
#ifdef CONFIG_BOARD_CTP
			reg_err = regulator_enable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to enable regulator vprog1\n");
				return reg_err;
			}
#else
			intel_scu_ipc_msic_vprog1(1);
#endif
		}
#ifndef CONFIG_BOARD_CTP
#ifdef CONFIG_BOARD_REDRIDGE
		if (camera_power_down >= 0)
			gpio_set_value(camera_power_down, 1);
#else
		gpio_set_value(camera_power_down, 1);
#endif
#endif
	} else {
		if (camera_vprog1_on) {
			camera_vprog1_on = 0;
#ifdef CONFIG_BOARD_CTP
			reg_err = regulator_disable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to disable regulator vprog1\n");
				return reg_err;
			}
#else
			intel_scu_ipc_msic_vprog1(0);
#endif
		}
#ifndef CONFIG_BOARD_CTP
#ifdef CONFIG_BOARD_REDRIDGE
		if (camera_power_down >= 0)
			gpio_set_value(camera_power_down, 0);
#else
		gpio_set_value(camera_power_down, 0);
#endif

		mt9e013_reset_value = 0;
#endif
	}

	return 0;
}
コード例 #18
0
ファイル: platform_ov5670.c プロジェクト: BORETS24/za580
/*
 * Checking the SOC type is temporary workaround to enable OV5670
 * on Bodegabay (tangier) platform. Once standard regulator devices
 * (e.g. vprog2, vprog1) and control functions (pmic_avp) are added
 * for the platforms with tangier, then we can revert this change.
 * ([email protected])
 */
static int ov5670_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	struct i2c_client *client = v4l2_get_subdevdata(sd);
	int ret = 0, gpio;

	if (offset_3 != 0) {
		if (camera_2v8_vcm_power_enable < 0) {
		
			gpio = camera_sensor_gpio(-1, "NFC-intr",
					GPIOF_DIR_OUT, 0);
			if (gpio < 0)
				return gpio;
		
			camera_2v8_vcm_power_enable = gpio;/*174*/
			/* set camera vcm power pin mode to gpio */
			lnw_gpio_set_alt(camera_2v8_vcm_power_enable, LNW_GPIO);
			pr_err("%s: set 2.8V vcm as GPIO\n", __func__);
		}
	}
	
	if (camera_1v2_power_enable < 0) {
		gpio = camera_sensor_gpio(-1, "GP_CAMERA_2_PD",
				GPIOF_DIR_OUT, 0);
		if (gpio < 0)
			return gpio;
		camera_1v2_power_enable = gpio;
		/* set camera vcm power pin mode to gpio */
		lnw_gpio_set_alt(camera_1v2_power_enable, LNW_GPIO);
		pr_err("%s: Set 1.2V as GPIO\n", __func__);
	}

	if (flag) {
		if (offset_3 == 0) {
			if (camera_reset < 0) {
		
				ret = camera_sensor_gpio(-1, "GP_SUB_CAM_PWDN",
							GPIOF_DIR_OUT, 0);
				printk("%s: request gpio camera_reset = %d, flag = %d\n", __func__, ret, flag);
				if (ret < 0)
					return ret;
		
				camera_reset = ret;/*48*/
				printk("%s: 8M sku offset_3 = %d\n", __func__, offset_3);
			}
		} else {
			if (camera_reset < 0) {
				ret = camera_sensor_gpio(-1, GP_CAMERA_0_RESET,
							GPIOF_DIR_OUT, 0);
				printk("%s: request gpio camera_reset = %d, flag = %d\n", __func__, ret, flag);
				if (ret < 0)
					return ret;
				camera_reset = ret; /*9*/
				printk("%s: 5M sku offset_3 = %d\n", __func__, offset_3);
			}
		}

		if (camera_reset >= 0){
			gpio_set_value(camera_reset, 0);
			printk("%s: camera_reset = 0\n", __func__);
			msleep(1);
		}
	}

	if (flag) {
		ret = intel_scu_ipc_msic_vprog1(flag);	//2.8V
		if (ret) {
			pr_err("%s: 2.8V power failed\n", __func__);
			return ret;
		}

		ret = intel_scu_ipc_msic_vprog2(flag);	//1.8V
		if (ret) {
			pr_err("%s: 1.8V power failed\n", __func__);
			return ret;
		}

		if (offset_3 != 0) {
			ret = control_vcm_phy_power(PMIC_VLDOCNT, flag);
			pr_err("%s: Set camera vcm 2.8V(V_SWITCH) on\n", __func__);
			if (ret) {
				pr_err("%s: VCM 3.3V power failed\n", __func__);
				return ret;
			}
		}

		if (offset_3 != 0) {
			pr_err("%s: Set camera vcm 2.8V on = %d\n", __func__, camera_2v8_vcm_power_enable);
			gpio_set_value(camera_2v8_vcm_power_enable, 1);
		}
		pr_err("%s: Set camera 1.2V on = %d\n", __func__, camera_1v2_power_enable);
		gpio_set_value(camera_1v2_power_enable, 1);
	}else {
		pr_err("%s: Set camera 1.2V off\n", __func__);
		gpio_set_value(camera_1v2_power_enable, 0);
		gpio_free(camera_1v2_power_enable);
		camera_1v2_power_enable = -1;
		if (offset_3 != 0) {
			pr_err("%s: Set camera vcm 2.8V off\n", __func__);
			gpio_set_value(camera_2v8_vcm_power_enable, 0);
			gpio_free(camera_2v8_vcm_power_enable);
			camera_2v8_vcm_power_enable = -1;
		}

		if (offset_3 != 0) {
			ret = control_vcm_phy_power(PMIC_VLDOCNT, flag);
			pr_err("%s: Set camera vcm 2.8V(V_SWITCH) off\n", __func__);
			if (ret) {
				pr_err("%s: VCM 3.3V power failed\n", __func__);
				return ret;
			}
		}
		
		ret = intel_scu_ipc_msic_vprog2(flag);	//1.8V
		if (ret) {
			pr_err("%s: 1.8V power failed\n", __func__);
			return ret;
		}
		
		ret = intel_scu_ipc_msic_vprog1(flag);	//2.8V
		if (ret) {
			pr_err("%s: 2.8V power failed\n", __func__);
			return ret;
		}
	}
	
	if (flag)
		usleep_range(1000, 1200);

	return ret;
}
コード例 #19
0
/*
 * The camera_v1p8_en gpio pin is to enable 1.8v power.
 */
static int ov5670_power_ctrl(struct v4l2_subdev *sd, int flag)
{
    int ret = 0;

    printk("@%s PROJECT_ID = 0x%x, HW_ID = 0x%x\n", __func__, Read_PROJ_ID(), Read_HW_ID());

    if (camera_1p2_en < 0) {
        ret = camera_sensor_gpio(-1,"INT_CAM_1V2_EN", GPIOF_DIR_OUT, 0);
        if (ret < 0){
            printk("camera_1p2_en not available.\n");
            return ret;
        }
        camera_1p2_en = ret;
        printk(KERN_INFO "ov5670, gpio number, camera_1p2_en is %d\n", camera_1p2_en);
    }

    if (camera_2v8 < 0) {
        ret = camera_sensor_gpio(-1, "INT_CAM_2V8_EN", GPIOF_DIR_OUT, 0);
        if (ret < 0){
            printk("INT_CAM_2V8_EN not available.\n");
            return ret;
        }
        camera_2v8 = ret;
        printk("<< camera_2v8:%d, flag:%d\n", camera_2v8, flag);
    }

    if (flag) {
        switch (Read_PROJ_ID()) {
            case PROJ_ID_ZE550ML:
            case PROJ_ID_ZE551ML:
            case PROJ_ID_ZR550ML:
            case PROJ_ID_ZX550ML:
                switch (Read_HW_ID()) {
                    case HW_ID_EVB:
                        pr_info("Hardware VERSION = EVB, ov5670 does not support.\n");
                        break;
                    case HW_ID_SR1:
                    case HW_ID_SR2:
                    case HW_ID_ER:
                    case HW_ID_ER1_1:
                    case HW_ID_ER1_2:
                    case HW_ID_PR:
		    case HW_ID_pre_PR:
                    case HW_ID_MP:
                        pr_info("ov5670 --> HW_ID = 0x%x\n", Read_HW_ID());
                        //turn on power 2.8V
                        if (camera_2v8 >= 0){
                            gpio_set_value(camera_2v8, 1);
                            printk(KERN_ALERT "ov5670 <<< camera_2v8 = 1\n");
                        }

                        //turn on power 1.8V
                        if (!camera_vprog2_on) {
                            camera_vprog2_on = 1;
                            ret = intel_scu_ipc_iowrite8(MSIC_VPROG2_MRFLD_CTRL, MSIC_VPROG2_ON_1P8);
                            if (ret){
                                printk(KERN_INFO "set vprog2 fails\n");
                                return -1;
                            }
                            msleep(1);
                        }
                        break;
                    default:
                        pr_info("ov5670 --> HW_ID 0x%x is not defined\n", Read_HW_ID());
                        break;
                }
                break;

            case PROJ_ID_ZE500ML:
                switch (Read_HW_ID()) {
                    case HW_ID_EVB:
                        pr_info("ov5670 --> HW_ID = 0x%x\n", Read_HW_ID());
                        //turn on power 1.8V
                        if (!camera_vprog2_on) {
                            camera_vprog2_on = 1;
                            ret = intel_scu_ipc_iowrite8(MSIC_VPROG2_MRFLD_CTRL, MSIC_VPROG2_ON_1P8);
                            if (ret){
                                printk(KERN_INFO "set vprog2 fails\n");
                                return -1;
                            }
                            msleep(1);
                        }

                        //turn on power 2.8V
                        if (!camera_vprog1_on) {
                            camera_vprog1_on = 1;
                            intel_scu_ipc_iowrite8(MSIC_VPROG1_MRFLD_CTRL ,MSIC_VPROG1_ON_2P8);
                            if (ret){
                                printk(KERN_INFO "set vprog1 fails\n");
                                return -1;
                            }
                            msleep(1);
                        }
                        break;
                    case HW_ID_SR1:
                    case HW_ID_SR2:
                    case HW_ID_ER:
		    case HW_ID_pre_PR:
                    case HW_ID_PR:
                    case HW_ID_MP:
                        pr_info("HW_ID 0x%x, ov5670 does not support.\n", Read_HW_ID());
                        break;
                    default:
                        pr_info("ov5670 --> HW_ID 0x%x is not defined\n", Read_HW_ID());
                        break;
                }
                break;

            default:
                pr_info("Project ID is not defined\n");
                break;
        }//end switch

        //turn on power 1.2V
        gpio_set_value(camera_1p2_en, 1);
        printk(KERN_INFO "ov5670---camera_1p2_en is %d\n", camera_1p2_en);
        usleep_range(10000, 11000);

        //flag == 0
    } else {
        //turn OFF power 1.2V
        gpio_set_value(camera_1p2_en, 0);
        gpio_free(camera_1p2_en);
        camera_1p2_en = -1;

        switch (Read_PROJ_ID()) {
            case PROJ_ID_ZE550ML:
            case PROJ_ID_ZE551ML:
            case PROJ_ID_ZR550ML:
            case PROJ_ID_ZX550ML:
                switch (Read_HW_ID()) {
                    case HW_ID_EVB:
                        pr_info("Hardware VERSION = EVB, ov5670 does not support.\n");
                        break;
                    case HW_ID_SR1:
                    case HW_ID_SR2:
                    case HW_ID_ER:
                    case HW_ID_ER1_1:
                    case HW_ID_ER1_2:
                    case HW_ID_PR:
		    case HW_ID_pre_PR:
                    case HW_ID_MP:
                        pr_info("ov5670 --> HW_ID = 0x%x\n", Read_HW_ID());
                        //turn off power 2.8V
                        if (camera_2v8 >= 0){
                            gpio_set_value(camera_2v8, 0);
                            gpio_free(camera_2v8);
                            camera_2v8 = -1;
                            printk("<<< camera_2v8 = 0\n");
                        }
                        break;
                    default:
                        pr_info("ov5670 --> HW_ID is not defined\n");
                        break;
                }
                break;

            case PROJ_ID_ZE500ML:
                switch (Read_HW_ID()) {
                    case HW_ID_EVB:
                        pr_info("ov5670 --> HW_ID = 0x%x\n", Read_HW_ID());
                        //turn off power 2.8V
                        if (camera_vprog1_on) {
                            camera_vprog1_on = 0;
                            ret = intel_scu_ipc_iowrite8(MSIC_VPROG1_MRFLD_CTRL, MSIC_VPROG1_OFF);
                            if (ret) {
                                printk(KERN_ALERT "Failed to disable regulator vprog1\n");
                                return ret;
                            }
                            printk("<<< 2.8V = 0\n");
                        }
                        break;
                    case HW_ID_SR1:
                    case HW_ID_SR2:
                    case HW_ID_ER:
                    case HW_ID_PR:
		    case HW_ID_pre_PR:
                    case HW_ID_MP:
                        pr_info("HW_ID 0x%x, ov5670 does not support.\n", Read_HW_ID());
                        break;
                    default:
                        pr_info("ov5670 --> HW_ID is not defined\n");
                        break;
                }
                break;

            default:
                pr_info("Project ID is not defined\n");
                break;
        }//end switch

        //turn off power 1.8V
        if (camera_vprog2_on) {
            camera_vprog2_on = 0;
            ret = intel_scu_ipc_iowrite8(MSIC_VPROG2_MRFLD_CTRL, MSIC_VPROG2_OFF);
            if (ret) {
                printk(KERN_ALERT "Failed to disable regulator vprog2\n");
                return ret;
            }
            printk("<<< 1.8V= 0\n");
        }
    }//end if

    return 0;
}
コード例 #20
0
static int gc0339_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret = 0;
	int reg_err = 0;

	printk("%s: ++\n",__func__);

	if (camera_reset < 0) {
		ret = camera_sensor_gpio(GP_CORE_077, "SUB_CAM_RST#", GPIOF_DIR_OUT, 0);
		if (ret < 0){
		    printk("camera_reset not available.\n");
		    return ret;
		}
		camera_reset = ret;
	}

	if (camera_power_down < 0) {
		ret = camera_sensor_gpio(GP_CORE_080, "SUB_CAM_PWDN", GPIOF_DIR_OUT, 0);
		if (ret < 0){
		    printk("camera_power_down not available.\n");
		    return ret;
		}
		camera_power_down = ret;
	}

	printk("<< camera_reset:%d, camera_power_down:%d, flag:%d\n", camera_reset, camera_power_down, flag);

	if (flag) {

		if (camera_reset >= 0){
			gpio_set_value(camera_reset, 0);
			printk("<<< camera_reset = 0\n");
			msleep(1);
		}
		if (camera_power_down >= 0){
			gpio_set_value(camera_power_down, 0);
			printk("<<< camera_power_down = 0\n");
			msleep(1);
		}

		//turn on power 1.8V and 2.8V
		if (!camera_vprog1_on) {
			camera_vprog1_on = 1;
			reg_err = regulator_enable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to enable regulator vprog1\n");
				return reg_err;
			}
			printk("<<< 1.8V and 2.8V = 1\n");
			msleep(1);
		}

		msleep(2); //wait vprog1 from enable to 90% (max:2000us)

	} else {

		//turn off power 1.8V and 2.8V
		if (camera_vprog1_on) {
			camera_vprog1_on = 0;
			reg_err = regulator_disable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to disable regulator vprog1\n");
				return reg_err;
			}
			printk("<<< 1.8V and 2.8V = 0\n");
			msleep(1);
		}


	}

	if (camera_reset >= 0){
		gpio_free(camera_reset);
		camera_reset = -1;
	}

	if (camera_power_down >= 0){
		gpio_free(camera_power_down);
		camera_power_down = -1;
	}

	return 0;
}
コード例 #21
0
static int t4k35_180_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	int reg_err;
	int ret = 0;

	printk("%s: ++\n",__func__);

	if (camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_0_RESET, GPIOF_DIR_OUT, 0);
		if (ret < 0){
			printk("camera_reset not available.\n");
			return ret;
		}
		camera_reset = ret;
	}

	printk("<< camera_reset:%d, flag:%d\n", camera_reset, flag);

	if (flag) {
		if (camera_reset >= 0){
			gpio_set_value(camera_reset, 0);
			printk("<<< camera_reset = 0\n");
		}

		//turn on VCM power 2.85V
		if (!camera_vemmc1_on) {
			camera_vemmc1_on = 1;
			reg_err = regulator_enable(vemmc1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to enable regulator vemmc1\n");
				return reg_err;
			}
			printk("<<< VCM 2.85V = 1\n");
		}

		//turn on power 1.8V and 2.8V
		if (!camera_vprog1_on) {
			camera_vprog1_on = 1;
			reg_err = regulator_enable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to enable regulator vprog1\n");
				return reg_err;
			}
			printk("<<< 1.8V and 2.8V = 1\n");
		}

		//turn on power 1.2V
		if (!camera_vprog2_on) {
			camera_vprog2_on = 1;
			reg_err = regulator_enable(vprog2_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to enable regulator vprog2\n");
				return reg_err;
			}
			printk("<<< 1.2V = 1\n");
		}

		usleep_range(2000, 2100); //wait vprog1 and vprog2 from enable to 90% (max:2000us)
	} else {
		if (camera_reset >= 0){
			gpio_free(camera_reset);
			camera_reset = -1;
		}

		//turn off power 1.2V
		if (camera_vprog2_on) {
			camera_vprog2_on = 0;
			reg_err = regulator_disable(vprog2_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to disable regulator vprog2\n");
				return reg_err;
			}
			printk("<<< 1.2V = 0\n");
		}

		//turn off power 1.8V and 2.8V
		if (camera_vprog1_on) {
			camera_vprog1_on = 0;
			reg_err = regulator_disable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to disable regulator vprog1\n");
				return reg_err;
			}
			printk("<<< 1.8V and 2.8V = 0\n");
		}

		//turn off VCM power 2.85V
		if (camera_vemmc1_on) {
			camera_vemmc1_on = 0;
			reg_err = regulator_disable(vemmc1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to disable regulator vemmc1\n");
				return reg_err;
			}
			printk("<<< VCM 2.85V = 0\n");
		}
	}
	return 0;
}
コード例 #22
0
static int m10mo_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret = 0;
	pr_info("M10MO power control. flag=%d\n", flag);
	if(Read_PROJ_ID() != PROJ_ID_ZX550ML){
	     pr_err("M10MO, this is not ZX550ML, break! \n");
		 return -1;
	}
	set_flis_value(0x3221, 0x2D18);
#ifdef CONFIG_CRYSTAL_COVE

	if (flag) {
		ret = intel_mid_pmic_writeb(VPROG_2P8V, VPROG_ENABLE);
		if (ret) {
			pr_err("Failed to power on V2P8SX.\n");
			return ret;
		}
		ret = intel_mid_pmic_writeb(VPROG_1P2V, VPROG_ENABLE);
		if (ret) {
			pr_err("Failed to power on V1P2SX.\n");
			/* Turn all powers off if one is failed. */
			intel_mid_pmic_writeb(VPROG_2P8V, VPROG_DISABLE);
			return ret;
		}
		/* Wait for 8ms to make all the power supplies to be stable. */
		usleep_range(8000, 8000);
	} else {
		/* Turn all powers off even when some are failed. */
		if (intel_mid_pmic_writeb(VPROG_2P8V, VPROG_DISABLE))
			pr_err("Failed to power off V2P8SX.\n");
		if (intel_mid_pmic_writeb(VPROG_1P2V, VPROG_DISABLE))
			pr_err("Failed to power off V1P2SX.\n");
	}
#else

    if (camera_1p2_en < 0) {
        lnw_gpio_set_alt(55, LNW_GPIO);
        ret = camera_sensor_gpio(55,"INT_CAM_1V2_EN", GPIOF_DIR_OUT, 0);
        if (ret < 0){
            printk("camera_1p2_en is not available.\n");
            return ret;
        }
        camera_1p2_en = ret;
        printk(KERN_INFO "M10MO, gpio number, camera_1p2_en is %d\n", camera_1p2_en);
    }

switch (Read_HW_ID()) {
	case HW_ID_EVB:
	case HW_ID_SR1:
	case HW_ID_SR2:
	case HW_ID_ER:
	case HW_ID_ER1_1:
	case HW_ID_ER1_2:
	case HW_ID_PR:
	case HW_ID_pre_PR:
	case HW_ID_MP:
		if (camera_3p3_en2 < 0) {
		gpio_free(58);/////// temp WA.
        	lnw_gpio_set_alt(58, LNW_GPIO);
        	ret = camera_sensor_gpio(58, "3X_I2C_LED", GPIOF_DIR_OUT, 0);
        	if (ret < 0){
            		printk("GPIO58 is not available.\n");
        	}else{
            		camera_3p3_en2 = ret;
            		printk(KERN_INFO "M10MO, gpio number, camera_3p3_en2 is %d\n", camera_3p3_en2);
        	}
    	}
	break;

	default:
    	if (camera_3p3_en2 < 0) {
		gpio_free(54);/////// temp WA.
        	lnw_gpio_set_alt(54, LNW_GPIO);
        	ret = camera_sensor_gpio(54, "3X_I2C_LED", GPIOF_DIR_OUT, 0);
        	if (ret < 0){
            		printk("GPIO54 is not available.\n");
        	}else{
            		camera_3p3_en2 = ret;
            		printk(KERN_INFO "M10MO, gpio number, camera_3p3_en2 is %d\n", camera_3p3_en2);
        	}
    	}
	break;
}//switch

    if (camera_2p8_en < 0) {
        lnw_gpio_set_alt(56, LNW_GPIO);
        ret = camera_sensor_gpio(56,"INT_CAM_2V8_EN", GPIOF_DIR_OUT, 0);
        if (ret < 0){
            printk("camera_2p8_en not available.\n");
            return ret;
        }
        camera_2p8_en = ret;
        printk(KERN_INFO "M10MO, gpio number, camera_2p8_en is %d\n", camera_2p8_en);
    }

	if (flag) {

/*
static int camera_1p2_en = -1;
static int camera_2p8_en = -1;
static int camera_isp_1p2_en = -1;
*/
		if(camera_1p2_en > 0){
            printk("@%s %d, project zx550ml pull up GPIO%d\n", __func__, __LINE__, camera_1p2_en);
            gpio_set_value(camera_1p2_en, 1);
        }
#if 0
		ret = intel_scu_ipc_iowrite8(MSIC_VPROG2_MRFLD_CTRL, MSIC_VPROG2_ON_1P8);
		if (ret) {
			pr_err("Failed to power on M10MO MSIC_VPROG2_ON_1P8.\n");
			return ret;
		}
#endif
        if(camera_3p3_en2 > 0){
            mdelay(1);
            printk("@%s %d, project zx550ml pull up GPIO%d\n", __func__, __LINE__, camera_3p3_en2);
            gpio_set_value(camera_3p3_en2, 1);
        }
        mdelay(1);
		ret = intel_scu_ipc_iowrite8(MSIC_VPROG1_MRFLD_CTRL, MSIC_VPROG1_ON_1P8);

        if (ret) {
            pr_err("Failed to power on M10MO MSIC_VPROG1_ON_1P8.\n");
            return ret;
        }else{
		    printk("@%s %d, project zx550ml pull up Vprog1, 1.8V \n", __func__, __LINE__);
		}

		if(camera_2p8_en > 0){
            printk("@%s %d, project zx550ml pull up GPIO%d\n", __func__, __LINE__, camera_2p8_en);
            gpio_set_value(camera_2p8_en, 1);
        }

		/* Wait for 8ms to make all the power supplies to be stable. */
		usleep_range(8000, 8000);
	} else {
/*
static int camera_1p2_en = -1;
static int camera_2p8_en = -1;
static int camera_isp_1p2_en = -1;
*/
        ret = intel_scu_ipc_iowrite8(MSIC_VPROG1_MRFLD_CTRL, MSIC_VPROG1_OFF);
        if (ret) {
            pr_err("Failed to power off M10MO MSIC_VPROG1_ON_2P8.\n");
            return ret;
        }

        gpio_set_value(camera_2p8_en, 0);
        camera_sensor_gpio_free(camera_2p8_en);
        camera_2p8_en = -1;

        gpio_set_value(camera_1p2_en, 0);
        camera_sensor_gpio_free(camera_1p2_en);
        camera_1p2_en = -1;

		gpio_set_value(camera_3p3_en2, 0);
		camera_sensor_gpio_free(camera_3p3_en2);
        camera_3p3_en2 = -1;

        camera_sensor_gpio_free(camera_reset);
        camera_reset = -1;
	}

#endif
	return ret;
}
コード例 #23
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;
}
コード例 #24
0
static int mt9m114_power_ctrl(struct v4l2_subdev *sd, int flag)
{
	int reg_err;
	int ret, SPI_ret=0;
	printk("%s: ++\n",__func__);


	if (HW_ID == 0xFF){
		HW_ID = Read_HW_ID();
	}

	if (PROJECT_ID == 0xFF) {
		PROJECT_ID = Read_PROJ_ID();
	}	
	

	if (PROJECT_ID==PROJ_ID_ME302C) {
		switch (HW_ID) {
			case HW_ID_SR1:
			case HW_ID_SR2:
			case HW_ID_ER:		
				SPI_ENABLE=0;
				break;
			case HW_ID_PR:
			case HW_ID_MP:
				SPI_ENABLE=1;
				break;
			default:
				SPI_ENABLE=1;
		}
	}

	if (PROJECT_ID==PROJ_ID_ME372CG) {
		switch (HW_ID) {
			case HW_ID_SR1:	//for EVB
				SPI_ENABLE=0;
				break;				
			case HW_ID_SR2:	//for SR1
			case HW_ID_ER:		
			case HW_ID_PR:
			case HW_ID_MP:
				SPI_ENABLE=1;
				break;
			default:
				SPI_ENABLE=1;
		}
	}	

	if (PROJECT_ID==PROJ_ID_ME372C) {
		switch (HW_ID) {
			case HW_ID_SR1:	//for EVB
				SPI_ENABLE=0;
				break;				
			case HW_ID_SR2:	//for SR1
			case HW_ID_ER:		
			case HW_ID_PR:
			case HW_ID_MP:
				SPI_ENABLE=1;
				break;
			default:
				SPI_ENABLE=1;
		}
	}	
	

	if (PROJECT_ID==PROJ_ID_GEMINI) {
		switch (HW_ID) {
			case HW_ID_SR1:
				SPI_ENABLE=0;
				break;				
			case HW_ID_SR2:
			case HW_ID_ER:		
			case HW_ID_PR:
			case HW_ID_MP:
				SPI_ENABLE=1;
				break;
			default:
				SPI_ENABLE=1;
		}
	}	

	SPI_ret=spi_init_extra_parameter();

	if (SPI_ret==SPI_magic_number) {
		SPI_ENABLE=1;		
	} else if (SPI_ret==EEPROM_magic_number) {
		SPI_ENABLE=0;
	}
	
	//printk("HW ID:%d\n", HW_ID);
	switch (HW_ID){
		case HW_ID_SR1:
		case HW_ID_SR2:
			if (camera_power_1p2_en < 0) {
				ret = camera_sensor_gpio(-1, GP_CAMERA_ISP_POWER_1P2_EN,
							 GPIOF_DIR_OUT, 0);
				if (ret < 0){
					printk("%s not available.\n", GP_CAMERA_ISP_POWER_1P2_EN);
					return ret;
				}
				camera_power_1p2_en = ret;
			}
			if (camera_reset < 0) {
				ret = camera_sensor_gpio(-1, GP_CAMERA_ISP_RESET,
							 GPIOF_DIR_OUT, 0);
				if (ret < 0){
					printk("%s not available.\n", GP_CAMERA_ISP_RESET);
					return ret;
				}
				camera_reset = ret;
			}
			if (camera_suspend < 0) {
				ret = camera_sensor_gpio(-1, GP_CAMERA_ISP_SUSPEND,
							GPIOF_DIR_OUT, 0);
				if (ret < 0){
					printk("%s not available.\n", GP_CAMERA_ISP_SUSPEND);
					return ret;
				}
				camera_suspend = ret;
			}
			break;
		case HW_ID_ER:
		case HW_ID_PR:
		case HW_ID_MP:
		default:
			printk("@@@@@HW_ID is unknow:%d, use SR2 setting\n", HW_ID);
			if (camera_power_1p2_en < 0) {
			ret = camera_sensor_gpio(111, GP_CAMERA_ISP_POWER_1P2_EN,
							 GPIOF_DIR_OUT, 0);
				if (ret < 0){
					printk("%s not available.\n", GP_CAMERA_ISP_POWER_1P2_EN);
					return ret;
				}
				camera_power_1p2_en = 111;
			}
			if (camera_reset < 0) {
				ret = camera_sensor_gpio(161, GP_CAMERA_ISP_RESET,
							 GPIOF_DIR_OUT, 0);
				if (ret < 0){
					printk("%s not available.\n", GP_CAMERA_ISP_RESET);
					return ret;
				}
				camera_reset = 161;
			}
			if (camera_suspend < 0) {
				ret = camera_sensor_gpio(162, GP_CAMERA_ISP_SUSPEND,
							GPIOF_DIR_OUT, 0);
				if (ret < 0){
					printk("%s not available.\n", GP_CAMERA_ISP_SUSPEND);
					return ret;
				}
				camera_suspend = 162;
			}
			break;
	}

	printk("<<1p2_en:%d, reset:%d, suspend:%d, flag:%d\n", camera_power_1p2_en, camera_reset, camera_suspend, flag);
	if (flag){
		//pull low reset first
		if (camera_reset >= 0){
			gpio_set_value(camera_reset, 0);
			printk("<<< camera_reset = 0\n");
			msleep(1);
		}

		//turn on DVDD power 1.2V
		if (camera_power_1p2_en >= 0){
			gpio_set_value(camera_power_1p2_en, 1);
			printk("<<< DVDD 1.2V = 1\n");
			msleep(1);
		}

		//turn on power VDD_SEN VDD_HOST 1.8V
		if (!camera_vprog1_on) {
			camera_vprog1_on = 1;
			reg_err = regulator_enable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to enable regulator vprog1\n");
				return reg_err;
			}
			printk("<<< VDD_SEN VDD_HOST 1.8V = 1\n");
			msleep(10);
		}

		//turn on power AVDD 2.8V
		if (!camera_vprog2_on) {
			camera_vprog2_on = 1;
			reg_err = regulator_enable(vprog2_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to enable regulator vprog2\n");
				return reg_err;
			}
			printk("<<< AVDD 2.8V = 1\n");
			msleep(10);
		}

		//turn on MCLK
		mt9m114_flisclk_ctrl(sd, 1);
		msleep(1); //need wait 16 clk cycle

//FW_BSP++		
		if (SPI_ENABLE==0) {
			//Pull high suspend to load fw from SPI
			if (camera_suspend >= 0){
				gpio_set_value(camera_suspend, 1);
				printk("<<< suspend = 1, load fw\n");
			}

			//Reset control
			if (camera_reset >= 0){
				gpio_set_value(camera_reset, 1);
				printk("<<< reset = 1\n");
				msleep(6); //wait 6ms
			}							
		} else {
			//Pull low suspend to load fw from host
			if (camera_suspend >= 0){
				gpio_set_value(camera_suspend, 0);
				printk("<<< suspend = 0, load fw\n");
			}

			lnw_gpio_set_alt(GP_AON_019, LNW_GPIO);
			lnw_gpio_set_alt(GP_AON_021, LNW_GPIO);
			lnw_gpio_set_alt(GP_AON_023, LNW_GPIO);

			if (camera_SPI_1_SS3 < 0) {
				ret = camera_sensor_gpio(GP_AON_019, GP_CAMERA_SPI_SS3,
						 GPIOF_DIR_OUT, 0);
				if (ret < 0){
					printk("%s not available.\n", GP_CAMERA_SPI_SS3);
					return ret;
				}
				camera_SPI_1_SS3= GP_AON_019;
			}		

			if (camera_SPI_1_SDO < 0) {
				ret = camera_sensor_gpio(GP_AON_021, GP_CAMERA_SPI_SDO,
						 GPIOF_DIR_OUT, 0);
				if (ret < 0){
					printk("%s not available.\n", GP_CAMERA_SPI_SDO);
					return ret;
				}
				camera_SPI_1_SDO= GP_AON_021;
			}							


			if (camera_SPI_1_CLK < 0) {
			ret = camera_sensor_gpio(GP_AON_023, GP_CAMERA_SPI_CLK,
							 GPIOF_DIR_OUT, 1);
				if (ret < 0){
					printk("%s not available.\n", GP_CAMERA_SPI_CLK);
					return ret;
				}
				camera_SPI_1_CLK = GP_AON_023;
			}


			if (camera_SPI_1_SS3 >= 0){
				gpio_set_value(camera_SPI_1_SS3, 0);
				printk("<<< SPI SS3 = 0\n");
			}					


			if (camera_SPI_1_SDO >= 0){
				gpio_set_value(camera_SPI_1_SDO, 0);
				printk("<<< SPI SDO = 0\n");
			}	


			if (camera_SPI_1_CLK >= 0){
				gpio_set_value(camera_SPI_1_CLK, 1);
				printk("<<< SPI CLK = 1\n");
				msleep(6);
			}				

			//Reset control
			if (camera_reset >= 0){
				gpio_set_value(camera_reset, 1);
				printk("<<< reset = 1\n");
				msleep(6); //wait 6ms
			}

			if (camera_SPI_1_SS3 >= 0){
				gpio_free(camera_SPI_1_SS3);
				camera_SPI_1_SS3 = -1;
			}				


			if (camera_SPI_1_SDO >= 0){
				gpio_free(camera_SPI_1_SDO);
				camera_SPI_1_SDO = -1;
			}	
				

			if (camera_SPI_1_CLK >= 0){
				gpio_set_value(camera_SPI_1_CLK, 0);
				printk("<<< SPI CLK = 0\n");
				gpio_free(camera_SPI_1_CLK);
				camera_SPI_1_CLK = -1;
			}

			lnw_gpio_set_alt(GP_AON_019, LNW_ALT_1);
			lnw_gpio_set_alt(GP_AON_021, LNW_ALT_1);
			lnw_gpio_set_alt(GP_AON_023, LNW_ALT_1);		
		}
//FW_BSP--

		//Pull low suspend
		if (camera_suspend >= 0){
			gpio_set_value(camera_suspend, 0);
			printk("<<< suspend = 0\n");
		}
		msleep(10); //delay time for first i2c command
	}else{
		//pull low reset
		if (camera_reset >= 0){
			gpio_set_value(camera_reset, 0);
			printk("<<< reset = 0\n");
			gpio_free(camera_reset);
			camera_reset = -1;
		}

		//turn off MCLK
		mt9m114_flisclk_ctrl(sd, 0);

		//turn off power AVDD 2.8V
		if (camera_vprog2_on) {
			camera_vprog2_on = 0;
			reg_err = regulator_disable(vprog2_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to disable regulator vprog2\n");
				return reg_err;
			}
			printk("<<< AVDD 2.8V = 0\n");
			msleep(10);
		}

		lnw_gpio_set_alt(GP_AON_019, LNW_GPIO);
		lnw_gpio_set_alt(GP_AON_021, LNW_GPIO);
		
		if (camera_SPI_1_SS3 < 0) {
			ret = camera_sensor_gpio(GP_AON_019, GP_CAMERA_SPI_SS3,
					 GPIOF_DIR_OUT, 0);
			if (ret < 0){
				printk("%s not available.\n", GP_CAMERA_SPI_SS3);
				return ret;
			}
			camera_SPI_1_SS3= GP_AON_019;
		}			


		if (camera_SPI_1_SDO < 0) {
			ret = camera_sensor_gpio(GP_AON_021, GP_CAMERA_SPI_SDO,
					 GPIOF_DIR_OUT, 0);
			if (ret < 0){
				printk("%s not available.\n", GP_CAMERA_SPI_SDO);
				return ret;
			}
			camera_SPI_1_SDO= GP_AON_021;
		}			
		

		if (camera_SPI_1_SS3 >= 0){
			gpio_set_value(camera_SPI_1_SS3, 0);
			printk("<<< SPI SS3 = 0\n");
			gpio_free(camera_SPI_1_SS3);
			camera_SPI_1_SS3 = -1;
			mdelay(1);
		}		


		if (camera_SPI_1_SDO >= 0){
			gpio_set_value(camera_SPI_1_SDO, 0);
			printk("<<< SPI SDO = 0\n");
			gpio_free(camera_SPI_1_SDO);
			camera_SPI_1_SDO = -1;		
			mdelay(1);
		}					

		//turn off power VDD_SEN VDD_HOST 1.8V
		if (camera_vprog1_on) {
			camera_vprog1_on = 0;
			reg_err = regulator_disable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT "Failed to disable regulator vprog1\n");
				return reg_err;
			}
			printk("<<< VDD_SEN VDD_HOST 1.8V = 0\n");
			msleep(10);
		}

		//turn off DVDD power 1.2V
		if (camera_power_1p2_en >= 0){
			gpio_set_value(camera_power_1p2_en, 0);
			printk("<<< DVDD 1.2V = 0\n");
			gpio_free(camera_power_1p2_en);
			camera_power_1p2_en = -1;
		}
		msleep(1);

		//release suspend gpio
		if (camera_suspend >= 0){
			printk("<<< Release camera_suspend pin:%d\n", camera_suspend);
			gpio_free(camera_suspend);
			camera_suspend = -1;
		}
	}
	return 0;
}
コード例 #25
0
static int ov2722_gpio_ctrl(struct v4l2_subdev *sd, int flag)
{
	int ret;
	int pin;

	if (!IS_BYT) {
		if (gp_camera1_power_down < 0) {
			ret = camera_sensor_gpio(-1, GP_CAMERA_1_POWER_DOWN,
					GPIOF_DIR_OUT, 1);
			if (ret < 0)
				return ret;
			gp_camera1_power_down = ret;
		}

		if (gp_camera1_reset < 0) {
			ret = camera_sensor_gpio(-1, GP_CAMERA_1_RESET,
					GPIOF_DIR_OUT, 1);
			if (ret < 0)
				return ret;
			gp_camera1_reset = ret;
		}
	} else {
		/*
		 * FIXME: WA using hardcoded GPIO value here.
		 * The GPIO value would be provided by ACPI table, which is
		 * not implemented currently.
		 */
		if (spid.hardware_id == BYT_TABLET_BLK_CRV2)
			pin = CAMERA_1_RESET_CRV2;
		else
			pin = CAMERA_1_RESET;

		if (gp_camera1_reset < 0) {
			ret = gpio_request(pin, "camera_1_reset");
			if (ret) {
				pr_err("%s: failed to request gpio(pin %d)\n",
					__func__, pin);
				return ret;
			}
		}
		gp_camera1_reset = pin;
		ret = gpio_direction_output(pin, 1);
		if (ret) {
			pr_err("%s: failed to set gpio(pin %d) direction\n",
				__func__, pin);
			gpio_free(pin);
			return ret;
		}

		/*
		 * FIXME: WA using hardcoded GPIO value here.
		 * The GPIO value would be provided by ACPI table, which is
		 * not implemented currently.
		 */
		pin = CAMERA_1_PWDN;
		if (gp_camera1_power_down < 0) {
			ret = gpio_request(pin, "camera_1_power");
			if (ret) {
				pr_err("%s: failed to request gpio(pin %d)\n",
					__func__, pin);
				return ret;
			}
		}
		gp_camera1_power_down = pin;

		if (spid.hardware_id == BYT_TABLET_BLK_8PR0 ||
		    spid.hardware_id == BYT_TABLET_BLK_8PR1 ||
		    spid.hardware_id == BYT_TABLET_BLK_CRV2)
			ret = gpio_direction_output(pin, 0);
		else
			ret = gpio_direction_output(pin, 1);

		if (ret) {
			pr_err("%s: failed to set gpio(pin %d) direction\n",
				__func__, pin);
			gpio_free(pin);
			return ret;
		}
	}
	if (flag) {
		if (spid.hardware_id == BYT_TABLET_BLK_8PR0 ||
		    spid.hardware_id == BYT_TABLET_BLK_8PR1 ||
		    spid.hardware_id == BYT_TABLET_BLK_CRV2)
			gpio_set_value(gp_camera1_power_down, 0);
		else
			gpio_set_value(gp_camera1_power_down, 1);

		gpio_set_value(gp_camera1_reset, 0);
		msleep(20);
		gpio_set_value(gp_camera1_reset, 1);
	} else {
		gpio_set_value(gp_camera1_reset, 0);
		if (spid.hardware_id == BYT_TABLET_BLK_8PR0 ||
		    spid.hardware_id == BYT_TABLET_BLK_8PR1 ||
		    spid.hardware_id == BYT_TABLET_BLK_CRV2)
			gpio_set_value(gp_camera1_power_down, 1);
		else
			gpio_set_value(gp_camera1_power_down, 0);
	}

	return 0;
}
コード例 #26
0
static int mt9m114_power_ctrl(struct v4l2_subdev *sd, int flag)
{
#ifdef CONFIG_BOARD_CTP
	int reg_err;
#endif
#ifndef CONFIG_BOARD_CTP
	int ret;

	/* Note here, there maybe a workaround to avoid I2C SDA issue */
        if (mt9m114_camera_power_down < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_1_POWER_DOWN,
					GPIOF_DIR_OUT, 1);
#ifndef CONFIG_BOARD_REDRIDGE
		if (ret < 0)
			return ret;
#endif
                mt9m114_camera_power_down = ret;
	}

        if (mt9m114_camera_reset < 0) {
		ret = camera_sensor_gpio(-1, GP_CAMERA_1_RESET,
					 GPIOF_DIR_OUT, 1);
		if (ret < 0)
			return ret;
		mt9m114_camera_reset = ret;
	}
#endif
	if (flag) {
#ifndef CONFIG_BOARD_CTP
		if (!mt9e013_reset_value) {
			if (mt9e013_reset)
				mt9e013_reset(sd);
			mt9e013_reset_value = 1;
		}
#ifdef CONFIG_BOARD_REDRIDGE
		gpio_direction_output(mt9m114_camera_reset, 0);
#endif
		gpio_set_value(mt9m114_camera_reset, 0);
#endif
		if (!mt9e013_camera_vprog1_on) {
			mt9m114_camera_vprog1_on = 1;
#ifdef CONFIG_BOARD_CTP
			reg_err = regulator_enable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT, "Failed to enable regulator vprog1\n");
				return reg_err;
			}
#else
			intel_scu_ipc_msic_vprog1(1);
#endif
		}
#ifndef CONFIG_BOARD_CTP
#ifdef CONFIG_BOARD_REDRIDGE
		if (mt9m114_camera_power_down >= 0)
			gpio_set_value(mt9m114_camera_power_down, 1);
#else
		gpio_set_value(mt9m114_camera_power_down, 1);
#endif
#endif
	} else {
		if (mt9m114_camera_vprog1_on) {
			mt9m114_camera_vprog1_on = 0;
#ifdef CONFIG_BOARD_CTP
			reg_err = regulator_disable(vprog1_reg);
			if (reg_err) {
				printk(KERN_ALERT, "Failed to disable regulator vprog1\n");
				return reg_err;
			}
#else
			intel_scu_ipc_msic_vprog1(0);
#endif
		}
#ifndef CONFIG_BOARD_CTP
#ifdef CONFIG_BOARD_REDRIDGE
		if (mt9m114_camera_power_down >= 0)
			gpio_set_value(mt9m114_camera_power_down, 0);
#else
		gpio_set_value(mt9m114_camera_power_down, 0);
#endif

		mt9e013_reset_value = 0;
#endif
	}

	return 0;
}
コード例 #27
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;
}
コード例 #28
0
static int ov8865_power_pins(void)
{
	int ret;

	if (IS_BYT) {
		blade_power_pins();
		if (camera_power_down < 0) {
			camera_power_down = CAMERA_0_PWDN;
			ret = gpio_request(camera_power_down, "camera_power_down");
			if (ret) {
				pr_err("%s: failed to request gpio(pin %d)\n",
				__func__, camera_power_down);
				return -EINVAL;
			}
			ret = gpio_direction_output(camera_power_down, 0);
		}

		if (camera_vcm_en < 0) {
			camera_vcm_en = CAMERA_VCM_EN;
			ret = gpio_request(camera_vcm_en, "camera_vcm_en");
			if (ret) {
				pr_err("%s: failed to request gpio(pin %d) keep going\n",
				__func__, camera_vcm_en);
				//return -EINVAL;
			}
			ret = gpio_direction_output(camera_vcm_en, 0);
		}
		OV8865_PLAT_LOG(1,"%s %d camera_power_down:%d camera_dovdd_en:%d camera_vcm_en:%d camera_avdd_en:%d camera_dvdd_en:%d\n", __func__, __LINE__,
				camera_power_down, camera_dovdd_en, camera_vcm_en, camera_avdd_en, camera_dvdd_en);
	}
	if (!IS_BYT) {
		if (camera_reset < 0) {
			ret = camera_sensor_gpio(-1, GP_CAMERA_0_RESET,
					GPIOF_DIR_OUT, 1);
			if (ret < 0)
				return ret;
			camera_reset = ret;
		}
	} else {
		/*
		 * FIXME: WA using hardcoded GPIO value here.
		 * The GPIO value would be provided by ACPI table, which is
		 * not implemented currently
		 */
		if (camera_reset < 0) {
			if (spid.hardware_id == BYT_TABLET_BLK_CRV2)
				camera_reset = CAMERA_0_RESET_CRV2;
			else
				camera_reset = CAMERA_0_RESET;

			ret = gpio_request(camera_reset, "camera_reset");
			if (ret) {
				pr_err("%s: failed to request gpio(pin %d) keep going\n",
				__func__, CAMERA_0_RESET);
				//return -EINVAL;
			}
			OV8865_PLAT_LOG(1,"CAMERA:%s %d camera_reset:%d\n", __func__, __LINE__, camera_reset);
			ret = gpio_direction_output(camera_reset, 0);
			if (ret) {
			pr_err("%s: failed to set gpio(pin %d) direction\n",
				__func__, camera_reset);
			gpio_free(camera_reset);
		        }
		}
	#if 0
		OV8865_PLAT_LOG(1,"CAMERA:%s %d camera_reset:%d\n", __func__, __LINE__, camera_reset);
		ret = gpio_direction_output(camera_reset, 0);
		if (ret) {
			pr_err("%s: failed to set gpio(pin %d) direction\n",
				__func__, camera_reset);
			gpio_free(camera_reset);
		}
	#endif
	}
	return 0;
}