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