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