linux/drivers/media/dvb-core/dvbdev.h
<<
>>
Prefs
   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 * You should have received a copy of the GNU Lesser General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20 *
  21 */
  22
  23#ifndef _DVBDEV_H_
  24#define _DVBDEV_H_
  25
  26#include <linux/types.h>
  27#include <linux/poll.h>
  28#include <linux/fs.h>
  29#include <linux/list.h>
  30#include <media/media-device.h>
  31
  32#define DVB_MAJOR 212
  33
  34#if defined(CONFIG_DVB_MAX_ADAPTERS) && CONFIG_DVB_MAX_ADAPTERS > 0
  35  #define DVB_MAX_ADAPTERS CONFIG_DVB_MAX_ADAPTERS
  36#else
  37  #define DVB_MAX_ADAPTERS 8
  38#endif
  39
  40#define DVB_UNSET (-1)
  41
  42#define DVB_DEVICE_VIDEO      0
  43#define DVB_DEVICE_AUDIO      1
  44#define DVB_DEVICE_SEC        2
  45#define DVB_DEVICE_FRONTEND   3
  46#define DVB_DEVICE_DEMUX      4
  47#define DVB_DEVICE_DVR        5
  48#define DVB_DEVICE_CA         6
  49#define DVB_DEVICE_NET        7
  50#define DVB_DEVICE_OSD        8
  51
  52#define DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr) \
  53        static short adapter_nr[] = \
  54                {[0 ... (DVB_MAX_ADAPTERS - 1)] = DVB_UNSET }; \
  55        module_param_array(adapter_nr, short, NULL, 0444); \
  56        MODULE_PARM_DESC(adapter_nr, "DVB adapter numbers")
  57
  58struct dvb_frontend;
  59
  60/**
  61 * struct dvb_adapter - represents a Digital TV adapter using Linux DVB API
  62 *
  63 * @num:                Number of the adapter
  64 * @list_head:          List with the DVB adapters
  65 * @device_list:        List with the DVB devices
  66 * @name:               Name of the adapter
  67 * @proposed_mac:       proposed MAC address for the adapter
  68 * @priv:               private data
  69 * @device:             pointer to struct device
  70 * @module:             pointer to struct module
  71 * @mfe_shared:         mfe shared: indicates mutually exclusive frontends
  72 *                      Thie usage of this flag is currently deprecated
  73 * @mfe_dvbdev:         Frontend device in use, in the case of MFE
  74 * @mfe_lock:           Lock to prevent using the other frontends when MFE is
  75 *                      used.
  76 * @mdev:               pointer to struct media_device, used when the media
  77 *                      controller is used.
  78 * @conn:               RF connector. Used only if the device has no separate
  79 *                      tuner.
  80 * @conn_pads:          pointer to struct media_pad associated with @conn;
  81 */
  82struct dvb_adapter {
  83        int num;
  84        struct list_head list_head;
  85        struct list_head device_list;
  86        const char *name;
  87        u8 proposed_mac [6];
  88        void* priv;
  89
  90        struct device *device;
  91
  92        struct module *module;
  93
  94        int mfe_shared;                 /* indicates mutually exclusive frontends */
  95        struct dvb_device *mfe_dvbdev;  /* frontend device in use */
  96        struct mutex mfe_lock;          /* access lock for thread creation */
  97
  98#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
  99        struct media_device *mdev;
 100        struct media_entity *conn;
 101        struct media_pad *conn_pads;
 102#endif
 103};
 104
 105/**
 106 * struct dvb_device - represents a DVB device node
 107 *
 108 * @list_head:  List head with all DVB devices
 109 * @fops:       pointer to struct file_operations
 110 * @adapter:    pointer to the adapter that holds this device node
 111 * @type:       type of the device: DVB_DEVICE_SEC, DVB_DEVICE_FRONTEND,
 112 *              DVB_DEVICE_DEMUX, DVB_DEVICE_DVR, DVB_DEVICE_CA, DVB_DEVICE_NET
 113 * @minor:      devnode minor number. Major number is always DVB_MAJOR.
 114 * @id:         device ID number, inside the adapter
 115 * @readers:    Initialized by the caller. Each call to open() in Read Only mode
 116 *              decreases this counter by one.
 117 * @writers:    Initialized by the caller. Each call to open() in Read/Write
 118 *              mode decreases this counter by one.
 119 * @users:      Initialized by the caller. Each call to open() in any mode
 120 *              decreases this counter by one.
 121 * @wait_queue: wait queue, used to wait for certain events inside one of
 122 *              the DVB API callers
 123 * @kernel_ioctl: callback function used to handle ioctl calls from userspace.
 124 * @name:       Name to be used for the device at the Media Controller
 125 * @entity:     pointer to struct media_entity associated with the device node
 126 * @pads:       pointer to struct media_pad associated with @entity;
 127 * @priv:       private data
 128 * @intf_devnode: Pointer to media_intf_devnode. Used by the dvbdev core to
 129 *              store the MC device node interface
 130 * @tsout_num_entities: Number of Transport Stream output entities
 131 * @tsout_entity: array with MC entities associated to each TS output node
 132 * @tsout_pads: array with the source pads for each @tsout_entity
 133 *
 134 * This structure is used by the DVB core (frontend, CA, net, demux) in
 135 * order to create the device nodes. Usually, driver should not initialize
 136 * this struct diretly.
 137 */
 138struct dvb_device {
 139        struct list_head list_head;
 140        const struct file_operations *fops;
 141        struct dvb_adapter *adapter;
 142        int type;
 143        int minor;
 144        u32 id;
 145
 146        /* in theory, 'users' can vanish now,
 147           but I don't want to change too much now... */
 148        int readers;
 149        int writers;
 150        int users;
 151
 152        wait_queue_head_t         wait_queue;
 153        /* don't really need those !? -- FIXME: use video_usercopy  */
 154        int (*kernel_ioctl)(struct file *file, unsigned int cmd, void *arg);
 155
 156        /* Needed for media controller register/unregister */
 157#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
 158        const char *name;
 159
 160        /* Allocated and filled inside dvbdev.c */
 161        struct media_intf_devnode *intf_devnode;
 162
 163        unsigned tsout_num_entities;
 164        struct media_entity *entity, *tsout_entity;
 165        struct media_pad *pads, *tsout_pads;
 166#endif
 167
 168        void *priv;
 169};
 170
 171/**
 172 * dvb_register_adapter - Registers a new DVB adapter
 173 *
 174 * @adap:       pointer to struct dvb_adapter
 175 * @name:       Adapter's name
 176 * @module:     initialized with THIS_MODULE at the caller
 177 * @device:     pointer to struct device that corresponds to the device driver
 178 * @adapter_nums: Array with a list of the numbers for @dvb_register_adapter;
 179 *              to select among them. Typically, initialized with:
 180 *              DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nums)
 181 */
 182int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
 183                         struct module *module, struct device *device,
 184                         short *adapter_nums);
 185
 186/**
 187 * dvb_unregister_adapter - Unregisters a DVB adapter
 188 *
 189 * @adap:       pointer to struct dvb_adapter
 190 */
 191int dvb_unregister_adapter(struct dvb_adapter *adap);
 192
 193/**
 194 * dvb_register_device - Registers a new DVB device
 195 *
 196 * @adap:       pointer to struct dvb_adapter
 197 * @pdvbdev:    pointer to the place where the new struct dvb_device will be
 198 *              stored
 199 * @template:   Template used to create &pdvbdev;
 200 * @priv:       private data
 201 * @type:       type of the device: %DVB_DEVICE_SEC, %DVB_DEVICE_FRONTEND,
 202 *              %DVB_DEVICE_DEMUX, %DVB_DEVICE_DVR, %DVB_DEVICE_CA,
 203 *              %DVB_DEVICE_NET
 204 * @demux_sink_pads: Number of demux outputs, to be used to create the TS
 205 *              outputs via the Media Controller.
 206 */
 207int dvb_register_device(struct dvb_adapter *adap,
 208                        struct dvb_device **pdvbdev,
 209                        const struct dvb_device *template,
 210                        void *priv,
 211                        int type,
 212                        int demux_sink_pads);
 213
 214/**
 215 * dvb_unregister_device - Unregisters a DVB device
 216 *
 217 * @dvbdev:     pointer to struct dvb_device
 218 */
 219void dvb_unregister_device(struct dvb_device *dvbdev);
 220
 221#ifdef CONFIG_MEDIA_CONTROLLER_DVB
 222/**
 223 * dvb_create_media_graph - Creates media graph for the Digital TV part of the
 224 *                              device.
 225 *
 226 * @adap:                       pointer to struct dvb_adapter
 227 * @create_rf_connector:        if true, it creates the RF connector too
 228 *
 229 * This function checks all DVB-related functions at the media controller
 230 * entities and creates the needed links for the media graph. It is
 231 * capable of working with multiple tuners or multiple frontends, but it
 232 * won't create links if the device has multiple tuners and multiple frontends
 233 * or if the device has multiple muxes. In such case, the caller driver should
 234 * manually create the remaining links.
 235 */
 236__must_check int dvb_create_media_graph(struct dvb_adapter *adap,
 237                                        bool create_rf_connector);
 238
 239static inline void dvb_register_media_controller(struct dvb_adapter *adap,
 240                                                 struct media_device *mdev)
 241{
 242        adap->mdev = mdev;
 243}
 244
 245static inline struct media_device
 246*dvb_get_media_controller(struct dvb_adapter *adap)
 247{
 248        return adap->mdev;
 249}
 250#else
 251static inline
 252int dvb_create_media_graph(struct dvb_adapter *adap,
 253                           bool create_rf_connector)
 254{
 255        return 0;
 256};
 257#define dvb_register_media_controller(a, b) {}
 258#define dvb_get_media_controller(a) NULL
 259#endif
 260
 261int dvb_generic_open (struct inode *inode, struct file *file);
 262int dvb_generic_release (struct inode *inode, struct file *file);
 263long dvb_generic_ioctl (struct file *file,
 264                              unsigned int cmd, unsigned long arg);
 265
 266/* we don't mess with video_usercopy() any more,
 267we simply define out own dvb_usercopy(), which will hopefully become
 268generic_usercopy()  someday... */
 269
 270int dvb_usercopy(struct file *file, unsigned int cmd, unsigned long arg,
 271                 int (*func)(struct file *file, unsigned int cmd, void *arg));
 272
 273/** generic DVB attach function. */
 274#ifdef CONFIG_MEDIA_ATTACH
 275#define dvb_attach(FUNCTION, ARGS...) ({ \
 276        void *__r = NULL; \
 277        typeof(&FUNCTION) __a = symbol_request(FUNCTION); \
 278        if (__a) { \
 279                __r = (void *) __a(ARGS); \
 280                if (__r == NULL) \
 281                        symbol_put(FUNCTION); \
 282        } else { \
 283                printk(KERN_ERR "DVB: Unable to find symbol "#FUNCTION"()\n"); \
 284        } \
 285        __r; \
 286})
 287
 288#define dvb_detach(FUNC)        symbol_put_addr(FUNC)
 289
 290#else
 291#define dvb_attach(FUNCTION, ARGS...) ({ \
 292        FUNCTION(ARGS); \
 293})
 294
 295#define dvb_detach(FUNC)        {}
 296
 297#endif
 298
 299#endif /* #ifndef _DVBDEV_H_ */
 300