1 | /* |
2 | * dvbdev.h |
3 | * |
4 | * Copyright (C) 2000 Ralph Metzler & Marcus Metzler |
5 | * for convergence integrated media GmbH |
6 | * |
7 | * This program is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU General Lesser Public License |
9 | * as published by the Free Software Foundation; either version 2.1 |
10 | * of the License, or (at your option) any later version. |
11 | * |
12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. |
16 | * |
17 | */ |
18 | |
19 | #ifndef _DVBDEV_H_ |
20 | #define _DVBDEV_H_ |
21 | |
22 | #include <linux/types.h> |
23 | #include <linux/poll.h> |
24 | #include <linux/fs.h> |
25 | #include <linux/list.h> |
26 | #include <media/media-device.h> |
27 | |
28 | #define DVB_MAJOR 212 |
29 | |
30 | #if defined(CONFIG_DVB_MAX_ADAPTERS) && CONFIG_DVB_MAX_ADAPTERS > 0 |
31 | #define DVB_MAX_ADAPTERS CONFIG_DVB_MAX_ADAPTERS |
32 | #else |
33 | #define DVB_MAX_ADAPTERS 16 |
34 | #endif |
35 | |
36 | #define DVB_UNSET (-1) |
37 | |
38 | /* List of DVB device types */ |
39 | |
40 | /** |
41 | * enum dvb_device_type - type of the Digital TV device |
42 | * |
43 | * @DVB_DEVICE_SEC: Digital TV standalone Common Interface (CI) |
44 | * @DVB_DEVICE_FRONTEND: Digital TV frontend. |
45 | * @DVB_DEVICE_DEMUX: Digital TV demux. |
46 | * @DVB_DEVICE_DVR: Digital TV digital video record (DVR). |
47 | * @DVB_DEVICE_CA: Digital TV Conditional Access (CA). |
48 | * @DVB_DEVICE_NET: Digital TV network. |
49 | * |
50 | * @DVB_DEVICE_VIDEO: Digital TV video decoder. |
51 | * Deprecated. Used only on av7110-av. |
52 | * @DVB_DEVICE_AUDIO: Digital TV audio decoder. |
53 | * Deprecated. Used only on av7110-av. |
54 | * @DVB_DEVICE_OSD: Digital TV On Screen Display (OSD). |
55 | * Deprecated. Used only on av7110. |
56 | */ |
57 | enum dvb_device_type { |
58 | DVB_DEVICE_SEC, |
59 | DVB_DEVICE_FRONTEND, |
60 | DVB_DEVICE_DEMUX, |
61 | DVB_DEVICE_DVR, |
62 | DVB_DEVICE_CA, |
63 | DVB_DEVICE_NET, |
64 | |
65 | DVB_DEVICE_VIDEO, |
66 | DVB_DEVICE_AUDIO, |
67 | DVB_DEVICE_OSD, |
68 | }; |
69 | |
70 | #define DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr) \ |
71 | static short adapter_nr[] = \ |
72 | {[0 ... (DVB_MAX_ADAPTERS - 1)] = DVB_UNSET }; \ |
73 | module_param_array(adapter_nr, short, NULL, 0444); \ |
74 | MODULE_PARM_DESC(adapter_nr, "DVB adapter numbers") |
75 | |
76 | struct dvb_frontend; |
77 | |
78 | /** |
79 | * struct dvb_adapter - represents a Digital TV adapter using Linux DVB API |
80 | * |
81 | * @num: Number of the adapter |
82 | * @list_head: List with the DVB adapters |
83 | * @device_list: List with the DVB devices |
84 | * @name: Name of the adapter |
85 | * @proposed_mac: proposed MAC address for the adapter |
86 | * @priv: private data |
87 | * @device: pointer to struct device |
88 | * @module: pointer to struct module |
89 | * @mfe_shared: indicates mutually exclusive frontends. |
90 | * 1 = legacy exclusion behavior: blocking any open() call |
91 | * 2 = enhanced exclusion behavior, emulating the standard |
92 | * behavior of busy frontends: allowing read-only sharing |
93 | * and otherwise returning immediately with -EBUSY when any |
94 | * of the frontends is already opened with write access. |
95 | * @mfe_dvbdev: Frontend device in use, in the case of MFE |
96 | * @mfe_lock: Lock to prevent using the other frontends when MFE is |
97 | * used. |
98 | * @mdev_lock: Protect access to the mdev pointer. |
99 | * @mdev: pointer to struct media_device, used when the media |
100 | * controller is used. |
101 | * @conn: RF connector. Used only if the device has no separate |
102 | * tuner. |
103 | * @conn_pads: pointer to struct media_pad associated with @conn; |
104 | */ |
105 | struct dvb_adapter { |
106 | int num; |
107 | struct list_head list_head; |
108 | struct list_head device_list; |
109 | const char *name; |
110 | u8 proposed_mac [6]; |
111 | void* priv; |
112 | |
113 | struct device *device; |
114 | |
115 | struct module *module; |
116 | |
117 | int mfe_shared; /* indicates mutually exclusive frontends */ |
118 | struct dvb_device *mfe_dvbdev; /* frontend device in use */ |
119 | struct mutex mfe_lock; /* access lock for thread creation */ |
120 | |
121 | #if defined(CONFIG_MEDIA_CONTROLLER_DVB) |
122 | struct mutex mdev_lock; |
123 | struct media_device *mdev; |
124 | struct media_entity *conn; |
125 | struct media_pad *conn_pads; |
126 | #endif |
127 | }; |
128 | |
129 | /** |
130 | * struct dvb_device - represents a DVB device node |
131 | * |
132 | * @list_head: List head with all DVB devices |
133 | * @ref: reference count for this device |
134 | * @fops: pointer to struct file_operations |
135 | * @adapter: pointer to the adapter that holds this device node |
136 | * @type: type of the device, as defined by &enum dvb_device_type. |
137 | * @minor: devnode minor number. Major number is always DVB_MAJOR. |
138 | * @id: device ID number, inside the adapter |
139 | * @readers: Initialized by the caller. Each call to open() in Read Only mode |
140 | * decreases this counter by one. |
141 | * @writers: Initialized by the caller. Each call to open() in Read/Write |
142 | * mode decreases this counter by one. |
143 | * @users: Initialized by the caller. Each call to open() in any mode |
144 | * decreases this counter by one. |
145 | * @wait_queue: wait queue, used to wait for certain events inside one of |
146 | * the DVB API callers |
147 | * @kernel_ioctl: callback function used to handle ioctl calls from userspace. |
148 | * @name: Name to be used for the device at the Media Controller |
149 | * @entity: pointer to struct media_entity associated with the device node |
150 | * @pads: pointer to struct media_pad associated with @entity; |
151 | * @priv: private data |
152 | * @intf_devnode: Pointer to media_intf_devnode. Used by the dvbdev core to |
153 | * store the MC device node interface |
154 | * @tsout_num_entities: Number of Transport Stream output entities |
155 | * @tsout_entity: array with MC entities associated to each TS output node |
156 | * @tsout_pads: array with the source pads for each @tsout_entity |
157 | * |
158 | * This structure is used by the DVB core (frontend, CA, net, demux) in |
159 | * order to create the device nodes. Usually, driver should not initialize |
160 | * this struct diretly. |
161 | */ |
162 | struct dvb_device { |
163 | struct list_head list_head; |
164 | struct kref ref; |
165 | const struct file_operations *fops; |
166 | struct dvb_adapter *adapter; |
167 | enum dvb_device_type type; |
168 | int minor; |
169 | u32 id; |
170 | |
171 | /* in theory, 'users' can vanish now, |
172 | but I don't want to change too much now... */ |
173 | int readers; |
174 | int writers; |
175 | int users; |
176 | |
177 | wait_queue_head_t wait_queue; |
178 | /* don't really need those !? -- FIXME: use video_usercopy */ |
179 | int (*kernel_ioctl)(struct file *file, unsigned int cmd, void *arg); |
180 | |
181 | /* Needed for media controller register/unregister */ |
182 | #if defined(CONFIG_MEDIA_CONTROLLER_DVB) |
183 | const char *name; |
184 | |
185 | /* Allocated and filled inside dvbdev.c */ |
186 | struct media_intf_devnode *intf_devnode; |
187 | |
188 | unsigned tsout_num_entities; |
189 | struct media_entity *entity, *tsout_entity; |
190 | struct media_pad *pads, *tsout_pads; |
191 | #endif |
192 | |
193 | void *priv; |
194 | }; |
195 | |
196 | /** |
197 | * struct dvbdevfops_node - fops nodes registered in dvbdevfops_list |
198 | * |
199 | * @fops: Dynamically allocated fops for ->owner registration |
200 | * @type: type of dvb_device |
201 | * @template: dvb_device used for registration |
202 | * @list_head: list_head for dvbdevfops_list |
203 | */ |
204 | struct dvbdevfops_node { |
205 | struct file_operations *fops; |
206 | enum dvb_device_type type; |
207 | const struct dvb_device *template; |
208 | struct list_head list_head; |
209 | }; |
210 | |
211 | /** |
212 | * dvb_device_get - Increase dvb_device reference |
213 | * |
214 | * @dvbdev: pointer to struct dvb_device |
215 | */ |
216 | struct dvb_device *dvb_device_get(struct dvb_device *dvbdev); |
217 | |
218 | /** |
219 | * dvb_device_put - Decrease dvb_device reference |
220 | * |
221 | * @dvbdev: pointer to struct dvb_device |
222 | */ |
223 | void dvb_device_put(struct dvb_device *dvbdev); |
224 | |
225 | /** |
226 | * dvb_register_adapter - Registers a new DVB adapter |
227 | * |
228 | * @adap: pointer to struct dvb_adapter |
229 | * @name: Adapter's name |
230 | * @module: initialized with THIS_MODULE at the caller |
231 | * @device: pointer to struct device that corresponds to the device driver |
232 | * @adapter_nums: Array with a list of the numbers for @dvb_register_adapter; |
233 | * to select among them. Typically, initialized with: |
234 | * DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nums) |
235 | */ |
236 | int dvb_register_adapter(struct dvb_adapter *adap, const char *name, |
237 | struct module *module, struct device *device, |
238 | short *adapter_nums); |
239 | |
240 | /** |
241 | * dvb_unregister_adapter - Unregisters a DVB adapter |
242 | * |
243 | * @adap: pointer to struct dvb_adapter |
244 | */ |
245 | int dvb_unregister_adapter(struct dvb_adapter *adap); |
246 | |
247 | /** |
248 | * dvb_register_device - Registers a new DVB device |
249 | * |
250 | * @adap: pointer to struct dvb_adapter |
251 | * @pdvbdev: pointer to the place where the new struct dvb_device will be |
252 | * stored |
253 | * @template: Template used to create &pdvbdev; |
254 | * @priv: private data |
255 | * @type: type of the device, as defined by &enum dvb_device_type. |
256 | * @demux_sink_pads: Number of demux outputs, to be used to create the TS |
257 | * outputs via the Media Controller. |
258 | */ |
259 | int dvb_register_device(struct dvb_adapter *adap, |
260 | struct dvb_device **pdvbdev, |
261 | const struct dvb_device *template, |
262 | void *priv, |
263 | enum dvb_device_type type, |
264 | int demux_sink_pads); |
265 | |
266 | /** |
267 | * dvb_remove_device - Remove a registered DVB device |
268 | * |
269 | * @dvbdev: pointer to struct dvb_device |
270 | * |
271 | * This does not free memory. dvb_free_device() will do that when |
272 | * reference counter is empty |
273 | */ |
274 | void dvb_remove_device(struct dvb_device *dvbdev); |
275 | |
276 | |
277 | /** |
278 | * dvb_unregister_device - Unregisters a DVB device |
279 | * |
280 | * @dvbdev: pointer to struct dvb_device |
281 | */ |
282 | void dvb_unregister_device(struct dvb_device *dvbdev); |
283 | |
284 | #ifdef CONFIG_MEDIA_CONTROLLER_DVB |
285 | /** |
286 | * dvb_create_media_graph - Creates media graph for the Digital TV part of the |
287 | * device. |
288 | * |
289 | * @adap: pointer to &struct dvb_adapter |
290 | * @create_rf_connector: if true, it creates the RF connector too |
291 | * |
292 | * This function checks all DVB-related functions at the media controller |
293 | * entities and creates the needed links for the media graph. It is |
294 | * capable of working with multiple tuners or multiple frontends, but it |
295 | * won't create links if the device has multiple tuners and multiple frontends |
296 | * or if the device has multiple muxes. In such case, the caller driver should |
297 | * manually create the remaining links. |
298 | */ |
299 | __must_check int dvb_create_media_graph(struct dvb_adapter *adap, |
300 | bool create_rf_connector); |
301 | |
302 | /** |
303 | * dvb_register_media_controller - registers a media controller at DVB adapter |
304 | * |
305 | * @adap: pointer to &struct dvb_adapter |
306 | * @mdev: pointer to &struct media_device |
307 | */ |
308 | static inline void dvb_register_media_controller(struct dvb_adapter *adap, |
309 | struct media_device *mdev) |
310 | { |
311 | adap->mdev = mdev; |
312 | } |
313 | |
314 | /** |
315 | * dvb_get_media_controller - gets the associated media controller |
316 | * |
317 | * @adap: pointer to &struct dvb_adapter |
318 | */ |
319 | static inline struct media_device * |
320 | dvb_get_media_controller(struct dvb_adapter *adap) |
321 | { |
322 | return adap->mdev; |
323 | } |
324 | #else |
325 | static inline |
326 | int dvb_create_media_graph(struct dvb_adapter *adap, |
327 | bool create_rf_connector) |
328 | { |
329 | return 0; |
330 | }; |
331 | #define dvb_register_media_controller(a, b) {} |
332 | #define dvb_get_media_controller(a) NULL |
333 | #endif |
334 | |
335 | /** |
336 | * dvb_generic_open - Digital TV open function, used by DVB devices |
337 | * |
338 | * @inode: pointer to &struct inode. |
339 | * @file: pointer to &struct file. |
340 | * |
341 | * Checks if a DVB devnode is still valid, and if the permissions are |
342 | * OK and increment negative use count. |
343 | */ |
344 | int dvb_generic_open(struct inode *inode, struct file *file); |
345 | |
346 | /** |
347 | * dvb_generic_release - Digital TV close function, used by DVB devices |
348 | * |
349 | * @inode: pointer to &struct inode. |
350 | * @file: pointer to &struct file. |
351 | * |
352 | * Checks if a DVB devnode is still valid, and if the permissions are |
353 | * OK and decrement negative use count. |
354 | */ |
355 | int dvb_generic_release(struct inode *inode, struct file *file); |
356 | |
357 | /** |
358 | * dvb_generic_ioctl - Digital TV close function, used by DVB devices |
359 | * |
360 | * @file: pointer to &struct file. |
361 | * @cmd: Ioctl name. |
362 | * @arg: Ioctl argument. |
363 | * |
364 | * Checks if a DVB devnode and struct dvbdev.kernel_ioctl is still valid. |
365 | * If so, calls dvb_usercopy(). |
366 | */ |
367 | long dvb_generic_ioctl(struct file *file, |
368 | unsigned int cmd, unsigned long arg); |
369 | |
370 | /** |
371 | * dvb_usercopy - copies data from/to userspace memory when an ioctl is |
372 | * issued. |
373 | * |
374 | * @file: Pointer to struct &file. |
375 | * @cmd: Ioctl name. |
376 | * @arg: Ioctl argument. |
377 | * @func: function that will actually handle the ioctl |
378 | * |
379 | * Ancillary function that uses ioctl direction and size to copy from |
380 | * userspace. Then, it calls @func, and, if needed, data is copied back |
381 | * to userspace. |
382 | */ |
383 | int dvb_usercopy(struct file *file, unsigned int cmd, unsigned long arg, |
384 | int (*func)(struct file *file, unsigned int cmd, void *arg)); |
385 | |
386 | #if IS_ENABLED(CONFIG_I2C) |
387 | |
388 | struct i2c_adapter; |
389 | struct i2c_client; |
390 | /** |
391 | * dvb_module_probe - helper routine to probe an I2C module |
392 | * |
393 | * @module_name: |
394 | * Name of the I2C module to be probed |
395 | * @name: |
396 | * Optional name for the I2C module. Used for debug purposes. |
397 | * If %NULL, defaults to @module_name. |
398 | * @adap: |
399 | * pointer to &struct i2c_adapter that describes the I2C adapter where |
400 | * the module will be bound. |
401 | * @addr: |
402 | * I2C address of the adapter, in 7-bit notation. |
403 | * @platform_data: |
404 | * Platform data to be passed to the I2C module probed. |
405 | * |
406 | * This function binds an I2C device into the DVB core. Should be used by |
407 | * all drivers that use I2C bus to control the hardware. A module bound |
408 | * with dvb_module_probe() should use dvb_module_release() to unbind. |
409 | * |
410 | * Return: |
411 | * On success, return an &struct i2c_client, pointing to the bound |
412 | * I2C device. %NULL otherwise. |
413 | * |
414 | * .. note:: |
415 | * |
416 | * In the past, DVB modules (mainly, frontends) were bound via dvb_attach() |
417 | * macro, with does an ugly hack, using I2C low level functions. Such |
418 | * usage is deprecated and will be removed soon. Instead, use this routine. |
419 | */ |
420 | struct i2c_client *dvb_module_probe(const char *module_name, |
421 | const char *name, |
422 | struct i2c_adapter *adap, |
423 | unsigned char addr, |
424 | void *platform_data); |
425 | |
426 | /** |
427 | * dvb_module_release - releases an I2C device allocated with |
428 | * dvb_module_probe(). |
429 | * |
430 | * @client: pointer to &struct i2c_client with the I2C client to be released. |
431 | * can be %NULL. |
432 | * |
433 | * This function should be used to free all resources reserved by |
434 | * dvb_module_probe() and unbinding the I2C hardware. |
435 | */ |
436 | void dvb_module_release(struct i2c_client *client); |
437 | |
438 | #endif /* CONFIG_I2C */ |
439 | |
440 | /* Legacy generic DVB attach function. */ |
441 | #ifdef CONFIG_MEDIA_ATTACH |
442 | |
443 | /** |
444 | * dvb_attach - attaches a DVB frontend into the DVB core. |
445 | * |
446 | * @FUNCTION: function on a frontend module to be called. |
447 | * @ARGS: @FUNCTION arguments. |
448 | * |
449 | * This ancillary function loads a frontend module in runtime and runs |
450 | * the @FUNCTION function there, with @ARGS. |
451 | * As it increments symbol usage cont, at unregister, dvb_detach() |
452 | * should be called. |
453 | * |
454 | * .. note:: |
455 | * |
456 | * In the past, DVB modules (mainly, frontends) were bound via dvb_attach() |
457 | * macro, with does an ugly hack, using I2C low level functions. Such |
458 | * usage is deprecated and will be removed soon. Instead, you should use |
459 | * dvb_module_probe(). |
460 | */ |
461 | #define dvb_attach(FUNCTION, ARGS...) ({ \ |
462 | void *__r = NULL; \ |
463 | typeof(&FUNCTION) __a = symbol_request(FUNCTION); \ |
464 | if (__a) { \ |
465 | __r = (void *) __a(ARGS); \ |
466 | if (__r == NULL) \ |
467 | symbol_put(FUNCTION); \ |
468 | } else { \ |
469 | printk(KERN_ERR "DVB: Unable to find symbol "#FUNCTION"()\n"); \ |
470 | } \ |
471 | __r; \ |
472 | }) |
473 | |
474 | /** |
475 | * dvb_detach - detaches a DVB frontend loaded via dvb_attach() |
476 | * |
477 | * @FUNC: attach function |
478 | * |
479 | * Decrements usage count for a function previously called via dvb_attach(). |
480 | */ |
481 | |
482 | #define dvb_detach(FUNC) symbol_put_addr(FUNC) |
483 | |
484 | #else |
485 | #define dvb_attach(FUNCTION, ARGS...) ({ \ |
486 | FUNCTION(ARGS); \ |
487 | }) |
488 | |
489 | #define dvb_detach(FUNC) {} |
490 | |
491 | #endif /* CONFIG_MEDIA_ATTACH */ |
492 | |
493 | #endif /* #ifndef _DVBDEV_H_ */ |
494 | |