162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * dvbdev.h 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2000 Ralph Metzler & Marcus Metzler 562306a36Sopenharmony_ci * for convergence integrated media GmbH 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or 862306a36Sopenharmony_ci * modify it under the terms of the GNU General Lesser Public License 962306a36Sopenharmony_ci * as published by the Free Software Foundation; either version 2.1 1062306a36Sopenharmony_ci * of the License, or (at your option) any later version. 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * This program is distributed in the hope that it will be useful, 1362306a36Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 1462306a36Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1562306a36Sopenharmony_ci * GNU General Public License for more details. 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#ifndef _DVBDEV_H_ 2062306a36Sopenharmony_ci#define _DVBDEV_H_ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <linux/types.h> 2362306a36Sopenharmony_ci#include <linux/poll.h> 2462306a36Sopenharmony_ci#include <linux/fs.h> 2562306a36Sopenharmony_ci#include <linux/list.h> 2662306a36Sopenharmony_ci#include <media/media-device.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define DVB_MAJOR 212 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#if defined(CONFIG_DVB_MAX_ADAPTERS) && CONFIG_DVB_MAX_ADAPTERS > 0 3162306a36Sopenharmony_ci #define DVB_MAX_ADAPTERS CONFIG_DVB_MAX_ADAPTERS 3262306a36Sopenharmony_ci#else 3362306a36Sopenharmony_ci #define DVB_MAX_ADAPTERS 16 3462306a36Sopenharmony_ci#endif 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define DVB_UNSET (-1) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* List of DVB device types */ 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/** 4162306a36Sopenharmony_ci * enum dvb_device_type - type of the Digital TV device 4262306a36Sopenharmony_ci * 4362306a36Sopenharmony_ci * @DVB_DEVICE_SEC: Digital TV standalone Common Interface (CI) 4462306a36Sopenharmony_ci * @DVB_DEVICE_FRONTEND: Digital TV frontend. 4562306a36Sopenharmony_ci * @DVB_DEVICE_DEMUX: Digital TV demux. 4662306a36Sopenharmony_ci * @DVB_DEVICE_DVR: Digital TV digital video record (DVR). 4762306a36Sopenharmony_ci * @DVB_DEVICE_CA: Digital TV Conditional Access (CA). 4862306a36Sopenharmony_ci * @DVB_DEVICE_NET: Digital TV network. 4962306a36Sopenharmony_ci * 5062306a36Sopenharmony_ci * @DVB_DEVICE_VIDEO: Digital TV video decoder. 5162306a36Sopenharmony_ci * Deprecated. Used only on av7110-av. 5262306a36Sopenharmony_ci * @DVB_DEVICE_AUDIO: Digital TV audio decoder. 5362306a36Sopenharmony_ci * Deprecated. Used only on av7110-av. 5462306a36Sopenharmony_ci * @DVB_DEVICE_OSD: Digital TV On Screen Display (OSD). 5562306a36Sopenharmony_ci * Deprecated. Used only on av7110. 5662306a36Sopenharmony_ci */ 5762306a36Sopenharmony_cienum dvb_device_type { 5862306a36Sopenharmony_ci DVB_DEVICE_SEC, 5962306a36Sopenharmony_ci DVB_DEVICE_FRONTEND, 6062306a36Sopenharmony_ci DVB_DEVICE_DEMUX, 6162306a36Sopenharmony_ci DVB_DEVICE_DVR, 6262306a36Sopenharmony_ci DVB_DEVICE_CA, 6362306a36Sopenharmony_ci DVB_DEVICE_NET, 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci DVB_DEVICE_VIDEO, 6662306a36Sopenharmony_ci DVB_DEVICE_AUDIO, 6762306a36Sopenharmony_ci DVB_DEVICE_OSD, 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#define DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr) \ 7162306a36Sopenharmony_ci static short adapter_nr[] = \ 7262306a36Sopenharmony_ci {[0 ... (DVB_MAX_ADAPTERS - 1)] = DVB_UNSET }; \ 7362306a36Sopenharmony_ci module_param_array(adapter_nr, short, NULL, 0444); \ 7462306a36Sopenharmony_ci MODULE_PARM_DESC(adapter_nr, "DVB adapter numbers") 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistruct dvb_frontend; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci/** 7962306a36Sopenharmony_ci * struct dvb_adapter - represents a Digital TV adapter using Linux DVB API 8062306a36Sopenharmony_ci * 8162306a36Sopenharmony_ci * @num: Number of the adapter 8262306a36Sopenharmony_ci * @list_head: List with the DVB adapters 8362306a36Sopenharmony_ci * @device_list: List with the DVB devices 8462306a36Sopenharmony_ci * @name: Name of the adapter 8562306a36Sopenharmony_ci * @proposed_mac: proposed MAC address for the adapter 8662306a36Sopenharmony_ci * @priv: private data 8762306a36Sopenharmony_ci * @device: pointer to struct device 8862306a36Sopenharmony_ci * @module: pointer to struct module 8962306a36Sopenharmony_ci * @mfe_shared: indicates mutually exclusive frontends. 9062306a36Sopenharmony_ci * 1 = legacy exclusion behavior: blocking any open() call 9162306a36Sopenharmony_ci * 2 = enhanced exclusion behavior, emulating the standard 9262306a36Sopenharmony_ci * behavior of busy frontends: allowing read-only sharing 9362306a36Sopenharmony_ci * and otherwise returning immediately with -EBUSY when any 9462306a36Sopenharmony_ci * of the frontends is already opened with write access. 9562306a36Sopenharmony_ci * @mfe_dvbdev: Frontend device in use, in the case of MFE 9662306a36Sopenharmony_ci * @mfe_lock: Lock to prevent using the other frontends when MFE is 9762306a36Sopenharmony_ci * used. 9862306a36Sopenharmony_ci * @mdev_lock: Protect access to the mdev pointer. 9962306a36Sopenharmony_ci * @mdev: pointer to struct media_device, used when the media 10062306a36Sopenharmony_ci * controller is used. 10162306a36Sopenharmony_ci * @conn: RF connector. Used only if the device has no separate 10262306a36Sopenharmony_ci * tuner. 10362306a36Sopenharmony_ci * @conn_pads: pointer to struct media_pad associated with @conn; 10462306a36Sopenharmony_ci */ 10562306a36Sopenharmony_cistruct dvb_adapter { 10662306a36Sopenharmony_ci int num; 10762306a36Sopenharmony_ci struct list_head list_head; 10862306a36Sopenharmony_ci struct list_head device_list; 10962306a36Sopenharmony_ci const char *name; 11062306a36Sopenharmony_ci u8 proposed_mac [6]; 11162306a36Sopenharmony_ci void* priv; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci struct device *device; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci struct module *module; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci int mfe_shared; /* indicates mutually exclusive frontends */ 11862306a36Sopenharmony_ci struct dvb_device *mfe_dvbdev; /* frontend device in use */ 11962306a36Sopenharmony_ci struct mutex mfe_lock; /* access lock for thread creation */ 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci#if defined(CONFIG_MEDIA_CONTROLLER_DVB) 12262306a36Sopenharmony_ci struct mutex mdev_lock; 12362306a36Sopenharmony_ci struct media_device *mdev; 12462306a36Sopenharmony_ci struct media_entity *conn; 12562306a36Sopenharmony_ci struct media_pad *conn_pads; 12662306a36Sopenharmony_ci#endif 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci/** 13062306a36Sopenharmony_ci * struct dvb_device - represents a DVB device node 13162306a36Sopenharmony_ci * 13262306a36Sopenharmony_ci * @list_head: List head with all DVB devices 13362306a36Sopenharmony_ci * @ref: reference count for this device 13462306a36Sopenharmony_ci * @fops: pointer to struct file_operations 13562306a36Sopenharmony_ci * @adapter: pointer to the adapter that holds this device node 13662306a36Sopenharmony_ci * @type: type of the device, as defined by &enum dvb_device_type. 13762306a36Sopenharmony_ci * @minor: devnode minor number. Major number is always DVB_MAJOR. 13862306a36Sopenharmony_ci * @id: device ID number, inside the adapter 13962306a36Sopenharmony_ci * @readers: Initialized by the caller. Each call to open() in Read Only mode 14062306a36Sopenharmony_ci * decreases this counter by one. 14162306a36Sopenharmony_ci * @writers: Initialized by the caller. Each call to open() in Read/Write 14262306a36Sopenharmony_ci * mode decreases this counter by one. 14362306a36Sopenharmony_ci * @users: Initialized by the caller. Each call to open() in any mode 14462306a36Sopenharmony_ci * decreases this counter by one. 14562306a36Sopenharmony_ci * @wait_queue: wait queue, used to wait for certain events inside one of 14662306a36Sopenharmony_ci * the DVB API callers 14762306a36Sopenharmony_ci * @kernel_ioctl: callback function used to handle ioctl calls from userspace. 14862306a36Sopenharmony_ci * @name: Name to be used for the device at the Media Controller 14962306a36Sopenharmony_ci * @entity: pointer to struct media_entity associated with the device node 15062306a36Sopenharmony_ci * @pads: pointer to struct media_pad associated with @entity; 15162306a36Sopenharmony_ci * @priv: private data 15262306a36Sopenharmony_ci * @intf_devnode: Pointer to media_intf_devnode. Used by the dvbdev core to 15362306a36Sopenharmony_ci * store the MC device node interface 15462306a36Sopenharmony_ci * @tsout_num_entities: Number of Transport Stream output entities 15562306a36Sopenharmony_ci * @tsout_entity: array with MC entities associated to each TS output node 15662306a36Sopenharmony_ci * @tsout_pads: array with the source pads for each @tsout_entity 15762306a36Sopenharmony_ci * 15862306a36Sopenharmony_ci * This structure is used by the DVB core (frontend, CA, net, demux) in 15962306a36Sopenharmony_ci * order to create the device nodes. Usually, driver should not initialize 16062306a36Sopenharmony_ci * this struct diretly. 16162306a36Sopenharmony_ci */ 16262306a36Sopenharmony_cistruct dvb_device { 16362306a36Sopenharmony_ci struct list_head list_head; 16462306a36Sopenharmony_ci struct kref ref; 16562306a36Sopenharmony_ci const struct file_operations *fops; 16662306a36Sopenharmony_ci struct dvb_adapter *adapter; 16762306a36Sopenharmony_ci enum dvb_device_type type; 16862306a36Sopenharmony_ci int minor; 16962306a36Sopenharmony_ci u32 id; 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci /* in theory, 'users' can vanish now, 17262306a36Sopenharmony_ci but I don't want to change too much now... */ 17362306a36Sopenharmony_ci int readers; 17462306a36Sopenharmony_ci int writers; 17562306a36Sopenharmony_ci int users; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci wait_queue_head_t wait_queue; 17862306a36Sopenharmony_ci /* don't really need those !? -- FIXME: use video_usercopy */ 17962306a36Sopenharmony_ci int (*kernel_ioctl)(struct file *file, unsigned int cmd, void *arg); 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci /* Needed for media controller register/unregister */ 18262306a36Sopenharmony_ci#if defined(CONFIG_MEDIA_CONTROLLER_DVB) 18362306a36Sopenharmony_ci const char *name; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci /* Allocated and filled inside dvbdev.c */ 18662306a36Sopenharmony_ci struct media_intf_devnode *intf_devnode; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci unsigned tsout_num_entities; 18962306a36Sopenharmony_ci struct media_entity *entity, *tsout_entity; 19062306a36Sopenharmony_ci struct media_pad *pads, *tsout_pads; 19162306a36Sopenharmony_ci#endif 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci void *priv; 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci/** 19762306a36Sopenharmony_ci * struct dvbdevfops_node - fops nodes registered in dvbdevfops_list 19862306a36Sopenharmony_ci * 19962306a36Sopenharmony_ci * @fops: Dynamically allocated fops for ->owner registration 20062306a36Sopenharmony_ci * @type: type of dvb_device 20162306a36Sopenharmony_ci * @template: dvb_device used for registration 20262306a36Sopenharmony_ci * @list_head: list_head for dvbdevfops_list 20362306a36Sopenharmony_ci */ 20462306a36Sopenharmony_cistruct dvbdevfops_node { 20562306a36Sopenharmony_ci struct file_operations *fops; 20662306a36Sopenharmony_ci enum dvb_device_type type; 20762306a36Sopenharmony_ci const struct dvb_device *template; 20862306a36Sopenharmony_ci struct list_head list_head; 20962306a36Sopenharmony_ci}; 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci/** 21262306a36Sopenharmony_ci * dvb_device_get - Increase dvb_device reference 21362306a36Sopenharmony_ci * 21462306a36Sopenharmony_ci * @dvbdev: pointer to struct dvb_device 21562306a36Sopenharmony_ci */ 21662306a36Sopenharmony_cistruct dvb_device *dvb_device_get(struct dvb_device *dvbdev); 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci/** 21962306a36Sopenharmony_ci * dvb_device_put - Decrease dvb_device reference 22062306a36Sopenharmony_ci * 22162306a36Sopenharmony_ci * @dvbdev: pointer to struct dvb_device 22262306a36Sopenharmony_ci */ 22362306a36Sopenharmony_civoid dvb_device_put(struct dvb_device *dvbdev); 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci/** 22662306a36Sopenharmony_ci * dvb_register_adapter - Registers a new DVB adapter 22762306a36Sopenharmony_ci * 22862306a36Sopenharmony_ci * @adap: pointer to struct dvb_adapter 22962306a36Sopenharmony_ci * @name: Adapter's name 23062306a36Sopenharmony_ci * @module: initialized with THIS_MODULE at the caller 23162306a36Sopenharmony_ci * @device: pointer to struct device that corresponds to the device driver 23262306a36Sopenharmony_ci * @adapter_nums: Array with a list of the numbers for @dvb_register_adapter; 23362306a36Sopenharmony_ci * to select among them. Typically, initialized with: 23462306a36Sopenharmony_ci * DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nums) 23562306a36Sopenharmony_ci */ 23662306a36Sopenharmony_ciint dvb_register_adapter(struct dvb_adapter *adap, const char *name, 23762306a36Sopenharmony_ci struct module *module, struct device *device, 23862306a36Sopenharmony_ci short *adapter_nums); 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci/** 24162306a36Sopenharmony_ci * dvb_unregister_adapter - Unregisters a DVB adapter 24262306a36Sopenharmony_ci * 24362306a36Sopenharmony_ci * @adap: pointer to struct dvb_adapter 24462306a36Sopenharmony_ci */ 24562306a36Sopenharmony_ciint dvb_unregister_adapter(struct dvb_adapter *adap); 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci/** 24862306a36Sopenharmony_ci * dvb_register_device - Registers a new DVB device 24962306a36Sopenharmony_ci * 25062306a36Sopenharmony_ci * @adap: pointer to struct dvb_adapter 25162306a36Sopenharmony_ci * @pdvbdev: pointer to the place where the new struct dvb_device will be 25262306a36Sopenharmony_ci * stored 25362306a36Sopenharmony_ci * @template: Template used to create &pdvbdev; 25462306a36Sopenharmony_ci * @priv: private data 25562306a36Sopenharmony_ci * @type: type of the device, as defined by &enum dvb_device_type. 25662306a36Sopenharmony_ci * @demux_sink_pads: Number of demux outputs, to be used to create the TS 25762306a36Sopenharmony_ci * outputs via the Media Controller. 25862306a36Sopenharmony_ci */ 25962306a36Sopenharmony_ciint dvb_register_device(struct dvb_adapter *adap, 26062306a36Sopenharmony_ci struct dvb_device **pdvbdev, 26162306a36Sopenharmony_ci const struct dvb_device *template, 26262306a36Sopenharmony_ci void *priv, 26362306a36Sopenharmony_ci enum dvb_device_type type, 26462306a36Sopenharmony_ci int demux_sink_pads); 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci/** 26762306a36Sopenharmony_ci * dvb_remove_device - Remove a registered DVB device 26862306a36Sopenharmony_ci * 26962306a36Sopenharmony_ci * @dvbdev: pointer to struct dvb_device 27062306a36Sopenharmony_ci * 27162306a36Sopenharmony_ci * This does not free memory. dvb_free_device() will do that when 27262306a36Sopenharmony_ci * reference counter is empty 27362306a36Sopenharmony_ci */ 27462306a36Sopenharmony_civoid dvb_remove_device(struct dvb_device *dvbdev); 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci/** 27862306a36Sopenharmony_ci * dvb_unregister_device - Unregisters a DVB device 27962306a36Sopenharmony_ci * 28062306a36Sopenharmony_ci * @dvbdev: pointer to struct dvb_device 28162306a36Sopenharmony_ci */ 28262306a36Sopenharmony_civoid dvb_unregister_device(struct dvb_device *dvbdev); 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci#ifdef CONFIG_MEDIA_CONTROLLER_DVB 28562306a36Sopenharmony_ci/** 28662306a36Sopenharmony_ci * dvb_create_media_graph - Creates media graph for the Digital TV part of the 28762306a36Sopenharmony_ci * device. 28862306a36Sopenharmony_ci * 28962306a36Sopenharmony_ci * @adap: pointer to &struct dvb_adapter 29062306a36Sopenharmony_ci * @create_rf_connector: if true, it creates the RF connector too 29162306a36Sopenharmony_ci * 29262306a36Sopenharmony_ci * This function checks all DVB-related functions at the media controller 29362306a36Sopenharmony_ci * entities and creates the needed links for the media graph. It is 29462306a36Sopenharmony_ci * capable of working with multiple tuners or multiple frontends, but it 29562306a36Sopenharmony_ci * won't create links if the device has multiple tuners and multiple frontends 29662306a36Sopenharmony_ci * or if the device has multiple muxes. In such case, the caller driver should 29762306a36Sopenharmony_ci * manually create the remaining links. 29862306a36Sopenharmony_ci */ 29962306a36Sopenharmony_ci__must_check int dvb_create_media_graph(struct dvb_adapter *adap, 30062306a36Sopenharmony_ci bool create_rf_connector); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci/** 30362306a36Sopenharmony_ci * dvb_register_media_controller - registers a media controller at DVB adapter 30462306a36Sopenharmony_ci * 30562306a36Sopenharmony_ci * @adap: pointer to &struct dvb_adapter 30662306a36Sopenharmony_ci * @mdev: pointer to &struct media_device 30762306a36Sopenharmony_ci */ 30862306a36Sopenharmony_cistatic inline void dvb_register_media_controller(struct dvb_adapter *adap, 30962306a36Sopenharmony_ci struct media_device *mdev) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci adap->mdev = mdev; 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci/** 31562306a36Sopenharmony_ci * dvb_get_media_controller - gets the associated media controller 31662306a36Sopenharmony_ci * 31762306a36Sopenharmony_ci * @adap: pointer to &struct dvb_adapter 31862306a36Sopenharmony_ci */ 31962306a36Sopenharmony_cistatic inline struct media_device * 32062306a36Sopenharmony_cidvb_get_media_controller(struct dvb_adapter *adap) 32162306a36Sopenharmony_ci{ 32262306a36Sopenharmony_ci return adap->mdev; 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci#else 32562306a36Sopenharmony_cistatic inline 32662306a36Sopenharmony_ciint dvb_create_media_graph(struct dvb_adapter *adap, 32762306a36Sopenharmony_ci bool create_rf_connector) 32862306a36Sopenharmony_ci{ 32962306a36Sopenharmony_ci return 0; 33062306a36Sopenharmony_ci}; 33162306a36Sopenharmony_ci#define dvb_register_media_controller(a, b) {} 33262306a36Sopenharmony_ci#define dvb_get_media_controller(a) NULL 33362306a36Sopenharmony_ci#endif 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci/** 33662306a36Sopenharmony_ci * dvb_generic_open - Digital TV open function, used by DVB devices 33762306a36Sopenharmony_ci * 33862306a36Sopenharmony_ci * @inode: pointer to &struct inode. 33962306a36Sopenharmony_ci * @file: pointer to &struct file. 34062306a36Sopenharmony_ci * 34162306a36Sopenharmony_ci * Checks if a DVB devnode is still valid, and if the permissions are 34262306a36Sopenharmony_ci * OK and increment negative use count. 34362306a36Sopenharmony_ci */ 34462306a36Sopenharmony_ciint dvb_generic_open(struct inode *inode, struct file *file); 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ci/** 34762306a36Sopenharmony_ci * dvb_generic_release - Digital TV close function, used by DVB devices 34862306a36Sopenharmony_ci * 34962306a36Sopenharmony_ci * @inode: pointer to &struct inode. 35062306a36Sopenharmony_ci * @file: pointer to &struct file. 35162306a36Sopenharmony_ci * 35262306a36Sopenharmony_ci * Checks if a DVB devnode is still valid, and if the permissions are 35362306a36Sopenharmony_ci * OK and decrement negative use count. 35462306a36Sopenharmony_ci */ 35562306a36Sopenharmony_ciint dvb_generic_release(struct inode *inode, struct file *file); 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci/** 35862306a36Sopenharmony_ci * dvb_generic_ioctl - Digital TV close function, used by DVB devices 35962306a36Sopenharmony_ci * 36062306a36Sopenharmony_ci * @file: pointer to &struct file. 36162306a36Sopenharmony_ci * @cmd: Ioctl name. 36262306a36Sopenharmony_ci * @arg: Ioctl argument. 36362306a36Sopenharmony_ci * 36462306a36Sopenharmony_ci * Checks if a DVB devnode and struct dvbdev.kernel_ioctl is still valid. 36562306a36Sopenharmony_ci * If so, calls dvb_usercopy(). 36662306a36Sopenharmony_ci */ 36762306a36Sopenharmony_cilong dvb_generic_ioctl(struct file *file, 36862306a36Sopenharmony_ci unsigned int cmd, unsigned long arg); 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci/** 37162306a36Sopenharmony_ci * dvb_usercopy - copies data from/to userspace memory when an ioctl is 37262306a36Sopenharmony_ci * issued. 37362306a36Sopenharmony_ci * 37462306a36Sopenharmony_ci * @file: Pointer to struct &file. 37562306a36Sopenharmony_ci * @cmd: Ioctl name. 37662306a36Sopenharmony_ci * @arg: Ioctl argument. 37762306a36Sopenharmony_ci * @func: function that will actually handle the ioctl 37862306a36Sopenharmony_ci * 37962306a36Sopenharmony_ci * Ancillary function that uses ioctl direction and size to copy from 38062306a36Sopenharmony_ci * userspace. Then, it calls @func, and, if needed, data is copied back 38162306a36Sopenharmony_ci * to userspace. 38262306a36Sopenharmony_ci */ 38362306a36Sopenharmony_ciint dvb_usercopy(struct file *file, unsigned int cmd, unsigned long arg, 38462306a36Sopenharmony_ci int (*func)(struct file *file, unsigned int cmd, void *arg)); 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_I2C) 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_cistruct i2c_adapter; 38962306a36Sopenharmony_cistruct i2c_client; 39062306a36Sopenharmony_ci/** 39162306a36Sopenharmony_ci * dvb_module_probe - helper routine to probe an I2C module 39262306a36Sopenharmony_ci * 39362306a36Sopenharmony_ci * @module_name: 39462306a36Sopenharmony_ci * Name of the I2C module to be probed 39562306a36Sopenharmony_ci * @name: 39662306a36Sopenharmony_ci * Optional name for the I2C module. Used for debug purposes. 39762306a36Sopenharmony_ci * If %NULL, defaults to @module_name. 39862306a36Sopenharmony_ci * @adap: 39962306a36Sopenharmony_ci * pointer to &struct i2c_adapter that describes the I2C adapter where 40062306a36Sopenharmony_ci * the module will be bound. 40162306a36Sopenharmony_ci * @addr: 40262306a36Sopenharmony_ci * I2C address of the adapter, in 7-bit notation. 40362306a36Sopenharmony_ci * @platform_data: 40462306a36Sopenharmony_ci * Platform data to be passed to the I2C module probed. 40562306a36Sopenharmony_ci * 40662306a36Sopenharmony_ci * This function binds an I2C device into the DVB core. Should be used by 40762306a36Sopenharmony_ci * all drivers that use I2C bus to control the hardware. A module bound 40862306a36Sopenharmony_ci * with dvb_module_probe() should use dvb_module_release() to unbind. 40962306a36Sopenharmony_ci * 41062306a36Sopenharmony_ci * Return: 41162306a36Sopenharmony_ci * On success, return an &struct i2c_client, pointing to the bound 41262306a36Sopenharmony_ci * I2C device. %NULL otherwise. 41362306a36Sopenharmony_ci * 41462306a36Sopenharmony_ci * .. note:: 41562306a36Sopenharmony_ci * 41662306a36Sopenharmony_ci * In the past, DVB modules (mainly, frontends) were bound via dvb_attach() 41762306a36Sopenharmony_ci * macro, with does an ugly hack, using I2C low level functions. Such 41862306a36Sopenharmony_ci * usage is deprecated and will be removed soon. Instead, use this routine. 41962306a36Sopenharmony_ci */ 42062306a36Sopenharmony_cistruct i2c_client *dvb_module_probe(const char *module_name, 42162306a36Sopenharmony_ci const char *name, 42262306a36Sopenharmony_ci struct i2c_adapter *adap, 42362306a36Sopenharmony_ci unsigned char addr, 42462306a36Sopenharmony_ci void *platform_data); 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci/** 42762306a36Sopenharmony_ci * dvb_module_release - releases an I2C device allocated with 42862306a36Sopenharmony_ci * dvb_module_probe(). 42962306a36Sopenharmony_ci * 43062306a36Sopenharmony_ci * @client: pointer to &struct i2c_client with the I2C client to be released. 43162306a36Sopenharmony_ci * can be %NULL. 43262306a36Sopenharmony_ci * 43362306a36Sopenharmony_ci * This function should be used to free all resources reserved by 43462306a36Sopenharmony_ci * dvb_module_probe() and unbinding the I2C hardware. 43562306a36Sopenharmony_ci */ 43662306a36Sopenharmony_civoid dvb_module_release(struct i2c_client *client); 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci#endif /* CONFIG_I2C */ 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci/* Legacy generic DVB attach function. */ 44162306a36Sopenharmony_ci#ifdef CONFIG_MEDIA_ATTACH 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci/** 44462306a36Sopenharmony_ci * dvb_attach - attaches a DVB frontend into the DVB core. 44562306a36Sopenharmony_ci * 44662306a36Sopenharmony_ci * @FUNCTION: function on a frontend module to be called. 44762306a36Sopenharmony_ci * @ARGS: @FUNCTION arguments. 44862306a36Sopenharmony_ci * 44962306a36Sopenharmony_ci * This ancillary function loads a frontend module in runtime and runs 45062306a36Sopenharmony_ci * the @FUNCTION function there, with @ARGS. 45162306a36Sopenharmony_ci * As it increments symbol usage cont, at unregister, dvb_detach() 45262306a36Sopenharmony_ci * should be called. 45362306a36Sopenharmony_ci * 45462306a36Sopenharmony_ci * .. note:: 45562306a36Sopenharmony_ci * 45662306a36Sopenharmony_ci * In the past, DVB modules (mainly, frontends) were bound via dvb_attach() 45762306a36Sopenharmony_ci * macro, with does an ugly hack, using I2C low level functions. Such 45862306a36Sopenharmony_ci * usage is deprecated and will be removed soon. Instead, you should use 45962306a36Sopenharmony_ci * dvb_module_probe(). 46062306a36Sopenharmony_ci */ 46162306a36Sopenharmony_ci#define dvb_attach(FUNCTION, ARGS...) ({ \ 46262306a36Sopenharmony_ci void *__r = NULL; \ 46362306a36Sopenharmony_ci typeof(&FUNCTION) __a = symbol_request(FUNCTION); \ 46462306a36Sopenharmony_ci if (__a) { \ 46562306a36Sopenharmony_ci __r = (void *) __a(ARGS); \ 46662306a36Sopenharmony_ci if (__r == NULL) \ 46762306a36Sopenharmony_ci symbol_put(FUNCTION); \ 46862306a36Sopenharmony_ci } else { \ 46962306a36Sopenharmony_ci printk(KERN_ERR "DVB: Unable to find symbol "#FUNCTION"()\n"); \ 47062306a36Sopenharmony_ci } \ 47162306a36Sopenharmony_ci __r; \ 47262306a36Sopenharmony_ci}) 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci/** 47562306a36Sopenharmony_ci * dvb_detach - detaches a DVB frontend loaded via dvb_attach() 47662306a36Sopenharmony_ci * 47762306a36Sopenharmony_ci * @FUNC: attach function 47862306a36Sopenharmony_ci * 47962306a36Sopenharmony_ci * Decrements usage count for a function previously called via dvb_attach(). 48062306a36Sopenharmony_ci */ 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci#define dvb_detach(FUNC) symbol_put_addr(FUNC) 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci#else 48562306a36Sopenharmony_ci#define dvb_attach(FUNCTION, ARGS...) ({ \ 48662306a36Sopenharmony_ci FUNCTION(ARGS); \ 48762306a36Sopenharmony_ci}) 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci#define dvb_detach(FUNC) {} 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_ci#endif /* CONFIG_MEDIA_ATTACH */ 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci#endif /* #ifndef _DVBDEV_H_ */ 494