[media] v4l2-ctrls.c: Implement unlocked variant of v4l2_ctrl_handler_setup()
authorSakari Ailus <sakari.ailus@linux.intel.com>
Fri, 26 May 2017 08:21:37 +0000 (05:21 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Wed, 7 Jun 2017 11:38:12 +0000 (08:38 -0300)
Sometimes the caller is already holding the control handler mutex and
using it to serialise something. Provide an unlocked variant of the same
function to be used in those cases.

Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/v4l2-core/v4l2-ctrls.c
include/media/v4l2-ctrls.h

index ec42872d11cfd03b450eb33f14727ce66d69fc84..dec55d53d24aa81b306cd26e15957d2f409e73c7 100644 (file)
@@ -2444,14 +2444,16 @@ int v4l2_ctrl_subdev_log_status(struct v4l2_subdev *sd)
 EXPORT_SYMBOL(v4l2_ctrl_subdev_log_status);
 
 /* Call s_ctrl for all controls owned by the handler */
-int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
+int __v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
 {
        struct v4l2_ctrl *ctrl;
        int ret = 0;
 
        if (hdl == NULL)
                return 0;
-       mutex_lock(hdl->lock);
+
+       lockdep_assert_held(hdl->lock);
+
        list_for_each_entry(ctrl, &hdl->ctrls, node)
                ctrl->done = false;
 
@@ -2476,7 +2478,22 @@ int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
                if (ret)
                        break;
        }
+
+       return ret;
+}
+EXPORT_SYMBOL_GPL(__v4l2_ctrl_handler_setup);
+
+int v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl)
+{
+       int ret;
+
+       if (hdl == NULL)
+               return 0;
+
+       mutex_lock(hdl->lock);
+       ret = __v4l2_ctrl_handler_setup(hdl);
        mutex_unlock(hdl->lock);
+
        return ret;
 }
 EXPORT_SYMBOL(v4l2_ctrl_handler_setup);
index bee1404391dd5565abe2d324f4a196f0602fc032..2d2aed56922fb43a7988531b37a1bdfe16310b6b 100644 (file)
@@ -457,6 +457,19 @@ static inline void v4l2_ctrl_unlock(struct v4l2_ctrl *ctrl)
        mutex_unlock(ctrl->handler->lock);
 }
 
+/**
+ * __v4l2_ctrl_handler_setup() - Call the s_ctrl op for all controls belonging
+ * to the handler to initialize the hardware to the current control values. The
+ * caller is responsible for acquiring the control handler mutex on behalf of
+ * __v4l2_ctrl_handler_setup().
+ * @hdl:       The control handler.
+ *
+ * Button controls will be skipped, as are read-only controls.
+ *
+ * If @hdl == NULL, then this just returns 0.
+ */
+int __v4l2_ctrl_handler_setup(struct v4l2_ctrl_handler *hdl);
+
 /**
  * v4l2_ctrl_handler_setup() - Call the s_ctrl op for all controls belonging
  * to the handler to initialize the hardware to the current control values.