Blame view

include/media/media-devnode.h 5.29 KB
1802d0bee   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-only */
cf4b9211b   Laurent Pinchart   [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   Laurent Pinchart   [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   Mauro Carvalho Chehab   [media] media-dev...
23
  struct media_device;
cf4b9211b   Laurent Pinchart   [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   Mauro Carvalho Chehab   [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   Randy Dunlap   media: media-devn...
39
   *	calls to the ioctl() syscall on a Kernel compiled with 64 bits.
75c7e2957   Mauro Carvalho Chehab   [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   Laurent Pinchart   [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   Al Viro   ->poll() methods ...
48
  	__poll_t (*poll) (struct file *, struct poll_table_struct *);
cf4b9211b   Laurent Pinchart   [media] media: Me...
49
  	long (*ioctl) (struct file *, unsigned int, unsigned long);
c6c1d50b5   Sakari Ailus   [media] media: Ad...
50
  	long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
cf4b9211b   Laurent Pinchart   [media] media: Me...
51
52
53
54
55
56
  	int (*open) (struct file *);
  	int (*release) (struct file *);
  };
  
  /**
   * struct media_devnode - Media device node
0db5c7998   Mauro Carvalho Chehab   [media] media-dev...
57
   * @media_dev:	pointer to struct &media_device
75c7e2957   Mauro Carvalho Chehab   [media] media-dev...
58
   * @fops:	pointer to struct &media_file_operations with media device ops
0db5c7998   Mauro Carvalho Chehab   [media] media-dev...
59
   * @dev:	pointer to struct &device containing the media controller device
ec0255cad   Mauro Carvalho Chehab   [media] Docbook: ...
60
   * @cdev:	struct cdev pointer character device
cf4b9211b   Laurent Pinchart   [media] media: Me...
61
62
   * @parent:	parent device
   * @minor:	device node minor number
48a7c4bac   Mauro Carvalho Chehab   [media] docs-rst:...
63
   * @flags:	flags, combination of the ``MEDIA_FLAG_*`` constants
82631b5bb   Mauro Carvalho Chehab   [media] mc-core.r...
64
65
   * @release:	release callback called at the end of ``media_devnode_release()``
   *		routine at media-device.c.
cf4b9211b   Laurent Pinchart   [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   Mauro Carvalho Chehab   [media] media-dev...
73
  	struct media_device *media_dev;
cf4b9211b   Laurent Pinchart   [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   Mauro Carvalho Chehab   [media] media-dev...
87
  	void (*release)(struct media_devnode *devnode);
cf4b9211b   Laurent Pinchart   [media] media: Me...
88
89
90
91
  };
  
  /* dev to media_devnode */
  #define to_media_devnode(cd) container_of(cd, struct media_devnode, dev)
fe3c565e4   Mauro Carvalho Chehab   [media] media-dev...
92
93
94
  /**
   * media_devnode_register - register a media device node
   *
0db5c7998   Mauro Carvalho Chehab   [media] media-dev...
95
   * @mdev: struct media_device we want to register a device node
163f1e93e   Mauro Carvalho Chehab   [media] media-dev...
96
   * @devnode: media device node structure we want to register
fe3c565e4   Mauro Carvalho Chehab   [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   Mauro Carvalho Chehab   [media] media-dev...
109
110
  int __must_check media_devnode_register(struct media_device *mdev,
  					struct media_devnode *devnode,
85de721c4   Sakari Ailus   [media] media: Us...
111
  					struct module *owner);
fe3c565e4   Mauro Carvalho Chehab   [media] media-dev...
112
113
  
  /**
6f0dd24a0   Shuah Khan   [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   Mauro Carvalho Chehab   [media] media-dev...
127
   * media_devnode_unregister - unregister a media device node
163f1e93e   Mauro Carvalho Chehab   [media] media-dev...
128
   * @devnode: the device node to unregister
fe3c565e4   Mauro Carvalho Chehab   [media] media-dev...
129
130
131
132
   *
   * This unregisters the passed device. Future open calls will be met with
   * errors.
   *
6f0dd24a0   Shuah Khan   [media] media: fi...
133
   * Should be called after media_devnode_unregister_prepare()
fe3c565e4   Mauro Carvalho Chehab   [media] media-dev...
134
   */
163f1e93e   Mauro Carvalho Chehab   [media] media-dev...
135
  void media_devnode_unregister(struct media_devnode *devnode);
cf4b9211b   Laurent Pinchart   [media] media: Me...
136

75c7e2957   Mauro Carvalho Chehab   [media] media-dev...
137
138
139
140
141
  /**
   * media_devnode_data - returns a pointer to the &media_devnode
   *
   * @filp: pointer to struct &file
   */
cf4b9211b   Laurent Pinchart   [media] media: Me...
142
143
144
145
  static inline struct media_devnode *media_devnode_data(struct file *filp)
  {
  	return filp->private_data;
  }
75c7e2957   Mauro Carvalho Chehab   [media] media-dev...
146
147
148
149
  /**
   * media_devnode_is_registered - returns true if &media_devnode is registered;
   *	false otherwise.
   *
163f1e93e   Mauro Carvalho Chehab   [media] media-dev...
150
   * @devnode: pointer to struct &media_devnode.
a087ce704   Mauro Carvalho Chehab   [media] media-dev...
151
152
   *
   * Note: If mdev is NULL, it also returns false.
75c7e2957   Mauro Carvalho Chehab   [media] media-dev...
153
   */
163f1e93e   Mauro Carvalho Chehab   [media] media-dev...
154
  static inline int media_devnode_is_registered(struct media_devnode *devnode)
cf4b9211b   Laurent Pinchart   [media] media: Me...
155
  {
a087ce704   Mauro Carvalho Chehab   [media] media-dev...
156
157
  	if (!devnode)
  		return false;
163f1e93e   Mauro Carvalho Chehab   [media] media-dev...
158
  	return test_bit(MEDIA_FLAG_REGISTERED, &devnode->flags);
cf4b9211b   Laurent Pinchart   [media] media: Me...
159
160
161
  }
  
  #endif /* _MEDIA_DEVNODE_H */