diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index 5476dbab74d5..22889be43398 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -166,6 +166,8 @@ PipelineHandler::~PipelineHandler()
  * If this function returns true, a new instance of the pipeline handler will
  * be created and its match() function called.
  *
+ * \context This function is called from the CameraManager thread.
+ *
  * \return true if media devices have been acquired and camera instances
  * created, or false otherwise
  */
@@ -182,6 +184,8 @@ PipelineHandler::~PipelineHandler()
  * device explicitly, it will be automatically released when the pipeline
  * handler is destroyed.
  *
+ * \context This function shall be called from the CameraManager thread.
+ *
  * \return A pointer to the matching MediaDevice, or nullptr if no match is found
  */
 MediaDevice *PipelineHandler::acquireMediaDevice(DeviceEnumerator *enumerator,
@@ -205,6 +209,8 @@ MediaDevice *PipelineHandler::acquireMediaDevice(DeviceEnumerator *enumerator,
  * This method shall not be called from pipeline handler implementation, as the
  * Camera class handles locking directly.
  *
+ * \context This function is \threadsafe.
+ *
  * \return True if the devices could be locked, false otherwise
  * \sa unlock()
  * \sa MediaDevice::lock()
@@ -227,6 +233,8 @@ bool PipelineHandler::lock()
  * This method shall not be called from pipeline handler implementation, as the
  * Camera class handles locking directly.
  *
+ * \context This function is \threadsafe.
+ *
  * \sa lock()
  */
 void PipelineHandler::unlock()
@@ -238,6 +246,7 @@ void PipelineHandler::unlock()
 /**
  * \brief Retrieve the list of controls for a camera
  * \param[in] camera The camera
+ * \context This function is \threadsafe.
  * \return A ControlInfoMap listing the controls support by \a camera
  */
 const ControlInfoMap &PipelineHandler::controls(Camera *camera)
@@ -261,6 +270,10 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)
  * The intended companion to this is \a configure() which can be used to change
  * the group of streams parameters.
  *
+ * \context This function may be called from any thread and shall be
+ * \threadsafe. It shall not modify the state of the \a camera in the pipeline
+ * handler.
+ *
  * \return A valid CameraConfiguration if the requested roles can be satisfied,
  * or a null pointer otherwise. The ownership of the returned configuration is
  * passed to the caller.
@@ -286,6 +299,8 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)
  * instance to each StreamConfiguration entry in the CameraConfiguration using
  * the StreamConfiguration::setStream() method.
  *
+ * \context This function is called from the CameraManager thread.
+ *
  * \return 0 on success or a negative error code otherwise
  */
 
@@ -316,6 +331,8 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)
  *
  * The only intended caller is Camera::exportFrameBuffers().
  *
+ * \context This function is called from the CameraManager thread.
+ *
  * \return The number of allocated buffers on success or a negative error code
  * otherwise
  */
@@ -344,6 +361,8 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)
  *
  * The only intended caller is Camera::start().
  *
+ * \context This function is called from the CameraManager thread.
+ *
  * \return 0 on success or a negative error code otherwise
  */
 
@@ -359,6 +378,8 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)
  * once per stream.
  *
  * The only intended callers are Camera::stop() and Camera::freeFrameBuffers().
+ *
+ * \context This function is called from the CameraManager thread.
  */
 
 /**
@@ -371,6 +392,8 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)
  * will in turn be called from the application to indicate that it has
  * configured the streams and is ready to capture.
  *
+ * \context This function is called from the CameraManager thread.
+ *
  * \return 0 on success or a negative error code otherwise
  */
 
@@ -381,6 +404,8 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)
  *
  * This method stops capturing and processing requests immediately. All pending
  * requests are cancelled and complete immediately in an error state.
+ *
+ * \context This function is called from the CameraManager thread.
  */
 
 /**
@@ -397,6 +422,8 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)
  * when the pipeline handler is stopped with stop(). Request completion shall be
  * signalled by the pipeline handler using the completeRequest() method.
  *
+ * \context This function is called from the CameraManager thread.
+ *
  * \return 0 on success or a negative error code otherwise
  */
 int PipelineHandler::queueRequest(Camera *camera, Request *request)
@@ -423,6 +450,8 @@ int PipelineHandler::queueRequest(Camera *camera, Request *request)
  * parameters will be applied to the frames captured in the buffers provided in
  * the request.
  *
+ * \context This function is called from the CameraManager thread.
+ *
  * \return 0 on success or a negative error code otherwise
  */
 
@@ -439,6 +468,8 @@ int PipelineHandler::queueRequest(Camera *camera, Request *request)
  * pipeline handlers a chance to perform any operation that may still be
  * needed. They shall complete requests explicitly with completeRequest().
  *
+ * \context This function shall be called from the CameraManager thread.
+ *
  * \return True if all buffers contained in the request have completed, false
  * otherwise
  */
@@ -461,6 +492,8 @@ bool PipelineHandler::completeBuffer(Camera *camera, Request *request,
  * This method ensures that requests will be returned to the application in
  * submission order, the pipeline handler may call it on any complete request
  * without any ordering constraint.
+ *
+ * \context This function shall be called from the CameraManager thread.
  */
 void PipelineHandler::completeRequest(Camera *camera, Request *request)
 {
@@ -494,6 +527,8 @@ void PipelineHandler::completeRequest(Camera *camera, Request *request)
  * is to be associated with. This is for the V4L2 compatibility layer to map
  * device nodes to Camera instances based on the device number
  * registered by this method in \a devnum.
+ *
+ * \context This function shall be called from the CameraManager thread.
  */
 void PipelineHandler::registerCamera(std::shared_ptr<Camera> camera,
 				     std::unique_ptr<CameraData> data,
@@ -587,6 +622,7 @@ CameraData *PipelineHandler::cameraData(const Camera *camera)
 /**
  * \fn PipelineHandler::name()
  * \brief Retrieve the pipeline handler name
+ * \context This function shall be \threadsafe.
  * \return The pipeline handler name
  */
 
