Revert "mt9e013: async power up sequence to decrease Lanuch2preview time"
authorDavid Cohen <david.a.cohen@intel.com>
Fri, 4 May 2012 18:30:56 +0000 (21:30 +0300)
committerbuildbot <buildbot@intel.com>
Wed, 9 May 2012 20:22:24 +0000 (13:22 -0700)
BZ: 34894

This reverts commit 1428b87c861f5e007fa1becd137f5a72d83badd0.

Change-Id: I7bffb6e8951bee67ff85e4aae4b22e0625e73c34
Signed-off-by: David Cohen <david.a.cohen@intel.com>
Reviewed-on: http://android.intel.com:8080/47522
Reviewed-by: Kruger, Jozef <jozef.kruger@intel.com>
Reviewed-by: Koskinen, Ilkka <ilkka.koskinen@intel.com>
Reviewed-by: Tao, Jing <jing.tao@intel.com>
Reviewed-by: Koski, Anttu <anttu.koski@intel.com>
Tested-by: Koski, Anttu <anttu.koski@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/media/video/mt9e013.c
drivers/media/video/mt9e013.h

index 8956e48..06374f2 100644 (file)
@@ -680,39 +680,6 @@ static int mt9e013_write_reg_array(struct i2c_client *client,
        return __mt9e013_flush_reg_array(client, &ctrl);
 }
 
