1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#ifndef CX18_DRIVER_H
26#define CX18_DRIVER_H
27
28#include <linux/version.h>
29#include <linux/module.h>
30#include <linux/moduleparam.h>
31#include <linux/init.h>
32#include <linux/delay.h>
33#include <linux/sched.h>
34#include <linux/fs.h>
35#include <linux/pci.h>
36#include <linux/interrupt.h>
37#include <linux/spinlock.h>
38#include <linux/i2c.h>
39#include <linux/i2c-algo-bit.h>
40#include <linux/list.h>
41#include <linux/unistd.h>
42#include <linux/pagemap.h>
43#include <linux/workqueue.h>
44#include <linux/mutex.h>
45#include <asm/byteorder.h>
46
47#include <linux/dvb/video.h>
48#include <linux/dvb/audio.h>
49#include <media/v4l2-common.h>
50#include <media/v4l2-ioctl.h>
51#include <media/v4l2-device.h>
52#include <media/tuner.h>
53#include "cx18-mailbox.h"
54#include "cx18-av-core.h"
55#include "cx23418.h"
56
57
58#include "demux.h"
59#include "dmxdev.h"
60#include "dvb_demux.h"
61#include "dvb_frontend.h"
62#include "dvb_net.h"
63#include "dvbdev.h"
64
65#ifndef CONFIG_PCI
66# error "This driver requires kernel PCI support."
67#endif
68
69#define CX18_MEM_OFFSET 0x00000000
70#define CX18_MEM_SIZE 0x04000000
71#define CX18_REG_OFFSET 0x02000000
72
73
74#define CX18_MAX_CARDS 32
75
76
77#define CX18_CARD_HVR_1600_ESMT 0
78#define CX18_CARD_HVR_1600_SAMSUNG 1
79#define CX18_CARD_COMPRO_H900 2
80#define CX18_CARD_YUAN_MPC718 3
81#define CX18_CARD_CNXT_RAPTOR_PAL 4
82#define CX18_CARD_TOSHIBA_QOSMIO_DVBT 5
83#define CX18_CARD_LEADTEK_PVR2100 6
84#define CX18_CARD_LEADTEK_DVR3100H 7
85#define CX18_CARD_LAST 7
86
87#define CX18_ENC_STREAM_TYPE_MPG 0
88#define CX18_ENC_STREAM_TYPE_TS 1
89#define CX18_ENC_STREAM_TYPE_YUV 2
90#define CX18_ENC_STREAM_TYPE_VBI 3
91#define CX18_ENC_STREAM_TYPE_PCM 4
92#define CX18_ENC_STREAM_TYPE_IDX 5
93#define CX18_ENC_STREAM_TYPE_RAD 6
94#define CX18_MAX_STREAMS 7
95
96
97#define PCI_VENDOR_ID_CX 0x14f1
98#define PCI_DEVICE_ID_CX23418 0x5b7a
99
100
101#define CX18_PCI_ID_HAUPPAUGE 0x0070
102#define CX18_PCI_ID_COMPRO 0x185b
103#define CX18_PCI_ID_YUAN 0x12ab
104#define CX18_PCI_ID_CONEXANT 0x14f1
105#define CX18_PCI_ID_TOSHIBA 0x1179
106#define CX18_PCI_ID_LEADTEK 0x107D
107
108
109
110
111
112
113#define CX18_DEFAULT_ENC_TS_BUFFERS 1
114#define CX18_DEFAULT_ENC_MPG_BUFFERS 2
115#define CX18_DEFAULT_ENC_IDX_BUFFERS 1
116#define CX18_DEFAULT_ENC_YUV_BUFFERS 2
117#define CX18_DEFAULT_ENC_VBI_BUFFERS 1
118#define CX18_DEFAULT_ENC_PCM_BUFFERS 1
119
120
121#define CX18_MAX_FW_MDLS_PER_STREAM 63
122
123
124#define CX18_DEFAULT_ENC_TS_BUFSIZE 32
125#define CX18_DEFAULT_ENC_MPG_BUFSIZE 32
126#define CX18_DEFAULT_ENC_IDX_BUFSIZE 32
127#define CX18_DEFAULT_ENC_YUV_BUFSIZE 128
128
129#define CX18_DEFAULT_ENC_PCM_BUFSIZE 4
130
131
132#define I2C_CLIENTS_MAX 16
133
134
135
136
137#define CX18_DBGFLG_WARN (1 << 0)
138#define CX18_DBGFLG_INFO (1 << 1)
139#define CX18_DBGFLG_API (1 << 2)
140#define CX18_DBGFLG_DMA (1 << 3)
141#define CX18_DBGFLG_IOCTL (1 << 4)
142#define CX18_DBGFLG_FILE (1 << 5)
143#define CX18_DBGFLG_I2C (1 << 6)
144#define CX18_DBGFLG_IRQ (1 << 7)
145
146#define CX18_DBGFLG_HIGHVOL (1 << 8)
147
148
149
150#define CX18_DEBUG(x, type, fmt, args...) \
151 do { \
152 if ((x) & cx18_debug) \
153 v4l2_info(&cx->v4l2_dev, " " type ": " fmt , ## args); \
154 } while (0)
155#define CX18_DEBUG_WARN(fmt, args...) CX18_DEBUG(CX18_DBGFLG_WARN, "warning", fmt , ## args)
156#define CX18_DEBUG_INFO(fmt, args...) CX18_DEBUG(CX18_DBGFLG_INFO, "info", fmt , ## args)
157#define CX18_DEBUG_API(fmt, args...) CX18_DEBUG(CX18_DBGFLG_API, "api", fmt , ## args)
158#define CX18_DEBUG_DMA(fmt, args...) CX18_DEBUG(CX18_DBGFLG_DMA, "dma", fmt , ## args)
159#define CX18_DEBUG_IOCTL(fmt, args...) CX18_DEBUG(CX18_DBGFLG_IOCTL, "ioctl", fmt , ## args)
160#define CX18_DEBUG_FILE(fmt, args...) CX18_DEBUG(CX18_DBGFLG_FILE, "file", fmt , ## args)
161#define CX18_DEBUG_I2C(fmt, args...) CX18_DEBUG(CX18_DBGFLG_I2C, "i2c", fmt , ## args)
162#define CX18_DEBUG_IRQ(fmt, args...) CX18_DEBUG(CX18_DBGFLG_IRQ, "irq", fmt , ## args)
163
164#define CX18_DEBUG_HIGH_VOL(x, type, fmt, args...) \
165 do { \
166 if (((x) & cx18_debug) && (cx18_debug & CX18_DBGFLG_HIGHVOL)) \
167 v4l2_info(&cx->v4l2_dev, " " type ": " fmt , ## args); \
168 } while (0)
169#define CX18_DEBUG_HI_WARN(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_WARN, "warning", fmt , ## args)
170#define CX18_DEBUG_HI_INFO(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_INFO, "info", fmt , ## args)
171#define CX18_DEBUG_HI_API(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_API, "api", fmt , ## args)
172#define CX18_DEBUG_HI_DMA(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_DMA, "dma", fmt , ## args)
173#define CX18_DEBUG_HI_IOCTL(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_IOCTL, "ioctl", fmt , ## args)
174#define CX18_DEBUG_HI_FILE(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_FILE, "file", fmt , ## args)
175#define CX18_DEBUG_HI_I2C(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_I2C, "i2c", fmt , ## args)
176#define CX18_DEBUG_HI_IRQ(fmt, args...) CX18_DEBUG_HIGH_VOL(CX18_DBGFLG_IRQ, "irq", fmt , ## args)
177
178
179#define CX18_ERR(fmt, args...) v4l2_err(&cx->v4l2_dev, fmt , ## args)
180#define CX18_WARN(fmt, args...) v4l2_warn(&cx->v4l2_dev, fmt , ## args)
181#define CX18_INFO(fmt, args...) v4l2_info(&cx->v4l2_dev, fmt , ## args)
182
183
184#define CX18_DEBUG_DEV(x, dev, type, fmt, args...) \
185 do { \
186 if ((x) & cx18_debug) \
187 v4l2_info(dev, " " type ": " fmt , ## args); \
188 } while (0)
189#define CX18_DEBUG_WARN_DEV(dev, fmt, args...) \
190 CX18_DEBUG_DEV(CX18_DBGFLG_WARN, dev, "warning", fmt , ## args)
191#define CX18_DEBUG_INFO_DEV(dev, fmt, args...) \
192 CX18_DEBUG_DEV(CX18_DBGFLG_INFO, dev, "info", fmt , ## args)
193#define CX18_DEBUG_API_DEV(dev, fmt, args...) \
194 CX18_DEBUG_DEV(CX18_DBGFLG_API, dev, "api", fmt , ## args)
195#define CX18_DEBUG_DMA_DEV(dev, fmt, args...) \
196 CX18_DEBUG_DEV(CX18_DBGFLG_DMA, dev, "dma", fmt , ## args)
197#define CX18_DEBUG_IOCTL_DEV(dev, fmt, args...) \
198 CX18_DEBUG_DEV(CX18_DBGFLG_IOCTL, dev, "ioctl", fmt , ## args)
199#define CX18_DEBUG_FILE_DEV(dev, fmt, args...) \
200 CX18_DEBUG_DEV(CX18_DBGFLG_FILE, dev, "file", fmt , ## args)
201#define CX18_DEBUG_I2C_DEV(dev, fmt, args...) \
202 CX18_DEBUG_DEV(CX18_DBGFLG_I2C, dev, "i2c", fmt , ## args)
203#define CX18_DEBUG_IRQ_DEV(dev, fmt, args...) \
204 CX18_DEBUG_DEV(CX18_DBGFLG_IRQ, dev, "irq", fmt , ## args)
205
206#define CX18_DEBUG_HIGH_VOL_DEV(x, dev, type, fmt, args...) \
207 do { \
208 if (((x) & cx18_debug) && (cx18_debug & CX18_DBGFLG_HIGHVOL)) \
209 v4l2_info(dev, " " type ": " fmt , ## args); \
210 } while (0)
211#define CX18_DEBUG_HI_WARN_DEV(dev, fmt, args...) \
212 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_WARN, dev, "warning", fmt , ## args)
213#define CX18_DEBUG_HI_INFO_DEV(dev, fmt, args...) \
214 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_INFO, dev, "info", fmt , ## args)
215#define CX18_DEBUG_HI_API_DEV(dev, fmt, args...) \
216 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_API, dev, "api", fmt , ## args)
217#define CX18_DEBUG_HI_DMA_DEV(dev, fmt, args...) \
218 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_DMA, dev, "dma", fmt , ## args)
219#define CX18_DEBUG_HI_IOCTL_DEV(dev, fmt, args...) \
220 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_IOCTL, dev, "ioctl", fmt , ## args)
221#define CX18_DEBUG_HI_FILE_DEV(dev, fmt, args...) \
222 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_FILE, dev, "file", fmt , ## args)
223#define CX18_DEBUG_HI_I2C_DEV(dev, fmt, args...) \
224 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_I2C, dev, "i2c", fmt , ## args)
225#define CX18_DEBUG_HI_IRQ_DEV(dev, fmt, args...) \
226 CX18_DEBUG_HIGH_VOL_DEV(CX18_DBGFLG_IRQ, dev, "irq", fmt , ## args)
227
228#define CX18_ERR_DEV(dev, fmt, args...) v4l2_err(dev, fmt , ## args)
229#define CX18_WARN_DEV(dev, fmt, args...) v4l2_warn(dev, fmt , ## args)
230#define CX18_INFO_DEV(dev, fmt, args...) v4l2_info(dev, fmt , ## args)
231
232
233#define MPEG_FRAME_TYPE_IFRAME 1
234#define MPEG_FRAME_TYPE_IFRAME_PFRAME 3
235#define MPEG_FRAME_TYPE_ALL 7
236
237#define CX18_MAX_PGM_INDEX (400)
238
239extern int cx18_debug;
240
241
242struct cx18_options {
243 int megabytes[CX18_MAX_STREAMS];
244 int cardtype;
245 int tuner;
246 int radio;
247};
248
249
250#define CX18_F_B_NEED_BUF_SWAP 0
251
252
253#define CX18_F_S_CLAIMED 3
254#define CX18_F_S_STREAMING 4
255#define CX18_F_S_INTERNAL_USE 5
256#define CX18_F_S_STREAMOFF 7
257#define CX18_F_S_APPL_IO 8
258#define CX18_F_S_STOPPING 9
259
260
261#define CX18_F_I_LOADED_FW 0
262#define CX18_F_I_EOS 4
263#define CX18_F_I_RADIO_USER 5
264#define CX18_F_I_ENC_PAUSED 13
265#define CX18_F_I_INITED 21
266#define CX18_F_I_FAILED 22
267
268
269#define CX18_SLICED_TYPE_TELETEXT_B (1)
270#define CX18_SLICED_TYPE_CAPTION_525 (4)
271#define CX18_SLICED_TYPE_WSS_625 (5)
272#define CX18_SLICED_TYPE_VPS (7)
273
274struct cx18_buffer {
275 struct list_head list;
276 dma_addr_t dma_handle;
277 u32 id;
278 unsigned long b_flags;
279 unsigned skipped;
280 char *buf;
281
282 u32 bytesused;
283 u32 readpos;
284};
285
286struct cx18_queue {
287 struct list_head list;
288 atomic_t buffers;
289 u32 bytesused;
290 spinlock_t lock;
291};
292
293struct cx18_dvb {
294 struct dmx_frontend hw_frontend;
295 struct dmx_frontend mem_frontend;
296 struct dmxdev dmxdev;
297 struct dvb_adapter dvb_adapter;
298 struct dvb_demux demux;
299 struct dvb_frontend *fe;
300 struct dvb_net dvbnet;
301 int enabled;
302 int feeding;
303 struct mutex feedlock;
304};
305
306struct cx18;
307struct cx18_scb;
308
309
310#define CX18_MAX_MDL_ACKS 2
311#define CX18_MAX_IN_WORK_ORDERS (CX18_MAX_FW_MDLS_PER_STREAM + 7)
312
313
314#define CX18_F_EWO_MB_STALE_UPON_RECEIPT 0x1
315#define CX18_F_EWO_MB_STALE_WHILE_PROC 0x2
316#define CX18_F_EWO_MB_STALE \
317 (CX18_F_EWO_MB_STALE_UPON_RECEIPT | CX18_F_EWO_MB_STALE_WHILE_PROC)
318
319struct cx18_in_work_order {
320 struct work_struct work;
321 atomic_t pending;
322 struct cx18 *cx;
323 unsigned long flags;
324 int rpu;
325 struct cx18_mailbox mb;
326 struct cx18_mdl_ack mdl_ack[CX18_MAX_MDL_ACKS];
327 char *str;
328};
329
330#define CX18_INVALID_TASK_HANDLE 0xffffffff
331
332struct cx18_stream {
333
334
335 struct video_device *video_dev;
336 struct cx18 *cx;
337 const char *name;
338 int type;
339 u32 handle;
340 unsigned mdl_offset;
341
342 u32 id;
343 unsigned long s_flags;
344 int dma;
345
346
347 wait_queue_head_t waitq;
348
349
350 u32 buffers;
351 u32 buf_size;
352
353
354 struct cx18_queue q_free;
355 struct cx18_queue q_busy;
356 struct cx18_queue q_full;
357
358 struct work_struct out_work_order;
359
360
361 struct cx18_dvb dvb;
362};
363
364struct cx18_open_id {
365 u32 open_id;
366 int type;
367 enum v4l2_priority prio;
368 struct cx18 *cx;
369};
370
371
372struct cx18_card;
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420static const u32 vbi_active_samples = 1444;
421static const u32 vbi_hblank_samples_60Hz = 272;
422static const u32 vbi_hblank_samples_50Hz = 284;
423
424#define CX18_VBI_FRAMES 32
425
426struct vbi_info {
427
428 struct v4l2_format in;
429 struct v4l2_sliced_vbi_format *sliced_in;
430 u32 count;
431 u32 start[2];
432
433 u32 frame;
434
435
436
437
438
439
440
441 int insert_mpeg;
442
443
444
445
446
447
448
449
450 struct v4l2_sliced_vbi_data sliced_data[36];
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474#define CX18_SLICED_MPEG_DATA_MAXSZ 1584
475
476#define CX18_SLICED_MPEG_DATA_BUFSZ (CX18_SLICED_MPEG_DATA_MAXSZ+8)
477 u8 *sliced_mpeg_data[CX18_VBI_FRAMES];
478 u32 sliced_mpeg_size[CX18_VBI_FRAMES];
479
480
481 u32 inserted_frame;
482
483
484
485
486
487
488 struct cx18_buffer sliced_mpeg_buf;
489};
490
491
492struct cx18_i2c_algo_callback_data {
493 struct cx18 *cx;
494 int bus_index;
495};
496
497#define CX18_MAX_MMIO_WR_RETRIES 10
498
499
500struct cx18 {
501 int instance;
502 struct pci_dev *pci_dev;
503 struct v4l2_device v4l2_dev;
504 struct v4l2_subdev *sd_av;
505 struct v4l2_subdev *sd_extmux;
506
507 const struct cx18_card *card;
508 const char *card_name;
509 const struct cx18_card_tuner_i2c *card_i2c;
510 u8 is_50hz;
511 u8 is_60hz;
512 u8 nof_inputs;
513 u8 nof_audio_inputs;
514 u16 buffer_id;
515 u32 v4l2_cap;
516 u32 hw_flags;
517 unsigned mdl_offset;
518 struct cx18_scb __iomem *scb;
519 struct mutex epu2apu_mb_lock;
520 struct mutex epu2cpu_mb_lock;
521
522 struct cx18_av_state av_state;
523
524
525 struct cx2341x_mpeg_params params;
526 u32 filter_mode;
527 u32 temporal_strength;
528 u32 spatial_strength;
529
530
531 unsigned long dualwatch_jiffies;
532 u32 dualwatch_stereo_mode;
533
534 struct mutex serialize_lock;
535 struct cx18_options options;
536 int stream_buffers[CX18_MAX_STREAMS];
537 int stream_buf_size[CX18_MAX_STREAMS];
538 struct cx18_stream streams[CX18_MAX_STREAMS];
539 unsigned long i_flags;
540 atomic_t ana_capturing;
541 atomic_t tot_capturing;
542 int search_pack_header;
543
544 int open_id;
545
546
547
548 u32 base_addr;
549 struct v4l2_prio_state prio;
550
551 u8 card_rev;
552 void __iomem *enc_mem, *reg_mem;
553
554 struct vbi_info vbi;
555
556 u32 pgm_info_offset;
557 u32 pgm_info_num;
558 u32 pgm_info_write_idx;
559 u32 pgm_info_read_idx;
560 struct v4l2_enc_idx_entry pgm_info[CX18_MAX_PGM_INDEX];
561
562 u64 mpg_data_received;
563 u64 vbi_data_inserted;
564
565 wait_queue_head_t mb_apu_waitq;
566 wait_queue_head_t mb_cpu_waitq;
567 wait_queue_head_t cap_w;
568
569 wait_queue_head_t dma_waitq;
570
571 u32 sw1_irq_mask;
572 u32 sw2_irq_mask;
573 u32 hw2_irq_mask;
574
575 struct workqueue_struct *in_work_queue;
576 char in_workq_name[11];
577 struct cx18_in_work_order in_work_order[CX18_MAX_IN_WORK_ORDERS];
578 char epu_debug_str[256];
579
580 struct workqueue_struct *out_work_queue;
581 char out_workq_name[12];
582
583
584 struct i2c_adapter i2c_adap[2];
585 struct i2c_algo_bit_data i2c_algo[2];
586 struct cx18_i2c_algo_callback_data i2c_algo_cb_data[2];
587
588
589 u32 gpio_dir;
590 u32 gpio_val;
591 struct mutex gpio_lock;
592 struct v4l2_subdev sd_gpiomux;
593 struct v4l2_subdev sd_resetctrl;
594
595
596
597
598 u32 audio_input;
599 u32 active_input;
600 v4l2_std_id std;
601 v4l2_std_id tuner_std;
602};
603
604static inline struct cx18 *to_cx18(struct v4l2_device *v4l2_dev)
605{
606 return container_of(v4l2_dev, struct cx18, v4l2_dev);
607}
608
609
610extern int cx18_first_minor;
611
612
613
614
615int cx18_msleep_timeout(unsigned int msecs, int intr);
616
617
618struct tveeprom;
619void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv);
620
621
622int cx18_init_on_first_open(struct cx18 *cx);
623
624
625static inline int cx18_raw_vbi(const struct cx18 *cx)
626{
627 return cx->vbi.in.type == V4L2_BUF_TYPE_VBI_CAPTURE;
628}
629
630
631
632#define cx18_call_hw(cx, hw, o, f, args...) \
633 __v4l2_device_call_subdevs(&(cx)->v4l2_dev, \
634 !(hw) || (sd->grp_id & (hw)), o, f , ##args)
635
636#define cx18_call_all(cx, o, f, args...) cx18_call_hw(cx, 0, o, f , ##args)
637
638
639
640
641#define cx18_call_hw_err(cx, hw, o, f, args...) \
642 __v4l2_device_call_subdevs_until_err( \
643 &(cx)->v4l2_dev, !(hw) || (sd->grp_id & (hw)), o, f , ##args)
644
645#define cx18_call_all_err(cx, o, f, args...) \
646 cx18_call_hw_err(cx, 0, o, f , ##args)
647
648#endif
649