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; }
/* * 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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
/* * 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; }
/* * 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; }
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; }
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; }
/* * 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; }
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; }
/* * 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; }
/* * 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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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 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; }