static u32 mt9v113_sensor_set_xclk(struct v4l2_int_device *s, u32 xclkfreq) { struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; struct isp_device *isp = dev_get_drvdata(vdev->cam->isp); /* Enable/Disable sensor xclk */ if (xclkfreq) isp_enable_mclk(isp->dev); else isp_disable_mclk(isp); return isp_set_xclk(vdev->cam->isp, xclkfreq, USE_XCLKB); // XCLK B }
static int ov7675_sensor_power_set(struct v4l2_int_device *s, enum v4l2_power power) { struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; struct isp_device *isp = dev_get_drvdata(vdev->cam->isp); static enum v4l2_power previous_power = V4L2_POWER_OFF; switch (power) { case V4L2_POWER_OFF: printk("ov7675_sensor_power_set : Power OFF...\n"); /* Power Down Sequence */ /* PWDN is active HIGH */ gpio_set_value(pwdn_gpio, 1); if (previous_power != V4L2_POWER_OFF) isp_disable_mclk(isp); break; case V4L2_POWER_STANDBY: case V4L2_POWER_ON: printk("ov7675_sensor_power_set : Power ON...\n"); if (previous_power == V4L2_POWER_OFF) { /* Power Up Sequence */ isp_configure_interface(vdev->cam->isp, &ov7675_if_config); // fyi, regulator_enable takes +/-8ms /* Give sensor sometime to get out of the reset. * Datasheet says >=5 ms. */ msleep(10); /* PWDN is active HIGH. Set LOW to release * PWDN at the end of the power up sequence. */ gpio_set_value(pwdn_gpio, 0); /* We need to wait a little before any I2C access. * Datasheet says >= 20 ms. */ msleep(40); } break; } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return 0; }
static int imx072_sensor_power_set(struct v4l2_int_device *s, enum v4l2_power power) { struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; struct isp_device *isp = dev_get_drvdata(vdev->cam->isp); struct isp_csi2_lanes_cfg lanecfg; struct isp_csi2_phy_cfg phyconfig; static enum v4l2_power previous_power = V4L2_POWER_OFF; // 20110426 [email protected] Update omap_pm_set_max_mpu_wakeup_lat() for 2.6.35 kernel [START] static struct pm_qos_request_list *qos_request; // 20110426 [email protected] Update omap_pm_set_max_mpu_wakeup_lat() for 2.6.35 kernel [END] int err = 0; switch (power) { case V4L2_POWER_ON: /* Power Up Sequence */ printk(KERN_DEBUG "imx072_sensor_power_set(ON)\n"); // [email protected] [TBD]Temporarily block the following code because PM APIs have been changed [START] #if 1 /* * Through-put requirement: * Set max OCP freq for 3630 is 200 MHz through-put * is in KByte/s so 200000 KHz * 4 = 800000 KByte/s */ omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 800000); /* Hold a constraint to keep MPU in C1 */ omap_pm_set_max_mpu_wakeup_lat(&qos_request, 12); #endif // [email protected] [TBD]Temporarily block the following code because PM APIs have been changed [END] isp_csi2_reset(&isp->isp_csi2); lanecfg.clk.pol = IMX072_CSI2_CLOCK_POLARITY; lanecfg.clk.pos = IMX072_CSI2_CLOCK_LANE; lanecfg.data[0].pol = IMX072_CSI2_DATA0_POLARITY; lanecfg.data[0].pos = IMX072_CSI2_DATA0_LANE; lanecfg.data[1].pol = IMX072_CSI2_DATA1_POLARITY; lanecfg.data[1].pos = IMX072_CSI2_DATA1_LANE; lanecfg.data[2].pol = 0; lanecfg.data[2].pos = 0; lanecfg.data[3].pol = 0; lanecfg.data[3].pos = 0; isp_csi2_complexio_lanes_config(&isp->isp_csi2, &lanecfg); isp_csi2_complexio_lanes_update(&isp->isp_csi2, true); isp_csi2_ctrl_config_ecc_enable(&isp->isp_csi2, true); phyconfig.ths_term = IMX072_CSI2_PHY_THS_TERM; phyconfig.ths_settle = IMX072_CSI2_PHY_THS_SETTLE; phyconfig.tclk_term = IMX072_CSI2_PHY_TCLK_TERM; phyconfig.tclk_miss = IMX072_CSI2_PHY_TCLK_MISS; phyconfig.tclk_settle = IMX072_CSI2_PHY_TCLK_SETTLE; isp_csi2_phy_config(&isp->isp_csi2, &phyconfig); isp_csi2_phy_update(&isp->isp_csi2, true); isp_configure_interface(vdev->cam->isp, &imx072_if_config); //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.09.19] - CAM gpio_direction_output(SUBPM_ENABLE, 1); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.09.19] - CAM /* Request and configure gpio pins */ if (gpio_request(IMX072_RESET_GPIO, "imx072_rst") != 0) return -EIO; subpm_set_output(SWREG,1); subpm_output_enable(); subpm_set_output(LDO4,1); subpm_output_enable(); subpm_set_output(LDO3,1); subpm_output_enable(); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_1_8_V, TWL4030_VAUX4_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX4_DEV_GRP); udelay(100); /* have to put sensor to reset to guarantee detection */ gpio_direction_output(IMX072_RESET_GPIO, 1); // gpio_set_value(IMX072_RESET_GPIO, 1); udelay(100); // gpio_direction_output(IMX072_RESET_GPIO, 0); gpio_set_value(IMX072_RESET_GPIO, 0); udelay(1500); /* nRESET is active LOW. set HIGH to release reset */ // gpio_direction_output(IMX072_RESET_GPIO, 1); gpio_set_value(IMX072_RESET_GPIO, 1); udelay(300); break; case V4L2_POWER_OFF: subpm_set_output(LDO5,0); subpm_output_enable(); gpio_set_value(DW9716_VCM_ENABLE, 0); isp_disable_mclk(isp); isp_csi2_complexio_power(&isp->isp_csi2, ISP_CSI2_POWER_OFF); isp_csi2_reset(&isp->isp_csi2); isp_csi2_ctrl_config_ecc_enable(&isp->isp_csi2, true); isp_csi2_complexio_power(&isp->isp_csi2, ISP_CSI2_POWER_OFF); isp_disable_mclk(isp); //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.09.19] - CAM gpio_direction_output(SUBPM_ENABLE, 0); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.09.19] - CAM break; case V4L2_POWER_STANDBY: printk(KERN_DEBUG "imx072_sensor_power_set(%s)\n", (power == V4L2_POWER_OFF) ? "OFF" : "STANDBY"); /* Power Down Sequence */ isp_csi2_complexio_power(&isp->isp_csi2, ISP_CSI2_POWER_OFF); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX4_DEV_GRP); gpio_set_value(IMX072_RESET_GPIO, 0); udelay(5); subpm_set_output(LDO3,0); subpm_output_enable(); subpm_set_output(LDO4,0); subpm_output_enable(); subpm_set_output(SWREG,0); subpm_output_enable(); gpio_free(IMX072_RESET_GPIO); // [email protected] [TBD]Temporarily block the following code because PM APIs have been changed [START] #if 1 /* Remove pm constraints */ omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 0); //omap_pm_set_max_mpu_wakeup_lat(vdev->cam->isp, -1); omap_pm_set_max_mpu_wakeup_lat(&qos_request, -1); #endif // [email protected] [TBD]Temporarily block the following code because PM APIs have been changed [END] /* Make sure not to disable the MCLK twice in a row */ if (previous_power == V4L2_POWER_ON) isp_disable_mclk(isp); //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.09.19] - CAM isp_disable_mclk(isp); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.09.19] - CAM break; } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return err; }
static int yacd5b1s_sensor_power_set(struct v4l2_int_device *dev, enum v4l2_power power) { struct omap34xxcam_videodev *vdev = dev->u.slave->master->priv; struct isp_device *isp = dev_get_drvdata(vdev->cam->isp); static enum v4l2_power previous_power = V4L2_POWER_OFF; //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.07.26] - CAM // 20110426 [email protected] Update omap_pm_set_max_mpu_wakeup_lat() for 2.6.35 kernel [START] static struct pm_qos_request_list *qos_request; // 20110426 [email protected] Update omap_pm_set_max_mpu_wakeup_lat() for 2.6.35 kernel [END] //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.07.26] - CAM int err = 0; switch (power) { case V4L2_POWER_ON: /* Power Up Sequence */ printk(KERN_DEBUG "yacd5b1s_sensor_power_set(ON)\n"); omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 800000); /* Hold a constraint to keep MPU in C1 */ //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.07.26] - CAM // 20110426 [email protected] Update omap_pm_set_max_mpu_wakeup_lat() for 2.6.35 kernel [START] //omap_pm_set_max_mpu_wakeup_lat(vdev->cam->isp, 12); omap_pm_set_max_mpu_wakeup_lat(&qos_request, 12); // 20110426 [email protected] Update omap_pm_set_max_mpu_wakeup_lat() for 2.6.35 kernel [END] //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.07.26] - CAM isp_configure_interface(vdev->cam->isp,&yacd5b1s_if_config); if (gpio_request(YACD5B1S_RESET_GPIO, "yacd5b1s_rst") != 0) printk("\n\n\n>>>>>>>>>>>>YACD5B1S_RESET_GPIO_gpio_request_error\n\n\n");//return -EIO; if (gpio_request(YACD5B1S_STANDBY_GPIO, "yacd5b1s_PWD") != 0) printk("\n\n\n>>>>>>>>>>>>YACD5B1S_STANDBY_GPIO_gpio_request_error\n\n\n");//return -EIO;return -EIO; #if 1 twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, SET_VMMC1_V2_8,VMMC1_DEDICATED ); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VMMC1_DEV_GRP_P1,VMMC1_DEV_GRP ); #endif udelay(20); #if 1 twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX3_1_8_V, TWL4030_VAUX3_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX3_DEV_GRP); #endif twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_1_8_V, TWL4030_VAUX4_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX4_DEV_GRP); //wait typical 500ms for xclk to settle //mdelay(500); gpio_direction_output(YACD5B1S_STANDBY_GPIO, true); udelay(100); gpio_set_value(YACD5B1S_STANDBY_GPIO, 0); udelay(1500); gpio_set_value(YACD5B1S_STANDBY_GPIO, 1); mdelay(100); udelay(50); gpio_direction_output(YACD5B1S_RESET_GPIO, true); udelay(100); gpio_set_value(YACD5B1S_RESET_GPIO, 0); /* set to output mode */ udelay(1500); gpio_set_value(YACD5B1S_RESET_GPIO, 1); udelay(300); break; case V4L2_POWER_OFF: printk(KERN_DEBUG "yacd5b1s_sensor_power_set(OFF)\n"); /* Power Down Sequence */ gpio_set_value(YACD5B1S_RESET_GPIO, 0); udelay(50); gpio_set_value(YACD5B1S_STANDBY_GPIO, 0); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX4_DEV_GRP); #if 1 twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE,VMMC1_DEV_GRP ); #endif #if 1 twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX3_DEV_GRP); #endif gpio_free(YACD5B1S_STANDBY_GPIO); gpio_free(YACD5B1S_RESET_GPIO); omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, -1); //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.07.26] - CAM // 20110426 [email protected] Update omap_pm_set_max_mpu_wakeup_lat() for 2.6.35 kernel [START] //omap_pm_set_max_mpu_wakeup_lat(vdev->cam->isp, -1); omap_pm_set_max_mpu_wakeup_lat(&qos_request, -1); // 20110426 [email protected] Update omap_pm_set_max_mpu_wakeup_lat() for 2.6.35 kernel [END] //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.07.26] - CAM if (previous_power == V4L2_POWER_ON){ isp_disable_mclk(isp); udelay(5); } break; case V4L2_POWER_STANDBY: printk(KERN_DEBUG "yacd5b1s_sensor_power_set(STANDBY)\n"); gpio_set_value(YACD5B1S_RESET_GPIO, 0); udelay(50); gpio_set_value(YACD5B1S_STANDBY_GPIO, 0); udelay(50); gpio_free(YACD5B1S_STANDBY_GPIO); gpio_free(YACD5B1S_RESET_GPIO); if (previous_power == V4L2_POWER_ON){ isp_disable_mclk(isp); udelay(5); } break; } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return err; }
static int S5K5CA_sensor_power_set(struct v4l2_int_device *s, enum v4l2_power power) { struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; struct isp_device *isp = dev_get_drvdata(vdev->cam->isp); static enum v4l2_power previous_power = V4L2_POWER_OFF; static struct pm_qos_request_list *qos_request; int err = 0; printk(KERN_INFO "previous_power = %d,S5K5CA_sensor_power_set(%d)\n",previous_power,power); switch (power) { case V4L2_POWER_ON: /* Through-put requirement: * 3280 x 2464 x 2Bpp x 7.5fps x 3 memory ops = 355163 KByte/s */ omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 664000); // 276480); /* Hold a constraint to keep MPU in C1 */ omap_pm_set_max_mpu_wakeup_lat(&qos_request, 12); isp_configure_interface(vdev->cam->isp,&S5K5CA_if_config); /* turn on analog power */ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX2_1_5_V, TWL4030_VAUX2_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX2_DEV_GRP); udelay(600); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_2_8_V, TWL4030_VAUX4_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX4_DEV_GRP); udelay(100); printk(KERN_INFO "VAUX4 = 2.8V\n"); gpio_direction_output(S5K5CA_RESET_GPIO, 0); printk(KERN_INFO "reset camera\n"); udelay(20); gpio_direction_output(S5K5CA_STANDBY_GPIO, 1); udelay(20); gpio_direction_output(S5K5CA_RESET_GPIO, 1); //udelay(20); break; case V4L2_POWER_OFF: printk(KERN_INFO "S5K5CA_sensor_power_set(OFF)\n"); break; case V4L2_POWER_STANDBY: printk(KERN_INFO "S5K5CA_sensor_power_set(STANDBY)\n"); /* Remove pm constraints */ gpio_direction_output(S5K5CA_STANDBY_GPIO, 0); mdelay(50); omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 0); omap_pm_set_max_mpu_wakeup_lat(&qos_request, -1); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX4_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX2_DEV_GRP); /* Make sure not to disable the MCLK twice in a row */ if (previous_power == V4L2_POWER_ON) isp_disable_mclk(isp); break; } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return err; }
static int ov2659_sensor_power_set(struct v4l2_int_device *s, enum v4l2_power power) { struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; struct isp_device *isp = dev_get_drvdata(vdev->cam->isp); static enum v4l2_power previous_power = V4L2_POWER_OFF; static struct pm_qos_request_list *qos_request; int err = 0; printk(KERN_INFO "previous_power = %d,ov2659_sensor_power_set(%d)\n",previous_power,power); switch (power) { case V4L2_POWER_ON: /* Through-put requirement: * 3280 x 2464 x 2Bpp x 7.5fps x 3 memory ops = 355163 KByte/s */ omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 664000); /* Hold a constraint to keep MPU in C1 */ omap_pm_set_max_mpu_wakeup_lat(&qos_request, 12); isp_configure_interface(vdev->cam->isp,&ov2659_if_config); udelay(20); #if OV2659_USE_STANDBY //add standby mode for cam open speed up jhy 2011.09.09 if (previous_power == V4L2_POWER_OFF) { gpio_direction_output(OV2659_STANDBY_GPIO, 0); //standby gpio_direction_output(OV2659_RESET_GPIO, 1); /* turn on analog & IO power jhy add VAUX3 Ctrl 2011.6.30*/ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX3_1_8_V, TWL4030_VAUX3_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX3_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, TWL4030_VAUX_REMAP_VALUE, TWL4030_VAUX3_REMAP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX2_1_5_V, TWL4030_VAUX2_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX2_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, TWL4030_VAUX_REMAP_VALUE, TWL4030_VAUX2_REMAP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_2_8_V, TWL4030_VAUX4_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX4_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, TWL4030_VAUX_REMAP_VALUE, TWL4030_VAUX4_REMAP); udelay(100); //printk(KERN_INFO "VAUX4 = 2.8V\n"); /* have to put sensor to reset to guarantee detection */ gpio_direction_output(OV2659_RESET_GPIO, 0); udelay(1500); /* nRESET is active LOW. set HIGH to release reset */ gpio_direction_output(OV2659_RESET_GPIO, 1); } else { gpio_direction_output(OV2659_STANDBY_GPIO, 0); printk(KERN_INFO "camera(OV2659) exit standby\n"); } #else gpio_direction_output(OV2659_STANDBY_GPIO, 0); //standby gpio_direction_output(OV2659_RESET_GPIO, 1); /* turn on analog & IO power jhy add VAUX3 Ctrl 2011.6.30*/ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX3_1_8_V, TWL4030_VAUX3_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX3_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX2_1_5_V, TWL4030_VAUX2_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX2_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_2_8_V, TWL4030_VAUX4_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX4_DEV_GRP); udelay(100); //printk(KERN_INFO "VAUX4 = 2.8V\n"); /* have to put sensor to reset to guarantee detection */ gpio_direction_output(OV2659_RESET_GPIO, 0); udelay(1500); /* nRESET is active LOW. set HIGH to release reset */ gpio_direction_output(OV2659_RESET_GPIO, 1); #endif //printk(KERN_INFO "reset camera\n"); break; case V4L2_POWER_OFF: printk(KERN_INFO "OV2659_sensor_power_set(OFF)\n"); case V4L2_POWER_STANDBY: /* Remove pm constraints */ omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 0); omap_pm_set_max_mpu_wakeup_lat(&qos_request, -1); #if OV2659_USE_STANDBY // standby mode for cam jhy 2011.09.09 gpio_direction_output(OV2659_STANDBY_GPIO, 1); #else gpio_direction_output(OV2659_STANDBY_GPIO, 0); gpio_direction_output(OV2659_RESET_GPIO, 0); #if 1 /*definded CONFIG_CAM_GPIO_I2C */ gpio_direction_output(CAM_SCL_GPIO, 0); gpio_direction_output(CAM_SDA_GPIO, 0); #endif twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX4_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX2_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX3_DEV_GRP); //jhy add for Cam IOVDD ctrl 2011.6.30 #endif /* Make sure not to disable the MCLK twice in a row */ if (previous_power == V4L2_POWER_ON) isp_disable_mclk(isp); break; } #if !OV2659_USE_STANDBY /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; #endif return err; }
static int gc2015_sensor_power_set(struct v4l2_int_device *s, enum v4l2_power power) { struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; struct isp_device *isp = dev_get_drvdata(vdev->cam->isp); static enum v4l2_power previous_power = V4L2_POWER_OFF; static struct pm_qos_request_list *qos_request; int err = 0; printk(KERN_INFO "previous_power = %d,gc2015_sensor_power_set(%d)\n",previous_power,power); switch (power) { case V4L2_POWER_ON: /* Through-put requirement: * 3280 x 2464 x 2Bpp x 7.5fps x 3 memory ops = 355163 KByte/s */ omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 664000); /* Hold a constraint to keep MPU in C1 */ omap_pm_set_max_mpu_wakeup_lat(&qos_request, 12); isp_configure_interface(vdev->cam->isp,&gc2015_if_config); udelay(20); //#ifndef KUNLUN_P0 jhy close according to cam poweron timing //gpio_direction_output(GC2015_STANDBY_GPIO, 0); //udelay(10); //#endif // gpio_direction_output(GC2015_RESET_GPIO, 0); /* turn on analog & IO power jhy add VAUX3 Ctrl 2011.6.30*/ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX3_1_8_V, TWL4030_VAUX3_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX3_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX2_1_5_V, TWL4030_VAUX2_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX2_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_2_8_V, TWL4030_VAUX4_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX4_DEV_GRP); udelay(100); printk(KERN_INFO "VAUX4 = 2.8V\n"); /*jhy add according to cam poweron timing beg 2011.6.30*/ #if 1 /*defined CONFIG_CAM_GPIO_I2C*/ gpio_direction_output(CAM_SCL_GPIO, 1); gpio_direction_output(CAM_SDA_GPIO, 1); #endif gpio_direction_output(GC2015_STANDBY_GPIO, 0); //standby /*jhy add according to cam poweron timing end 2011.6.30*/ /* have to put sensor to reset to guarantee detection */ gpio_direction_output(GC2015_RESET_GPIO, 0); udelay(1500); /* nRESET is active LOW. set HIGH to release reset */ gpio_direction_output(GC2015_RESET_GPIO, 1); printk(KERN_INFO "reset camera\n"); break; case V4L2_POWER_OFF: printk(KERN_INFO "GC2015_sensor_power_set(OFF)\n"); case V4L2_POWER_STANDBY: printk(KERN_INFO "GC2015_sensor_power_set(STANDBY)\n"); #ifndef KUNLUN_P0 /*kunlun P0 can't use GC2015_STANDBY_GPIO*/ gpio_direction_output(GC2015_STANDBY_GPIO, 0); //1 change by jhy for IOVDD has been close so standby no use 2011.6.30 udelay(20); gpio_direction_output(GC2015_RESET_GPIO, 0); udelay(20); //printk(KERN_DEBUG "GC2015_sensor_power_set(STANDBY)\n"); #endif /* Remove pm constraints */ omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 0); omap_pm_set_max_mpu_wakeup_lat(&qos_request, -1); /*jhy add according to cam poweron timing beg 2011.6.30*/ #if 1 /*definded CONFIG_CAM_GPIO_I2C*/ gpio_direction_output(CAM_SCL_GPIO, 0); gpio_direction_output(CAM_SDA_GPIO, 0); #endif /*jhy add according to cam poweron timing end 2011.6.30*/ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX4_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX2_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX3_DEV_GRP); //jhy add for Cam IOVDD ctrl 2011.6.30 /* Make sure not to disable the MCLK twice in a row */ if (previous_power == V4L2_POWER_ON) isp_disable_mclk(isp); break; } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return err; }
static int hi253_power_set(struct v4l2_int_device *s, enum v4l2_power power,u8 type) { struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; struct isp_device *isp = dev_get_drvdata(vdev->cam->isp); static enum v4l2_power previous_power = V4L2_POWER_OFF; static struct pm_qos_request_list *qos_request; int err = 0; printk(KERN_ERR "previous_power = %d,Hi253_sensor_power_set(%d)\n",previous_power,power); switch (power) { case V4L2_POWER_ON: /* * Through-put requirement: * Set max OCP freq for 3630 is 200 MHz through-put * is in KByte/s so 200000 KHz * 4 = 800000 KByte/s */ omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 800000); /* Hold a constraint to keep MPU in C1 */ omap_pm_set_max_mpu_wakeup_lat(&qos_request, 12); isp_configure_interface(vdev->cam->isp,&Hi253_if_config); gpio_direction_output(BF3703_STANDBY_GPIO,1); gpio_direction_output(HI253_STANDBY_GPIO, 0); udelay(10); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_2_8_V, TWL4030_VAUX4_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX4_DEV_GRP); udelay(100); printk(KERN_ERR "VAUX4 = 2.8V\n"); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VMMC2_1_5_V, TWL4030_VMMC2_DEDICATED); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VMMC2_DEV_GRP_P1, TWL4030_VMMC2_DEV_GRP); udelay(100); printk(KERN_ERR "VMMC2 = 1.5V\n"); gpio_direction_output(HI253_RESET_GPIO, 1); mdelay(1); /* have to put sensor to reset to guarantee detection */ gpio_direction_output(HI253_RESET_GPIO, 0); udelay(1500); /* nRESET is active LOW. set HIGH to release reset */ gpio_direction_output(HI253_RESET_GPIO, 1); printk(KERN_ERR "reset camera(HI253)\n"); break; case V4L2_POWER_OFF: case V4L2_POWER_STANDBY: printk(KERN_ERR "_sensor_power_set(OFF )\n"); gpio_direction_output(HI253_STANDBY_GPIO, 1); printk(KERN_DEBUG "hi253_sensor_power_set(STANDBY)\n"); /* Remove pm constraints */ omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 0); omap_pm_set_max_mpu_wakeup_lat(&qos_request, -1); /* twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX4_DEV_GRP); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VMMC2_DEV_GRP); */ /* Make sure not to disable the MCLK twice in a row */ if (previous_power == V4L2_POWER_ON){ isp_disable_mclk(isp); } break; // printk(KERN_ERR "_sensor_power_set(STANDBY)\n"); break; } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return err; }