[media] m5mols: Don't ignore v4l2_ctrl_handler_setup() return value
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Mon, 12 Dec 2011 18:45:56 +0000 (15:45 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 30 Dec 2011 16:38:06 +0000 (14:38 -0200)
v4l2_ctrl_handler_setup() may fail so check its return value when
restoring controls after device is powered on. While at it simplify
the m5mols_restore_function() a bit.

Acked-by: HeungJun Kim <riverful.kim@samsung.com>
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/m5mols/m5mols.h
drivers/media/video/m5mols/m5mols_capture.c
drivers/media/video/m5mols/m5mols_core.c

index 0265ea6..4b021e1 100644 (file)
@@ -188,15 +188,16 @@ struct m5mols_info {
        struct media_pad pad;
        struct v4l2_mbus_framefmt ffmt[M5MOLS_RESTYPE_MAX];
        int res_type;
+
        wait_queue_head_t irq_waitq;
        atomic_t irq_done;
 
        struct v4l2_ctrl_handler handle;
+
        /* Autoexposure/exposure control cluster */
-       struct {
-               struct v4l2_ctrl *autoexposure;
-               struct v4l2_ctrl *exposure;
-       };
+       struct v4l2_ctrl *autoexposure;
+       struct v4l2_ctrl *exposure;
+
        struct v4l2_ctrl *autowb;
        struct v4l2_ctrl *colorfx;
        struct v4l2_ctrl *saturation;
@@ -213,10 +214,10 @@ struct m5mols_info {
        bool lock_awb;
        u8 resolution;
        u8 mode;
+
        int (*set_power)(struct device *dev, int on);
 };
 
-#define is_ctrl_synced(__info) (__info->ctrl_sync)
 #define is_available_af(__info)        (__info->ver.af)
 #define is_code(__code, __type) (__code == m5mols_default_ffmt[__type].code)
 #define is_manufacturer(__info, __manufacturer)        \
@@ -285,7 +286,7 @@ int m5mols_mode(struct m5mols_info *info, u8 mode);
 
 int m5mols_enable_interrupt(struct v4l2_subdev *sd, u8 reg);
 int m5mols_wait_interrupt(struct v4l2_subdev *sd, u8 condition, u32 timeout);
-int m5mols_sync_controls(struct m5mols_info *info);
+int m5mols_restore_controls(struct m5mols_info *info);
 int m5mols_start_capture(struct m5mols_info *info);
 int m5mols_do_scenemode(struct m5mols_info *info, u8 mode);
 int m5mols_lock_3a(struct m5mols_info *info, bool lock);
index 6814a9d..ba25e8e 100644 (file)
@@ -116,7 +116,7 @@ int m5mols_start_capture(struct m5mols_info *info)
         */
        ret = m5mols_mode(info, REG_MONITOR);
        if (!ret)
-               ret = m5mols_sync_controls(info);
+               ret = m5mols_restore_controls(info);
        if (!ret)
                ret = m5mols_write(sd, CAPP_YUVOUT_MAIN, REG_JPEG);
        if (!ret)
index 049b8ee..9966d2e 100644 (file)
@@ -611,26 +611,25 @@ static struct v4l2_subdev_pad_ops m5mols_pad_ops = {
 };
 
 /**
- * m5mols_sync_controls - Apply default scene mode and the current controls
+ * m5mols_restore_controls - Apply current control values to the registers
  *
- * This is used only streaming for syncing between v4l2_ctrl framework and
- * m5mols's controls. First, do the scenemode to the sensor, then call
- * v4l2_ctrl_handler_setup. It can be same between some commands and
- * the scenemode's in the default v4l2_ctrls. But, such commands of control
- * should be prior to the scenemode's one.
+ * m5mols_do_scenemode() handles all parameters for which there is yet no
+ * individual control. It should be replaced at some point by setting each
+ * control individually, in required register set up order.
  */
-int m5mols_sync_controls(struct m5mols_info *info)
+int m5mols_restore_controls(struct m5mols_info *info)
 {
-       int ret = -EINVAL;
+       int ret;
 
-       if (!is_ctrl_synced(info)) {
-               ret = m5mols_do_scenemode(info, REG_SCENE_NORMAL);
-               if (ret)
-                       return ret;
+       if (info->ctrl_sync)
+               return 0;
 
-               v4l2_ctrl_handler_setup(&info->handle);
-               info->ctrl_sync = 1;
-       }
+       ret = m5mols_do_scenemode(info, REG_SCENE_NORMAL);
+       if (ret)
+               return ret;
+
+       ret = v4l2_ctrl_handler_setup(&info->handle);
+       info->ctrl_sync = !ret;
 
        return ret;
 }
@@ -654,7 +653,7 @@ static int m5mols_start_monitor(struct m5mols_info *info)
        if (!ret)
                ret = m5mols_mode(info, REG_MONITOR);
        if (!ret)
-               ret = m5mols_sync_controls(info);
+               ret = m5mols_restore_controls(info);
 
        return ret;
 }