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