162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Media device request objects
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2018 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
662306a36Sopenharmony_ci * Copyright (C) 2018 Intel Corporation
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Author: Hans Verkuil <hans.verkuil@cisco.com>
962306a36Sopenharmony_ci * Author: Sakari Ailus <sakari.ailus@linux.intel.com>
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef MEDIA_REQUEST_H
1362306a36Sopenharmony_ci#define MEDIA_REQUEST_H
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/list.h>
1662306a36Sopenharmony_ci#include <linux/slab.h>
1762306a36Sopenharmony_ci#include <linux/spinlock.h>
1862306a36Sopenharmony_ci#include <linux/refcount.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include <media/media-device.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/**
2362306a36Sopenharmony_ci * enum media_request_state - media request state
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * @MEDIA_REQUEST_STATE_IDLE:		Idle
2662306a36Sopenharmony_ci * @MEDIA_REQUEST_STATE_VALIDATING:	Validating the request, no state changes
2762306a36Sopenharmony_ci *					allowed
2862306a36Sopenharmony_ci * @MEDIA_REQUEST_STATE_QUEUED:		Queued
2962306a36Sopenharmony_ci * @MEDIA_REQUEST_STATE_COMPLETE:	Completed, the request is done
3062306a36Sopenharmony_ci * @MEDIA_REQUEST_STATE_CLEANING:	Cleaning, the request is being re-inited
3162306a36Sopenharmony_ci * @MEDIA_REQUEST_STATE_UPDATING:	The request is being updated, i.e.
3262306a36Sopenharmony_ci *					request objects are being added,
3362306a36Sopenharmony_ci *					modified or removed
3462306a36Sopenharmony_ci * @NR_OF_MEDIA_REQUEST_STATE:		The number of media request states, used
3562306a36Sopenharmony_ci *					internally for sanity check purposes
3662306a36Sopenharmony_ci */
3762306a36Sopenharmony_cienum media_request_state {
3862306a36Sopenharmony_ci	MEDIA_REQUEST_STATE_IDLE,
3962306a36Sopenharmony_ci	MEDIA_REQUEST_STATE_VALIDATING,
4062306a36Sopenharmony_ci	MEDIA_REQUEST_STATE_QUEUED,
4162306a36Sopenharmony_ci	MEDIA_REQUEST_STATE_COMPLETE,
4262306a36Sopenharmony_ci	MEDIA_REQUEST_STATE_CLEANING,
4362306a36Sopenharmony_ci	MEDIA_REQUEST_STATE_UPDATING,
4462306a36Sopenharmony_ci	NR_OF_MEDIA_REQUEST_STATE,
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct media_request_object;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/**
5062306a36Sopenharmony_ci * struct media_request - Media device request
5162306a36Sopenharmony_ci * @mdev: Media device this request belongs to
5262306a36Sopenharmony_ci * @kref: Reference count
5362306a36Sopenharmony_ci * @debug_str: Prefix for debug messages (process name:fd)
5462306a36Sopenharmony_ci * @state: The state of the request
5562306a36Sopenharmony_ci * @updating_count: count the number of request updates that are in progress
5662306a36Sopenharmony_ci * @access_count: count the number of request accesses that are in progress
5762306a36Sopenharmony_ci * @objects: List of @struct media_request_object request objects
5862306a36Sopenharmony_ci * @num_incomplete_objects: The number of incomplete objects in the request
5962306a36Sopenharmony_ci * @poll_wait: Wait queue for poll
6062306a36Sopenharmony_ci * @lock: Serializes access to this struct
6162306a36Sopenharmony_ci */
6262306a36Sopenharmony_cistruct media_request {
6362306a36Sopenharmony_ci	struct media_device *mdev;
6462306a36Sopenharmony_ci	struct kref kref;
6562306a36Sopenharmony_ci	char debug_str[TASK_COMM_LEN + 11];
6662306a36Sopenharmony_ci	enum media_request_state state;
6762306a36Sopenharmony_ci	unsigned int updating_count;
6862306a36Sopenharmony_ci	unsigned int access_count;
6962306a36Sopenharmony_ci	struct list_head objects;
7062306a36Sopenharmony_ci	unsigned int num_incomplete_objects;
7162306a36Sopenharmony_ci	wait_queue_head_t poll_wait;
7262306a36Sopenharmony_ci	spinlock_t lock;
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#ifdef CONFIG_MEDIA_CONTROLLER
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci/**
7862306a36Sopenharmony_ci * media_request_lock_for_access - Lock the request to access its objects
7962306a36Sopenharmony_ci *
8062306a36Sopenharmony_ci * @req: The media request
8162306a36Sopenharmony_ci *
8262306a36Sopenharmony_ci * Use before accessing a completed request. A reference to the request must
8362306a36Sopenharmony_ci * be held during the access. This usually takes place automatically through
8462306a36Sopenharmony_ci * a file handle. Use @media_request_unlock_for_access when done.
8562306a36Sopenharmony_ci */
8662306a36Sopenharmony_cistatic inline int __must_check
8762306a36Sopenharmony_cimedia_request_lock_for_access(struct media_request *req)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	unsigned long flags;
9062306a36Sopenharmony_ci	int ret = -EBUSY;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	spin_lock_irqsave(&req->lock, flags);
9362306a36Sopenharmony_ci	if (req->state == MEDIA_REQUEST_STATE_COMPLETE) {
9462306a36Sopenharmony_ci		req->access_count++;
9562306a36Sopenharmony_ci		ret = 0;
9662306a36Sopenharmony_ci	}
9762306a36Sopenharmony_ci	spin_unlock_irqrestore(&req->lock, flags);
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	return ret;
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci/**
10362306a36Sopenharmony_ci * media_request_unlock_for_access - Unlock a request previously locked for
10462306a36Sopenharmony_ci *				     access
10562306a36Sopenharmony_ci *
10662306a36Sopenharmony_ci * @req: The media request
10762306a36Sopenharmony_ci *
10862306a36Sopenharmony_ci * Unlock a request that has previously been locked using
10962306a36Sopenharmony_ci * @media_request_lock_for_access.
11062306a36Sopenharmony_ci */
11162306a36Sopenharmony_cistatic inline void media_request_unlock_for_access(struct media_request *req)
11262306a36Sopenharmony_ci{
11362306a36Sopenharmony_ci	unsigned long flags;
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	spin_lock_irqsave(&req->lock, flags);
11662306a36Sopenharmony_ci	if (!WARN_ON(!req->access_count))
11762306a36Sopenharmony_ci		req->access_count--;
11862306a36Sopenharmony_ci	spin_unlock_irqrestore(&req->lock, flags);
11962306a36Sopenharmony_ci}
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci/**
12262306a36Sopenharmony_ci * media_request_lock_for_update - Lock the request for updating its objects
12362306a36Sopenharmony_ci *
12462306a36Sopenharmony_ci * @req: The media request
12562306a36Sopenharmony_ci *
12662306a36Sopenharmony_ci * Use before updating a request, i.e. adding, modifying or removing a request
12762306a36Sopenharmony_ci * object in it. A reference to the request must be held during the update. This
12862306a36Sopenharmony_ci * usually takes place automatically through a file handle. Use
12962306a36Sopenharmony_ci * @media_request_unlock_for_update when done.
13062306a36Sopenharmony_ci */
13162306a36Sopenharmony_cistatic inline int __must_check
13262306a36Sopenharmony_cimedia_request_lock_for_update(struct media_request *req)
13362306a36Sopenharmony_ci{
13462306a36Sopenharmony_ci	unsigned long flags;
13562306a36Sopenharmony_ci	int ret = 0;
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	spin_lock_irqsave(&req->lock, flags);
13862306a36Sopenharmony_ci	if (req->state == MEDIA_REQUEST_STATE_IDLE ||
13962306a36Sopenharmony_ci	    req->state == MEDIA_REQUEST_STATE_UPDATING) {
14062306a36Sopenharmony_ci		req->state = MEDIA_REQUEST_STATE_UPDATING;
14162306a36Sopenharmony_ci		req->updating_count++;
14262306a36Sopenharmony_ci	} else {
14362306a36Sopenharmony_ci		ret = -EBUSY;
14462306a36Sopenharmony_ci	}
14562306a36Sopenharmony_ci	spin_unlock_irqrestore(&req->lock, flags);
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	return ret;
14862306a36Sopenharmony_ci}
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci/**
15162306a36Sopenharmony_ci * media_request_unlock_for_update - Unlock a request previously locked for
15262306a36Sopenharmony_ci *				     update
15362306a36Sopenharmony_ci *
15462306a36Sopenharmony_ci * @req: The media request
15562306a36Sopenharmony_ci *
15662306a36Sopenharmony_ci * Unlock a request that has previously been locked using
15762306a36Sopenharmony_ci * @media_request_lock_for_update.
15862306a36Sopenharmony_ci */
15962306a36Sopenharmony_cistatic inline void media_request_unlock_for_update(struct media_request *req)
16062306a36Sopenharmony_ci{
16162306a36Sopenharmony_ci	unsigned long flags;
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_ci	spin_lock_irqsave(&req->lock, flags);
16462306a36Sopenharmony_ci	WARN_ON(req->updating_count <= 0);
16562306a36Sopenharmony_ci	if (!--req->updating_count)
16662306a36Sopenharmony_ci		req->state = MEDIA_REQUEST_STATE_IDLE;
16762306a36Sopenharmony_ci	spin_unlock_irqrestore(&req->lock, flags);
16862306a36Sopenharmony_ci}
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci/**
17162306a36Sopenharmony_ci * media_request_get - Get the media request
17262306a36Sopenharmony_ci *
17362306a36Sopenharmony_ci * @req: The media request
17462306a36Sopenharmony_ci *
17562306a36Sopenharmony_ci * Get the media request.
17662306a36Sopenharmony_ci */
17762306a36Sopenharmony_cistatic inline void media_request_get(struct media_request *req)
17862306a36Sopenharmony_ci{
17962306a36Sopenharmony_ci	kref_get(&req->kref);
18062306a36Sopenharmony_ci}
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci/**
18362306a36Sopenharmony_ci * media_request_put - Put the media request
18462306a36Sopenharmony_ci *
18562306a36Sopenharmony_ci * @req: The media request
18662306a36Sopenharmony_ci *
18762306a36Sopenharmony_ci * Put the media request. The media request will be released
18862306a36Sopenharmony_ci * when the refcount reaches 0.
18962306a36Sopenharmony_ci */
19062306a36Sopenharmony_civoid media_request_put(struct media_request *req);
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci/**
19362306a36Sopenharmony_ci * media_request_get_by_fd - Get a media request by fd
19462306a36Sopenharmony_ci *
19562306a36Sopenharmony_ci * @mdev: Media device this request belongs to
19662306a36Sopenharmony_ci * @request_fd: The file descriptor of the request
19762306a36Sopenharmony_ci *
19862306a36Sopenharmony_ci * Get the request represented by @request_fd that is owned
19962306a36Sopenharmony_ci * by the media device.
20062306a36Sopenharmony_ci *
20162306a36Sopenharmony_ci * Return a -EBADR error pointer if requests are not supported
20262306a36Sopenharmony_ci * by this driver. Return -EINVAL if the request was not found.
20362306a36Sopenharmony_ci * Return the pointer to the request if found: the caller will
20462306a36Sopenharmony_ci * have to call @media_request_put when it finished using the
20562306a36Sopenharmony_ci * request.
20662306a36Sopenharmony_ci */
20762306a36Sopenharmony_cistruct media_request *
20862306a36Sopenharmony_cimedia_request_get_by_fd(struct media_device *mdev, int request_fd);
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci/**
21162306a36Sopenharmony_ci * media_request_alloc - Allocate the media request
21262306a36Sopenharmony_ci *
21362306a36Sopenharmony_ci * @mdev: Media device this request belongs to
21462306a36Sopenharmony_ci * @alloc_fd: Store the request's file descriptor in this int
21562306a36Sopenharmony_ci *
21662306a36Sopenharmony_ci * Allocated the media request and put the fd in @alloc_fd.
21762306a36Sopenharmony_ci */
21862306a36Sopenharmony_ciint media_request_alloc(struct media_device *mdev,
21962306a36Sopenharmony_ci			int *alloc_fd);
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci#else
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_cistatic inline void media_request_get(struct media_request *req)
22462306a36Sopenharmony_ci{
22562306a36Sopenharmony_ci}
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_cistatic inline void media_request_put(struct media_request *req)
22862306a36Sopenharmony_ci{
22962306a36Sopenharmony_ci}
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_cistatic inline struct media_request *
23262306a36Sopenharmony_cimedia_request_get_by_fd(struct media_device *mdev, int request_fd)
23362306a36Sopenharmony_ci{
23462306a36Sopenharmony_ci	return ERR_PTR(-EBADR);
23562306a36Sopenharmony_ci}
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci#endif
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci/**
24062306a36Sopenharmony_ci * struct media_request_object_ops - Media request object operations
24162306a36Sopenharmony_ci * @prepare: Validate and prepare the request object, optional.
24262306a36Sopenharmony_ci * @unprepare: Unprepare the request object, optional.
24362306a36Sopenharmony_ci * @queue: Queue the request object, optional.
24462306a36Sopenharmony_ci * @unbind: Unbind the request object, optional.
24562306a36Sopenharmony_ci * @release: Release the request object, required.
24662306a36Sopenharmony_ci */
24762306a36Sopenharmony_cistruct media_request_object_ops {
24862306a36Sopenharmony_ci	int (*prepare)(struct media_request_object *object);
24962306a36Sopenharmony_ci	void (*unprepare)(struct media_request_object *object);
25062306a36Sopenharmony_ci	void (*queue)(struct media_request_object *object);
25162306a36Sopenharmony_ci	void (*unbind)(struct media_request_object *object);
25262306a36Sopenharmony_ci	void (*release)(struct media_request_object *object);
25362306a36Sopenharmony_ci};
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci/**
25662306a36Sopenharmony_ci * struct media_request_object - An opaque object that belongs to a media
25762306a36Sopenharmony_ci *				 request
25862306a36Sopenharmony_ci *
25962306a36Sopenharmony_ci * @ops: object's operations
26062306a36Sopenharmony_ci * @priv: object's priv pointer
26162306a36Sopenharmony_ci * @req: the request this object belongs to (can be NULL)
26262306a36Sopenharmony_ci * @list: List entry of the object for @struct media_request
26362306a36Sopenharmony_ci * @kref: Reference count of the object, acquire before releasing req->lock
26462306a36Sopenharmony_ci * @completed: If true, then this object was completed.
26562306a36Sopenharmony_ci *
26662306a36Sopenharmony_ci * An object related to the request. This struct is always embedded in
26762306a36Sopenharmony_ci * another struct that contains the actual data for this request object.
26862306a36Sopenharmony_ci */
26962306a36Sopenharmony_cistruct media_request_object {
27062306a36Sopenharmony_ci	const struct media_request_object_ops *ops;
27162306a36Sopenharmony_ci	void *priv;
27262306a36Sopenharmony_ci	struct media_request *req;
27362306a36Sopenharmony_ci	struct list_head list;
27462306a36Sopenharmony_ci	struct kref kref;
27562306a36Sopenharmony_ci	bool completed;
27662306a36Sopenharmony_ci};
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci#ifdef CONFIG_MEDIA_CONTROLLER
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci/**
28162306a36Sopenharmony_ci * media_request_object_get - Get a media request object
28262306a36Sopenharmony_ci *
28362306a36Sopenharmony_ci * @obj: The object
28462306a36Sopenharmony_ci *
28562306a36Sopenharmony_ci * Get a media request object.
28662306a36Sopenharmony_ci */
28762306a36Sopenharmony_cistatic inline void media_request_object_get(struct media_request_object *obj)
28862306a36Sopenharmony_ci{
28962306a36Sopenharmony_ci	kref_get(&obj->kref);
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci/**
29362306a36Sopenharmony_ci * media_request_object_put - Put a media request object
29462306a36Sopenharmony_ci *
29562306a36Sopenharmony_ci * @obj: The object
29662306a36Sopenharmony_ci *
29762306a36Sopenharmony_ci * Put a media request object. Once all references are gone, the
29862306a36Sopenharmony_ci * object's memory is released.
29962306a36Sopenharmony_ci */
30062306a36Sopenharmony_civoid media_request_object_put(struct media_request_object *obj);
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci/**
30362306a36Sopenharmony_ci * media_request_object_find - Find an object in a request
30462306a36Sopenharmony_ci *
30562306a36Sopenharmony_ci * @req: The media request
30662306a36Sopenharmony_ci * @ops: Find an object with this ops value
30762306a36Sopenharmony_ci * @priv: Find an object with this priv value
30862306a36Sopenharmony_ci *
30962306a36Sopenharmony_ci * Both @ops and @priv must be non-NULL.
31062306a36Sopenharmony_ci *
31162306a36Sopenharmony_ci * Returns the object pointer or NULL if not found. The caller must
31262306a36Sopenharmony_ci * call media_request_object_put() once it finished using the object.
31362306a36Sopenharmony_ci *
31462306a36Sopenharmony_ci * Since this function needs to walk the list of objects it takes
31562306a36Sopenharmony_ci * the @req->lock spin lock to make this safe.
31662306a36Sopenharmony_ci */
31762306a36Sopenharmony_cistruct media_request_object *
31862306a36Sopenharmony_cimedia_request_object_find(struct media_request *req,
31962306a36Sopenharmony_ci			  const struct media_request_object_ops *ops,
32062306a36Sopenharmony_ci			  void *priv);
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci/**
32362306a36Sopenharmony_ci * media_request_object_init - Initialise a media request object
32462306a36Sopenharmony_ci *
32562306a36Sopenharmony_ci * @obj: The object
32662306a36Sopenharmony_ci *
32762306a36Sopenharmony_ci * Initialise a media request object. The object will be released using the
32862306a36Sopenharmony_ci * release callback of the ops once it has no references (this function
32962306a36Sopenharmony_ci * initialises references to one).
33062306a36Sopenharmony_ci */
33162306a36Sopenharmony_civoid media_request_object_init(struct media_request_object *obj);
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci/**
33462306a36Sopenharmony_ci * media_request_object_bind - Bind a media request object to a request
33562306a36Sopenharmony_ci *
33662306a36Sopenharmony_ci * @req: The media request
33762306a36Sopenharmony_ci * @ops: The object ops for this object
33862306a36Sopenharmony_ci * @priv: A driver-specific priv pointer associated with this object
33962306a36Sopenharmony_ci * @is_buffer: Set to true if the object a buffer object.
34062306a36Sopenharmony_ci * @obj: The object
34162306a36Sopenharmony_ci *
34262306a36Sopenharmony_ci * Bind this object to the request and set the ops and priv values of
34362306a36Sopenharmony_ci * the object so it can be found later with media_request_object_find().
34462306a36Sopenharmony_ci *
34562306a36Sopenharmony_ci * Every bound object must be unbound or completed by the kernel at some
34662306a36Sopenharmony_ci * point in time, otherwise the request will never complete. When the
34762306a36Sopenharmony_ci * request is released all completed objects will be unbound by the
34862306a36Sopenharmony_ci * request core code.
34962306a36Sopenharmony_ci *
35062306a36Sopenharmony_ci * Buffer objects will be added to the end of the request's object
35162306a36Sopenharmony_ci * list, non-buffer objects will be added to the front of the list.
35262306a36Sopenharmony_ci * This ensures that all buffer objects are at the end of the list
35362306a36Sopenharmony_ci * and that all non-buffer objects that they depend on are processed
35462306a36Sopenharmony_ci * first.
35562306a36Sopenharmony_ci */
35662306a36Sopenharmony_ciint media_request_object_bind(struct media_request *req,
35762306a36Sopenharmony_ci			      const struct media_request_object_ops *ops,
35862306a36Sopenharmony_ci			      void *priv, bool is_buffer,
35962306a36Sopenharmony_ci			      struct media_request_object *obj);
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci/**
36262306a36Sopenharmony_ci * media_request_object_unbind - Unbind a media request object
36362306a36Sopenharmony_ci *
36462306a36Sopenharmony_ci * @obj: The object
36562306a36Sopenharmony_ci *
36662306a36Sopenharmony_ci * Unbind the media request object from the request.
36762306a36Sopenharmony_ci */
36862306a36Sopenharmony_civoid media_request_object_unbind(struct media_request_object *obj);
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci/**
37162306a36Sopenharmony_ci * media_request_object_complete - Mark the media request object as complete
37262306a36Sopenharmony_ci *
37362306a36Sopenharmony_ci * @obj: The object
37462306a36Sopenharmony_ci *
37562306a36Sopenharmony_ci * Mark the media request object as complete. Only bound objects can
37662306a36Sopenharmony_ci * be completed.
37762306a36Sopenharmony_ci */
37862306a36Sopenharmony_civoid media_request_object_complete(struct media_request_object *obj);
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci#else
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_cistatic inline int __must_check
38362306a36Sopenharmony_cimedia_request_lock_for_access(struct media_request *req)
38462306a36Sopenharmony_ci{
38562306a36Sopenharmony_ci	return -EINVAL;
38662306a36Sopenharmony_ci}
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_cistatic inline void media_request_unlock_for_access(struct media_request *req)
38962306a36Sopenharmony_ci{
39062306a36Sopenharmony_ci}
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_cistatic inline int __must_check
39362306a36Sopenharmony_cimedia_request_lock_for_update(struct media_request *req)
39462306a36Sopenharmony_ci{
39562306a36Sopenharmony_ci	return -EINVAL;
39662306a36Sopenharmony_ci}
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_cistatic inline void media_request_unlock_for_update(struct media_request *req)
39962306a36Sopenharmony_ci{
40062306a36Sopenharmony_ci}
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_cistatic inline void media_request_object_get(struct media_request_object *obj)
40362306a36Sopenharmony_ci{
40462306a36Sopenharmony_ci}
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_cistatic inline void media_request_object_put(struct media_request_object *obj)
40762306a36Sopenharmony_ci{
40862306a36Sopenharmony_ci}
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_cistatic inline struct media_request_object *
41162306a36Sopenharmony_cimedia_request_object_find(struct media_request *req,
41262306a36Sopenharmony_ci			  const struct media_request_object_ops *ops,
41362306a36Sopenharmony_ci			  void *priv)
41462306a36Sopenharmony_ci{
41562306a36Sopenharmony_ci	return NULL;
41662306a36Sopenharmony_ci}
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_cistatic inline void media_request_object_init(struct media_request_object *obj)
41962306a36Sopenharmony_ci{
42062306a36Sopenharmony_ci	obj->ops = NULL;
42162306a36Sopenharmony_ci	obj->req = NULL;
42262306a36Sopenharmony_ci}
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_cistatic inline int media_request_object_bind(struct media_request *req,
42562306a36Sopenharmony_ci			       const struct media_request_object_ops *ops,
42662306a36Sopenharmony_ci			       void *priv, bool is_buffer,
42762306a36Sopenharmony_ci			       struct media_request_object *obj)
42862306a36Sopenharmony_ci{
42962306a36Sopenharmony_ci	return 0;
43062306a36Sopenharmony_ci}
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_cistatic inline void media_request_object_unbind(struct media_request_object *obj)
43362306a36Sopenharmony_ci{
43462306a36Sopenharmony_ci}
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_cistatic inline void media_request_object_complete(struct media_request_object *obj)
43762306a36Sopenharmony_ci{
43862306a36Sopenharmony_ci}
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci#endif
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci#endif
443