/**
 * @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;
}
예제 #2
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;
}
예제 #4
0
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;
}
예제 #5
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;
}
예제 #7
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;
}
예제 #8
0
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;
}
예제 #9
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;
}
예제 #10
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;
}
예제 #11
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;
}
예제 #15
0
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;
}
예제 #17
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;
}
예제 #18
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 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;
}