1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * cx18 driver initialization and card probing
5 * Derived from ivtv-driver.c
7 * Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl>
8 * Copyright (C) 2008 Andy Walls <awalls@md.metrocast.net>
11 #include "cx18-driver.h"
13 #include "cx18-version.h"
14 #include "cx18-cards.h"
17 #include "cx18-gpio.h"
18 #include "cx18-firmware.h"
19 #include "cx18-queue.h"
20 #include "cx18-streams.h"
21 #include "cx18-av-core.h"
23 #include "cx18-mailbox.h"
24 #include "cx18-ioctl.h"
25 #include "cx18-controls.h"
26 #include "tuner-xc2028.h"
27 #include <linux/dma-mapping.h>
28 #include <media/tveeprom.h>
30 /* If you have already X v4l cards, then set this to X. This way
31 the device numbers stay matched. Example: you have a WinTV card
32 without radio and a Compro H900 with. Normally this would give a
33 video1 device together with a radio0 device for the Compro. By
34 setting this to 1 you ensure that radio0 is now also radio1. */
37 /* Callback for registering extensions */
38 int (*cx18_ext_init
)(struct cx18
*);
39 EXPORT_SYMBOL(cx18_ext_init
);
41 /* add your revision and whatnot here */
42 static const struct pci_device_id cx18_pci_tbl
[] = {
43 {PCI_VENDOR_ID_CX
, PCI_DEVICE_ID_CX23418
,
44 PCI_ANY_ID
, PCI_ANY_ID
, 0, 0, 0},
48 MODULE_DEVICE_TABLE(pci
, cx18_pci_tbl
);
50 static atomic_t cx18_instance
= ATOMIC_INIT(0);
52 /* Parameter declarations */
53 static int cardtype
[CX18_MAX_CARDS
];
54 static int tuner
[CX18_MAX_CARDS
] = { -1, -1, -1, -1, -1, -1, -1, -1,
55 -1, -1, -1, -1, -1, -1, -1, -1,
56 -1, -1, -1, -1, -1, -1, -1, -1,
57 -1, -1, -1, -1, -1, -1, -1, -1 };
58 static int radio
[CX18_MAX_CARDS
] = { -1, -1, -1, -1, -1, -1, -1, -1,
59 -1, -1, -1, -1, -1, -1, -1, -1,
60 -1, -1, -1, -1, -1, -1, -1, -1,
61 -1, -1, -1, -1, -1, -1, -1, -1 };
62 static unsigned cardtype_c
= 1;
63 static unsigned tuner_c
= 1;
64 static unsigned radio_c
= 1;
65 static char pal
[] = "--";
66 static char secam
[] = "--";
67 static char ntsc
[] = "-";
70 static int enc_ts_buffers
= CX18_DEFAULT_ENC_TS_BUFFERS
;
71 static int enc_mpg_buffers
= CX18_DEFAULT_ENC_MPG_BUFFERS
;
72 static int enc_idx_buffers
= CX18_DEFAULT_ENC_IDX_BUFFERS
;
73 static int enc_yuv_buffers
= CX18_DEFAULT_ENC_YUV_BUFFERS
;
74 static int enc_vbi_buffers
= CX18_DEFAULT_ENC_VBI_BUFFERS
;
75 static int enc_pcm_buffers
= CX18_DEFAULT_ENC_PCM_BUFFERS
;
77 static int enc_ts_bufsize
= CX18_DEFAULT_ENC_TS_BUFSIZE
;
78 static int enc_mpg_bufsize
= CX18_DEFAULT_ENC_MPG_BUFSIZE
;
79 static int enc_idx_bufsize
= CX18_DEFAULT_ENC_IDX_BUFSIZE
;
80 static int enc_yuv_bufsize
= CX18_DEFAULT_ENC_YUV_BUFSIZE
;
81 static int enc_pcm_bufsize
= CX18_DEFAULT_ENC_PCM_BUFSIZE
;
83 static int enc_ts_bufs
= -1;
84 static int enc_mpg_bufs
= -1;
85 static int enc_idx_bufs
= CX18_MAX_FW_MDLS_PER_STREAM
;
86 static int enc_yuv_bufs
= -1;
87 static int enc_vbi_bufs
= -1;
88 static int enc_pcm_bufs
= -1;
91 static int cx18_pci_latency
= 1;
93 static int mmio_ndelay
;
94 static int retry_mmio
= 1;
98 module_param_array(tuner
, int, &tuner_c
, 0644);
99 module_param_array(radio
, int, &radio_c
, 0644);
100 module_param_array(cardtype
, int, &cardtype_c
, 0644);
101 module_param_string(pal
, pal
, sizeof(pal
), 0644);
102 module_param_string(secam
, secam
, sizeof(secam
), 0644);
103 module_param_string(ntsc
, ntsc
, sizeof(ntsc
), 0644);
104 module_param_named(debug
, cx18_debug
, int, 0644);
105 module_param(mmio_ndelay
, int, 0644);
106 module_param(retry_mmio
, int, 0644);
107 module_param(cx18_pci_latency
, int, 0644);
108 module_param(cx18_first_minor
, int, 0644);
110 module_param(enc_ts_buffers
, int, 0644);
111 module_param(enc_mpg_buffers
, int, 0644);
112 module_param(enc_idx_buffers
, int, 0644);
113 module_param(enc_yuv_buffers
, int, 0644);
114 module_param(enc_vbi_buffers
, int, 0644);
115 module_param(enc_pcm_buffers
, int, 0644);
117 module_param(enc_ts_bufsize
, int, 0644);
118 module_param(enc_mpg_bufsize
, int, 0644);
119 module_param(enc_idx_bufsize
, int, 0644);
120 module_param(enc_yuv_bufsize
, int, 0644);
121 module_param(enc_pcm_bufsize
, int, 0644);
123 module_param(enc_ts_bufs
, int, 0644);
124 module_param(enc_mpg_bufs
, int, 0644);
125 module_param(enc_idx_bufs
, int, 0644);
126 module_param(enc_yuv_bufs
, int, 0644);
127 module_param(enc_vbi_bufs
, int, 0644);
128 module_param(enc_pcm_bufs
, int, 0644);
130 MODULE_PARM_DESC(tuner
, "Tuner type selection,\n"
131 "\t\t\tsee tuner.h for values");
132 MODULE_PARM_DESC(radio
,
133 "Enable or disable the radio. Use only if autodetection\n"
134 "\t\t\tfails. 0 = disable, 1 = enable");
135 MODULE_PARM_DESC(cardtype
,
136 "Only use this option if your card is not detected properly.\n"
137 "\t\tSpecify card type:\n"
138 "\t\t\t 1 = Hauppauge HVR 1600 (ESMT memory)\n"
139 "\t\t\t 2 = Hauppauge HVR 1600 (Samsung memory)\n"
140 "\t\t\t 3 = Compro VideoMate H900\n"
141 "\t\t\t 4 = Yuan MPC718\n"
142 "\t\t\t 5 = Conexant Raptor PAL/SECAM\n"
143 "\t\t\t 6 = Toshiba Qosmio DVB-T/Analog\n"
144 "\t\t\t 7 = Leadtek WinFast PVR2100\n"
145 "\t\t\t 8 = Leadtek WinFast DVR3100 H\n"
146 "\t\t\t 9 = GoTView PCI DVD3 Hybrid\n"
147 "\t\t\t 10 = Hauppauge HVR 1600 (S5H1411)\n"
148 "\t\t\t 0 = Autodetect (default)\n"
149 "\t\t\t-1 = Ignore this card\n\t\t");
150 MODULE_PARM_DESC(pal
, "Set PAL standard: B, G, H, D, K, I, M, N, Nc, 60");
151 MODULE_PARM_DESC(secam
, "Set SECAM standard: B, G, H, D, K, L, LC");
152 MODULE_PARM_DESC(ntsc
, "Set NTSC standard: M, J, K");
153 MODULE_PARM_DESC(debug
,
154 "Debug level (bitmask). Default: 0\n"
155 "\t\t\t 1/0x0001: warning\n"
156 "\t\t\t 2/0x0002: info\n"
157 "\t\t\t 4/0x0004: mailbox\n"
158 "\t\t\t 8/0x0008: dma\n"
159 "\t\t\t 16/0x0010: ioctl\n"
160 "\t\t\t 32/0x0020: file\n"
161 "\t\t\t 64/0x0040: i2c\n"
162 "\t\t\t128/0x0080: irq\n"
163 "\t\t\t256/0x0100: high volume\n");
164 MODULE_PARM_DESC(cx18_pci_latency
,
165 "Change the PCI latency to 64 if lower: 0 = No, 1 = Yes,\n"
166 "\t\t\tDefault: Yes");
167 MODULE_PARM_DESC(retry_mmio
,
168 "(Deprecated) MMIO writes are now always checked and retried\n"
169 "\t\t\tEffectively: 1 [Yes]");
170 MODULE_PARM_DESC(mmio_ndelay
,
171 "(Deprecated) MMIO accesses are now never purposely delayed\n"
172 "\t\t\tEffectively: 0 ns");
173 MODULE_PARM_DESC(enc_ts_buffers
,
174 "Encoder TS buffer memory (MB). (enc_ts_bufs can override)\n"
175 "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_TS_BUFFERS
));
176 MODULE_PARM_DESC(enc_ts_bufsize
,
177 "Size of an encoder TS buffer (kB)\n"
178 "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_TS_BUFSIZE
));
179 MODULE_PARM_DESC(enc_ts_bufs
,
180 "Number of encoder TS buffers\n"
181 "\t\t\tDefault is computed from other enc_ts_* parameters");
182 MODULE_PARM_DESC(enc_mpg_buffers
,
183 "Encoder MPG buffer memory (MB). (enc_mpg_bufs can override)\n"
184 "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_MPG_BUFFERS
));
185 MODULE_PARM_DESC(enc_mpg_bufsize
,
186 "Size of an encoder MPG buffer (kB)\n"
187 "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_MPG_BUFSIZE
));
188 MODULE_PARM_DESC(enc_mpg_bufs
,
189 "Number of encoder MPG buffers\n"
190 "\t\t\tDefault is computed from other enc_mpg_* parameters");
191 MODULE_PARM_DESC(enc_idx_buffers
,
192 "(Deprecated) Encoder IDX buffer memory (MB)\n"
193 "\t\t\tIgnored, except 0 disables IDX buffer allocations\n"
194 "\t\t\tDefault: 1 [Enabled]");
195 MODULE_PARM_DESC(enc_idx_bufsize
,
196 "Size of an encoder IDX buffer (kB)\n"
197 "\t\t\tAllowed values are multiples of 1.5 kB rounded up\n"
198 "\t\t\t(multiples of size required for 64 index entries)\n"
200 MODULE_PARM_DESC(enc_idx_bufs
,
201 "Number of encoder IDX buffers\n"
202 "\t\t\tDefault: " __stringify(CX18_MAX_FW_MDLS_PER_STREAM
));
203 MODULE_PARM_DESC(enc_yuv_buffers
,
204 "Encoder YUV buffer memory (MB). (enc_yuv_bufs can override)\n"
205 "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_YUV_BUFFERS
));
206 MODULE_PARM_DESC(enc_yuv_bufsize
,
207 "Size of an encoder YUV buffer (kB)\n"
208 "\t\t\tAllowed values are multiples of 33.75 kB rounded up\n"
209 "\t\t\t(multiples of size required for 32 screen lines)\n"
210 "\t\t\tDefault: 102");
211 MODULE_PARM_DESC(enc_yuv_bufs
,
212 "Number of encoder YUV buffers\n"
213 "\t\t\tDefault is computed from other enc_yuv_* parameters");
214 MODULE_PARM_DESC(enc_vbi_buffers
,
215 "Encoder VBI buffer memory (MB). (enc_vbi_bufs can override)\n"
216 "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_VBI_BUFFERS
));
217 MODULE_PARM_DESC(enc_vbi_bufs
,
218 "Number of encoder VBI buffers\n"
219 "\t\t\tDefault is computed from enc_vbi_buffers");
220 MODULE_PARM_DESC(enc_pcm_buffers
,
221 "Encoder PCM buffer memory (MB). (enc_pcm_bufs can override)\n"
222 "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_PCM_BUFFERS
));
223 MODULE_PARM_DESC(enc_pcm_bufsize
,
224 "Size of an encoder PCM buffer (kB)\n"
225 "\t\t\tDefault: " __stringify(CX18_DEFAULT_ENC_PCM_BUFSIZE
));
226 MODULE_PARM_DESC(enc_pcm_bufs
,
227 "Number of encoder PCM buffers\n"
228 "\t\t\tDefault is computed from other enc_pcm_* parameters");
230 MODULE_PARM_DESC(cx18_first_minor
,
231 "Set device node number assigned to first card");
233 MODULE_AUTHOR("Hans Verkuil");
234 MODULE_DESCRIPTION("CX23418 driver");
235 MODULE_SUPPORTED_DEVICE("CX23418 MPEG2 encoder");
236 MODULE_LICENSE("GPL");
238 MODULE_VERSION(CX18_VERSION
);
240 #if defined(CONFIG_MODULES) && defined(MODULE)
241 static void request_module_async(struct work_struct
*work
)
243 struct cx18
*dev
= container_of(work
, struct cx18
, request_module_wk
);
245 /* Make sure cx18-alsa module is loaded */
246 request_module("cx18-alsa");
248 /* Initialize cx18-alsa for this instance of the cx18 device */
253 static void request_modules(struct cx18
*dev
)
255 INIT_WORK(&dev
->request_module_wk
, request_module_async
);
256 schedule_work(&dev
->request_module_wk
);
259 static void flush_request_modules(struct cx18
*dev
)
261 flush_work(&dev
->request_module_wk
);
264 #define request_modules(dev)
265 #define flush_request_modules(dev)
266 #endif /* CONFIG_MODULES */
268 /* Generic utility functions */
269 int cx18_msleep_timeout(unsigned int msecs
, int intr
)
271 long int timeout
= msecs_to_jiffies(msecs
);
275 set_current_state(intr
? TASK_INTERRUPTIBLE
: TASK_UNINTERRUPTIBLE
);
276 timeout
= schedule_timeout(timeout
);
277 sig
= intr
? signal_pending(current
) : 0;
278 } while (!sig
&& timeout
);
282 /* Release ioremapped memory */
283 static void cx18_iounmap(struct cx18
*cx
)
288 /* Release io memory */
290 CX18_DEBUG_INFO("releasing enc_mem\n");
291 iounmap(cx
->enc_mem
);
296 static void cx18_eeprom_dump(struct cx18
*cx
, unsigned char *eedata
, int len
)
300 CX18_INFO("eeprom dump:\n");
301 for (i
= 0; i
< len
; i
++) {
303 CX18_INFO("eeprom %02x:", i
);
304 printk(KERN_CONT
" %02x", eedata
[i
]);
306 printk(KERN_CONT
"\n");
310 /* Hauppauge card? get values from tveeprom */
311 void cx18_read_eeprom(struct cx18
*cx
, struct tveeprom
*tv
)
313 struct i2c_client
*c
;
316 memset(tv
, 0, sizeof(*tv
));
318 c
= kzalloc(sizeof(*c
), GFP_KERNEL
);
322 strscpy(c
->name
, "cx18 tveeprom tmp", sizeof(c
->name
));
323 c
->adapter
= &cx
->i2c_adap
[0];
326 if (tveeprom_read(c
, eedata
, sizeof(eedata
)))
329 switch (cx
->card
->type
) {
330 case CX18_CARD_HVR_1600_ESMT
:
331 case CX18_CARD_HVR_1600_SAMSUNG
:
332 case CX18_CARD_HVR_1600_S5H1411
:
333 tveeprom_hauppauge_analog(tv
, eedata
);
335 case CX18_CARD_YUAN_MPC718
:
336 case CX18_CARD_GOTVIEW_PCI_DVD3
:
338 cx18_eeprom_dump(cx
, eedata
, sizeof(eedata
));
339 CX18_INFO("eeprom PCI ID: %02x%02x:%02x%02x\n",
340 eedata
[2], eedata
[1], eedata
[4], eedata
[3]);
343 tv
->model
= 0xffffffff;
344 cx18_eeprom_dump(cx
, eedata
, sizeof(eedata
));
352 static void cx18_process_eeprom(struct cx18
*cx
)
356 cx18_read_eeprom(cx
, &tv
);
358 /* Many thanks to Steven Toth from Hauppauge for providing the
360 /* Note: the Samsung memory models cannot be reliably determined
361 from the model number. Use the cardtype module option if you
362 have one of these preproduction models. */
364 case 74301: /* Retail models */
366 case 74351: /* OEM models */
368 /* Digital side is s5h1411/tda18271 */
369 cx
->card
= cx18_get_card(CX18_CARD_HVR_1600_S5H1411
);
371 case 74021: /* Retail models */
375 case 74541: /* OEM models */
382 /* Digital side is s5h1409/mxl5005s */
383 cx
->card
= cx18_get_card(CX18_CARD_HVR_1600_ESMT
);
388 CX18_INFO("Unknown EEPROM encoding\n");
391 CX18_ERR("Invalid EEPROM\n");
394 CX18_ERR("Unknown model %d, defaulting to original HVR-1600 (cardtype=1)\n",
396 cx
->card
= cx18_get_card(CX18_CARD_HVR_1600_ESMT
);
400 cx
->v4l2_cap
= cx
->card
->v4l2_capabilities
;
401 cx
->card_name
= cx
->card
->name
;
402 cx
->card_i2c
= cx
->card
->i2c
;
404 CX18_INFO("Autodetected %s\n", cx
->card_name
);
406 if (tv
.tuner_type
== TUNER_ABSENT
)
407 CX18_ERR("tveeprom cannot autodetect tuner!\n");
409 if (cx
->options
.tuner
== -1)
410 cx
->options
.tuner
= tv
.tuner_type
;
411 if (cx
->options
.radio
== -1)
412 cx
->options
.radio
= (tv
.has_radio
!= 0);
415 /* user specified tuner standard */
418 /* autodetect tuner standard */
419 #define TVEEPROM_TUNER_FORMAT_ALL (V4L2_STD_B | V4L2_STD_GH | \
422 V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC | \
424 if ((tv
.tuner_formats
& TVEEPROM_TUNER_FORMAT_ALL
)
425 == TVEEPROM_TUNER_FORMAT_ALL
) {
426 CX18_DEBUG_INFO("Worldwide tuner detected\n");
427 cx
->std
= V4L2_STD_ALL
;
428 } else if (tv
.tuner_formats
& V4L2_STD_PAL
) {
429 CX18_DEBUG_INFO("PAL tuner detected\n");
430 cx
->std
|= V4L2_STD_PAL_BG
| V4L2_STD_PAL_H
;
431 } else if (tv
.tuner_formats
& V4L2_STD_NTSC
) {
432 CX18_DEBUG_INFO("NTSC tuner detected\n");
433 cx
->std
|= V4L2_STD_NTSC_M
;
434 } else if (tv
.tuner_formats
& V4L2_STD_SECAM
) {
435 CX18_DEBUG_INFO("SECAM tuner detected\n");
436 cx
->std
|= V4L2_STD_SECAM_L
;
438 CX18_INFO("No tuner detected, default to NTSC-M\n");
439 cx
->std
|= V4L2_STD_NTSC_M
;
443 static v4l2_std_id
cx18_parse_std(struct cx18
*cx
)
447 return V4L2_STD_PAL_60
;
452 return V4L2_STD_PAL_BG
;
455 return V4L2_STD_PAL_H
;
458 if (pal
[1] == 'c' || pal
[1] == 'C')
459 return V4L2_STD_PAL_Nc
;
460 return V4L2_STD_PAL_N
;
463 return V4L2_STD_PAL_I
;
468 return V4L2_STD_PAL_DK
;
471 return V4L2_STD_PAL_M
;
475 CX18_WARN("pal= argument not recognised\n");
486 return V4L2_STD_SECAM_B
| V4L2_STD_SECAM_G
| V4L2_STD_SECAM_H
;
491 return V4L2_STD_SECAM_DK
;
494 if (secam
[1] == 'C' || secam
[1] == 'c')
495 return V4L2_STD_SECAM_LC
;
496 return V4L2_STD_SECAM_L
;
500 CX18_WARN("secam= argument not recognised\n");
507 return V4L2_STD_NTSC_M
;
510 return V4L2_STD_NTSC_M_JP
;
513 return V4L2_STD_NTSC_M_KR
;
517 CX18_WARN("ntsc= argument not recognised\n");
525 static void cx18_process_options(struct cx18
*cx
)
529 cx
->options
.megabytes
[CX18_ENC_STREAM_TYPE_TS
] = enc_ts_buffers
;
530 cx
->options
.megabytes
[CX18_ENC_STREAM_TYPE_MPG
] = enc_mpg_buffers
;
531 cx
->options
.megabytes
[CX18_ENC_STREAM_TYPE_IDX
] = enc_idx_buffers
;
532 cx
->options
.megabytes
[CX18_ENC_STREAM_TYPE_YUV
] = enc_yuv_buffers
;
533 cx
->options
.megabytes
[CX18_ENC_STREAM_TYPE_VBI
] = enc_vbi_buffers
;
534 cx
->options
.megabytes
[CX18_ENC_STREAM_TYPE_PCM
] = enc_pcm_buffers
;
535 cx
->options
.megabytes
[CX18_ENC_STREAM_TYPE_RAD
] = 0; /* control only */
537 cx
->stream_buffers
[CX18_ENC_STREAM_TYPE_TS
] = enc_ts_bufs
;
538 cx
->stream_buffers
[CX18_ENC_STREAM_TYPE_MPG
] = enc_mpg_bufs
;
539 cx
->stream_buffers
[CX18_ENC_STREAM_TYPE_IDX
] = enc_idx_bufs
;
540 cx
->stream_buffers
[CX18_ENC_STREAM_TYPE_YUV
] = enc_yuv_bufs
;
541 cx
->stream_buffers
[CX18_ENC_STREAM_TYPE_VBI
] = enc_vbi_bufs
;
542 cx
->stream_buffers
[CX18_ENC_STREAM_TYPE_PCM
] = enc_pcm_bufs
;
543 cx
->stream_buffers
[CX18_ENC_STREAM_TYPE_RAD
] = 0; /* control, no data */
545 cx
->stream_buf_size
[CX18_ENC_STREAM_TYPE_TS
] = enc_ts_bufsize
;
546 cx
->stream_buf_size
[CX18_ENC_STREAM_TYPE_MPG
] = enc_mpg_bufsize
;
547 cx
->stream_buf_size
[CX18_ENC_STREAM_TYPE_IDX
] = enc_idx_bufsize
;
548 cx
->stream_buf_size
[CX18_ENC_STREAM_TYPE_YUV
] = enc_yuv_bufsize
;
549 cx
->stream_buf_size
[CX18_ENC_STREAM_TYPE_VBI
] = VBI_ACTIVE_SAMPLES
* 36;
550 cx
->stream_buf_size
[CX18_ENC_STREAM_TYPE_PCM
] = enc_pcm_bufsize
;
551 cx
->stream_buf_size
[CX18_ENC_STREAM_TYPE_RAD
] = 0; /* control no data */
553 /* Ensure stream_buffers & stream_buf_size are valid */
554 for (i
= 0; i
< CX18_MAX_STREAMS
; i
++) {
555 if (cx
->stream_buffers
[i
] == 0 || /* User said 0 buffers */
556 cx
->options
.megabytes
[i
] <= 0 || /* User said 0 MB total */
557 cx
->stream_buf_size
[i
] <= 0) { /* User said buf size 0 */
558 cx
->options
.megabytes
[i
] = 0;
559 cx
->stream_buffers
[i
] = 0;
560 cx
->stream_buf_size
[i
] = 0;
564 * YUV is a special case where the stream_buf_size needs to be
565 * an integral multiple of 33.75 kB (storage for 32 screens
566 * lines to maintain alignment in case of lost buffers).
568 * IDX is a special case where the stream_buf_size should be
569 * an integral multiple of 1.5 kB (storage for 64 index entries
570 * to maintain alignment in case of lost buffers).
573 if (i
== CX18_ENC_STREAM_TYPE_YUV
) {
574 cx
->stream_buf_size
[i
] *= 1024;
575 cx
->stream_buf_size
[i
] -=
576 (cx
->stream_buf_size
[i
] % CX18_UNIT_ENC_YUV_BUFSIZE
);
578 if (cx
->stream_buf_size
[i
] < CX18_UNIT_ENC_YUV_BUFSIZE
)
579 cx
->stream_buf_size
[i
] =
580 CX18_UNIT_ENC_YUV_BUFSIZE
;
581 } else if (i
== CX18_ENC_STREAM_TYPE_IDX
) {
582 cx
->stream_buf_size
[i
] *= 1024;
583 cx
->stream_buf_size
[i
] -=
584 (cx
->stream_buf_size
[i
] % CX18_UNIT_ENC_IDX_BUFSIZE
);
586 if (cx
->stream_buf_size
[i
] < CX18_UNIT_ENC_IDX_BUFSIZE
)
587 cx
->stream_buf_size
[i
] =
588 CX18_UNIT_ENC_IDX_BUFSIZE
;
591 * YUV and IDX are special cases where the stream_buf_size is
593 * VBI is a special case where the stream_buf_size is fixed
594 * and already in bytes
596 if (i
== CX18_ENC_STREAM_TYPE_VBI
||
597 i
== CX18_ENC_STREAM_TYPE_YUV
||
598 i
== CX18_ENC_STREAM_TYPE_IDX
) {
599 if (cx
->stream_buffers
[i
] < 0) {
600 cx
->stream_buffers
[i
] =
601 cx
->options
.megabytes
[i
] * 1024 * 1024
602 / cx
->stream_buf_size
[i
];
604 /* N.B. This might round down to 0 */
605 cx
->options
.megabytes
[i
] =
606 cx
->stream_buffers
[i
]
607 * cx
->stream_buf_size
[i
]/(1024 * 1024);
610 /* All other streams have stream_buf_size in kB here */
611 if (cx
->stream_buffers
[i
] < 0) {
612 cx
->stream_buffers
[i
] =
613 cx
->options
.megabytes
[i
] * 1024
614 / cx
->stream_buf_size
[i
];
616 /* N.B. This might round down to 0 */
617 cx
->options
.megabytes
[i
] =
618 cx
->stream_buffers
[i
]
619 * cx
->stream_buf_size
[i
] / 1024;
621 /* convert from kB to bytes */
622 cx
->stream_buf_size
[i
] *= 1024;
624 CX18_DEBUG_INFO("Stream type %d options: %d MB, %d buffers, %d bytes\n",
625 i
, cx
->options
.megabytes
[i
],
626 cx
->stream_buffers
[i
], cx
->stream_buf_size
[i
]);
629 cx
->options
.cardtype
= cardtype
[cx
->instance
];
630 cx
->options
.tuner
= tuner
[cx
->instance
];
631 cx
->options
.radio
= radio
[cx
->instance
];
633 cx
->std
= cx18_parse_std(cx
);
634 if (cx
->options
.cardtype
== -1) {
635 CX18_INFO("Ignore card\n");
638 cx
->card
= cx18_get_card(cx
->options
.cardtype
- 1);
640 CX18_INFO("User specified %s card\n", cx
->card
->name
);
641 else if (cx
->options
.cardtype
!= 0)
642 CX18_ERR("Unknown user specified type, trying to autodetect card\n");
644 if (cx
->pci_dev
->subsystem_vendor
== CX18_PCI_ID_HAUPPAUGE
) {
645 cx
->card
= cx18_get_card(CX18_CARD_HVR_1600_ESMT
);
646 CX18_INFO("Autodetected Hauppauge card\n");
650 for (i
= 0; (cx
->card
= cx18_get_card(i
)); i
++) {
651 if (!cx
->card
->pci_list
)
653 for (j
= 0; cx
->card
->pci_list
[j
].device
; j
++) {
654 if (cx
->pci_dev
->device
!=
655 cx
->card
->pci_list
[j
].device
)
657 if (cx
->pci_dev
->subsystem_vendor
!=
658 cx
->card
->pci_list
[j
].subsystem_vendor
)
660 if (cx
->pci_dev
->subsystem_device
!=
661 cx
->card
->pci_list
[j
].subsystem_device
)
663 CX18_INFO("Autodetected %s card\n", cx
->card
->name
);
671 cx
->card
= cx18_get_card(CX18_CARD_HVR_1600_ESMT
);
672 CX18_ERR("Unknown card: vendor/device: [%04x:%04x]\n",
673 cx
->pci_dev
->vendor
, cx
->pci_dev
->device
);
674 CX18_ERR(" subsystem vendor/device: [%04x:%04x]\n",
675 cx
->pci_dev
->subsystem_vendor
,
676 cx
->pci_dev
->subsystem_device
);
677 CX18_ERR("Defaulting to %s card\n", cx
->card
->name
);
678 CX18_ERR("Please mail the vendor/device and subsystem vendor/device IDs and what kind of\n");
679 CX18_ERR("card you have to the linux-media mailinglist (www.linuxtv.org)\n");
680 CX18_ERR("Prefix your subject line with [UNKNOWN CX18 CARD].\n");
682 cx
->v4l2_cap
= cx
->card
->v4l2_capabilities
;
683 cx
->card_name
= cx
->card
->name
;
684 cx
->card_i2c
= cx
->card
->i2c
;
687 static int cx18_create_in_workq(struct cx18
*cx
)
689 snprintf(cx
->in_workq_name
, sizeof(cx
->in_workq_name
), "%s-in",
691 cx
->in_work_queue
= alloc_ordered_workqueue("%s", 0, cx
->in_workq_name
);
692 if (!cx
->in_work_queue
) {
693 CX18_ERR("Unable to create incoming mailbox handler thread\n");
699 static void cx18_init_in_work_orders(struct cx18
*cx
)
702 for (i
= 0; i
< CX18_MAX_IN_WORK_ORDERS
; i
++) {
703 cx
->in_work_order
[i
].cx
= cx
;
704 cx
->in_work_order
[i
].str
= cx
->epu_debug_str
;
705 INIT_WORK(&cx
->in_work_order
[i
].work
, cx18_in_work_handler
);
709 /* Precondition: the cx18 structure has been memset to 0. Only
710 the dev and instance fields have been filled in.
711 No assumptions on the card type may be made here (see cx18_init_struct2
714 static int cx18_init_struct1(struct cx18
*cx
)
718 cx
->base_addr
= pci_resource_start(cx
->pci_dev
, 0);
720 mutex_init(&cx
->serialize_lock
);
721 mutex_init(&cx
->gpio_lock
);
722 mutex_init(&cx
->epu2apu_mb_lock
);
723 mutex_init(&cx
->epu2cpu_mb_lock
);
725 ret
= cx18_create_in_workq(cx
);
729 cx18_init_in_work_orders(cx
);
731 /* start counting open_id at 1 */
734 /* Initial settings */
735 cx
->cxhdl
.port
= CX2341X_PORT_MEMORY
;
736 cx
->cxhdl
.capabilities
= CX2341X_CAP_HAS_TS
| CX2341X_CAP_HAS_SLICED_VBI
;
737 cx
->cxhdl
.ops
= &cx18_cxhdl_ops
;
738 cx
->cxhdl
.func
= cx18_api_func
;
739 cx
->cxhdl
.priv
= &cx
->streams
[CX18_ENC_STREAM_TYPE_MPG
];
740 ret
= cx2341x_handler_init(&cx
->cxhdl
, 50);
743 cx
->v4l2_dev
.ctrl_handler
= &cx
->cxhdl
.hdl
;
745 cx
->temporal_strength
= cx
->cxhdl
.video_temporal_filter
->cur
.val
;
746 cx
->spatial_strength
= cx
->cxhdl
.video_spatial_filter
->cur
.val
;
747 cx
->filter_mode
= cx
->cxhdl
.video_spatial_filter_mode
->cur
.val
|
748 (cx
->cxhdl
.video_temporal_filter_mode
->cur
.val
<< 1) |
749 (cx
->cxhdl
.video_median_filter_type
->cur
.val
<< 2);
751 init_waitqueue_head(&cx
->cap_w
);
752 init_waitqueue_head(&cx
->mb_apu_waitq
);
753 init_waitqueue_head(&cx
->mb_cpu_waitq
);
754 init_waitqueue_head(&cx
->dma_waitq
);
757 cx
->vbi
.in
.type
= V4L2_BUF_TYPE_VBI_CAPTURE
;
758 cx
->vbi
.sliced_in
= &cx
->vbi
.in
.fmt
.sliced
;
760 /* IVTV style VBI insertion into MPEG streams */
761 INIT_LIST_HEAD(&cx
->vbi
.sliced_mpeg_buf
.list
);
762 INIT_LIST_HEAD(&cx
->vbi
.sliced_mpeg_mdl
.list
);
763 INIT_LIST_HEAD(&cx
->vbi
.sliced_mpeg_mdl
.buf_list
);
764 list_add(&cx
->vbi
.sliced_mpeg_buf
.list
,
765 &cx
->vbi
.sliced_mpeg_mdl
.buf_list
);
769 /* Second initialization part. Here the card type has been
771 static void cx18_init_struct2(struct cx18
*cx
)
775 for (i
= 0; i
< CX18_CARD_MAX_VIDEO_INPUTS
- 1; i
++)
776 if (cx
->card
->video_inputs
[i
].video_type
== 0)
779 for (i
= 0; i
< CX18_CARD_MAX_AUDIO_INPUTS
- 1; i
++)
780 if (cx
->card
->audio_inputs
[i
].audio_type
== 0)
782 cx
->nof_audio_inputs
= i
;
784 /* Find tuner input */
785 for (i
= 0; i
< cx
->nof_inputs
; i
++) {
786 if (cx
->card
->video_inputs
[i
].video_type
==
787 CX18_CARD_INPUT_VID_TUNER
)
790 if (i
== cx
->nof_inputs
)
792 cx
->active_input
= i
;
793 cx
->audio_input
= cx
->card
->video_inputs
[i
].audio_index
;
796 static int cx18_setup_pci(struct cx18
*cx
, struct pci_dev
*pci_dev
,
797 const struct pci_device_id
*pci_id
)
800 unsigned char pci_latency
;
802 CX18_DEBUG_INFO("Enabling pci device\n");
804 if (pci_enable_device(pci_dev
)) {
805 CX18_ERR("Can't enable device %d!\n", cx
->instance
);
808 if (pci_set_dma_mask(pci_dev
, DMA_BIT_MASK(32))) {
809 CX18_ERR("No suitable DMA available, card %d\n", cx
->instance
);
812 if (!request_mem_region(cx
->base_addr
, CX18_MEM_SIZE
, "cx18 encoder")) {
813 CX18_ERR("Cannot request encoder memory region, card %d\n",
818 /* Enable bus mastering and memory mapped IO for the CX23418 */
819 pci_read_config_word(pci_dev
, PCI_COMMAND
, &cmd
);
820 cmd
|= PCI_COMMAND_MEMORY
| PCI_COMMAND_MASTER
;
821 pci_write_config_word(pci_dev
, PCI_COMMAND
, cmd
);
823 cx
->card_rev
= pci_dev
->revision
;
824 pci_read_config_byte(pci_dev
, PCI_LATENCY_TIMER
, &pci_latency
);
826 if (pci_latency
< 64 && cx18_pci_latency
) {
827 CX18_INFO("Unreasonably low latency timer, setting to 64 (was %d)\n",
829 pci_write_config_byte(pci_dev
, PCI_LATENCY_TIMER
, 64);
830 pci_read_config_byte(pci_dev
, PCI_LATENCY_TIMER
, &pci_latency
);
833 CX18_DEBUG_INFO("cx%d (rev %d) at %02x:%02x.%x, irq: %d, latency: %d, memory: 0x%llx\n",
834 cx
->pci_dev
->device
, cx
->card_rev
, pci_dev
->bus
->number
,
835 PCI_SLOT(pci_dev
->devfn
), PCI_FUNC(pci_dev
->devfn
),
836 cx
->pci_dev
->irq
, pci_latency
, (u64
)cx
->base_addr
);
841 static void cx18_init_subdevs(struct cx18
*cx
)
843 u32 hw
= cx
->card
->hw_all
;
847 for (i
= 0, device
= 1; i
< 32; i
++, device
<<= 1) {
854 case CX18_HW_TVEEPROM
:
855 /* These subordinate devices do not use probing */
856 cx
->hw_flags
|= device
;
859 /* The A/V decoder gets probed earlier to set PLLs */
860 /* Just note that the card uses it (i.e. has analog) */
861 cx
->hw_flags
|= device
;
863 case CX18_HW_GPIO_RESET_CTRL
:
865 * The Reset Controller gets probed and added to
866 * hw_flags earlier for i2c adapter/bus initialization
869 case CX18_HW_GPIO_MUX
:
870 if (cx18_gpio_register(cx
, device
) == 0)
871 cx
->hw_flags
|= device
;
874 if (cx18_i2c_register(cx
, i
) == 0)
875 cx
->hw_flags
|= device
;
880 if (cx
->hw_flags
& CX18_HW_418_AV
)
881 cx
->sd_av
= cx18_find_hw(cx
, CX18_HW_418_AV
);
883 if (cx
->card
->hw_muxer
!= 0)
884 cx
->sd_extmux
= cx18_find_hw(cx
, cx
->card
->hw_muxer
);
887 static int cx18_probe(struct pci_dev
*pci_dev
,
888 const struct pci_device_id
*pci_id
)
895 /* FIXME - module parameter arrays constrain max instances */
896 i
= atomic_inc_return(&cx18_instance
) - 1;
897 if (i
>= CX18_MAX_CARDS
) {
898 printk(KERN_ERR
"cx18: cannot manage card %d, driver has a limit of 0 - %d\n",
899 i
, CX18_MAX_CARDS
- 1);
903 cx
= kzalloc(sizeof(*cx
), GFP_ATOMIC
);
907 cx
->pci_dev
= pci_dev
;
910 retval
= v4l2_device_register(&pci_dev
->dev
, &cx
->v4l2_dev
);
912 printk(KERN_ERR
"cx18: v4l2_device_register of card %d failed\n",
917 snprintf(cx
->v4l2_dev
.name
, sizeof(cx
->v4l2_dev
.name
), "cx18-%d",
919 CX18_INFO("Initializing card %d\n", cx
->instance
);
921 cx18_process_options(cx
);
922 if (cx
->options
.cardtype
== -1) {
927 retval
= cx18_init_struct1(cx
);
931 CX18_DEBUG_INFO("base addr: 0x%llx\n", (u64
)cx
->base_addr
);
933 /* PCI Device Setup */
934 retval
= cx18_setup_pci(cx
, pci_dev
, pci_id
);
936 goto free_workqueues
;
939 CX18_DEBUG_INFO("attempting ioremap at 0x%llx len 0x%08x\n",
940 (u64
)cx
->base_addr
+ CX18_MEM_OFFSET
, CX18_MEM_SIZE
);
941 cx
->enc_mem
= ioremap(cx
->base_addr
+ CX18_MEM_OFFSET
,
944 CX18_ERR("ioremap failed. Can't get a window into CX23418 memory and register space\n");
945 CX18_ERR("Each capture card with a CX23418 needs 64 MB of vmalloc address space for the window\n");
946 CX18_ERR("Check the output of 'grep Vmalloc /proc/meminfo'\n");
947 CX18_ERR("Use the vmalloc= kernel command line option to set VmallocTotal to a larger value\n");
951 cx
->reg_mem
= cx
->enc_mem
+ CX18_REG_OFFSET
;
952 devtype
= cx18_read_reg(cx
, 0xC72028);
953 switch (devtype
& 0xff000000) {
955 CX18_INFO("cx23418 revision %08x (A)\n", devtype
);
958 CX18_INFO("cx23418 revision %08x (B)\n", devtype
);
961 CX18_INFO("cx23418 revision %08x (Unknown)\n", devtype
);
965 cx18_init_power(cx
, 1);
966 cx18_init_memory(cx
);
968 cx
->scb
= (struct cx18_scb __iomem
*)(cx
->enc_mem
+ SCB_OFFSET
);
973 /* Initialize integrated A/V decoder early to set PLLs, just in case */
974 retval
= cx18_av_probe(cx
);
976 CX18_ERR("Could not register A/V decoder subdevice\n");
980 /* Initialize GPIO Reset Controller to do chip resets during i2c init */
981 if (cx
->card
->hw_all
& CX18_HW_GPIO_RESET_CTRL
) {
982 if (cx18_gpio_register(cx
, CX18_HW_GPIO_RESET_CTRL
) != 0)
983 CX18_WARN("Could not register GPIO reset controllersubdevice; proceeding anyway.\n");
985 cx
->hw_flags
|= CX18_HW_GPIO_RESET_CTRL
;
989 CX18_DEBUG_INFO("activating i2c...\n");
990 retval
= init_cx18_i2c(cx
);
992 CX18_ERR("Could not initialize i2c\n");
996 if (cx
->card
->hw_all
& CX18_HW_TVEEPROM
) {
997 /* Based on the model number the cardtype may be changed.
998 The PCI IDs are not always reliable. */
999 const struct cx18_card
*orig_card
= cx
->card
;
1000 cx18_process_eeprom(cx
);
1002 if (cx
->card
!= orig_card
) {
1003 /* Changed the cardtype; re-reset the I2C chips */
1005 cx18_call_hw(cx
, CX18_HW_GPIO_RESET_CTRL
,
1006 core
, reset
, (u32
) CX18_GPIO_RESET_I2C
);
1009 if (cx
->card
->comment
)
1010 CX18_INFO("%s", cx
->card
->comment
);
1011 if (cx
->card
->v4l2_capabilities
== 0) {
1015 cx18_init_memory(cx
);
1019 retval
= request_irq(cx
->pci_dev
->irq
, cx18_irq_handler
,
1020 IRQF_SHARED
, cx
->v4l2_dev
.name
, (void *)cx
);
1022 CX18_ERR("Failed to register irq %d\n", retval
);
1027 cx
->std
= V4L2_STD_NTSC_M
;
1029 if (cx
->options
.tuner
== -1) {
1030 for (i
= 0; i
< CX18_CARD_MAX_TUNERS
; i
++) {
1031 if ((cx
->std
& cx
->card
->tuners
[i
].std
) == 0)
1033 cx
->options
.tuner
= cx
->card
->tuners
[i
].tuner
;
1037 /* if no tuner was found, then pick the first tuner in the card list */
1038 if (cx
->options
.tuner
== -1 && cx
->card
->tuners
[0].std
) {
1039 cx
->std
= cx
->card
->tuners
[0].std
;
1040 if (cx
->std
& V4L2_STD_PAL
)
1041 cx
->std
= V4L2_STD_PAL_BG
| V4L2_STD_PAL_H
;
1042 else if (cx
->std
& V4L2_STD_NTSC
)
1043 cx
->std
= V4L2_STD_NTSC_M
;
1044 else if (cx
->std
& V4L2_STD_SECAM
)
1045 cx
->std
= V4L2_STD_SECAM_L
;
1046 cx
->options
.tuner
= cx
->card
->tuners
[0].tuner
;
1048 if (cx
->options
.radio
== -1)
1049 cx
->options
.radio
= (cx
->card
->radio_input
.audio_type
!= 0);
1051 /* The card is now fully identified, continue with card-specific
1053 cx18_init_struct2(cx
);
1055 cx18_init_subdevs(cx
);
1057 if (cx
->std
& V4L2_STD_525_60
)
1062 cx2341x_handler_set_50hz(&cx
->cxhdl
, !cx
->is_60hz
);
1064 if (cx
->options
.radio
> 0)
1065 cx
->v4l2_cap
|= V4L2_CAP_RADIO
;
1067 if (cx
->options
.tuner
> -1) {
1068 struct tuner_setup setup
;
1070 setup
.addr
= ADDR_UNSET
;
1071 setup
.type
= cx
->options
.tuner
;
1072 setup
.mode_mask
= T_ANALOG_TV
; /* matches TV tuners */
1073 setup
.config
= NULL
;
1074 if (cx
->options
.radio
> 0)
1075 setup
.mode_mask
|= T_RADIO
;
1076 setup
.tuner_callback
= (setup
.type
== TUNER_XC2028
) ?
1077 cx18_reset_tuner_gpio
: NULL
;
1078 cx18_call_all(cx
, tuner
, s_type_addr
, &setup
);
1079 if (setup
.type
== TUNER_XC2028
) {
1080 static struct xc2028_ctrl ctrl
= {
1081 .fname
= XC2028_DEFAULT_FIRMWARE
,
1084 struct v4l2_priv_tun_config cfg
= {
1085 .tuner
= cx
->options
.tuner
,
1088 cx18_call_all(cx
, tuner
, s_config
, &cfg
);
1092 /* The tuner is fixed to the standard. The other inputs (e.g. S-Video)
1094 cx
->tuner_std
= cx
->std
;
1095 if (cx
->std
== V4L2_STD_ALL
)
1096 cx
->std
= V4L2_STD_NTSC_M
;
1098 retval
= cx18_streams_setup(cx
);
1100 CX18_ERR("Error %d setting up streams\n", retval
);
1103 retval
= cx18_streams_register(cx
);
1105 CX18_ERR("Error %d registering devices\n", retval
);
1109 CX18_INFO("Initialized card: %s\n", cx
->card_name
);
1111 /* Load cx18 submodules (cx18-alsa) */
1112 request_modules(cx
);
1116 cx18_streams_cleanup(cx
, 1);
1118 free_irq(cx
->pci_dev
->irq
, (void *)cx
);
1124 release_mem_region(cx
->base_addr
, CX18_MEM_SIZE
);
1126 destroy_workqueue(cx
->in_work_queue
);
1128 CX18_ERR("Error %d on initialization\n", retval
);
1130 v4l2_device_unregister(&cx
->v4l2_dev
);
1135 int cx18_init_on_first_open(struct cx18
*cx
)
1138 int fw_retry_count
= 3;
1139 struct v4l2_frequency vf
;
1140 struct cx18_open_id fh
;
1145 if (test_bit(CX18_F_I_FAILED
, &cx
->i_flags
))
1148 if (test_and_set_bit(CX18_F_I_INITED
, &cx
->i_flags
))
1151 while (--fw_retry_count
> 0) {
1153 if (cx18_firmware_init(cx
) == 0)
1155 if (fw_retry_count
> 1)
1156 CX18_WARN("Retry loading firmware\n");
1159 if (fw_retry_count
== 0) {
1160 set_bit(CX18_F_I_FAILED
, &cx
->i_flags
);
1163 set_bit(CX18_F_I_LOADED_FW
, &cx
->i_flags
);
1166 * Init the firmware twice to work around a silicon bug
1167 * with the digital TS.
1169 * The second firmware load requires us to normalize the APU state,
1170 * or the audio for the first analog capture will be badly incorrect.
1172 * I can't seem to call APU_RESETAI and have it succeed without the
1173 * APU capturing audio, so we start and stop it here to do the reset
1176 /* MPEG Encoding, 224 kbps, MPEG Layer II, 48 ksps */
1177 cx18_vapi(cx
, CX18_APU_START
, 2, CX18_APU_ENCODING_METHOD_MPEG
|0xb9, 0);
1178 cx18_vapi(cx
, CX18_APU_RESETAI
, 0);
1179 cx18_vapi(cx
, CX18_APU_STOP
, 1, CX18_APU_ENCODING_METHOD_MPEG
);
1182 while (--fw_retry_count
> 0) {
1184 if (cx18_firmware_init(cx
) == 0)
1186 if (fw_retry_count
> 1)
1187 CX18_WARN("Retry loading firmware\n");
1190 if (fw_retry_count
== 0) {
1191 set_bit(CX18_F_I_FAILED
, &cx
->i_flags
);
1196 * The second firmware load requires us to normalize the APU state,
1197 * or the audio for the first analog capture will be badly incorrect.
1199 * I can't seem to call APU_RESETAI and have it succeed without the
1200 * APU capturing audio, so we start and stop it here to do the reset
1203 /* MPEG Encoding, 224 kbps, MPEG Layer II, 48 ksps */
1204 cx18_vapi(cx
, CX18_APU_START
, 2, CX18_APU_ENCODING_METHOD_MPEG
|0xb9, 0);
1205 cx18_vapi(cx
, CX18_APU_RESETAI
, 0);
1206 cx18_vapi(cx
, CX18_APU_STOP
, 1, CX18_APU_ENCODING_METHOD_MPEG
);
1208 /* Init the A/V decoder, if it hasn't been already */
1209 v4l2_subdev_call(cx
->sd_av
, core
, load_fw
);
1212 vf
.type
= V4L2_TUNER_ANALOG_TV
;
1213 vf
.frequency
= 6400; /* the tuner 'baseline' frequency */
1215 /* Set initial frequency. For PAL/SECAM broadcasts no
1216 'default' channel exists AFAIK. */
1217 if (cx
->std
== V4L2_STD_NTSC_M_JP
)
1218 vf
.frequency
= 1460; /* ch. 1 91250*16/1000 */
1219 else if (cx
->std
& V4L2_STD_NTSC_M
)
1220 vf
.frequency
= 1076; /* ch. 4 67250*16/1000 */
1222 video_input
= cx
->active_input
;
1223 cx
->active_input
++; /* Force update of input */
1224 cx18_s_input(NULL
, &fh
, video_input
);
1226 /* Let the VIDIOC_S_STD ioctl do all the work, keeps the code
1228 cx
->std
++; /* Force full standard initialization */
1229 std
= (cx
->tuner_std
== V4L2_STD_ALL
) ? V4L2_STD_NTSC_M
: cx
->tuner_std
;
1230 cx18_s_std(NULL
, &fh
, std
);
1231 cx18_s_frequency(NULL
, &fh
, &vf
);
1235 static void cx18_cancel_in_work_orders(struct cx18
*cx
)
1238 for (i
= 0; i
< CX18_MAX_IN_WORK_ORDERS
; i
++)
1239 cancel_work_sync(&cx
->in_work_order
[i
].work
);
1242 static void cx18_cancel_out_work_orders(struct cx18
*cx
)
1245 for (i
= 0; i
< CX18_MAX_STREAMS
; i
++)
1246 if (cx
->streams
[i
].video_dev
.v4l2_dev
)
1247 cancel_work_sync(&cx
->streams
[i
].out_work_order
);
1250 static void cx18_remove(struct pci_dev
*pci_dev
)
1252 struct v4l2_device
*v4l2_dev
= pci_get_drvdata(pci_dev
);
1253 struct cx18
*cx
= to_cx18(v4l2_dev
);
1256 CX18_DEBUG_INFO("Removing Card\n");
1258 flush_request_modules(cx
);
1260 /* Stop all captures */
1261 CX18_DEBUG_INFO("Stopping all streams\n");
1262 if (atomic_read(&cx
->tot_capturing
) > 0)
1263 cx18_stop_all_captures(cx
);
1265 /* Stop interrupts that cause incoming work to be queued */
1266 cx18_sw1_irq_disable(cx
, IRQ_CPU_TO_EPU
| IRQ_APU_TO_EPU
);
1268 /* Incoming work can cause outgoing work, so clean up incoming first */
1269 cx18_cancel_in_work_orders(cx
);
1270 cx18_cancel_out_work_orders(cx
);
1272 /* Stop ack interrupts that may have been needed for work to finish */
1273 cx18_sw2_irq_disable(cx
, IRQ_CPU_TO_EPU_ACK
| IRQ_APU_TO_EPU_ACK
);
1275 cx18_halt_firmware(cx
);
1277 destroy_workqueue(cx
->in_work_queue
);
1279 cx18_streams_cleanup(cx
, 1);
1283 free_irq(cx
->pci_dev
->irq
, (void *)cx
);
1287 release_mem_region(cx
->base_addr
, CX18_MEM_SIZE
);
1289 pci_disable_device(cx
->pci_dev
);
1291 if (cx
->vbi
.sliced_mpeg_data
[0])
1292 for (i
= 0; i
< CX18_VBI_FRAMES
; i
++)
1293 kfree(cx
->vbi
.sliced_mpeg_data
[i
]);
1295 v4l2_ctrl_handler_free(&cx
->av_state
.hdl
);
1297 CX18_INFO("Removed %s\n", cx
->card_name
);
1299 v4l2_device_unregister(v4l2_dev
);
1304 /* define a pci_driver for card detection */
1305 static struct pci_driver cx18_pci_driver
= {
1307 .id_table
= cx18_pci_tbl
,
1308 .probe
= cx18_probe
,
1309 .remove
= cx18_remove
,
1312 static int __init
module_start(void)
1314 printk(KERN_INFO
"cx18: Start initialization, version %s\n",
1317 /* Validate parameters */
1318 if (cx18_first_minor
< 0 || cx18_first_minor
>= CX18_MAX_CARDS
) {
1319 printk(KERN_ERR
"cx18: Exiting, cx18_first_minor must be between 0 and %d\n",
1320 CX18_MAX_CARDS
- 1);
1324 if (cx18_debug
< 0 || cx18_debug
> 511) {
1326 printk(KERN_INFO
"cx18: Debug value must be >= 0 and <= 511!\n");
1329 if (pci_register_driver(&cx18_pci_driver
)) {
1330 printk(KERN_ERR
"cx18: Error detecting PCI card\n");
1333 printk(KERN_INFO
"cx18: End initialization\n");
1337 static void __exit
module_cleanup(void)
1339 pci_unregister_driver(&cx18_pci_driver
);
1342 module_init(module_start
);
1343 module_exit(module_cleanup
);
1344 MODULE_FIRMWARE(XC2028_DEFAULT_FIRMWARE
);