/** * @brief tvp5146_power_set - Power-on or power-off TVP5146 device * * @param power - enum, Power on/off, resume/standby * * @return result of operation - 0 is success */ static int tvp5146_power_set(struct v4l2_int_device *s, enum v4l2_power power) { struct omap34xxcam_videodev *vdev = s->u.slave->master->priv; switch (power) { case V4L2_POWER_OFF: if (omap3stalker_set_mux(MUX_TVP5146, DISABLE_MUX)) return -ENODEV; break; case V4L2_POWER_STANDBY: break; case V4L2_POWER_ON: /* Enable mux for TVP5146 decoder data path */ if (omap3stalker_set_mux(MUX_TVP5146, ENABLE_MUX)) return -ENODEV; #if defined(CONFIG_VIDEO_OMAP3) || defined(CONFIG_VIDEO_OMAP3_MODULE) isp_configure_interface(vdev->cam->isp, &tvp5146_if_config); #endif break; default: return -ENODEV; break; } return 0; }
static int s5k5ccgx_sensor_power_set(enum v4l2_power power) { static enum v4l2_power c_previous_pwr = V4L2_POWER_OFF; int err = 0; //printk("s5k5ccgx_sensor_power_set is called...!!!!!!!![%x]\n", power); switch (power) { case V4L2_POWER_OFF: { err = s5k5ccgx_disable_gpio(); } break; case V4L2_POWER_ON: { isp_configure_interface(0,&s5k5ccgx_if_config); err = s5k5ccgx_enable_gpio(); } break; case V4L2_POWER_STANDBY: break; case V4L2_POWER_RESUME: break; } c_previous_pwr = power; return err; }
static int ce147_sensor_power_set(enum v4l2_power power) { static enum v4l2_power c_previous_pwr = V4L2_POWER_OFF; int err = 0; printk(CE147_MOD_NAME "ce147_sensor_power_set is called...[%x] (0:OFF, 1:ON)\n", power); switch (power) { case V4L2_POWER_OFF: err = ce147_disable_gpio(); break; case V4L2_POWER_ON: isp_configure_interface(NULL,&ce147_if_config); if (c_previous_pwr != V4L2_POWER_OFF) err = ce147_disable_gpio(); err = ce147_enable_gpio(); break; case V4L2_POWER_STANDBY: break; case V4L2_POWER_RESUME: break; } c_previous_pwr = power; return err; }
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 ce147_sensor_power_set(enum v4l2_power power) { static enum v4l2_power c_previous_pwr = V4L2_POWER_OFF; int err = 0; printk("ce147_sensor_power_set is called...[%x]\n", power); switch (power) { case V4L2_POWER_OFF: { err = ce147_disable_gpio(); } break; case V4L2_POWER_ON: { isp_configure_interface(0,&ce147_if_config); err = ce147_enable_gpio(); if(err) { printk("ce147_sensor_power_set RETRY...[%x]\n", err); err = ce147_disable_gpio(); err = ce147_enable_gpio(); } } break; case V4L2_POWER_STANDBY: break; case V4L2_POWER_RESUME: break; } c_previous_pwr = power; return err; }
/** * @brief tvp5146_power_set - Power-on or power-off TVP5146 device * * @param power - enum, Power on/off, resume/standby * * @return result of operation - 0 is success */ static int tvp5146_power_set(enum v4l2_power power) { switch (power) { case V4L2_POWER_OFF: /* Disable mux for TVP5146 decoder data path */ if (is_dec_onboard) { if (omap3evm_set_mux(MUX_TVP5146, DISABLE_MUX)) return -ENODEV; } else { if (omap3evmdc_set_mux(MUX_TVP5146, DISABLE_MUX)) return -ENODEV; } break; case V4L2_POWER_STANDBY: break; case V4L2_POWER_ON: /* Enable mux for TVP5146 decoder data path */ if (is_dec_onboard) { if (omap3evm_set_mux(MUX_TVP5146, ENABLE_MUX)) return -ENODEV; } else { if (omap3evmdc_set_mux(MUX_TVP5146, ENABLE_MUX)) return -ENODEV; } #if defined(CONFIG_VIDEO_OMAP3_CAM) || defined(CONFIG_VIDEO_OMAP3_CAM_MODULE) isp_configure_interface(&tvp5146_if_config); #endif break; default: return -ENODEV; break; } 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; int err = 0; switch (power) { case V4L2_POWER_ON: /* Power Up Sequence */ printk(KERN_DEBUG "imx072_sensor_power_set(ON)\n"); /* * 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); /* S[, 20120922, [email protected], PM from froyo. */ doing_wakeup = 1; /* E], 20120922, [email protected], PM from froyo. */ /* Hold a constraint to keep MPU in C1 */ //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2012.05.22] - CAM pm_qos_update_request(&pm_qos_handler, SET_MPU_CONSTRAINT); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2012.05.22] - CAM 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); /* Request and configure gpio pins */ if (gpio_request(IMX072_RESET_GPIO, "imx072_rst") != 0) return -EIO; //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.07.26] - CAM //KJK for HDMI Sub PMIC usage 2011.03.10 //extern void lp8720_reinit(); //lp8720_reinit(); //gpio_direction_output(lp8720_pdata.en_gpio_num, 1); //subpm_lp8720_power_on(); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.07.26] - CAM 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: //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.07.26] - CAM printk(KERN_DEBUG "imx072_sensor_power_set(OFF)\n"); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.07.26] - CAM subpm_set_output(LDO5,0); subpm_output_enable(); //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.07.26] - CAM //KJK for HDMI Sub PMIC usage 2011.03.10 //gpio_direction_output(lp8720_pdata.en_gpio_num, 0); //subpm_lp8720_power_off(); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.07.26] - CAM gpio_set_value(DW9716_VCM_ENABLE, 0); //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.07.26] - CAM /* This is not required cuz it is disabled in isp_csi_memvs.c*/ /* isp_disable_mclk(isp); */ //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.07.26] - CAM 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); break; case V4L2_POWER_STANDBY: //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2011.07.26] - CAM #ifdef CONFIG_OMAP2_DSS_HDMI { extern int hdmi_power_initialize; int hdmi_wait_cnt = 0; for(hdmi_wait_cnt = 0; hdmi_wait_cnt<20; hdmi_wait_cnt++) { if (hdmi_power_initialize== 0) { printk("==========================================================\n"); printk("waiting DONE for HDMI : %d looping \n", hdmi_wait_cnt); printk("==========================================================\n"); break; } printk("==========================================================\n"); printk("HDMI is not done yet...waiting for HDMI DONE : %d looping \n", hdmi_wait_cnt); printk("==========================================================\n"); msleep(100); } } #endif //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2011.07.26] - CAM 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); /* S[, 20120922, [email protected], PM from froyo. */ doing_wakeup = 0; /* E], 20120922, [email protected], PM from froyo. */ /* Remove pm constraints */ //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2012.05.22] - CAM omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, -1); pm_qos_update_request(&pm_qos_handler, CLEAR_MPU_CONSTRAINT); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2012.05.22] - CAM break; } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return err; }
static int ov3640_sensor_power_set(enum v4l2_power power) { struct isp_csi2_lanes_cfg lanecfg; struct isp_csi2_phy_cfg phyconfig; static enum v4l2_power previous_power = V4L2_POWER_OFF; switch (power) { case V4L2_POWER_ON: if (previous_power == V4L2_POWER_OFF) isp_csi2_reset(); lanecfg.clk.pol = OV3640_CSI2_CLOCK_POLARITY; lanecfg.clk.pos = OV3640_CSI2_CLOCK_LANE; lanecfg.data[0].pol = OV3640_CSI2_DATA0_POLARITY; lanecfg.data[0].pos = OV3640_CSI2_DATA0_LANE; lanecfg.data[1].pol = OV3640_CSI2_DATA1_POLARITY; lanecfg.data[1].pos = OV3640_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(&lanecfg); isp_csi2_complexio_lanes_update(true); phyconfig.ths_term = OV3640_CSI2_PHY_THS_TERM; phyconfig.ths_settle = OV3640_CSI2_PHY_THS_SETTLE; phyconfig.tclk_term = OV3640_CSI2_PHY_TCLK_TERM; phyconfig.tclk_miss = OV3640_CSI2_PHY_TCLK_MISS; phyconfig.tclk_settle = OV3640_CSI2_PHY_TCLK_SETTLE; isp_csi2_phy_config(&phyconfig); isp_csi2_phy_update(true); isp_configure_interface(&ov3640_if_config); if (previous_power == V4L2_POWER_OFF) { #ifdef CONFIG_TWL4030_CORE /* turn on analog power */ #if defined(CONFIG_VIDEO_OV3640_CSI2) twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_1_8_V, TWL4030_VAUX4_DEDICATED); twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX4_DEV_GRP); #else twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_2_8_V, TWL4030_VAUX2_DEDICATED); twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX2_DEV_GRP); #endif udelay(100); #else #error "no power companion board defined!" #endif /* Request and configure gpio pins */ if (omap_request_gpio(OV3640_RESET_GPIO) != 0) { printk(KERN_ERR "Could not request GPIO %d", OV3640_RESET_GPIO); return -EIO; } if (omap_request_gpio(OV3640_STANDBY_GPIO) != 0) { printk(KERN_ERR "Could not request GPIO %d", OV3640_STANDBY_GPIO); return -EIO; } /* set to output mode */ gpio_direction_output(OV3640_RESET_GPIO, true); gpio_direction_output(OV3640_STANDBY_GPIO, true); /* Turn ON Omnivision sensor */ gpio_set_value(OV3640_RESET_GPIO, 1); gpio_set_value(OV3640_STANDBY_GPIO, 0); udelay(100); /* RESET Omnivision sensor */ gpio_set_value(OV3640_RESET_GPIO, 0); udelay(100); gpio_set_value(OV3640_RESET_GPIO, 1); /* Wait 10 ms */ mdelay(10); enable_fpga_vio_1v8(1); udelay(100); } break; case V4L2_POWER_OFF: /* Power Down Sequence */ isp_csi2_complexio_power(ISP_CSI2_POWER_OFF); #ifdef CONFIG_TWL4030_CORE #if defined(CONFIG_VIDEO_OV3640_CSI2) twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX4_DEV_GRP); #else twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX2_DEV_GRP); #endif #else #error "no power companion board defined!" #endif enable_fpga_vio_1v8(0); omap_free_gpio(OV3640_RESET_GPIO); iounmap(fpga_map_addr); omap_free_gpio(OV3640_STANDBY_GPIO); break; case V4L2_POWER_STANDBY: break; } previous_power = power; return 0; }
static int mt9p012_sensor_power_set(enum v4l2_power power) { switch (power) { case V4L2_POWER_OFF: /* Power Down Sequence */ #ifdef CONFIG_TWL4030_CORE twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX2_DEV_GRP); #else #error "no power companion board defined!" #endif enable_fpga_vio_1v8(0); omap_free_gpio(MT9P012_RESET_GPIO); iounmap(fpga_map_addr); omap_free_gpio(MT9P012_STANDBY_GPIO); break; case V4L2_POWER_ON: if (mt9p012_previous_power == V4L2_POWER_OFF) { /* Power Up Sequence */ isp_configure_interface(&mt9p012_if_config); /* Request and configure gpio pins */ if (omap_request_gpio(MT9P012_STANDBY_GPIO) != 0) { printk(KERN_WARNING "Could not request GPIO %d" " for MT9P012\n", MT9P012_STANDBY_GPIO); return -EIO; } /* Request and configure gpio pins */ if (omap_request_gpio(MT9P012_RESET_GPIO) != 0) return -EIO; /* set to output mode */ gpio_direction_output(MT9P012_STANDBY_GPIO, true); /* set to output mode */ gpio_direction_output(MT9P012_RESET_GPIO, true); /* STANDBY_GPIO is active HIGH for set LOW to release */ gpio_set_value(MT9P012_STANDBY_GPIO, 1); /* nRESET is active LOW. set HIGH to release reset */ gpio_set_value(MT9P012_RESET_GPIO, 1); /* turn on digital power */ enable_fpga_vio_1v8(1); #ifdef CONFIG_TWL4030_CORE /* turn on analog power */ twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_2_8_V, TWL4030_VAUX2_DEDICATED); twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_P1, TWL4030_VAUX2_DEV_GRP); #else #error "no power companion board defined!" #endif } /* out of standby */ gpio_set_value(MT9P012_STANDBY_GPIO, 0); udelay(1000); if (mt9p012_previous_power == V4L2_POWER_OFF) { /* have to put sensor to reset to guarantee detection */ gpio_set_value(MT9P012_RESET_GPIO, 0); udelay(1500); /* nRESET is active LOW. set HIGH to release reset */ gpio_set_value(MT9P012_RESET_GPIO, 1); /* give sensor sometime to get out of the reset. * Datasheet says 2400 xclks. At 6 MHz, 400 usec is * enough */ udelay(300); } break; case V4L2_POWER_STANDBY: /* stand by */ gpio_set_value(MT9P012_STANDBY_GPIO, 1); break; } /* Save powerstate to know what was before calling POWER_ON. */ mt9p012_previous_power = power; return 0; }
static int prev2resz_ioc_run_engine(struct prev2resz_fhdl *fh) { struct isp_freq_devider *fdiv; int rval; rval = isppreview_s_pipeline(fh->isp_prev, &fh->prev); if (rval != 0) return rval; rval = isppreview_set_inaddr(fh->isp_prev, fh->src_buff_addr); if (rval != 0) return rval; rval = isppreview_config_inlineoffset(fh->isp_prev, fh->prev.in.image.bytesperline); if (rval != 0) return rval; rval = isppreview_set_outaddr(fh->isp_prev, fh->dst_buff_addr); if (rval != 0) return rval; rval = isppreview_config_features(fh->isp_prev, &fh->isp_prev->params); if (rval != 0) return rval; isppreview_set_size(fh->isp_prev, fh->prev.in.image.width, fh->prev.in.image.height); /* Set resizer input and output size */ rval = ispresizer_s_pipeline(fh->isp_resz, &fh->resz); if (rval != 0) return rval; rval = ispresizer_set_outaddr(fh->isp_resz, fh->dst_buff_addr); if (rval != 0) return rval; isp_configure_interface(fh->isp, &p2r_interface); /* * 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(fh->isp, OCP_INITIATOR_AGENT, 800000); /* Reduces memory bandwidth */ fdiv = isp_get_upscale_ratio(fh->pipe.in.image.width, fh->pipe.in.image.height, fh->pipe.out.image.width, fh->pipe.out.image.height); dev_dbg(p2r_device, "Set the REQ_EXP register = %d.\n", fdiv->prev_exp); isp_reg_and_or(fh->isp, OMAP3_ISP_IOMEM_SBL, ISPSBL_SDR_REQ_EXP, ~(ISPSBL_SDR_REQ_PRV_EXP_MASK | ISPSBL_SDR_REQ_RSZ_EXP_MASK), fdiv->prev_exp << ISPSBL_SDR_REQ_PRV_EXP_SHIFT); isp_start(fh->isp); init_completion(&p2r_ctx.resz_complete); rval = isp_set_callback(fh->isp, CBK_RESZ_DONE, prev2resz_resz_callback, (void *) NULL, (void *) NULL); if (rval) { dev_err(p2r_device, "%s: setting resizer callback failed\n", __func__); return rval; } ispresizer_enable(fh->isp_resz, 1); isppreview_enable(fh->isp_prev, 1); rval = wait_for_completion_interruptible_timeout( &p2r_ctx.resz_complete, msecs_to_jiffies(1000)); if (rval == 0) dev_crit(p2r_device, "Resizer interrupt timeout exit\n"); isp_unset_callback(fh->isp, CBK_RESZ_DONE); /* Reset Through-put requirement */ omap_pm_set_min_bus_tput(fh->isp, OCP_INITIATOR_AGENT, -1); /* This will flushes the queue */ if (&fh->src_vbq) videobuf_queue_cancel(&fh->src_vbq); if (&fh->dst_vbq) videobuf_queue_cancel(&fh->dst_vbq); return 0; }
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 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 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 mt9v113_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; int err = 0; struct mt9v113_sensor *sensor = dev->priv; switch (power) { case V4L2_POWER_ON: /* Power Up Sequence */ printk(KERN_DEBUG "mt9v113_sensor_power_set(ON)\n"); /* * 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); /* S[, 20120922, [email protected], PM from froyo. */ doing_wakeup = 1; /* E], 20120922, [email protected], PM from froyo. */ /* Hold a constraint to keep MPU in C1 */ //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2012.05.22] - CAM pm_qos_update_request(&pm_qos_handler, SET_MPU_CONSTRAINT); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2012.05.22] - CAM isp_configure_interface(vdev->cam->isp,&mt9v113_if_config); if (gpio_request(MT9V113_RESET_GPIO, "mt9v113_rst") != 0) printk("\n\n\n>>>>>>>>>>>>MT9V113_RESET_GPIO_gpio_request_error\n\n\n");//return -EIO; if (gpio_request(MT9V113_STANDBY_GPIO, "mt9v113_PWD") != 0) printk("\n\n\n>>>>>>>>>>>>MT9V113_STANDBY_GPIO_gpio_request_error\n\n\n");//return -EIO;return -EIO; //RESET & PWDN HI gpio_direction_output(MT9V113_RESET_GPIO, true); gpio_set_value(MT9V113_RESET_GPIO, 1); gpio_direction_output(MT9V113_STANDBY_GPIO, true); gpio_set_value(MT9V113_STANDBY_GPIO, 1); mdelay(5); //<1.POWER ON> 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 ); //udelay(20); udelay(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); 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); mdelay(10); //<2.VGA MCLK ON> //mt9v113_sensor_set_xclk(dev,24000000); //KJK 1211 //sensor->pdata->set_xclk(dev, xclk_current); //sensor->pdata->set_xclk((struct v4l2_int_device *)dev, 24000000); //mdelay(5); //<3.POWER DOWN LOW> //gpio_direction_output(MT9V113_STANDBY_GPIO, true); gpio_set_value(MT9V113_STANDBY_GPIO, 0); mdelay(5); //udelay(2); //<4.RESET> //gpio_set_value(MT9V113_RESET_GPIO, 0); /* set to output mode */ //gpio_direction_output(MT9V113_RESET_GPIO, true); //reset is active low //gpio_set_value(MT9V113_RESET_GPIO, 1); //mdelay(5); gpio_set_value(MT9V113_RESET_GPIO, 0); mdelay(10); gpio_set_value(MT9V113_RESET_GPIO, 1); mdelay(10); break; case V4L2_POWER_OFF: case V4L2_POWER_STANDBY: printk(KERN_DEBUG "mt9v113_sensor_power_set(STANDBY OR OFF) POWER %d\n",power); /* Power Down Sequence */ //<1.POWER DOWN LOW && RESET LOW> gpio_set_value(MT9V113_STANDBY_GPIO, 0); gpio_set_value(MT9V113_RESET_GPIO, 0); mdelay(5); 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,VMMC1_DEV_GRP ); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX3_DEV_GRP); /* twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE,VMMC1_DEV_GRP ); twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, VAUX_DEV_GRP_NONE, TWL4030_VAUX3_DEV_GRP); */ mdelay(10); gpio_free(MT9V113_STANDBY_GPIO); gpio_free(MT9V113_RESET_GPIO); /* S[, 20120922, [email protected], PM from froyo. */ doing_wakeup = 0; /* E], 20120922, [email protected], PM from froyo. */ /* Remove pm constraints */ //--[[ LGE_UBIQUIX_MODIFIED_START : [email protected] [2012.05.22] - CAM omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, -1); pm_qos_update_request(&pm_qos_handler, CLEAR_MPU_CONSTRAINT); //--]] LGE_UBIQUIX_MODIFIED_END : [email protected] [2012.05.22] - CAM break; /* case V4L2_POWER_STANDBY: printk(KERN_DEBUG "mt9v113_sensor_power_set(STANDBY)\n"); gpio_free(MT9V113_STANDBY_GPIO); gpio_free(MT9V113_RESET_GPIO); gpio_set_value(MT9V113_STANDBY_GPIO, 0); break; */ } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return err; }
static int mt9p012_sensor_power_set(struct device* dev, enum v4l2_power power) { static enum v4l2_power previous_power = V4L2_POWER_OFF; static struct regulator *regulator; switch (power) { case V4L2_POWER_OFF: /* Power Down Sequence */ gpio_free(GPIO_MT9P012_RESET); /* Turn off power */ if (regulator != NULL) { regulator_disable(regulator); regulator_put(regulator); regulator = NULL; } else { sholes_camera_lines_safe_mode(); pr_err("%s: Regulator for vcam is not "\ "initialized\n", __func__); return -EIO; } /* Release pm constraints */ omap_pm_set_min_bus_tput(dev, OCP_INITIATOR_AGENT, 0); sholes_camera_lines_safe_mode(); break; case V4L2_POWER_ON: if (previous_power == V4L2_POWER_OFF) { /* Power Up Sequence */ sholes_camera_lines_func_mode(); /* Set min throughput to: * 2592 x 1944 x 2bpp x 30fps x 3 L3 accesses */ omap_pm_set_min_bus_tput(dev, OCP_INITIATOR_AGENT, 885735); /* Configure pixel clock divider (here?) */ omap_writel(0x2, 0x48004f40); isp_configure_interface(&mt9p012_if_config); /* Request and configure gpio pins */ if (gpio_request(GPIO_MT9P012_RESET, "mt9p012 camera reset") != 0) return -EIO; /* set to output mode */ gpio_direction_output(GPIO_MT9P012_RESET, 0); /* nRESET is active LOW. set HIGH to release reset */ gpio_set_value(GPIO_MT9P012_RESET, 1); /* turn on digital power */ if (regulator != NULL) { pr_warning("%s: Already have "\ "regulator\n", __func__); } else { regulator = regulator_get(NULL, "vcam"); if (IS_ERR(regulator)) { pr_err("%s: Cannot get vcam "\ "regulator, err=%ld\n", __func__, PTR_ERR(regulator)); return PTR_ERR(regulator); } } if (regulator_enable(regulator) != 0) { pr_err("%s: Cannot enable vcam regulator\n", __func__); return -EIO; } } udelay(1000); if (previous_power == V4L2_POWER_OFF) { /* trigger reset */ gpio_direction_output(GPIO_MT9P012_RESET, 0); udelay(1500); /* nRESET is active LOW. set HIGH to release reset */ gpio_set_value(GPIO_MT9P012_RESET, 1); /* give sensor sometime to get out of the reset. * Datasheet says 2400 xclks. At 6 MHz, 400 usec is * enough */ udelay(300); } break; case V4L2_POWER_STANDBY: /* Stand By Sequence */ break; } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return 0; }
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; static struct pm_qos_request_list *qos_request_sec; /* 20110527 [email protected] camera l3 clock*/ int err = 0; switch (power) { case V4L2_POWER_ON: /* Power Up Sequence */ printk(KERN_DEBUG "yacd5b1s_sensor_power_set(ON)\n"); // [email protected] [TBD]Temporarily block the following code because PM APIs have been changed [START] #if 1 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_sec, 12); /* 20110527 [email protected] camera l3 clock*/ #endif // [email protected] [TBD]Temporarily block the following code because PM APIs have been changed [END] 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); // [email protected] [TBD]Temporarily block the following code because PM APIs have been changed [START] #if 1 omap_pm_set_min_bus_tput(vdev->cam->isp, OCP_INITIATOR_AGENT, 0); omap_pm_set_max_mpu_wakeup_lat(&qos_request_sec, -1); #endif // [email protected] [TBD]Temporarily block the following code because PM APIs have been changed [END] 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); break; } /* Save powerstate to know what was before calling POWER_ON. */ previous_power = power; return err; }
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 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; }