2 * Driver for the Conexant CX23885 PCIe bridge
4 * Copyright (c) 2006 Steven Toth <stoth@linuxtv.org>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include <linux/init.h>
23 #include <linux/module.h>
24 #include <linux/pci.h>
25 #include <linux/delay.h>
26 #include <media/cx25840.h>
29 #include "tuner-xc2028.h"
31 /* ------------------------------------------------------------------ */
32 /* board config info */
34 struct cx23885_board cx23885_boards
[] = {
35 [CX23885_BOARD_UNKNOWN
] = {
36 .name
= "UNKNOWN/GENERIC",
37 /* Ensure safe default for unknown boards */
40 .type
= CX23885_VMUX_COMPOSITE1
,
43 .type
= CX23885_VMUX_COMPOSITE2
,
46 .type
= CX23885_VMUX_COMPOSITE3
,
49 .type
= CX23885_VMUX_COMPOSITE4
,
53 [CX23885_BOARD_HAUPPAUGE_HVR1800lp
] = {
54 .name
= "Hauppauge WinTV-HVR1800lp",
55 .portc
= CX23885_MPEG_DVB
,
57 .type
= CX23885_VMUX_TELEVISION
,
61 .type
= CX23885_VMUX_DEBUG
,
65 .type
= CX23885_VMUX_COMPOSITE1
,
69 .type
= CX23885_VMUX_SVIDEO
,
74 [CX23885_BOARD_HAUPPAUGE_HVR1800
] = {
75 .name
= "Hauppauge WinTV-HVR1800",
76 .porta
= CX23885_ANALOG_VIDEO
,
77 .portb
= CX23885_MPEG_ENCODER
,
78 .portc
= CX23885_MPEG_DVB
,
79 .tuner_type
= TUNER_PHILIPS_TDA8290
,
80 .tuner_addr
= 0x42, /* 0x84 >> 1 */
82 .type
= CX23885_VMUX_TELEVISION
,
83 .vmux
= CX25840_VIN7_CH3
|
88 .type
= CX23885_VMUX_COMPOSITE1
,
89 .vmux
= CX25840_VIN7_CH3
|
94 .type
= CX23885_VMUX_SVIDEO
,
95 .vmux
= CX25840_VIN7_CH3
|
102 [CX23885_BOARD_HAUPPAUGE_HVR1250
] = {
103 .name
= "Hauppauge WinTV-HVR1250",
104 .portc
= CX23885_MPEG_DVB
,
106 .type
= CX23885_VMUX_TELEVISION
,
110 .type
= CX23885_VMUX_DEBUG
,
114 .type
= CX23885_VMUX_COMPOSITE1
,
118 .type
= CX23885_VMUX_SVIDEO
,
123 [CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP
] = {
124 .name
= "DViCO FusionHDTV5 Express",
125 .portb
= CX23885_MPEG_DVB
,
127 [CX23885_BOARD_HAUPPAUGE_HVR1500Q
] = {
128 .name
= "Hauppauge WinTV-HVR1500Q",
129 .portc
= CX23885_MPEG_DVB
,
131 [CX23885_BOARD_HAUPPAUGE_HVR1500
] = {
132 .name
= "Hauppauge WinTV-HVR1500",
133 .portc
= CX23885_MPEG_DVB
,
135 [CX23885_BOARD_HAUPPAUGE_HVR1200
] = {
136 .name
= "Hauppauge WinTV-HVR1200",
137 .portc
= CX23885_MPEG_DVB
,
139 [CX23885_BOARD_HAUPPAUGE_HVR1700
] = {
140 .name
= "Hauppauge WinTV-HVR1700",
141 .portc
= CX23885_MPEG_DVB
,
143 [CX23885_BOARD_HAUPPAUGE_HVR1400
] = {
144 .name
= "Hauppauge WinTV-HVR1400",
145 .portc
= CX23885_MPEG_DVB
,
147 [CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP
] = {
148 .name
= "DViCO FusionHDTV7 Dual Express",
149 .portb
= CX23885_MPEG_DVB
,
150 .portc
= CX23885_MPEG_DVB
,
152 [CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP
] = {
153 .name
= "DViCO FusionHDTV DVB-T Dual Express",
154 .portb
= CX23885_MPEG_DVB
,
155 .portc
= CX23885_MPEG_DVB
,
158 const unsigned int cx23885_bcount
= ARRAY_SIZE(cx23885_boards
);
160 /* ------------------------------------------------------------------ */
161 /* PCI subsystem IDs */
163 struct cx23885_subid cx23885_subids
[] = {
167 .card
= CX23885_BOARD_UNKNOWN
,
171 .card
= CX23885_BOARD_HAUPPAUGE_HVR1800lp
,
175 .card
= CX23885_BOARD_HAUPPAUGE_HVR1800
,
179 .card
= CX23885_BOARD_HAUPPAUGE_HVR1800
,
183 .card
= CX23885_BOARD_HAUPPAUGE_HVR1800
,
187 .card
= CX23885_BOARD_HAUPPAUGE_HVR1250
,
191 .card
= CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP
,
195 .card
= CX23885_BOARD_HAUPPAUGE_HVR1500Q
,
199 .card
= CX23885_BOARD_HAUPPAUGE_HVR1500Q
,
203 .card
= CX23885_BOARD_HAUPPAUGE_HVR1500
,
207 .card
= CX23885_BOARD_HAUPPAUGE_HVR1500
,
211 .card
= CX23885_BOARD_HAUPPAUGE_HVR1200
,
215 .card
= CX23885_BOARD_HAUPPAUGE_HVR1200
,
219 .card
= CX23885_BOARD_HAUPPAUGE_HVR1700
,
223 .card
= CX23885_BOARD_HAUPPAUGE_HVR1400
,
227 .card
= CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP
,
231 .card
= CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP
,
234 const unsigned int cx23885_idcount
= ARRAY_SIZE(cx23885_subids
);
236 void cx23885_card_list(struct cx23885_dev
*dev
)
240 if (0 == dev
->pci
->subsystem_vendor
&&
241 0 == dev
->pci
->subsystem_device
) {
242 printk("%s: Your board has no valid PCIe Subsystem ID and thus can't\n"
243 "%s: be autodetected. Please pass card=<n> insmod option to\n"
244 "%s: workaround that. Redirect complaints to the vendor of\n"
245 "%s: the TV card. Best regards,\n"
247 dev
->name
, dev
->name
, dev
->name
, dev
->name
, dev
->name
);
249 printk("%s: Your board isn't known (yet) to the driver. You can\n"
250 "%s: try to pick one of the existing card configs via\n"
251 "%s: card=<n> insmod option. Updating to the latest\n"
252 "%s: version might help as well.\n",
253 dev
->name
, dev
->name
, dev
->name
, dev
->name
);
255 printk("%s: Here is a list of valid choices for the card=<n> insmod option:\n",
257 for (i
= 0; i
< cx23885_bcount
; i
++)
258 printk("%s: card=%d -> %s\n",
259 dev
->name
, i
, cx23885_boards
[i
].name
);
262 static void hauppauge_eeprom(struct cx23885_dev
*dev
, u8
*eeprom_data
)
266 tveeprom_hauppauge_analog(&dev
->i2c_bus
[0].i2c_client
, &tv
, eeprom_data
);
268 /* Make sure we support the board model */
272 /* WinTV-HVR1200 (PCIe, Retail, full height)
273 * DVB-T and basic analog */
275 /* WinTV-HVR1200 (PCIe, OEM, half height)
276 * DVB-T and basic analog */
278 /* WinTV-HVR1200 (PCIe, OEM, half height)
279 * DVB-T and basic analog */
281 /* WinTV-HVR1200 (PCIe, OEM, full height)
282 * DVB-T and basic analog */
284 /* WinTV-HVR1200 (PCIe, OEM, half height)
285 * DVB-T and basic analog */
287 /* WinTV-HVR1200 (PCIe, OEM, full height)
288 * DVB-T and basic analog */
290 /* WinTV-HVR1200 (PCIe, OEM, full height)
291 * DVB-T and basic analog */
293 /* WinTV-HVR1200 (PCIe, OEM, half height)
294 * DVB-T and basic analog */
296 /* WinTV-HVR1200 (PCIe, OEM, full height)
297 * DVB-T and basic analog */
298 case 76601: /* WinTV-HVR1800lp (PCIe, Retail, No IR, Dual channel ATSC and MPEG2 HW Encoder */
299 case 77001: /* WinTV-HVR1500 (Express Card, OEM, No IR, ATSC and Basic analog */
300 case 77011: /* WinTV-HVR1500 (Express Card, Retail, No IR, ATSC and Basic analog */
301 case 77041: /* WinTV-HVR1500Q (Express Card, OEM, No IR, ATSC/QAM and Basic analog */
302 case 77051: /* WinTV-HVR1500Q (Express Card, Retail, No IR, ATSC/QAM and Basic analog */
303 case 78011: /* WinTV-HVR1800 (PCIe, Retail, 3.5mm in, IR, No FM, Dual channel ATSC and MPEG2 HW Encoder */
304 case 78501: /* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM, Dual channel ATSC and MPEG2 HW Encoder */
305 case 78521: /* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM, Dual channel ATSC and MPEG2 HW Encoder */
306 case 78531: /* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, No FM, Dual channel ATSC and MPEG2 HW Encoder */
307 case 78631: /* WinTV-HVR1800 (PCIe, OEM, No IR, No FM, Dual channel ATSC and MPEG2 HW Encoder */
308 case 79001: /* WinTV-HVR1250 (PCIe, Retail, IR, full height, ATSC and Basic analog */
309 case 79101: /* WinTV-HVR1250 (PCIe, Retail, IR, half height, ATSC and Basic analog */
310 case 79561: /* WinTV-HVR1250 (PCIe, OEM, No IR, half height, ATSC and Basic analog */
311 case 79571: /* WinTV-HVR1250 (PCIe, OEM, No IR, full height, ATSC and Basic analog */
312 case 79671: /* WinTV-HVR1250 (PCIe, OEM, No IR, half height, ATSC and Basic analog */
314 /* WinTV-HVR1400 (Express Card, Retail, IR,
315 * DVB-T and Basic analog */
317 /* WinTV-HVR1700 (PCIe, OEM, No IR, half height)
318 * DVB-T and MPEG2 HW Encoder */
320 /* WinTV-HVR1700 (PCIe, OEM, No IR, full height)
321 * DVB-T and MPEG2 HW Encoder */
324 printk("%s: warning: unknown hauppauge model #%d\n", dev
->name
, tv
.model
);
328 printk(KERN_INFO
"%s: hauppauge eeprom: model=%d\n",
329 dev
->name
, tv
.model
);
332 static int cx23885_tuner_callback(struct cx23885_dev
*dev
, int port
,
333 int command
, int arg
)
338 printk(KERN_ERR
"%s(): Unknown command 0x%x.\n",
344 case CX23885_BOARD_HAUPPAUGE_HVR1400
:
345 case CX23885_BOARD_HAUPPAUGE_HVR1500
:
346 case CX23885_BOARD_HAUPPAUGE_HVR1500Q
:
347 /* Tuner Reset Command */
351 case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP
:
352 case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP
:
355 /* Two identical tuners on two different i2c buses,
356 * we need to reset the correct gpio. */
366 /* Drive the tuner into reset and back out */
367 cx_clear(GP0_IO
, bitmask
);
369 cx_set(GP0_IO
, bitmask
);
375 int cx23885_xc5000_tuner_callback(void *priv
, int command
, int arg
)
377 struct cx23885_i2c
*bus
= priv
;
378 struct cx23885_dev
*dev
= bus
->dev
;
380 return cx23885_tuner_callback(dev
, bus
->nr
, command
, arg
);
383 int cx23885_xc3028_tuner_callback(void *priv
, int command
, int arg
)
385 struct cx23885_tsport
*port
= priv
;
386 struct cx23885_dev
*dev
= port
->dev
;
388 if (command
== XC2028_RESET_CLK
)
391 return cx23885_tuner_callback(dev
, port
->nr
, command
, arg
);
394 void cx23885_gpio_setup(struct cx23885_dev
*dev
)
397 case CX23885_BOARD_HAUPPAUGE_HVR1250
:
398 /* GPIO-0 cx24227 demodulator reset */
399 cx_set(GP0_IO
, 0x00010001); /* Bring the part out of reset */
401 case CX23885_BOARD_HAUPPAUGE_HVR1500
:
402 /* GPIO-0 cx24227 demodulator */
403 /* GPIO-2 xc3028 tuner */
405 /* Put the parts into reset */
406 cx_set(GP0_IO
, 0x00050000);
407 cx_clear(GP0_IO
, 0x00000005);
410 /* Bring the parts out of reset */
411 cx_set(GP0_IO
, 0x00050005);
413 case CX23885_BOARD_HAUPPAUGE_HVR1500Q
:
414 /* GPIO-0 cx24227 demodulator reset */
415 /* GPIO-2 xc5000 tuner reset */
416 cx_set(GP0_IO
, 0x00050005); /* Bring the part out of reset */
418 case CX23885_BOARD_HAUPPAUGE_HVR1800
:
421 /* GPIO-2 8295A Reset */
422 /* GPIO-3-10 cx23417 data0-7 */
423 /* GPIO-11-14 cx23417 addr0-3 */
424 /* GPIO-15-18 cx23417 READY, CS, RD, WR */
428 /* EIO15 Zilog Reset */
429 /* EIO14 S5H1409/CX24227 Reset */
431 /* Force the TDA8295A into reset and back */
432 cx_set(GP0_IO
, 0x00040004);
434 cx_clear(GP0_IO
, 0x00000004);
436 cx_set(GP0_IO
, 0x00040004);
439 case CX23885_BOARD_HAUPPAUGE_HVR1200
:
440 /* GPIO-0 tda10048 demodulator reset */
441 /* GPIO-2 tda18271 tuner reset */
443 /* Put the parts into reset and back */
444 cx_set(GP0_IO
, 0x00050000);
446 cx_clear(GP0_IO
, 0x00000005);
448 cx_set(GP0_IO
, 0x00050005);
450 case CX23885_BOARD_HAUPPAUGE_HVR1700
:
451 /* GPIO-0 TDA10048 demodulator reset */
452 /* GPIO-2 TDA8295A Reset */
453 /* GPIO-3-10 cx23417 data0-7 */
454 /* GPIO-11-14 cx23417 addr0-3 */
455 /* GPIO-15-18 cx23417 READY, CS, RD, WR */
457 /* The following GPIO's are on the interna AVCore (cx25840) */
459 /* GPIO-20 IR_TX 416/DVBT Select */
460 /* GPIO-21 IIS DAT */
461 /* GPIO-22 IIS WCLK */
462 /* GPIO-23 IIS BCLK */
464 /* Put the parts into reset and back */
465 cx_set(GP0_IO
, 0x00050000);
467 cx_clear(GP0_IO
, 0x00000005);
469 cx_set(GP0_IO
, 0x00050005);
471 case CX23885_BOARD_HAUPPAUGE_HVR1400
:
472 /* GPIO-0 Dibcom7000p demodulator reset */
473 /* GPIO-2 xc3028L tuner reset */
476 /* Put the parts into reset and back */
477 cx_set(GP0_IO
, 0x00050000);
479 cx_clear(GP0_IO
, 0x00000005);
481 cx_set(GP0_IO
, 0x00050005);
483 case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP
:
484 /* GPIO-0 xc5000 tuner reset i2c bus 0 */
485 /* GPIO-1 s5h1409 demod reset i2c bus 0 */
486 /* GPIO-2 xc5000 tuner reset i2c bus 1 */
487 /* GPIO-3 s5h1409 demod reset i2c bus 0 */
489 /* Put the parts into reset and back */
490 cx_set(GP0_IO
, 0x000f0000);
492 cx_clear(GP0_IO
, 0x0000000f);
494 cx_set(GP0_IO
, 0x000f000f);
496 case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP
:
497 /* GPIO-0 portb xc3028 reset */
498 /* GPIO-1 portb zl10353 reset */
499 /* GPIO-2 portc xc3028 reset */
500 /* GPIO-3 portc zl10353 reset */
502 /* Put the parts into reset and back */
503 cx_set(GP0_IO
, 0x000f0000);
505 cx_clear(GP0_IO
, 0x0000000f);
507 cx_set(GP0_IO
, 0x000f000f);
512 int cx23885_ir_init(struct cx23885_dev
*dev
)
514 switch (dev
->board
) {
515 case CX23885_BOARD_HAUPPAUGE_HVR1250
:
516 case CX23885_BOARD_HAUPPAUGE_HVR1500
:
517 case CX23885_BOARD_HAUPPAUGE_HVR1500Q
:
518 case CX23885_BOARD_HAUPPAUGE_HVR1800
:
519 case CX23885_BOARD_HAUPPAUGE_HVR1200
:
520 case CX23885_BOARD_HAUPPAUGE_HVR1400
:
521 /* FIXME: Implement me */
528 void cx23885_card_setup(struct cx23885_dev
*dev
)
530 struct cx23885_tsport
*ts1
= &dev
->ts1
;
531 struct cx23885_tsport
*ts2
= &dev
->ts2
;
533 static u8 eeprom
[256];
535 if (dev
->i2c_bus
[0].i2c_rc
== 0) {
536 dev
->i2c_bus
[0].i2c_client
.addr
= 0xa0 >> 1;
537 tveeprom_read(&dev
->i2c_bus
[0].i2c_client
,
538 eeprom
, sizeof(eeprom
));
541 switch (dev
->board
) {
542 case CX23885_BOARD_HAUPPAUGE_HVR1250
:
543 case CX23885_BOARD_HAUPPAUGE_HVR1500
:
544 case CX23885_BOARD_HAUPPAUGE_HVR1500Q
:
545 case CX23885_BOARD_HAUPPAUGE_HVR1400
:
546 if (dev
->i2c_bus
[0].i2c_rc
== 0)
547 hauppauge_eeprom(dev
, eeprom
+0x80);
549 case CX23885_BOARD_HAUPPAUGE_HVR1800
:
550 case CX23885_BOARD_HAUPPAUGE_HVR1800lp
:
551 case CX23885_BOARD_HAUPPAUGE_HVR1200
:
552 case CX23885_BOARD_HAUPPAUGE_HVR1700
:
553 if (dev
->i2c_bus
[0].i2c_rc
== 0)
554 hauppauge_eeprom(dev
, eeprom
+0xc0);
558 switch (dev
->board
) {
559 case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP
:
560 case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP
:
561 ts2
->gen_ctrl_val
= 0xc; /* Serial bus + punctured clock */
562 ts2
->ts_clk_en_val
= 0x1; /* Enable TS_CLK */
563 ts2
->src_sel_val
= CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO
;
564 /* break omitted intentionally */
565 case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP
:
566 ts1
->gen_ctrl_val
= 0xc; /* Serial bus + punctured clock */
567 ts1
->ts_clk_en_val
= 0x1; /* Enable TS_CLK */
568 ts1
->src_sel_val
= CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO
;
570 case CX23885_BOARD_HAUPPAUGE_HVR1800
:
571 /* Defaults for VID B - Analog encoder */
572 /* DREQ_POL, SMODE, PUNC_CLK, MCLK_POL Serial bus + punc clk */
573 ts1
->gen_ctrl_val
= 0x10e;
574 ts1
->ts_clk_en_val
= 0x1; /* Enable TS_CLK */
575 ts1
->src_sel_val
= CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO
;
577 /* APB_TSVALERR_POL (active low)*/
578 ts1
->vld_misc_val
= 0x2000;
579 ts1
->hw_sop_ctrl_val
= (0x47 << 16 | 188 << 4 | 0xc);
581 /* Defaults for VID C */
582 ts2
->gen_ctrl_val
= 0xc; /* Serial bus + punctured clock */
583 ts2
->ts_clk_en_val
= 0x1; /* Enable TS_CLK */
584 ts2
->src_sel_val
= CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO
;
586 case CX23885_BOARD_HAUPPAUGE_HVR1250
:
587 case CX23885_BOARD_HAUPPAUGE_HVR1500
:
588 case CX23885_BOARD_HAUPPAUGE_HVR1500Q
:
589 case CX23885_BOARD_HAUPPAUGE_HVR1800lp
:
590 case CX23885_BOARD_HAUPPAUGE_HVR1200
:
591 case CX23885_BOARD_HAUPPAUGE_HVR1700
:
592 case CX23885_BOARD_HAUPPAUGE_HVR1400
:
594 ts2
->gen_ctrl_val
= 0xc; /* Serial bus + punctured clock */
595 ts2
->ts_clk_en_val
= 0x1; /* Enable TS_CLK */
596 ts2
->src_sel_val
= CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO
;
599 /* Certain boards support analog, or require the avcore to be
600 * loaded, ensure this happens.
602 switch (dev
->board
) {
603 case CX23885_BOARD_HAUPPAUGE_HVR1800
:
604 case CX23885_BOARD_HAUPPAUGE_HVR1800lp
:
605 case CX23885_BOARD_HAUPPAUGE_HVR1700
:
606 request_module("cx25840");
611 /* ------------------------------------------------------------------ */
617 * kate: eol "unix"; indent-width 3; remove-trailing-space on; replace-trailing-space-save on; tab-width 8; replace-tabs off; space-indent off; mixed-indent off