1
0

media-devnode.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Media device node
  4. *
  5. * Copyright (C) 2010 Nokia Corporation
  6. *
  7. * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  8. * Sakari Ailus <sakari.ailus@iki.fi>
  9. *
  10. * --
  11. *
  12. * Common functions for media-related drivers to register and unregister media
  13. * device nodes.
  14. */
  15. #ifndef _MEDIA_DEVNODE_H
  16. #define _MEDIA_DEVNODE_H
  17. #include <linux/poll.h>
  18. #include <linux/fs.h>
  19. #include <linux/device.h>
  20. #include <linux/cdev.h>
  21. #include <linux/debugfs.h>
  22. struct media_device;
  23. /* debugfs top-level media directory */
  24. extern struct dentry *media_debugfs_root;
  25. /*
  26. * Flag to mark the media_devnode struct as registered. Drivers must not touch
  27. * this flag directly, it will be set and cleared by media_devnode_register and
  28. * media_devnode_unregister.
  29. */
  30. #define MEDIA_FLAG_REGISTERED 0
  31. /**
  32. * struct media_file_operations - Media device file operations
  33. *
  34. * @owner: should be filled with %THIS_MODULE
  35. * @read: pointer to the function that implements read() syscall
  36. * @write: pointer to the function that implements write() syscall
  37. * @poll: pointer to the function that implements poll() syscall
  38. * @ioctl: pointer to the function that implements ioctl() syscall
  39. * @compat_ioctl: pointer to the function that will handle 32 bits userspace
  40. * calls to the ioctl() syscall on a Kernel compiled with 64 bits.
  41. * @open: pointer to the function that implements open() syscall
  42. * @release: pointer to the function that will release the resources allocated
  43. * by the @open function.
  44. */
  45. struct media_file_operations {
  46. struct module *owner;
  47. ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
  48. ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
  49. __poll_t (*poll) (struct file *, struct poll_table_struct *);
  50. long (*ioctl) (struct file *, unsigned int, unsigned long);
  51. long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
  52. int (*open) (struct file *);
  53. int (*release) (struct file *);
  54. };
  55. /**
  56. * struct media_devnode - Media device node
  57. * @media_dev: pointer to struct &media_device
  58. * @fops: pointer to struct &media_file_operations with media device ops
  59. * @dev: pointer to struct &device containing the media controller device
  60. * @cdev: struct cdev pointer character device
  61. * @parent: parent device
  62. * @minor: device node minor number
  63. * @flags: flags, combination of the ``MEDIA_FLAG_*`` constants
  64. * @release: release callback called at the end of ``media_devnode_release()``
  65. * routine at media-device.c.
  66. *
  67. * This structure represents a media-related device node.
  68. *
  69. * The @parent is a physical device. It must be set by core or device drivers
  70. * before registering the node.
  71. */
  72. struct media_devnode {
  73. struct media_device *media_dev;
  74. /* device ops */
  75. const struct media_file_operations *fops;
  76. /* sysfs */
  77. struct device dev; /* media device */
  78. struct cdev cdev; /* character device */
  79. struct device *parent; /* device parent */
  80. /* device info */
  81. int minor;
  82. unsigned long flags; /* Use bitops to access flags */
  83. /* callbacks */
  84. void (*release)(struct media_devnode *devnode);
  85. };
  86. /* dev to media_devnode */
  87. #define to_media_devnode(cd) container_of(cd, struct media_devnode, dev)
  88. /**
  89. * media_devnode_register - register a media device node
  90. *
  91. * @mdev: struct media_device we want to register a device node
  92. * @devnode: media device node structure we want to register
  93. * @owner: should be filled with %THIS_MODULE
  94. *
  95. * The registration code assigns minor numbers and registers the new device node
  96. * with the kernel. An error is returned if no free minor number can be found,
  97. * or if the registration of the device node fails.
  98. *
  99. * Zero is returned on success.
  100. *
  101. * Note that if the media_devnode_register call fails, the release() callback of
  102. * the media_devnode structure is *not* called, so the caller is responsible for
  103. * freeing any data.
  104. */
  105. int __must_check media_devnode_register(struct media_device *mdev,
  106. struct media_devnode *devnode,
  107. struct module *owner);
  108. /**
  109. * media_devnode_unregister_prepare - clear the media device node register bit
  110. * @devnode: the device node to prepare for unregister
  111. *
  112. * This clears the passed device register bit. Future open calls will be met
  113. * with errors. Should be called before media_devnode_unregister() to avoid
  114. * races with unregister and device file open calls.
  115. *
  116. * This function can safely be called if the device node has never been
  117. * registered or has already been unregistered.
  118. */
  119. void media_devnode_unregister_prepare(struct media_devnode *devnode);
  120. /**
  121. * media_devnode_unregister - unregister a media device node
  122. * @devnode: the device node to unregister
  123. *
  124. * This unregisters the passed device. Future open calls will be met with
  125. * errors.
  126. *
  127. * Should be called after media_devnode_unregister_prepare()
  128. */
  129. void media_devnode_unregister(struct media_devnode *devnode);
  130. /**
  131. * media_devnode_data - returns a pointer to the &media_devnode
  132. *
  133. * @filp: pointer to struct &file
  134. */
  135. static inline struct media_devnode *media_devnode_data(struct file *filp)
  136. {
  137. return filp->private_data;
  138. }
  139. /**
  140. * media_devnode_is_registered - returns true if &media_devnode is registered;
  141. * false otherwise.
  142. *
  143. * @devnode: pointer to struct &media_devnode.
  144. *
  145. * Note: If mdev is NULL, it also returns false.
  146. */
  147. static inline int media_devnode_is_registered(struct media_devnode *devnode)
  148. {
  149. if (!devnode)
  150. return false;
  151. return test_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
  152. }
  153. #endif /* _MEDIA_DEVNODE_H */