Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.14 405 lines 11 kB view raw
1/* 2 * tm6000.h - driver for TM5600/TM6000/TM6010 USB video capture devices 3 * 4 * Copyright (C) 2006-2007 Mauro Carvalho Chehab <mchehab@infradead.org> 5 * 6 * Copyright (C) 2007 Michel Ludwig <michel.ludwig@gmail.com> 7 * - DVB-T support 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation version 2 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 */ 18 19#include <linux/videodev2.h> 20#include <media/v4l2-common.h> 21#include <media/videobuf-vmalloc.h> 22#include "tm6000-usb-isoc.h" 23#include <linux/i2c.h> 24#include <linux/mutex.h> 25#include <media/v4l2-device.h> 26#include <media/v4l2-ctrls.h> 27#include <media/v4l2-fh.h> 28 29#include <linux/dvb/frontend.h> 30#include "dvb_demux.h" 31#include "dvb_frontend.h" 32#include "dmxdev.h" 33 34/* Inputs */ 35enum tm6000_itype { 36 TM6000_INPUT_TV = 1, 37 TM6000_INPUT_COMPOSITE1, 38 TM6000_INPUT_COMPOSITE2, 39 TM6000_INPUT_SVIDEO, 40 TM6000_INPUT_DVB, 41 TM6000_INPUT_RADIO, 42}; 43 44enum tm6000_mux { 45 TM6000_VMUX_VIDEO_A = 1, 46 TM6000_VMUX_VIDEO_B, 47 TM6000_VMUX_VIDEO_AB, 48 TM6000_AMUX_ADC1, 49 TM6000_AMUX_ADC2, 50 TM6000_AMUX_SIF1, 51 TM6000_AMUX_SIF2, 52 TM6000_AMUX_I2S, 53}; 54 55enum tm6000_devtype { 56 TM6000 = 0, 57 TM5600, 58 TM6010, 59}; 60 61struct tm6000_input { 62 enum tm6000_itype type; 63 enum tm6000_mux vmux; 64 enum tm6000_mux amux; 65 unsigned int v_gpio; 66 unsigned int a_gpio; 67}; 68 69/* ------------------------------------------------------------------ 70 * Basic structures 71 * ------------------------------------------------------------------ 72 */ 73 74struct tm6000_fmt { 75 char *name; 76 u32 fourcc; /* v4l2 format id */ 77 int depth; 78}; 79 80/* buffer for one video frame */ 81struct tm6000_buffer { 82 /* common v4l buffer stuff -- must be first */ 83 struct videobuf_buffer vb; 84 85 struct tm6000_fmt *fmt; 86}; 87 88struct tm6000_dmaqueue { 89 struct list_head active; 90 struct list_head queued; 91 92 /* thread for generating video stream*/ 93 struct task_struct *kthread; 94 wait_queue_head_t wq; 95 /* Counters to control fps rate */ 96 int frame; 97 int ini_jiffies; 98}; 99 100/* device states */ 101enum tm6000_core_state { 102 DEV_INITIALIZED = 0x01, 103 DEV_DISCONNECTED = 0x02, 104 DEV_MISCONFIGURED = 0x04, 105}; 106 107/* io methods */ 108enum tm6000_io_method { 109 IO_NONE, 110 IO_READ, 111 IO_MMAP, 112}; 113 114enum tm6000_mode { 115 TM6000_MODE_UNKNOWN = 0, 116 TM6000_MODE_ANALOG, 117 TM6000_MODE_DIGITAL, 118}; 119 120struct tm6000_gpio { 121 int tuner_reset; 122 int tuner_on; 123 int demod_reset; 124 int demod_on; 125 int power_led; 126 int dvb_led; 127 int ir; 128}; 129 130struct tm6000_capabilities { 131 unsigned int has_tuner:1; 132 unsigned int has_tda9874:1; 133 unsigned int has_dvb:1; 134 unsigned int has_zl10353:1; 135 unsigned int has_eeprom:1; 136 unsigned int has_remote:1; 137 unsigned int has_radio:1; 138}; 139 140struct tm6000_dvb { 141 struct dvb_adapter adapter; 142 struct dvb_demux demux; 143 struct dvb_frontend *frontend; 144 struct dmxdev dmxdev; 145 unsigned int streams; 146 struct urb *bulk_urb; 147 struct mutex mutex; 148}; 149 150struct snd_tm6000_card { 151 struct snd_card *card; 152 spinlock_t reg_lock; 153 struct tm6000_core *core; 154 struct snd_pcm_substream *substream; 155 156 /* temporary data for buffer fill processing */ 157 unsigned buf_pos; 158 unsigned period_pos; 159}; 160 161struct tm6000_endpoint { 162 struct usb_host_endpoint *endp; 163 __u8 bInterfaceNumber; 164 __u8 bAlternateSetting; 165 unsigned maxsize; 166}; 167 168#define TM6000_QUIRK_NO_USB_DELAY (1 << 0) 169 170struct tm6000_core { 171 /* generic device properties */ 172 char name[30]; /* name (including minor) of the device */ 173 int model; /* index in the device_data struct */ 174 int devno; /* marks the number of this device */ 175 enum tm6000_devtype dev_type; /* type of device */ 176 unsigned char eedata[256]; /* Eeprom data */ 177 unsigned eedata_size; /* Size of the eeprom info */ 178 179 v4l2_std_id norm; /* Current norm */ 180 int width, height; /* Selected resolution */ 181 182 enum tm6000_core_state state; 183 184 /* Device Capabilities*/ 185 struct tm6000_capabilities caps; 186 187 /* Used to load alsa/dvb */ 188 struct work_struct request_module_wk; 189 190 /* Tuner configuration */ 191 int tuner_type; /* type of the tuner */ 192 int tuner_addr; /* tuner address */ 193 194 struct tm6000_gpio gpio; 195 196 char *ir_codes; 197 198 __u8 radio; 199 200 /* Demodulator configuration */ 201 int demod_addr; /* demodulator address */ 202 203 int audio_bitrate; 204 /* i2c i/o */ 205 struct i2c_adapter i2c_adap; 206 struct i2c_client i2c_client; 207 208 209 /* extension */ 210 struct list_head devlist; 211 212 /* video for linux */ 213 int users; 214 215 /* various device info */ 216 struct tm6000_fh *resources; /* Points to fh that is streaming */ 217 bool is_res_read; 218 219 struct video_device vfd; 220 struct video_device radio_dev; 221 struct tm6000_dmaqueue vidq; 222 struct v4l2_device v4l2_dev; 223 struct v4l2_ctrl_handler ctrl_handler; 224 struct v4l2_ctrl_handler radio_ctrl_handler; 225 226 int input; 227 struct tm6000_input vinput[3]; /* video input */ 228 struct tm6000_input rinput; /* radio input */ 229 230 int freq; 231 unsigned int fourcc; 232 233 enum tm6000_mode mode; 234 235 int ctl_mute; /* audio */ 236 int ctl_volume; 237 int amode; 238 239 /* DVB-T support */ 240 struct tm6000_dvb *dvb; 241 242 /* audio support */ 243 struct snd_tm6000_card *adev; 244 struct work_struct wq_trigger; /* Trigger to start/stop audio for alsa module */ 245 atomic_t stream_started; /* stream should be running if true */ 246 247 struct tm6000_IR *ir; 248 249 /* locks */ 250 struct mutex lock; 251 struct mutex usb_lock; 252 253 /* usb transfer */ 254 struct usb_device *udev; /* the usb device */ 255 256 struct tm6000_endpoint bulk_in, bulk_out, isoc_in, isoc_out; 257 struct tm6000_endpoint int_in, int_out; 258 259 /* scaler!=0 if scaler is active*/ 260 int scaler; 261 262 /* Isoc control struct */ 263 struct usb_isoc_ctl isoc_ctl; 264 265 spinlock_t slock; 266 267 /* urb dma buffers */ 268 char **urb_buffer; 269 dma_addr_t *urb_dma; 270 unsigned int urb_size; 271 272 unsigned long quirks; 273}; 274 275enum tm6000_ops_type { 276 TM6000_AUDIO = 0x10, 277 TM6000_DVB = 0x20, 278}; 279 280struct tm6000_ops { 281 struct list_head next; 282 char *name; 283 enum tm6000_ops_type type; 284 int (*init)(struct tm6000_core *); 285 int (*fini)(struct tm6000_core *); 286 int (*fillbuf)(struct tm6000_core *, char *buf, int size); 287}; 288 289struct tm6000_fh { 290 struct v4l2_fh fh; 291 struct tm6000_core *dev; 292 unsigned int radio; 293 294 /* video capture */ 295 struct tm6000_fmt *fmt; 296 unsigned int width, height; 297 struct videobuf_queue vb_vidq; 298 299 enum v4l2_buf_type type; 300}; 301 302#define TM6000_STD (V4L2_STD_PAL|V4L2_STD_PAL_N|V4L2_STD_PAL_Nc| \ 303 V4L2_STD_PAL_M|V4L2_STD_PAL_60|V4L2_STD_NTSC_M| \ 304 V4L2_STD_NTSC_M_JP|V4L2_STD_SECAM) 305 306/* In tm6000-cards.c */ 307 308int tm6000_tuner_callback(void *ptr, int component, int command, int arg); 309int tm6000_xc5000_callback(void *ptr, int component, int command, int arg); 310int tm6000_cards_setup(struct tm6000_core *dev); 311void tm6000_flash_led(struct tm6000_core *dev, u8 state); 312 313/* In tm6000-core.c */ 314 315int tm6000_read_write_usb(struct tm6000_core *dev, u8 reqtype, u8 req, 316 u16 value, u16 index, u8 *buf, u16 len); 317int tm6000_get_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index); 318int tm6000_get_reg16(struct tm6000_core *dev, u8 req, u16 value, u16 index); 319int tm6000_get_reg32(struct tm6000_core *dev, u8 req, u16 value, u16 index); 320int tm6000_set_reg(struct tm6000_core *dev, u8 req, u16 value, u16 index); 321int tm6000_set_reg_mask(struct tm6000_core *dev, u8 req, u16 value, 322 u16 index, u16 mask); 323int tm6000_i2c_reset(struct tm6000_core *dev, u16 tsleep); 324int tm6000_init(struct tm6000_core *dev); 325int tm6000_reset(struct tm6000_core *dev); 326 327int tm6000_init_analog_mode(struct tm6000_core *dev); 328int tm6000_init_digital_mode(struct tm6000_core *dev); 329int tm6000_set_audio_bitrate(struct tm6000_core *dev, int bitrate); 330int tm6000_set_audio_rinput(struct tm6000_core *dev); 331int tm6000_tvaudio_set_mute(struct tm6000_core *dev, u8 mute); 332void tm6000_set_volume(struct tm6000_core *dev, int vol); 333 334int tm6000_v4l2_register(struct tm6000_core *dev); 335int tm6000_v4l2_unregister(struct tm6000_core *dev); 336int tm6000_v4l2_exit(void); 337void tm6000_set_fourcc_format(struct tm6000_core *dev); 338 339void tm6000_remove_from_devlist(struct tm6000_core *dev); 340void tm6000_add_into_devlist(struct tm6000_core *dev); 341int tm6000_register_extension(struct tm6000_ops *ops); 342void tm6000_unregister_extension(struct tm6000_ops *ops); 343void tm6000_init_extension(struct tm6000_core *dev); 344void tm6000_close_extension(struct tm6000_core *dev); 345int tm6000_call_fillbuf(struct tm6000_core *dev, enum tm6000_ops_type type, 346 char *buf, int size); 347 348 349/* In tm6000-stds.c */ 350void tm6000_get_std_res(struct tm6000_core *dev); 351int tm6000_set_standard(struct tm6000_core *dev); 352 353/* In tm6000-i2c.c */ 354int tm6000_i2c_register(struct tm6000_core *dev); 355int tm6000_i2c_unregister(struct tm6000_core *dev); 356 357/* In tm6000-queue.c */ 358 359int tm6000_v4l2_mmap(struct file *filp, struct vm_area_struct *vma); 360 361int tm6000_vidioc_streamon(struct file *file, void *priv, 362 enum v4l2_buf_type i); 363int tm6000_vidioc_streamoff(struct file *file, void *priv, 364 enum v4l2_buf_type i); 365int tm6000_vidioc_reqbufs(struct file *file, void *priv, 366 struct v4l2_requestbuffers *rb); 367int tm6000_vidioc_querybuf(struct file *file, void *priv, 368 struct v4l2_buffer *b); 369int tm6000_vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *b); 370int tm6000_vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b); 371ssize_t tm6000_v4l2_read(struct file *filp, char __user * buf, size_t count, 372 loff_t *f_pos); 373unsigned int tm6000_v4l2_poll(struct file *file, 374 struct poll_table_struct *wait); 375int tm6000_queue_init(struct tm6000_core *dev); 376 377/* In tm6000-alsa.c */ 378/*int tm6000_audio_init(struct tm6000_core *dev, int idx);*/ 379 380/* In tm6000-input.c */ 381int tm6000_ir_init(struct tm6000_core *dev); 382int tm6000_ir_fini(struct tm6000_core *dev); 383void tm6000_ir_wait(struct tm6000_core *dev, u8 state); 384int tm6000_ir_int_start(struct tm6000_core *dev); 385void tm6000_ir_int_stop(struct tm6000_core *dev); 386 387/* Debug stuff */ 388 389extern int tm6000_debug; 390 391#define dprintk(dev, level, fmt, arg...) do {\ 392 if (tm6000_debug & level) \ 393 printk(KERN_INFO "(%lu) %s %s :"fmt, jiffies, \ 394 dev->name, __func__ , ##arg); } while (0) 395 396#define V4L2_DEBUG_REG 0x0004 397#define V4L2_DEBUG_I2C 0x0008 398#define V4L2_DEBUG_QUEUE 0x0010 399#define V4L2_DEBUG_ISOC 0x0020 400#define V4L2_DEBUG_RES_LOCK 0x0040 /* Resource locking */ 401#define V4L2_DEBUG_OPEN 0x0080 /* video open/close debug */ 402 403#define tm6000_err(fmt, arg...) do {\ 404 printk(KERN_ERR "tm6000 %s :"fmt, \ 405 __func__ , ##arg); } while (0)