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