v4l2-fh.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /*
  2. * v4l2-fh.h
  3. *
  4. * V4L2 file handle. Store per file handle data for the V4L2
  5. * framework. Using file handles is optional for the drivers.
  6. *
  7. * Copyright (C) 2009--2010 Nokia Corporation.
  8. *
  9. * Contact: Sakari Ailus <sakari.ailus@iki.fi>
  10. *
  11. * This program is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU General Public License
  13. * version 2 as published by the Free Software Foundation.
  14. *
  15. * This program is distributed in the hope that it will be useful, but
  16. * WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18. * General Public License for more details.
  19. */
  20. #ifndef V4L2_FH_H
  21. #define V4L2_FH_H
  22. #include <linux/fs.h>
  23. #include <linux/list.h>
  24. #include <linux/videodev2.h>
  25. struct video_device;
  26. struct v4l2_ctrl_handler;
  27. /**
  28. * struct v4l2_fh - Describes a V4L2 file handler
  29. *
  30. * @list: list of file handlers
  31. * @vdev: pointer to &struct video_device
  32. * @ctrl_handler: pointer to &struct v4l2_ctrl_handler
  33. * @prio: priority of the file handler, as defined by &enum v4l2_priority
  34. *
  35. * @wait: event' s wait queue
  36. * @subscribed: list of subscribed events
  37. * @available: list of events waiting to be dequeued
  38. * @navailable: number of available events at @available list
  39. * @sequence: event sequence number
  40. * @m2m_ctx: pointer to &struct v4l2_m2m_ctx
  41. */
  42. struct v4l2_fh {
  43. struct list_head list;
  44. struct video_device *vdev;
  45. struct v4l2_ctrl_handler *ctrl_handler;
  46. enum v4l2_priority prio;
  47. /* Events */
  48. wait_queue_head_t wait;
  49. struct list_head subscribed;
  50. struct list_head available;
  51. unsigned int navailable;
  52. u32 sequence;
  53. #if IS_ENABLED(CONFIG_V4L2_MEM2MEM_DEV)
  54. struct v4l2_m2m_ctx *m2m_ctx;
  55. #endif
  56. };
  57. /**
  58. * v4l2_fh_init - Initialise the file handle.
  59. *
  60. * @fh: pointer to &struct v4l2_fh
  61. * @vdev: pointer to &struct video_device
  62. *
  63. * Parts of the V4L2 framework using the
  64. * file handles should be initialised in this function. Must be called
  65. * from driver's v4l2_file_operations->open\(\) handler if the driver
  66. * uses &struct v4l2_fh.
  67. */
  68. void v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev);
  69. /**
  70. * v4l2_fh_add - Add the fh to the list of file handles on a video_device.
  71. *
  72. * @fh: pointer to &struct v4l2_fh
  73. *
  74. * .. note::
  75. * The @fh file handle must be initialised first.
  76. */
  77. void v4l2_fh_add(struct v4l2_fh *fh);
  78. /**
  79. * v4l2_fh_open - Ancillary routine that can be used as the open\(\) op
  80. * of v4l2_file_operations.
  81. *
  82. * @filp: pointer to struct file
  83. *
  84. * It allocates a v4l2_fh and inits and adds it to the &struct video_device
  85. * associated with the file pointer.
  86. */
  87. int v4l2_fh_open(struct file *filp);
  88. /**
  89. * v4l2_fh_del - Remove file handle from the list of file handles.
  90. *
  91. * @fh: pointer to &struct v4l2_fh
  92. *
  93. * On error filp->private_data will be %NULL, otherwise it will point to
  94. * the &struct v4l2_fh.
  95. *
  96. * .. note::
  97. * Must be called in v4l2_file_operations->release\(\) handler if the driver
  98. * uses &struct v4l2_fh.
  99. */
  100. void v4l2_fh_del(struct v4l2_fh *fh);
  101. /**
  102. * v4l2_fh_exit - Release resources related to a file handle.
  103. *
  104. * @fh: pointer to &struct v4l2_fh
  105. *
  106. * Parts of the V4L2 framework using the v4l2_fh must release their
  107. * resources here, too.
  108. *
  109. * .. note::
  110. * Must be called in v4l2_file_operations->release\(\) handler if the
  111. * driver uses &struct v4l2_fh.
  112. */
  113. void v4l2_fh_exit(struct v4l2_fh *fh);
  114. /**
  115. * v4l2_fh_release - Ancillary routine that can be used as the release\(\) op
  116. * of v4l2_file_operations.
  117. *
  118. * @filp: pointer to struct file
  119. *
  120. * It deletes and exits the v4l2_fh associated with the file pointer and
  121. * frees it. It will do nothing if filp->private_data (the pointer to the
  122. * v4l2_fh struct) is %NULL.
  123. *
  124. * This function always returns 0.
  125. */
  126. int v4l2_fh_release(struct file *filp);
  127. /**
  128. * v4l2_fh_is_singular - Returns 1 if this filehandle is the only filehandle
  129. * opened for the associated video_device.
  130. *
  131. * @fh: pointer to &struct v4l2_fh
  132. *
  133. * If @fh is NULL, then it returns 0.
  134. */
  135. int v4l2_fh_is_singular(struct v4l2_fh *fh);
  136. /**
  137. * v4l2_fh_is_singular_file - Returns 1 if this filehandle is the only
  138. * filehandle opened for the associated video_device.
  139. *
  140. * @filp: pointer to struct file
  141. *
  142. * This is a helper function variant of v4l2_fh_is_singular() with uses
  143. * struct file as argument.
  144. *
  145. * If filp->private_data is %NULL, then it will return 0.
  146. */
  147. static inline int v4l2_fh_is_singular_file(struct file *filp)
  148. {
  149. return v4l2_fh_is_singular(filp->private_data);
  150. }
  151. #endif /* V4L2_EVENT_H */