media-devnode.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * Media device node
  3. *
  4. * Copyright (C) 2010 Nokia Corporation
  5. *
  6. * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  7. * Sakari Ailus <sakari.ailus@iki.fi>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. *
  22. * --
  23. *
  24. * Common functions for media-related drivers to register and unregister media
  25. * device nodes.
  26. */
  27. #ifndef _MEDIA_DEVNODE_H
  28. #define _MEDIA_DEVNODE_H
  29. #include <linux/poll.h>
  30. #include <linux/fs.h>
  31. #include <linux/device.h>
  32. #include <linux/cdev.h>
  33. /*
  34. * Flag to mark the media_devnode struct as registered. Drivers must not touch
  35. * this flag directly, it will be set and cleared by media_devnode_register and
  36. * media_devnode_unregister.
  37. */
  38. #define MEDIA_FLAG_REGISTERED 0
  39. /**
  40. * struct media_file_operations - Media device file operations
  41. *
  42. * @owner: should be filled with %THIS_MODULE
  43. * @read: pointer to the function that implements read() syscall
  44. * @write: pointer to the function that implements write() syscall
  45. * @poll: pointer to the function that implements poll() syscall
  46. * @ioctl: pointer to the function that implements ioctl() syscall
  47. * @compat_ioctl: pointer to the function that will handle 32 bits userspace
  48. * calls to the the ioctl() syscall on a Kernel compiled with 64 bits.
  49. * @open: pointer to the function that implements open() syscall
  50. * @release: pointer to the function that will release the resources allocated
  51. * by the @open function.
  52. */
  53. struct media_file_operations {
  54. struct module *owner;
  55. ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
  56. ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
  57. unsigned int (*poll) (struct file *, struct poll_table_struct *);
  58. long (*ioctl) (struct file *, unsigned int, unsigned long);
  59. long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
  60. int (*open) (struct file *);
  61. int (*release) (struct file *);
  62. };
  63. /**
  64. * struct media_devnode - Media device node
  65. * @fops: pointer to struct &media_file_operations with media device ops
  66. * @dev: struct device pointer for the media controller device
  67. * @cdev: struct cdev pointer character device
  68. * @parent: parent device
  69. * @minor: device node minor number
  70. * @flags: flags, combination of the MEDIA_FLAG_* constants
  71. * @release: release callback called at the end of media_devnode_release()
  72. *
  73. * This structure represents a media-related device node.
  74. *
  75. * The @parent is a physical device. It must be set by core or device drivers
  76. * before registering the node.
  77. */
  78. struct media_devnode {
  79. /* device ops */
  80. const struct media_file_operations *fops;
  81. /* sysfs */
  82. struct device dev; /* media device */
  83. struct cdev cdev; /* character device */
  84. struct device *parent; /* device parent */
  85. /* device info */
  86. int minor;
  87. unsigned long flags; /* Use bitops to access flags */
  88. /* callbacks */
  89. void (*release)(struct media_devnode *mdev);
  90. };
  91. /* dev to media_devnode */
  92. #define to_media_devnode(cd) container_of(cd, struct media_devnode, dev)
  93. /**
  94. * media_devnode_register - register a media device node
  95. *
  96. * @mdev: media device node structure we want to register
  97. * @owner: should be filled with %THIS_MODULE
  98. *
  99. * The registration code assigns minor numbers and registers the new device node
  100. * with the kernel. An error is returned if no free minor number can be found,
  101. * or if the registration of the device node fails.
  102. *
  103. * Zero is returned on success.
  104. *
  105. * Note that if the media_devnode_register call fails, the release() callback of
  106. * the media_devnode structure is *not* called, so the caller is responsible for
  107. * freeing any data.
  108. */
  109. int __must_check media_devnode_register(struct media_devnode *mdev,
  110. struct module *owner);
  111. /**
  112. * media_devnode_unregister - unregister a media device node
  113. * @mdev: the device node to unregister
  114. *
  115. * This unregisters the passed device. Future open calls will be met with
  116. * errors.
  117. *
  118. * This function can safely be called if the device node has never been
  119. * registered or has already been unregistered.
  120. */
  121. void media_devnode_unregister(struct media_devnode *mdev);
  122. /**
  123. * media_devnode_data - returns a pointer to the &media_devnode
  124. *
  125. * @filp: pointer to struct &file
  126. */
  127. static inline struct media_devnode *media_devnode_data(struct file *filp)
  128. {
  129. return filp->private_data;
  130. }
  131. /**
  132. * media_devnode_is_registered - returns true if &media_devnode is registered;
  133. * false otherwise.
  134. *
  135. * @mdev: pointer to struct &media_devnode.
  136. */
  137. static inline int media_devnode_is_registered(struct media_devnode *mdev)
  138. {
  139. return test_bit(MEDIA_FLAG_REGISTERED, &mdev->flags);
  140. }
  141. #endif /* _MEDIA_DEVNODE_H */