Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/media/dvbdev.h
26282 views
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
495