camera: fix sensor driver haven't unlock task when sensor init error, and turn on...
authorddl <ddl@rockchip.com>
Fri, 28 Jan 2011 23:50:57 +0000 (07:50 +0800)
committerddl <ddl@rockchip.com>
Fri, 28 Jan 2011 23:50:57 +0000 (07:50 +0800)
drivers/media/video/ov2655.c
drivers/media/video/ov2659.c
drivers/media/video/ov5640.c
drivers/media/video/ov5642.c
drivers/media/video/rk29_camera_oneframe.c

index bda7bd03b735be904d1b0e0fe7b3ee2d2ea4e4f4..b422b8808211102998daeadf6983889249026551 100755 (executable)
@@ -1456,10 +1456,12 @@ static int sensor_task_lock(struct i2c_client *client, int lock)
 
                atomic_add(1, &sensor->tasklock_cnt);
        } else {
-               atomic_sub(1, &sensor->tasklock_cnt);
+               if (atomic_read(&sensor->tasklock_cnt) > 0) {
+                       atomic_sub(1, &sensor->tasklock_cnt);
 
-               if (atomic_read(&sensor->tasklock_cnt) == 0)
-                       preempt_enable();
+                       if (atomic_read(&sensor->tasklock_cnt) == 0)
+                               preempt_enable();
+               }
        }
 #endif
        return 0;
@@ -1757,6 +1759,7 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
 
     return 0;
 sensor_INIT_ERR:
+       sensor_task_lock(client,0);
        sensor_deactivate(client);
     return ret;
 }
index ba34ebd8a6614079b00b1aea784fd0549f57c10a..a694977937505715d86c59caa3a1e2d3ecfd6fa8 100755 (executable)
@@ -26,10 +26,10 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 
 #define dprintk(level, fmt, arg...) do {                       \
        if (debug >= level)                                     \
-       printk(KERN_DEBUG fmt , ## arg); } while (0)
+       printk(KERN_WARNING fmt , ## arg); } while (0)
 
 #define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)
-#define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)
+#define SENSOR_DG(format, ...) dprintk(0, format, ## __VA_ARGS__)
 
 
 #define _CONS(a,b) a##b
@@ -1261,10 +1261,12 @@ static int sensor_task_lock(struct i2c_client *client, int lock)
 
                atomic_add(1, &sensor->tasklock_cnt);
        } else {
-               atomic_sub(1, &sensor->tasklock_cnt);
+               if (atomic_read(&sensor->tasklock_cnt) > 0) {
+                       atomic_sub(1, &sensor->tasklock_cnt);
 
-               if (atomic_read(&sensor->tasklock_cnt) == 0)
-                       preempt_enable();
+                       if (atomic_read(&sensor->tasklock_cnt) == 0)
+                               preempt_enable();
+               }
        }
 #endif
        return 0;
@@ -1469,7 +1471,6 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
         ret = -ENODEV;
                goto sensor_INIT_ERR;
     }
-
     mdelay(5);  //delay 5 microseconds
 
        /* check if it is an sensor sensor */
@@ -1563,6 +1564,7 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
 
     return 0;
 sensor_INIT_ERR:
+       sensor_task_lock(client,0);
        sensor_deactivate(client);
     return ret;
 }
index 0e83cf2540f50ec4229729940d3b44a2ac03fbf6..8f50b98b9f2b78ce6246f02a228692bf8e0230db 100755 (executable)
@@ -27,10 +27,10 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 
 #define dprintk(level, fmt, arg...) do {                       \
        if (debug >= level)                                     \
-       printk(KERN_DEBUG fmt , ## arg); } while (0)
+       printk(KERN_WARNING fmt , ## arg); } while (0)
 
 #define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)
-#define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)
+#define SENSOR_DG(format, ...) dprintk(0, format, ## __VA_ARGS__)
 
 #define _CONS(a,b) a##b
 #define CONS(a,b) _CONS(a,b)
@@ -1369,10 +1369,12 @@ static int sensor_task_lock(struct i2c_client *client, int lock)
 
                atomic_add(1, &sensor->tasklock_cnt);
        } else {
-               atomic_sub(1, &sensor->tasklock_cnt);
+               if (atomic_read(&sensor->tasklock_cnt) > 0) {
+                       atomic_sub(1, &sensor->tasklock_cnt);
 
-               if (atomic_read(&sensor->tasklock_cnt) == 0)
-                       preempt_enable();
+                       if (atomic_read(&sensor->tasklock_cnt) == 0)
+                               preempt_enable();
+               }
        }
 #endif
        return 0;
@@ -2144,6 +2146,7 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
 
     return 0;
 sensor_INIT_ERR:
+       sensor_task_lock(client,0);
        sensor_deactivate(client);
     return ret;
 }
@@ -3283,7 +3286,7 @@ static int sensor_s_stream(struct v4l2_subdev *sd, int enable)
                                        mutex_unlock(&sensor->wq_lock);
                                        sensor->sensor_wk.client = client;
                                        INIT_WORK(&(sensor->sensor_wk.dwork.work), sensor_af_workqueue);
