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;
 
                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);
 
        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.