-static int wait_power_on_lock(struct v4l2_subdev *sd)
-{
-       struct mt9e013_device *dev = to_mt9e013_sensor(sd);
-       struct i2c_client *client = v4l2_get_subdevdata(sd);
-       int power_state;
-
-       power_state = atomic_read(&dev->power_state);
-
-       /* not powered on before, this is not allowed */
-       if (power_state == POWER_OFF)
-               return -EINVAL;
-
-       if (power_state == POWER_ON_INPROGRESS) {
-               if (!wait_for_completion_timeout(&dev->power_complete,
-                                                2 * HZ)) {
-                       /*
-                        * this is really abnormal case that power on
-                        * should not take such long time.
-                        */
-                       dev_err(&client->dev, "waiting power up timeout!\n");
-                       return -EAGAIN;
-               }
-               power_state = atomic_read(&dev->power_state);
-       }
-
-       if (power_state == POWER_ON_ERROR) {
-               dev_err(&client->dev, "power up err!\n");
-               return -EIO;
-       }
-
-       return 0;
-}
-
 static int mt9e013_t_focus_abs(struct v4l2_subdev *sd, s32 value)
 {
        struct i2c_client *client = v4l2_get_subdevdata(sd);
@@ -1083,14 +1050,8 @@ out:
 
 static long mt9e013_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
 {
-       int ret;
-
        switch (cmd) {
        case ATOMISP_IOC_S_EXPOSURE:
-               ret = wait_power_on_lock(sd);
-               if (ret)
-                       return ret;
-
                return mt9e013_s_exposure(sd, (struct atomisp_exposure *)arg);
        case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA:
                return mt9e013_g_priv_int_data(sd, arg);
@@ -1233,51 +1194,21 @@ static int power_down(struct v4l2_subdev *sd)
        return ret;
 }
 
-static void mt9e013_powerup_work(struct work_struct *work)
-{
-       struct mt9e013_device *dev = container_of(work,
-                                                 struct mt9e013_device, work);
-
-       int ret;
-
-       ret = power_up(&dev->sd);
-       if (!ret) {
-               /* init motor initial position */
-               ret =  __mt9e013_init(&dev->sd, 0);
-       }
-
-       if (ret)
-               atomic_set(&dev->power_state, POWER_ON_ERROR);
-       else
-               atomic_set(&dev->power_state, POWER_ON);
-
-       complete(&dev->power_complete);
-}
-
 static int mt9e013_s_power(struct v4l2_subdev *sd, int on)
 {
        struct mt9e013_device *dev = to_mt9e013_sensor(sd);
-       int ret = 0;
-       int power_state;
-
-       power_state = atomic_read(&dev->power_state);
+       int ret;
 
        if (on == 0) {
-               if (power_state == POWER_OFF)
-                       return 0;
-               else
-                       ret = wait_power_on_lock(sd);
-
-               if (ret == -EAGAIN)
-                       cancel_work_sync(&dev->work);
-
                mt9e013_uninit(sd);
                ret = power_down(sd);
-               atomic_set(&dev->power_state, POWER_OFF);
+               dev->power = 0;
        } else {
-               if (power_state == POWER_OFF) {
-                       atomic_set(&dev->power_state, POWER_ON_INPROGRESS);
-                       queue_work(dev->work_queue, &dev->work);
+               ret = power_up(sd);
+               if (!ret) {
+                       dev->power = 1;
+                       /* init motor initial position */
+                       return __mt9e013_init(sd, 0);
                }
        }
 
@@ -1718,10 +1649,6 @@ static int mt9e013_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
        if ((octrl == NULL) || (octrl->tweak == NULL))
                return -EINVAL;
 
-       ret = wait_power_on_lock(sd);
-       if (ret)
-               return ret;
-
        mutex_lock(&dev->input_lock);
        ret = octrl->tweak(sd, ctrl->value);
        mutex_unlock(&dev->input_lock);
@@ -1856,10 +1783,6 @@ static int mt9e013_s_mbus_fmt(struct v4l2_subdev *sd,
                return ret;
        }
 
-       ret = wait_power_on_lock(sd);
-       if (ret)
-               return ret;
-
        mutex_lock(&dev->input_lock);
        dev->fmt_idx = get_resolution_index(fmt->width, fmt->height);
 
@@ -1951,10 +1874,6 @@ static int mt9e013_s_stream(struct v4l2_subdev *sd, int enable)
        struct i2c_client *client = v4l2_get_subdevdata(sd);
        struct mt9e013_device *dev = to_mt9e013_sensor(sd);
 
-       ret = wait_power_on_lock(sd);
-       if (ret)
-               return ret;
-
        mutex_lock(&dev->input_lock);
        if (enable) {
                if (!dev->keeps_focus_pos) {
@@ -2067,15 +1986,6 @@ static int mt9e013_s_config(struct v4l2_subdev *sd,
 
        dev->platform_data = pdata;
 
-       atomic_set(&dev->power_state, POWER_OFF);
-       dev->work_queue = create_singlethread_workqueue("mt9e013_work");
-       if (dev->work_queue == NULL) {
-               v4l2_err(client, "Failed to initialize work queue\n");
-               return -EINVAL;
-       }
-       INIT_WORK(&dev->work, mt9e013_powerup_work);
-       init_completion(&dev->power_complete);
-
        mutex_lock(&dev->input_lock);
 
        ret = mt9e013_s_power(sd, 1);
@@ -2085,10 +1995,6 @@ static int mt9e013_s_config(struct v4l2_subdev *sd,
                return ret;
        }
 
-       ret = wait_power_on_lock(sd);
-       if (ret)
-               goto fail_csi_cfg;
-
        ret = dev->platform_data->csi_cfg(sd, 1);
        if (ret)
                goto fail_csi_cfg;
index 0955d95..9b71384 100644 (file)
@@ -182,12 +182,6 @@ enum mt9e013_tok_type {
        MT9E013_TOK_DELAY  = 0xfe00     /* delay token for reg list */
 };
 
-enum mt9e013_power_state {
-       POWER_OFF,
-       POWER_ON_INPROGRESS,
-       POWER_ON,
-       POWER_ON_ERROR
-};
 /*
  * If register address or register width is not 32 bit width,
  * user needs to convert it manually
@@ -292,6 +286,7 @@ struct mt9e013_device {
        int fmt_idx;
        int status;
        int streaming;
+       int power;
        u8 res;
        u8 type;
        u16 sensor_id;
@@ -311,11 +306,6 @@ struct mt9e013_device {
        void *fuseid;
        /* Older VCMs could not maintain the focus position in standby mode. */
        bool keeps_focus_pos;
-
-       struct workqueue_struct *work_queue;
-       struct work_struct work;
-       atomic_t power_state;
-       struct completion power_complete;
 };
 
 #define MT9E013_MAX_WRITE_BUF_SIZE     32