-                                       queue_delayed_work(sensor->sensor_wq,&(sensor->sensor_wk.dwork.work), 0);
+                                       queue_delayed_work(sensor->sensor_wq,&(sensor->sensor_wk.dwork), 0);
                                }
                                sensor->info_priv.affm_reinit = 0;
                        }
index cbef41379c6b727e0089416a78003484e0e311a8..ba3c14443534b4d593da0dea3a860276f3d951a6 100755 (executable)
@@ -27,10 +27,10 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 
 #define dprintk(level, fmt, arg...) do {                       \
        if (debug >= level)                                     \
-       printk(KERN_DEBUG fmt , ## arg); } while (0)
+       printk(KERN_WARNING fmt , ## arg); } while (0)
 
 #define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)
-#define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)
+#define SENSOR_DG(format, ...) dprintk(0, format, ## __VA_ARGS__)
 
 #define _CONS(a,b) a##b
 #define CONS(a,b) _CONS(a,b)
@@ -3348,10 +3348,12 @@ static int sensor_task_lock(struct i2c_client *client, int lock)
 
                atomic_add(1, &sensor->tasklock_cnt);
        } else {
-               atomic_sub(1, &sensor->tasklock_cnt);
+               if (atomic_read(&sensor->tasklock_cnt) > 0) {
+                       atomic_sub(1, &sensor->tasklock_cnt);
 
-               if (atomic_read(&sensor->tasklock_cnt) == 0)
-                       preempt_enable();
+                       if (atomic_read(&sensor->tasklock_cnt) == 0)
+                               preempt_enable();
+               }
        }
 #endif
        return 0;
@@ -3438,8 +3440,12 @@ static int sensor_write_array(struct i2c_client *client, struct reginfo *regarra
 {
     int err = 0, cnt;
     int i = 0;
+#if CONFIG_SENSOR_Focus
        struct sensor *sensor = to_sensor(client);
+#endif
+#if CONFIG_SENSOR_I2C_RDWRCHK
        char valchk;
+#endif
 
        cnt = 0;
        sensor_task_lock(client, 1);
@@ -3487,6 +3493,7 @@ sensor_write_array_end:
        sensor_task_lock(client,0);
     return err;
 }
+#if CONFIG_SENSOR_I2C_RDWRCHK
 static int sensor_readchk_array(struct i2c_client *client, struct reginfo *regarray)
 {
     int cnt;
@@ -3505,7 +3512,7 @@ static int sensor_readchk_array(struct i2c_client *client, struct reginfo *regar
     }
     return 0;
 }
-
+#endif
 #if CONFIG_SENSOR_Focus
 struct af_cmdinfo
 {
@@ -3799,7 +3806,6 @@ static void sensor_af_workqueue(struct work_struct *work)
 {
        struct sensor_work *sensor_work = container_of(work, struct sensor_work, dwork.work);
        struct i2c_client *client = sensor_work->client;
-       struct sensor *sensor = to_sensor(client);
 
        if (sensor_af_wq_function(client) < 0) {
                SENSOR_TR("%s af workqueue return false\n",SENSOR_NAME_STRING());
@@ -4118,6 +4124,7 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
 
     return 0;
 sensor_INIT_ERR:
+       sensor_task_lock(client,0);
        sensor_deactivate(client);
     return ret;
 }
@@ -5255,7 +5262,7 @@ static int sensor_s_stream(struct v4l2_subdev *sd, int enable)
                                        mutex_unlock(&sensor->wq_lock);
                                        sensor->sensor_wk.client = client;
                                        INIT_WORK(&(sensor->sensor_wk.dwork.work), sensor_af_workqueue);
-                                       queue_delayed_work(sensor->sensor_wq,&(sensor->sensor_wk.dwork.work), 0);
+                                       queue_delayed_work(sensor->sensor_wq,&(sensor->sensor_wk.dwork), 0);
                                }
                                sensor->info_priv.affm_reinit = 0;
                        }
index 5ebf45c200ecd7c336ee3f98d5039641b8ab5c26..f46cd9f3b855e0782b74f94debfe7cd0cbe2bc93 100755 (executable)
@@ -44,10 +44,10 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 
 #define dprintk(level, fmt, arg...) do {                       \
        if (debug >= level)                                     \
-       printk(KERN_DEBUG "rk29xx_camera: " fmt , ## arg); } while (0)
+       printk(KERN_WARNING"rk29xx_camera: " fmt , ## arg); } while (0)
 
 #define RK29CAMERA_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)
-#define RK29CAMERA_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)
+#define RK29CAMERA_DG(format, ...) dprintk(0, format, ## __VA_ARGS__)
 
 // VIP Reg Offset
 #define RK29_VIP_AHBR_CTRL                0x00
@@ -1278,8 +1278,6 @@ static void rk29_camera_reinit_work(struct work_struct *work)
 {
        struct device *control;
     struct v4l2_subdev *sd;
-       struct i2c_client *client;
-    struct soc_camera_device *icd;
        struct v4l2_format cam_f;
        const struct soc_camera_format_xlate *xlate;
        int ret;