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