]> Pileus Git - ~andy/linux/blob - drivers/media/pci/cx23885/cx23885-cards.c
39a4a4b9ed7e893d97fe3460dcef33dc663de5b8
[~andy/linux] / drivers / media / pci / cx23885 / cx23885-cards.c
1 /*
2  *  Driver for the Conexant CX23885 PCIe bridge
3  *
4  *  Copyright (c) 2006 Steven Toth <stoth@linuxtv.org>
5  *
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.
10  *
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
14  *
15  *  GNU General Public License for more details.
16  *
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.
20  */
21
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>
27 #include <linux/firmware.h>
28 #include <misc/altera.h>
29
30 #include "cx23885.h"
31 #include "tuner-xc2028.h"
32 #include "netup-eeprom.h"
33 #include "netup-init.h"
34 #include "altera-ci.h"
35 #include "xc4000.h"
36 #include "xc5000.h"
37 #include "cx23888-ir.h"
38
39 static unsigned int netup_card_rev = 4;
40 module_param(netup_card_rev, int, 0644);
41 MODULE_PARM_DESC(netup_card_rev,
42                 "NetUP Dual DVB-T/C CI card revision");
43 static unsigned int enable_885_ir;
44 module_param(enable_885_ir, int, 0644);
45 MODULE_PARM_DESC(enable_885_ir,
46                  "Enable integrated IR controller for supported\n"
47                  "\t\t    CX2388[57] boards that are wired for it:\n"
48                  "\t\t\tHVR-1250 (reported safe)\n"
49                  "\t\t\tTerraTec Cinergy T PCIe Dual (not well tested, appears to be safe)\n"
50                  "\t\t\tTeVii S470 (reported unsafe)\n"
51                  "\t\t    This can cause an interrupt storm with some cards.\n"
52                  "\t\t    Default: 0 [Disabled]");
53
54 /* ------------------------------------------------------------------ */
55 /* board config info                                                  */
56
57 struct cx23885_board cx23885_boards[] = {
58         [CX23885_BOARD_UNKNOWN] = {
59                 .name           = "UNKNOWN/GENERIC",
60                 /* Ensure safe default for unknown boards */
61                 .clk_freq       = 0,
62                 .input          = {{
63                         .type   = CX23885_VMUX_COMPOSITE1,
64                         .vmux   = 0,
65                 }, {
66                         .type   = CX23885_VMUX_COMPOSITE2,
67                         .vmux   = 1,
68                 }, {
69                         .type   = CX23885_VMUX_COMPOSITE3,
70                         .vmux   = 2,
71                 }, {
72                         .type   = CX23885_VMUX_COMPOSITE4,
73                         .vmux   = 3,
74                 } },
75         },
76         [CX23885_BOARD_HAUPPAUGE_HVR1800lp] = {
77                 .name           = "Hauppauge WinTV-HVR1800lp",
78                 .portc          = CX23885_MPEG_DVB,
79                 .input          = {{
80                         .type   = CX23885_VMUX_TELEVISION,
81                         .vmux   = 0,
82                         .gpio0  = 0xff00,
83                 }, {
84                         .type   = CX23885_VMUX_DEBUG,
85                         .vmux   = 0,
86                         .gpio0  = 0xff01,
87                 }, {
88                         .type   = CX23885_VMUX_COMPOSITE1,
89                         .vmux   = 1,
90                         .gpio0  = 0xff02,
91                 }, {
92                         .type   = CX23885_VMUX_SVIDEO,
93                         .vmux   = 2,
94                         .gpio0  = 0xff02,
95                 } },
96         },
97         [CX23885_BOARD_HAUPPAUGE_HVR1800] = {
98                 .name           = "Hauppauge WinTV-HVR1800",
99                 .porta          = CX23885_ANALOG_VIDEO,
100                 .portb          = CX23885_MPEG_ENCODER,
101                 .portc          = CX23885_MPEG_DVB,
102                 .tuner_type     = TUNER_PHILIPS_TDA8290,
103                 .tuner_addr     = 0x42, /* 0x84 >> 1 */
104                 .tuner_bus      = 1,
105                 .input          = {{
106                         .type   = CX23885_VMUX_TELEVISION,
107                         .vmux   =       CX25840_VIN7_CH3 |
108                                         CX25840_VIN5_CH2 |
109                                         CX25840_VIN2_CH1,
110                         .amux   = CX25840_AUDIO8,
111                         .gpio0  = 0,
112                 }, {
113                         .type   = CX23885_VMUX_COMPOSITE1,
114                         .vmux   =       CX25840_VIN7_CH3 |
115                                         CX25840_VIN4_CH2 |
116                                         CX25840_VIN6_CH1,
117                         .amux   = CX25840_AUDIO7,
118                         .gpio0  = 0,
119                 }, {
120                         .type   = CX23885_VMUX_SVIDEO,
121                         .vmux   =       CX25840_VIN7_CH3 |
122                                         CX25840_VIN4_CH2 |
123                                         CX25840_VIN8_CH1 |
124                                         CX25840_SVIDEO_ON,
125                         .amux   = CX25840_AUDIO7,
126                         .gpio0  = 0,
127                 } },
128         },
129         [CX23885_BOARD_HAUPPAUGE_HVR1250] = {
130                 .name           = "Hauppauge WinTV-HVR1250",
131                 .porta          = CX23885_ANALOG_VIDEO,
132                 .portc          = CX23885_MPEG_DVB,
133 #ifdef MT2131_NO_ANALOG_SUPPORT_YET
134                 .tuner_type     = TUNER_PHILIPS_TDA8290,
135                 .tuner_addr     = 0x42, /* 0x84 >> 1 */
136                 .tuner_bus      = 1,
137 #endif
138                 .force_bff      = 1,
139                 .input          = {{
140 #ifdef MT2131_NO_ANALOG_SUPPORT_YET
141                         .type   = CX23885_VMUX_TELEVISION,
142                         .vmux   =       CX25840_VIN7_CH3 |
143                                         CX25840_VIN5_CH2 |
144                                         CX25840_VIN2_CH1,
145                         .amux   = CX25840_AUDIO8,
146                         .gpio0  = 0xff00,
147                 }, {
148 #endif
149                         .type   = CX23885_VMUX_COMPOSITE1,
150                         .vmux   =       CX25840_VIN7_CH3 |
151                                         CX25840_VIN4_CH2 |
152                                         CX25840_VIN6_CH1,
153                         .amux   = CX25840_AUDIO7,
154                         .gpio0  = 0xff02,
155                 }, {
156                         .type   = CX23885_VMUX_SVIDEO,
157                         .vmux   =       CX25840_VIN7_CH3 |
158                                         CX25840_VIN4_CH2 |
159                                         CX25840_VIN8_CH1 |
160                                         CX25840_SVIDEO_ON,
161                         .amux   = CX25840_AUDIO7,
162                         .gpio0  = 0xff02,
163                 } },
164         },
165         [CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP] = {
166                 .name           = "DViCO FusionHDTV5 Express",
167                 .portb          = CX23885_MPEG_DVB,
168         },
169         [CX23885_BOARD_HAUPPAUGE_HVR1500Q] = {
170                 .name           = "Hauppauge WinTV-HVR1500Q",
171                 .portc          = CX23885_MPEG_DVB,
172         },
173         [CX23885_BOARD_HAUPPAUGE_HVR1500] = {
174                 .name           = "Hauppauge WinTV-HVR1500",
175                 .porta          = CX23885_ANALOG_VIDEO,
176                 .portc          = CX23885_MPEG_DVB,
177                 .tuner_type     = TUNER_XC2028,
178                 .tuner_addr     = 0x61, /* 0xc2 >> 1 */
179                 .input          = {{
180                         .type   = CX23885_VMUX_TELEVISION,
181                         .vmux   =       CX25840_VIN7_CH3 |
182                                         CX25840_VIN5_CH2 |
183                                         CX25840_VIN2_CH1,
184                         .gpio0  = 0,
185                 }, {
186                         .type   = CX23885_VMUX_COMPOSITE1,
187                         .vmux   =       CX25840_VIN7_CH3 |
188                                         CX25840_VIN4_CH2 |
189                                         CX25840_VIN6_CH1,
190                         .gpio0  = 0,
191                 }, {
192                         .type   = CX23885_VMUX_SVIDEO,
193                         .vmux   =       CX25840_VIN7_CH3 |
194                                         CX25840_VIN4_CH2 |
195                                         CX25840_VIN8_CH1 |
196                                         CX25840_SVIDEO_ON,
197                         .gpio0  = 0,
198                 } },
199         },
200         [CX23885_BOARD_HAUPPAUGE_HVR1200] = {
201                 .name           = "Hauppauge WinTV-HVR1200",
202                 .portc          = CX23885_MPEG_DVB,
203         },
204         [CX23885_BOARD_HAUPPAUGE_HVR1700] = {
205                 .name           = "Hauppauge WinTV-HVR1700",
206                 .portc          = CX23885_MPEG_DVB,
207         },
208         [CX23885_BOARD_HAUPPAUGE_HVR1400] = {
209                 .name           = "Hauppauge WinTV-HVR1400",
210                 .portc          = CX23885_MPEG_DVB,
211         },
212         [CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP] = {
213                 .name           = "DViCO FusionHDTV7 Dual Express",
214                 .portb          = CX23885_MPEG_DVB,
215                 .portc          = CX23885_MPEG_DVB,
216         },
217         [CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP] = {
218                 .name           = "DViCO FusionHDTV DVB-T Dual Express",
219                 .portb          = CX23885_MPEG_DVB,
220                 .portc          = CX23885_MPEG_DVB,
221         },
222         [CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H] = {
223                 .name           = "Leadtek Winfast PxDVR3200 H",
224                 .portc          = CX23885_MPEG_DVB,
225         },
226         [CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000] = {
227                 .name           = "Leadtek Winfast PxDVR3200 H XC4000",
228                 .porta          = CX23885_ANALOG_VIDEO,
229                 .portc          = CX23885_MPEG_DVB,
230                 .tuner_type     = TUNER_XC4000,
231                 .tuner_addr     = 0x61,
232                 .radio_type     = UNSET,
233                 .radio_addr     = ADDR_UNSET,
234                 .input          = {{
235                         .type   = CX23885_VMUX_TELEVISION,
236                         .vmux   = CX25840_VIN2_CH1 |
237                                   CX25840_VIN5_CH2 |
238                                   CX25840_NONE0_CH3,
239                 }, {
240                         .type   = CX23885_VMUX_COMPOSITE1,
241                         .vmux   = CX25840_COMPOSITE1,
242                 }, {
243                         .type   = CX23885_VMUX_SVIDEO,
244                         .vmux   = CX25840_SVIDEO_LUMA3 |
245                                   CX25840_SVIDEO_CHROMA4,
246                 }, {
247                         .type   = CX23885_VMUX_COMPONENT,
248                         .vmux   = CX25840_VIN7_CH1 |
249                                   CX25840_VIN6_CH2 |
250                                   CX25840_VIN8_CH3 |
251                                   CX25840_COMPONENT_ON,
252                 } },
253         },
254         [CX23885_BOARD_COMPRO_VIDEOMATE_E650F] = {
255                 .name           = "Compro VideoMate E650F",
256                 .portc          = CX23885_MPEG_DVB,
257         },
258         [CX23885_BOARD_TBS_6920] = {
259                 .name           = "TurboSight TBS 6920",
260                 .portb          = CX23885_MPEG_DVB,
261         },
262         [CX23885_BOARD_TEVII_S470] = {
263                 .name           = "TeVii S470",
264                 .portb          = CX23885_MPEG_DVB,
265         },
266         [CX23885_BOARD_DVBWORLD_2005] = {
267                 .name           = "DVBWorld DVB-S2 2005",
268                 .portb          = CX23885_MPEG_DVB,
269         },
270         [CX23885_BOARD_NETUP_DUAL_DVBS2_CI] = {
271                 .ci_type        = 1,
272                 .name           = "NetUP Dual DVB-S2 CI",
273                 .portb          = CX23885_MPEG_DVB,
274                 .portc          = CX23885_MPEG_DVB,
275         },
276         [CX23885_BOARD_HAUPPAUGE_HVR1270] = {
277                 .name           = "Hauppauge WinTV-HVR1270",
278                 .portc          = CX23885_MPEG_DVB,
279         },
280         [CX23885_BOARD_HAUPPAUGE_HVR1275] = {
281                 .name           = "Hauppauge WinTV-HVR1275",
282                 .portc          = CX23885_MPEG_DVB,
283         },
284         [CX23885_BOARD_HAUPPAUGE_HVR1255] = {
285                 .name           = "Hauppauge WinTV-HVR1255",
286                 .porta          = CX23885_ANALOG_VIDEO,
287                 .portc          = CX23885_MPEG_DVB,
288                 .tuner_type     = TUNER_ABSENT,
289                 .tuner_addr     = 0x42, /* 0x84 >> 1 */
290                 .force_bff      = 1,
291                 .input          = {{
292                         .type   = CX23885_VMUX_TELEVISION,
293                         .vmux   =       CX25840_VIN7_CH3 |
294                                         CX25840_VIN5_CH2 |
295                                         CX25840_VIN2_CH1 |
296                                         CX25840_DIF_ON,
297                         .amux   = CX25840_AUDIO8,
298                 }, {
299                         .type   = CX23885_VMUX_COMPOSITE1,
300                         .vmux   =       CX25840_VIN7_CH3 |
301                                         CX25840_VIN4_CH2 |
302                                         CX25840_VIN6_CH1,
303                         .amux   = CX25840_AUDIO7,
304                 }, {
305                         .type   = CX23885_VMUX_SVIDEO,
306                         .vmux   =       CX25840_VIN7_CH3 |
307                                         CX25840_VIN4_CH2 |
308                                         CX25840_VIN8_CH1 |
309                                         CX25840_SVIDEO_ON,
310                         .amux   = CX25840_AUDIO7,
311                 } },
312         },
313         [CX23885_BOARD_HAUPPAUGE_HVR1255_22111] = {
314                 .name           = "Hauppauge WinTV-HVR1255",
315                 .porta          = CX23885_ANALOG_VIDEO,
316                 .portc          = CX23885_MPEG_DVB,
317                 .tuner_type     = TUNER_ABSENT,
318                 .tuner_addr     = 0x42, /* 0x84 >> 1 */
319                 .force_bff      = 1,
320                 .input          = {{
321                         .type   = CX23885_VMUX_TELEVISION,
322                         .vmux   =       CX25840_VIN7_CH3 |
323                                         CX25840_VIN5_CH2 |
324                                         CX25840_VIN2_CH1 |
325                                         CX25840_DIF_ON,
326                         .amux   = CX25840_AUDIO8,
327                 }, {
328                         .type   = CX23885_VMUX_SVIDEO,
329                         .vmux   =       CX25840_VIN7_CH3 |
330                                         CX25840_VIN4_CH2 |
331                                         CX25840_VIN8_CH1 |
332                                         CX25840_SVIDEO_ON,
333                         .amux   = CX25840_AUDIO7,
334                 } },
335         },
336         [CX23885_BOARD_HAUPPAUGE_HVR1210] = {
337                 .name           = "Hauppauge WinTV-HVR1210",
338                 .portc          = CX23885_MPEG_DVB,
339         },
340         [CX23885_BOARD_MYGICA_X8506] = {
341                 .name           = "Mygica X8506 DMB-TH",
342                 .tuner_type = TUNER_XC5000,
343                 .tuner_addr = 0x61,
344                 .tuner_bus      = 1,
345                 .porta          = CX23885_ANALOG_VIDEO,
346                 .portb          = CX23885_MPEG_DVB,
347                 .input          = {
348                         {
349                                 .type   = CX23885_VMUX_TELEVISION,
350                                 .vmux   = CX25840_COMPOSITE2,
351                         },
352                         {
353                                 .type   = CX23885_VMUX_COMPOSITE1,
354                                 .vmux   = CX25840_COMPOSITE8,
355                         },
356                         {
357                                 .type   = CX23885_VMUX_SVIDEO,
358                                 .vmux   = CX25840_SVIDEO_LUMA3 |
359                                                 CX25840_SVIDEO_CHROMA4,
360                         },
361                         {
362                                 .type   = CX23885_VMUX_COMPONENT,
363                                 .vmux   = CX25840_COMPONENT_ON |
364                                         CX25840_VIN1_CH1 |
365                                         CX25840_VIN6_CH2 |
366                                         CX25840_VIN7_CH3,
367                         },
368                 },
369         },
370         [CX23885_BOARD_MAGICPRO_PROHDTVE2] = {
371                 .name           = "Magic-Pro ProHDTV Extreme 2",
372                 .tuner_type = TUNER_XC5000,
373                 .tuner_addr = 0x61,
374                 .tuner_bus      = 1,
375                 .porta          = CX23885_ANALOG_VIDEO,
376                 .portb          = CX23885_MPEG_DVB,
377                 .input          = {
378                         {
379                                 .type   = CX23885_VMUX_TELEVISION,
380                                 .vmux   = CX25840_COMPOSITE2,
381                         },
382                         {
383                                 .type   = CX23885_VMUX_COMPOSITE1,
384                                 .vmux   = CX25840_COMPOSITE8,
385                         },
386                         {
387                                 .type   = CX23885_VMUX_SVIDEO,
388                                 .vmux   = CX25840_SVIDEO_LUMA3 |
389                                                 CX25840_SVIDEO_CHROMA4,
390                         },
391                         {
392                                 .type   = CX23885_VMUX_COMPONENT,
393                                 .vmux   = CX25840_COMPONENT_ON |
394                                         CX25840_VIN1_CH1 |
395                                         CX25840_VIN6_CH2 |
396                                         CX25840_VIN7_CH3,
397                         },
398                 },
399         },
400         [CX23885_BOARD_HAUPPAUGE_HVR1850] = {
401                 .name           = "Hauppauge WinTV-HVR1850",
402                 .porta          = CX23885_ANALOG_VIDEO,
403                 .portb          = CX23885_MPEG_ENCODER,
404                 .portc          = CX23885_MPEG_DVB,
405                 .tuner_type     = TUNER_ABSENT,
406                 .tuner_addr     = 0x42, /* 0x84 >> 1 */
407                 .force_bff      = 1,
408                 .input          = {{
409                         .type   = CX23885_VMUX_TELEVISION,
410                         .vmux   =       CX25840_VIN7_CH3 |
411                                         CX25840_VIN5_CH2 |
412                                         CX25840_VIN2_CH1 |
413                                         CX25840_DIF_ON,
414                         .amux   = CX25840_AUDIO8,
415                 }, {
416                         .type   = CX23885_VMUX_COMPOSITE1,
417                         .vmux   =       CX25840_VIN7_CH3 |
418                                         CX25840_VIN4_CH2 |
419                                         CX25840_VIN6_CH1,
420                         .amux   = CX25840_AUDIO7,
421                 }, {
422                         .type   = CX23885_VMUX_SVIDEO,
423                         .vmux   =       CX25840_VIN7_CH3 |
424                                         CX25840_VIN4_CH2 |
425                                         CX25840_VIN8_CH1 |
426                                         CX25840_SVIDEO_ON,
427                         .amux   = CX25840_AUDIO7,
428                 } },
429         },
430         [CX23885_BOARD_COMPRO_VIDEOMATE_E800] = {
431                 .name           = "Compro VideoMate E800",
432                 .portc          = CX23885_MPEG_DVB,
433         },
434         [CX23885_BOARD_HAUPPAUGE_HVR1290] = {
435                 .name           = "Hauppauge WinTV-HVR1290",
436                 .portc          = CX23885_MPEG_DVB,
437         },
438         [CX23885_BOARD_MYGICA_X8558PRO] = {
439                 .name           = "Mygica X8558 PRO DMB-TH",
440                 .portb          = CX23885_MPEG_DVB,
441                 .portc          = CX23885_MPEG_DVB,
442         },
443         [CX23885_BOARD_LEADTEK_WINFAST_PXTV1200] = {
444                 .name           = "LEADTEK WinFast PxTV1200",
445                 .porta          = CX23885_ANALOG_VIDEO,
446                 .tuner_type     = TUNER_XC2028,
447                 .tuner_addr     = 0x61,
448                 .tuner_bus      = 1,
449                 .input          = {{
450                         .type   = CX23885_VMUX_TELEVISION,
451                         .vmux   = CX25840_VIN2_CH1 |
452                                   CX25840_VIN5_CH2 |
453                                   CX25840_NONE0_CH3,
454                 }, {
455                         .type   = CX23885_VMUX_COMPOSITE1,
456                         .vmux   = CX25840_COMPOSITE1,
457                 }, {
458                         .type   = CX23885_VMUX_SVIDEO,
459                         .vmux   = CX25840_SVIDEO_LUMA3 |
460                                   CX25840_SVIDEO_CHROMA4,
461                 }, {
462                         .type   = CX23885_VMUX_COMPONENT,
463                         .vmux   = CX25840_VIN7_CH1 |
464                                   CX25840_VIN6_CH2 |
465                                   CX25840_VIN8_CH3 |
466                                   CX25840_COMPONENT_ON,
467                 } },
468         },
469         [CX23885_BOARD_GOTVIEW_X5_3D_HYBRID] = {
470                 .name           = "GoTView X5 3D Hybrid",
471                 .tuner_type     = TUNER_XC5000,
472                 .tuner_addr     = 0x64,
473                 .tuner_bus      = 1,
474                 .porta          = CX23885_ANALOG_VIDEO,
475                 .portb          = CX23885_MPEG_DVB,
476                 .input          = {{
477                         .type   = CX23885_VMUX_TELEVISION,
478                         .vmux   = CX25840_VIN2_CH1 |
479                                   CX25840_VIN5_CH2,
480                         .gpio0  = 0x02,
481                 }, {
482                         .type   = CX23885_VMUX_COMPOSITE1,
483                         .vmux   = CX23885_VMUX_COMPOSITE1,
484                 }, {
485                         .type   = CX23885_VMUX_SVIDEO,
486                         .vmux   = CX25840_SVIDEO_LUMA3 |
487                                   CX25840_SVIDEO_CHROMA4,
488                 } },
489         },
490         [CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF] = {
491                 .ci_type        = 2,
492                 .name           = "NetUP Dual DVB-T/C-CI RF",
493                 .porta          = CX23885_ANALOG_VIDEO,
494                 .portb          = CX23885_MPEG_DVB,
495                 .portc          = CX23885_MPEG_DVB,
496                 .num_fds_portb  = 2,
497                 .num_fds_portc  = 2,
498                 .tuner_type     = TUNER_XC5000,
499                 .tuner_addr     = 0x64,
500                 .input          = { {
501                                 .type   = CX23885_VMUX_TELEVISION,
502                                 .vmux   = CX25840_COMPOSITE1,
503                 } },
504         },
505         [CX23885_BOARD_MPX885] = {
506                 .name           = "MPX-885",
507                 .porta          = CX23885_ANALOG_VIDEO,
508                 .input          = {{
509                         .type   = CX23885_VMUX_COMPOSITE1,
510                         .vmux   = CX25840_COMPOSITE1,
511                         .amux   = CX25840_AUDIO6,
512                         .gpio0  = 0,
513                 }, {
514                         .type   = CX23885_VMUX_COMPOSITE2,
515                         .vmux   = CX25840_COMPOSITE2,
516                         .amux   = CX25840_AUDIO6,
517                         .gpio0  = 0,
518                 }, {
519                         .type   = CX23885_VMUX_COMPOSITE3,
520                         .vmux   = CX25840_COMPOSITE3,
521                         .amux   = CX25840_AUDIO7,
522                         .gpio0  = 0,
523                 }, {
524                         .type   = CX23885_VMUX_COMPOSITE4,
525                         .vmux   = CX25840_COMPOSITE4,
526                         .amux   = CX25840_AUDIO7,
527                         .gpio0  = 0,
528                 } },
529         },
530         [CX23885_BOARD_MYGICA_X8507] = {
531                 .name           = "Mygica X8507",
532                 .tuner_type = TUNER_XC5000,
533                 .tuner_addr = 0x61,
534                 .tuner_bus      = 1,
535                 .porta          = CX23885_ANALOG_VIDEO,
536                 .input          = {
537                         {
538                                 .type   = CX23885_VMUX_TELEVISION,
539                                 .vmux   = CX25840_COMPOSITE2,
540                                 .amux   = CX25840_AUDIO8,
541                         },
542                         {
543                                 .type   = CX23885_VMUX_COMPOSITE1,
544                                 .vmux   = CX25840_COMPOSITE8,
545                         },
546                         {
547                                 .type   = CX23885_VMUX_SVIDEO,
548                                 .vmux   = CX25840_SVIDEO_LUMA3 |
549                                                 CX25840_SVIDEO_CHROMA4,
550                         },
551                         {
552                                 .type   = CX23885_VMUX_COMPONENT,
553                                 .vmux   = CX25840_COMPONENT_ON |
554                                         CX25840_VIN1_CH1 |
555                                         CX25840_VIN6_CH2 |
556                                         CX25840_VIN7_CH3,
557                         },
558                 },
559         },
560         [CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL] = {
561                 .name           = "TerraTec Cinergy T PCIe Dual",
562                 .portb          = CX23885_MPEG_DVB,
563                 .portc          = CX23885_MPEG_DVB,
564         },
565         [CX23885_BOARD_TEVII_S471] = {
566                 .name           = "TeVii S471",
567                 .portb          = CX23885_MPEG_DVB,
568         },
569         [CX23885_BOARD_PROF_8000] = {
570                 .name           = "Prof Revolution DVB-S2 8000",
571                 .portb          = CX23885_MPEG_DVB,
572         }
573 };
574 const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards);
575
576 /* ------------------------------------------------------------------ */
577 /* PCI subsystem IDs                                                  */
578
579 struct cx23885_subid cx23885_subids[] = {
580         {
581                 .subvendor = 0x0070,
582                 .subdevice = 0x3400,
583                 .card      = CX23885_BOARD_UNKNOWN,
584         }, {
585                 .subvendor = 0x0070,
586                 .subdevice = 0x7600,
587                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1800lp,
588         }, {
589                 .subvendor = 0x0070,
590                 .subdevice = 0x7800,
591                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
592         }, {
593                 .subvendor = 0x0070,
594                 .subdevice = 0x7801,
595                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
596         }, {
597                 .subvendor = 0x0070,
598                 .subdevice = 0x7809,
599                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
600         }, {
601                 .subvendor = 0x0070,
602                 .subdevice = 0x7911,
603                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1250,
604         }, {
605                 .subvendor = 0x18ac,
606                 .subdevice = 0xd500,
607                 .card      = CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP,
608         }, {
609                 .subvendor = 0x0070,
610                 .subdevice = 0x7790,
611                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1500Q,
612         }, {
613                 .subvendor = 0x0070,
614                 .subdevice = 0x7797,
615                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1500Q,
616         }, {
617                 .subvendor = 0x0070,
618                 .subdevice = 0x7710,
619                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1500,
620         }, {
621                 .subvendor = 0x0070,
622                 .subdevice = 0x7717,
623                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1500,
624         }, {
625                 .subvendor = 0x0070,
626                 .subdevice = 0x71d1,
627                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1200,
628         }, {
629                 .subvendor = 0x0070,
630                 .subdevice = 0x71d3,
631                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1200,
632         }, {
633                 .subvendor = 0x0070,
634                 .subdevice = 0x8101,
635                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1700,
636         }, {
637                 .subvendor = 0x0070,
638                 .subdevice = 0x8010,
639                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1400,
640         }, {
641                 .subvendor = 0x18ac,
642                 .subdevice = 0xd618,
643                 .card      = CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP,
644         }, {
645                 .subvendor = 0x18ac,
646                 .subdevice = 0xdb78,
647                 .card      = CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP,
648         }, {
649                 .subvendor = 0x107d,
650                 .subdevice = 0x6681,
651                 .card      = CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H,
652         }, {
653                 .subvendor = 0x107d,
654                 .subdevice = 0x6f39,
655                 .card      = CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000,
656         }, {
657                 .subvendor = 0x185b,
658                 .subdevice = 0xe800,
659                 .card      = CX23885_BOARD_COMPRO_VIDEOMATE_E650F,
660         }, {
661                 .subvendor = 0x6920,
662                 .subdevice = 0x8888,
663                 .card      = CX23885_BOARD_TBS_6920,
664         }, {
665                 .subvendor = 0xd470,
666                 .subdevice = 0x9022,
667                 .card      = CX23885_BOARD_TEVII_S470,
668         }, {
669                 .subvendor = 0x0001,
670                 .subdevice = 0x2005,
671                 .card      = CX23885_BOARD_DVBWORLD_2005,
672         }, {
673                 .subvendor = 0x1b55,
674                 .subdevice = 0x2a2c,
675                 .card      = CX23885_BOARD_NETUP_DUAL_DVBS2_CI,
676         }, {
677                 .subvendor = 0x0070,
678                 .subdevice = 0x2211,
679                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1270,
680         }, {
681                 .subvendor = 0x0070,
682                 .subdevice = 0x2215,
683                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1275,
684         }, {
685                 .subvendor = 0x0070,
686                 .subdevice = 0x221d,
687                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1275,
688         }, {
689                 .subvendor = 0x0070,
690                 .subdevice = 0x2251,
691                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1255,
692         }, {
693                 .subvendor = 0x0070,
694                 .subdevice = 0x2259,
695                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1255_22111,
696         }, {
697                 .subvendor = 0x0070,
698                 .subdevice = 0x2291,
699                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
700         }, {
701                 .subvendor = 0x0070,
702                 .subdevice = 0x2295,
703                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
704         }, {
705                 .subvendor = 0x0070,
706                 .subdevice = 0x2299,
707                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
708         }, {
709                 .subvendor = 0x0070,
710                 .subdevice = 0x229d,
711                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
712         }, {
713                 .subvendor = 0x0070,
714                 .subdevice = 0x22f0,
715                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
716         }, {
717                 .subvendor = 0x0070,
718                 .subdevice = 0x22f1,
719                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1255,
720         }, {
721                 .subvendor = 0x0070,
722                 .subdevice = 0x22f2,
723                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1275,
724         }, {
725                 .subvendor = 0x0070,
726                 .subdevice = 0x22f3,
727                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
728         }, {
729                 .subvendor = 0x0070,
730                 .subdevice = 0x22f4,
731                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
732         }, {
733                 .subvendor = 0x0070,
734                 .subdevice = 0x22f5,
735                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
736         }, {
737                 .subvendor = 0x14f1,
738                 .subdevice = 0x8651,
739                 .card      = CX23885_BOARD_MYGICA_X8506,
740         }, {
741                 .subvendor = 0x14f1,
742                 .subdevice = 0x8657,
743                 .card      = CX23885_BOARD_MAGICPRO_PROHDTVE2,
744         }, {
745                 .subvendor = 0x0070,
746                 .subdevice = 0x8541,
747                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1850,
748         }, {
749                 .subvendor = 0x1858,
750                 .subdevice = 0xe800,
751                 .card      = CX23885_BOARD_COMPRO_VIDEOMATE_E800,
752         }, {
753                 .subvendor = 0x0070,
754                 .subdevice = 0x8551,
755                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1290,
756         }, {
757                 .subvendor = 0x14f1,
758                 .subdevice = 0x8578,
759                 .card      = CX23885_BOARD_MYGICA_X8558PRO,
760         }, {
761                 .subvendor = 0x107d,
762                 .subdevice = 0x6f22,
763                 .card      = CX23885_BOARD_LEADTEK_WINFAST_PXTV1200,
764         }, {
765                 .subvendor = 0x5654,
766                 .subdevice = 0x2390,
767                 .card      = CX23885_BOARD_GOTVIEW_X5_3D_HYBRID,
768         }, {
769                 .subvendor = 0x1b55,
770                 .subdevice = 0xe2e4,
771                 .card      = CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF,
772         }, {
773                 .subvendor = 0x14f1,
774                 .subdevice = 0x8502,
775                 .card      = CX23885_BOARD_MYGICA_X8507,
776         }, {
777                 .subvendor = 0x153b,
778                 .subdevice = 0x117e,
779                 .card      = CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL,
780         }, {
781                 .subvendor = 0xd471,
782                 .subdevice = 0x9022,
783                 .card      = CX23885_BOARD_TEVII_S471,
784         }, {
785                 .subvendor = 0x8000,
786                 .subdevice = 0x3034,
787                 .card      = CX23885_BOARD_PROF_8000,
788         },
789 };
790 const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids);
791
792 void cx23885_card_list(struct cx23885_dev *dev)
793 {
794         int i;
795
796         if (0 == dev->pci->subsystem_vendor &&
797             0 == dev->pci->subsystem_device) {
798                 printk(KERN_INFO
799                         "%s: Board has no valid PCIe Subsystem ID and can't\n"
800                        "%s: be autodetected. Pass card=<n> insmod option\n"
801                        "%s: to workaround that. Redirect complaints to the\n"
802                        "%s: vendor of the TV card.  Best regards,\n"
803                        "%s:         -- tux\n",
804                        dev->name, dev->name, dev->name, dev->name, dev->name);
805         } else {
806                 printk(KERN_INFO
807                         "%s: Your board isn't known (yet) to the driver.\n"
808                        "%s: Try to pick one of the existing card configs via\n"
809                        "%s: card=<n> insmod option.  Updating to the latest\n"
810                        "%s: version might help as well.\n",
811                        dev->name, dev->name, dev->name, dev->name);
812         }
813         printk(KERN_INFO "%s: Here is a list of valid choices for the card=<n> insmod option:\n",
814                dev->name);
815         for (i = 0; i < cx23885_bcount; i++)
816                 printk(KERN_INFO "%s:    card=%d -> %s\n",
817                        dev->name, i, cx23885_boards[i].name);
818 }
819
820 static void hauppauge_eeprom(struct cx23885_dev *dev, u8 *eeprom_data)
821 {
822         struct tveeprom tv;
823
824         tveeprom_hauppauge_analog(&dev->i2c_bus[0].i2c_client, &tv,
825                 eeprom_data);
826
827         /* Make sure we support the board model */
828         switch (tv.model) {
829         case 22001:
830                 /* WinTV-HVR1270 (PCIe, Retail, half height)
831                  * ATSC/QAM and basic analog, IR Blast */
832         case 22009:
833                 /* WinTV-HVR1210 (PCIe, Retail, half height)
834                  * DVB-T and basic analog, IR Blast */
835         case 22011:
836                 /* WinTV-HVR1270 (PCIe, Retail, half height)
837                  * ATSC/QAM and basic analog, IR Recv */
838         case 22019:
839                 /* WinTV-HVR1210 (PCIe, Retail, half height)
840                  * DVB-T and basic analog, IR Recv */
841         case 22021:
842                 /* WinTV-HVR1275 (PCIe, Retail, half height)
843                  * ATSC/QAM and basic analog, IR Recv */
844         case 22029:
845                 /* WinTV-HVR1210 (PCIe, Retail, half height)
846                  * DVB-T and basic analog, IR Recv */
847         case 22101:
848                 /* WinTV-HVR1270 (PCIe, Retail, full height)
849                  * ATSC/QAM and basic analog, IR Blast */
850         case 22109:
851                 /* WinTV-HVR1210 (PCIe, Retail, full height)
852                  * DVB-T and basic analog, IR Blast */
853         case 22111:
854                 /* WinTV-HVR1270 (PCIe, Retail, full height)
855                  * ATSC/QAM and basic analog, IR Recv */
856         case 22119:
857                 /* WinTV-HVR1210 (PCIe, Retail, full height)
858                  * DVB-T and basic analog, IR Recv */
859         case 22121:
860                 /* WinTV-HVR1275 (PCIe, Retail, full height)
861                  * ATSC/QAM and basic analog, IR Recv */
862         case 22129:
863                 /* WinTV-HVR1210 (PCIe, Retail, full height)
864                  * DVB-T and basic analog, IR Recv */
865         case 71009:
866                 /* WinTV-HVR1200 (PCIe, Retail, full height)
867                  * DVB-T and basic analog */
868         case 71359:
869                 /* WinTV-HVR1200 (PCIe, OEM, half height)
870                  * DVB-T and basic analog */
871         case 71439:
872                 /* WinTV-HVR1200 (PCIe, OEM, half height)
873                  * DVB-T and basic analog */
874         case 71449:
875                 /* WinTV-HVR1200 (PCIe, OEM, full height)
876                  * DVB-T and basic analog */
877         case 71939:
878                 /* WinTV-HVR1200 (PCIe, OEM, half height)
879                  * DVB-T and basic analog */
880         case 71949:
881                 /* WinTV-HVR1200 (PCIe, OEM, full height)
882                  * DVB-T and basic analog */
883         case 71959:
884                 /* WinTV-HVR1200 (PCIe, OEM, full height)
885                  * DVB-T and basic analog */
886         case 71979:
887                 /* WinTV-HVR1200 (PCIe, OEM, half height)
888                  * DVB-T and basic analog */
889         case 71999:
890                 /* WinTV-HVR1200 (PCIe, OEM, full height)
891                  * DVB-T and basic analog */
892         case 76601:
893                 /* WinTV-HVR1800lp (PCIe, Retail, No IR, Dual
894                         channel ATSC and MPEG2 HW Encoder */
895         case 77001:
896                 /* WinTV-HVR1500 (Express Card, OEM, No IR, ATSC
897                         and Basic analog */
898         case 77011:
899                 /* WinTV-HVR1500 (Express Card, Retail, No IR, ATSC
900                         and Basic analog */
901         case 77041:
902                 /* WinTV-HVR1500Q (Express Card, OEM, No IR, ATSC/QAM
903                         and Basic analog */
904         case 77051:
905                 /* WinTV-HVR1500Q (Express Card, Retail, No IR, ATSC/QAM
906                         and Basic analog */
907         case 78011:
908                 /* WinTV-HVR1800 (PCIe, Retail, 3.5mm in, IR, No FM,
909                         Dual channel ATSC and MPEG2 HW Encoder */
910         case 78501:
911                 /* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
912                         Dual channel ATSC and MPEG2 HW Encoder */
913         case 78521:
914                 /* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
915                         Dual channel ATSC and MPEG2 HW Encoder */
916         case 78531:
917                 /* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, No FM,
918                         Dual channel ATSC and MPEG2 HW Encoder */
919         case 78631:
920                 /* WinTV-HVR1800 (PCIe, OEM, No IR, No FM,
921                         Dual channel ATSC and MPEG2 HW Encoder */
922         case 79001:
923                 /* WinTV-HVR1250 (PCIe, Retail, IR, full height,
924                         ATSC and Basic analog */
925         case 79101:
926                 /* WinTV-HVR1250 (PCIe, Retail, IR, half height,
927                         ATSC and Basic analog */
928         case 79501:
929                 /* WinTV-HVR1250 (PCIe, No IR, half height,
930                         ATSC [at least] and Basic analog) */
931         case 79561:
932                 /* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
933                         ATSC and Basic analog */
934         case 79571:
935                 /* WinTV-HVR1250 (PCIe, OEM, No IR, full height,
936                  ATSC and Basic analog */
937         case 79671:
938                 /* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
939                         ATSC and Basic analog */
940         case 80019:
941                 /* WinTV-HVR1400 (Express Card, Retail, IR,
942                  * DVB-T and Basic analog */
943         case 81509:
944                 /* WinTV-HVR1700 (PCIe, OEM, No IR, half height)
945                  * DVB-T and MPEG2 HW Encoder */
946         case 81519:
947                 /* WinTV-HVR1700 (PCIe, OEM, No IR, full height)
948                  * DVB-T and MPEG2 HW Encoder */
949                 break;
950         case 85021:
951                 /* WinTV-HVR1850 (PCIe, Retail, 3.5mm in, IR, FM,
952                         Dual channel ATSC and MPEG2 HW Encoder */
953                 break;
954         case 85721:
955                 /* WinTV-HVR1290 (PCIe, OEM, RCA in, IR,
956                         Dual channel ATSC and Basic analog */
957                 break;
958         default:
959                 printk(KERN_WARNING "%s: warning: "
960                         "unknown hauppauge model #%d\n",
961                         dev->name, tv.model);
962                 break;
963         }
964
965         printk(KERN_INFO "%s: hauppauge eeprom: model=%d\n",
966                         dev->name, tv.model);
967 }
968
969 int cx23885_tuner_callback(void *priv, int component, int command, int arg)
970 {
971         struct cx23885_tsport *port = priv;
972         struct cx23885_dev *dev = port->dev;
973         u32 bitmask = 0;
974
975         if ((command == XC2028_RESET_CLK) || (command == XC2028_I2C_FLUSH))
976                 return 0;
977
978         if (command != 0) {
979                 printk(KERN_ERR "%s(): Unknown command 0x%x.\n",
980                         __func__, command);
981                 return -EINVAL;
982         }
983
984         switch (dev->board) {
985         case CX23885_BOARD_HAUPPAUGE_HVR1400:
986         case CX23885_BOARD_HAUPPAUGE_HVR1500:
987         case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
988         case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
989         case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
990         case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
991         case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
992         case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
993                 /* Tuner Reset Command */
994                 bitmask = 0x04;
995                 break;
996         case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
997         case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
998                 /* Two identical tuners on two different i2c buses,
999                  * we need to reset the correct gpio. */
1000                 if (port->nr == 1)
1001                         bitmask = 0x01;
1002                 else if (port->nr == 2)
1003                         bitmask = 0x04;
1004                 break;
1005         case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
1006                 /* Tuner Reset Command */
1007                 bitmask = 0x02;
1008                 break;
1009         case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
1010                 altera_ci_tuner_reset(dev, port->nr);
1011                 break;
1012         }
1013
1014         if (bitmask) {
1015                 /* Drive the tuner into reset and back out */
1016                 cx_clear(GP0_IO, bitmask);
1017                 mdelay(200);
1018                 cx_set(GP0_IO, bitmask);
1019         }
1020
1021         return 0;
1022 }
1023
1024 void cx23885_gpio_setup(struct cx23885_dev *dev)
1025 {
1026         switch (dev->board) {
1027         case CX23885_BOARD_HAUPPAUGE_HVR1250:
1028                 /* GPIO-0 cx24227 demodulator reset */
1029                 cx_set(GP0_IO, 0x00010001); /* Bring the part out of reset */
1030                 break;
1031         case CX23885_BOARD_HAUPPAUGE_HVR1500:
1032                 /* GPIO-0 cx24227 demodulator */
1033                 /* GPIO-2 xc3028 tuner */
1034
1035                 /* Put the parts into reset */
1036                 cx_set(GP0_IO, 0x00050000);
1037                 cx_clear(GP0_IO, 0x00000005);
1038                 msleep(5);
1039
1040                 /* Bring the parts out of reset */
1041                 cx_set(GP0_IO, 0x00050005);
1042                 break;
1043         case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
1044                 /* GPIO-0 cx24227 demodulator reset */
1045                 /* GPIO-2 xc5000 tuner reset */
1046                 cx_set(GP0_IO, 0x00050005); /* Bring the part out of reset */
1047                 break;
1048         case CX23885_BOARD_HAUPPAUGE_HVR1800:
1049                 /* GPIO-0 656_CLK */
1050                 /* GPIO-1 656_D0 */
1051                 /* GPIO-2 8295A Reset */
1052                 /* GPIO-3-10 cx23417 data0-7 */
1053                 /* GPIO-11-14 cx23417 addr0-3 */
1054                 /* GPIO-15-18 cx23417 READY, CS, RD, WR */
1055                 /* GPIO-19 IR_RX */
1056
1057                 /* CX23417 GPIO's */
1058                 /* EIO15 Zilog Reset */
1059                 /* EIO14 S5H1409/CX24227 Reset */
1060                 mc417_gpio_enable(dev, GPIO_15 | GPIO_14, 1);
1061
1062                 /* Put the demod into reset and protect the eeprom */
1063                 mc417_gpio_clear(dev, GPIO_15 | GPIO_14);
1064                 mdelay(100);
1065
1066                 /* Bring the demod and blaster out of reset */
1067                 mc417_gpio_set(dev, GPIO_15 | GPIO_14);
1068                 mdelay(100);
1069
1070                 /* Force the TDA8295A into reset and back */
1071                 cx23885_gpio_enable(dev, GPIO_2, 1);
1072                 cx23885_gpio_set(dev, GPIO_2);
1073                 mdelay(20);
1074                 cx23885_gpio_clear(dev, GPIO_2);
1075                 mdelay(20);
1076                 cx23885_gpio_set(dev, GPIO_2);
1077                 mdelay(20);
1078                 break;
1079         case CX23885_BOARD_HAUPPAUGE_HVR1200:
1080                 /* GPIO-0 tda10048 demodulator reset */
1081                 /* GPIO-2 tda18271 tuner reset */
1082
1083                 /* Put the parts into reset and back */
1084                 cx_set(GP0_IO, 0x00050000);
1085                 mdelay(20);
1086                 cx_clear(GP0_IO, 0x00000005);
1087                 mdelay(20);
1088                 cx_set(GP0_IO, 0x00050005);
1089                 break;
1090         case CX23885_BOARD_HAUPPAUGE_HVR1700:
1091                 /* GPIO-0 TDA10048 demodulator reset */
1092                 /* GPIO-2 TDA8295A Reset */
1093                 /* GPIO-3-10 cx23417 data0-7 */
1094                 /* GPIO-11-14 cx23417 addr0-3 */
1095                 /* GPIO-15-18 cx23417 READY, CS, RD, WR */
1096
1097                 /* The following GPIO's are on the interna AVCore (cx25840) */
1098                 /* GPIO-19 IR_RX */
1099                 /* GPIO-20 IR_TX 416/DVBT Select */
1100                 /* GPIO-21 IIS DAT */
1101                 /* GPIO-22 IIS WCLK */
1102                 /* GPIO-23 IIS BCLK */
1103
1104                 /* Put the parts into reset and back */
1105                 cx_set(GP0_IO, 0x00050000);
1106                 mdelay(20);
1107                 cx_clear(GP0_IO, 0x00000005);
1108                 mdelay(20);
1109                 cx_set(GP0_IO, 0x00050005);
1110                 break;
1111         case CX23885_BOARD_HAUPPAUGE_HVR1400:
1112                 /* GPIO-0  Dibcom7000p demodulator reset */
1113                 /* GPIO-2  xc3028L tuner reset */
1114                 /* GPIO-13 LED */
1115
1116                 /* Put the parts into reset and back */
1117                 cx_set(GP0_IO, 0x00050000);
1118                 mdelay(20);
1119                 cx_clear(GP0_IO, 0x00000005);
1120                 mdelay(20);
1121                 cx_set(GP0_IO, 0x00050005);
1122                 break;
1123         case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
1124                 /* GPIO-0 xc5000 tuner reset i2c bus 0 */
1125                 /* GPIO-1 s5h1409 demod reset i2c bus 0 */
1126                 /* GPIO-2 xc5000 tuner reset i2c bus 1 */
1127                 /* GPIO-3 s5h1409 demod reset i2c bus 0 */
1128
1129                 /* Put the parts into reset and back */
1130                 cx_set(GP0_IO, 0x000f0000);
1131                 mdelay(20);
1132                 cx_clear(GP0_IO, 0x0000000f);
1133                 mdelay(20);
1134                 cx_set(GP0_IO, 0x000f000f);
1135                 break;
1136         case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
1137                 /* GPIO-0 portb xc3028 reset */
1138                 /* GPIO-1 portb zl10353 reset */
1139                 /* GPIO-2 portc xc3028 reset */
1140                 /* GPIO-3 portc zl10353 reset */
1141
1142                 /* Put the parts into reset and back */
1143                 cx_set(GP0_IO, 0x000f0000);
1144                 mdelay(20);
1145                 cx_clear(GP0_IO, 0x0000000f);
1146                 mdelay(20);
1147                 cx_set(GP0_IO, 0x000f000f);
1148                 break;
1149         case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
1150         case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
1151         case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
1152         case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
1153         case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
1154                 /* GPIO-2  xc3028 tuner reset */
1155
1156                 /* The following GPIO's are on the internal AVCore (cx25840) */
1157                 /* GPIO-?  zl10353 demod reset */
1158
1159                 /* Put the parts into reset and back */
1160                 cx_set(GP0_IO, 0x00040000);
1161                 mdelay(20);
1162                 cx_clear(GP0_IO, 0x00000004);
1163                 mdelay(20);
1164                 cx_set(GP0_IO, 0x00040004);
1165                 break;
1166         case CX23885_BOARD_TBS_6920:
1167         case CX23885_BOARD_PROF_8000:
1168                 cx_write(MC417_CTL, 0x00000036);
1169                 cx_write(MC417_OEN, 0x00001000);
1170                 cx_set(MC417_RWD, 0x00000002);
1171                 mdelay(200);
1172                 cx_clear(MC417_RWD, 0x00000800);
1173                 mdelay(200);
1174                 cx_set(MC417_RWD, 0x00000800);
1175                 mdelay(200);
1176                 break;
1177         case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
1178                 /* GPIO-0 INTA from CiMax1
1179                    GPIO-1 INTB from CiMax2
1180                    GPIO-2 reset chips
1181                    GPIO-3 to GPIO-10 data/addr for CA
1182                    GPIO-11 ~CS0 to CiMax1
1183                    GPIO-12 ~CS1 to CiMax2
1184                    GPIO-13 ADL0 load LSB addr
1185                    GPIO-14 ADL1 load MSB addr
1186                    GPIO-15 ~RDY from CiMax
1187                    GPIO-17 ~RD to CiMax
1188                    GPIO-18 ~WR to CiMax
1189                  */
1190                 cx_set(GP0_IO, 0x00040000); /* GPIO as out */
1191                 /* GPIO1 and GPIO2 as INTA and INTB from CiMaxes, reset low */
1192                 cx_clear(GP0_IO, 0x00030004);
1193                 mdelay(100);/* reset delay */
1194                 cx_set(GP0_IO, 0x00040004); /* GPIO as out, reset high */
1195                 cx_write(MC417_CTL, 0x00000037);/* enable GPIO3-18 pins */
1196                 /* GPIO-15 IN as ~ACK, rest as OUT */
1197                 cx_write(MC417_OEN, 0x00001000);
1198                 /* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */
1199                 cx_write(MC417_RWD, 0x0000c300);
1200                 /* enable irq */
1201                 cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
1202                 break;
1203         case CX23885_BOARD_HAUPPAUGE_HVR1270:
1204         case CX23885_BOARD_HAUPPAUGE_HVR1275:
1205         case CX23885_BOARD_HAUPPAUGE_HVR1255:
1206         case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
1207         case CX23885_BOARD_HAUPPAUGE_HVR1210:
1208                 /* GPIO-5 RF Control: 0 = RF1 Terrestrial, 1 = RF2 Cable */
1209                 /* GPIO-6 I2C Gate which can isolate the demod from the bus */
1210                 /* GPIO-9 Demod reset */
1211
1212                 /* Put the parts into reset and back */
1213                 cx23885_gpio_enable(dev, GPIO_9 | GPIO_6 | GPIO_5, 1);
1214                 cx23885_gpio_set(dev, GPIO_9 | GPIO_6 | GPIO_5);
1215                 cx23885_gpio_clear(dev, GPIO_9);
1216                 mdelay(20);
1217                 cx23885_gpio_set(dev, GPIO_9);
1218                 break;
1219         case CX23885_BOARD_MYGICA_X8506:
1220         case CX23885_BOARD_MAGICPRO_PROHDTVE2:
1221         case CX23885_BOARD_MYGICA_X8507:
1222                 /* GPIO-0 (0)Analog / (1)Digital TV */
1223                 /* GPIO-1 reset XC5000 */
1224                 /* GPIO-2 reset LGS8GL5 / LGS8G75 */
1225                 cx23885_gpio_enable(dev, GPIO_0 | GPIO_1 | GPIO_2, 1);
1226                 cx23885_gpio_clear(dev, GPIO_1 | GPIO_2);
1227                 mdelay(100);
1228                 cx23885_gpio_set(dev, GPIO_0 | GPIO_1 | GPIO_2);
1229                 mdelay(100);
1230                 break;
1231         case CX23885_BOARD_MYGICA_X8558PRO:
1232                 /* GPIO-0 reset first ATBM8830 */
1233                 /* GPIO-1 reset second ATBM8830 */
1234                 cx23885_gpio_enable(dev, GPIO_0 | GPIO_1, 1);
1235                 cx23885_gpio_clear(dev, GPIO_0 | GPIO_1);
1236                 mdelay(100);
1237                 cx23885_gpio_set(dev, GPIO_0 | GPIO_1);
1238                 mdelay(100);
1239                 break;
1240         case CX23885_BOARD_HAUPPAUGE_HVR1850:
1241         case CX23885_BOARD_HAUPPAUGE_HVR1290:
1242                 /* GPIO-0 656_CLK */
1243                 /* GPIO-1 656_D0 */
1244                 /* GPIO-2 Wake# */
1245                 /* GPIO-3-10 cx23417 data0-7 */
1246                 /* GPIO-11-14 cx23417 addr0-3 */
1247                 /* GPIO-15-18 cx23417 READY, CS, RD, WR */
1248                 /* GPIO-19 IR_RX */
1249                 /* GPIO-20 C_IR_TX */
1250                 /* GPIO-21 I2S DAT */
1251                 /* GPIO-22 I2S WCLK */
1252                 /* GPIO-23 I2S BCLK */
1253                 /* ALT GPIO: EXP GPIO LATCH */
1254
1255                 /* CX23417 GPIO's */
1256                 /* GPIO-14 S5H1411/CX24228 Reset */
1257                 /* GPIO-13 EEPROM write protect */
1258                 mc417_gpio_enable(dev, GPIO_14 | GPIO_13, 1);
1259
1260                 /* Put the demod into reset and protect the eeprom */
1261                 mc417_gpio_clear(dev, GPIO_14 | GPIO_13);
1262                 mdelay(100);
1263
1264                 /* Bring the demod out of reset */
1265                 mc417_gpio_set(dev, GPIO_14);
1266                 mdelay(100);
1267
1268                 /* CX24228 GPIO */
1269                 /* Connected to IF / Mux */
1270                 break;
1271         case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
1272                 cx_set(GP0_IO, 0x00010001); /* Bring the part out of reset */
1273                 break;
1274         case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
1275                 /* GPIO-0 ~INT in
1276                    GPIO-1 TMS out
1277                    GPIO-2 ~reset chips out
1278                    GPIO-3 to GPIO-10 data/addr for CA in/out
1279                    GPIO-11 ~CS out
1280                    GPIO-12 ADDR out
1281                    GPIO-13 ~WR out
1282                    GPIO-14 ~RD out
1283                    GPIO-15 ~RDY in
1284                    GPIO-16 TCK out
1285                    GPIO-17 TDO in
1286                    GPIO-18 TDI out
1287                  */
1288                 cx_set(GP0_IO, 0x00060000); /* GPIO-1,2 as out */
1289                 /* GPIO-0 as INT, reset & TMS low */
1290                 cx_clear(GP0_IO, 0x00010006);
1291                 mdelay(100);/* reset delay */
1292                 cx_set(GP0_IO, 0x00000004); /* reset high */
1293                 cx_write(MC417_CTL, 0x00000037);/* enable GPIO-3..18 pins */
1294                 /* GPIO-17 is TDO in, GPIO-15 is ~RDY in, rest is out */
1295                 cx_write(MC417_OEN, 0x00005000);
1296                 /* ~RD, ~WR high; ADDR low; ~CS high */
1297                 cx_write(MC417_RWD, 0x00000d00);
1298                 /* enable irq */
1299                 cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
1300                 break;
1301         }
1302 }
1303
1304 int cx23885_ir_init(struct cx23885_dev *dev)
1305 {
1306         static struct v4l2_subdev_io_pin_config ir_rxtx_pin_cfg[] = {
1307                 {
1308                         .flags    = V4L2_SUBDEV_IO_PIN_INPUT,
1309                         .pin      = CX23885_PIN_IR_RX_GPIO19,
1310                         .function = CX23885_PAD_IR_RX,
1311                         .value    = 0,
1312                         .strength = CX25840_PIN_DRIVE_MEDIUM,
1313                 }, {
1314                         .flags    = V4L2_SUBDEV_IO_PIN_OUTPUT,
1315                         .pin      = CX23885_PIN_IR_TX_GPIO20,
1316                         .function = CX23885_PAD_IR_TX,
1317                         .value    = 0,
1318                         .strength = CX25840_PIN_DRIVE_MEDIUM,
1319                 }
1320         };
1321         const size_t ir_rxtx_pin_cfg_count = ARRAY_SIZE(ir_rxtx_pin_cfg);
1322
1323         static struct v4l2_subdev_io_pin_config ir_rx_pin_cfg[] = {
1324                 {
1325                         .flags    = V4L2_SUBDEV_IO_PIN_INPUT,
1326                         .pin      = CX23885_PIN_IR_RX_GPIO19,
1327                         .function = CX23885_PAD_IR_RX,
1328                         .value    = 0,
1329                         .strength = CX25840_PIN_DRIVE_MEDIUM,
1330                 }
1331         };
1332         const size_t ir_rx_pin_cfg_count = ARRAY_SIZE(ir_rx_pin_cfg);
1333
1334         struct v4l2_subdev_ir_parameters params;
1335         int ret = 0;
1336         switch (dev->board) {
1337         case CX23885_BOARD_HAUPPAUGE_HVR1500:
1338         case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
1339         case CX23885_BOARD_HAUPPAUGE_HVR1800:
1340         case CX23885_BOARD_HAUPPAUGE_HVR1200:
1341         case CX23885_BOARD_HAUPPAUGE_HVR1400:
1342         case CX23885_BOARD_HAUPPAUGE_HVR1275:
1343         case CX23885_BOARD_HAUPPAUGE_HVR1255:
1344         case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
1345         case CX23885_BOARD_HAUPPAUGE_HVR1210:
1346                 /* FIXME: Implement me */
1347                 break;
1348         case CX23885_BOARD_HAUPPAUGE_HVR1270:
1349                 ret = cx23888_ir_probe(dev);
1350                 if (ret)
1351                         break;
1352                 dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_888_IR);
1353                 v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
1354                                  ir_rx_pin_cfg_count, ir_rx_pin_cfg);
1355                 break;
1356         case CX23885_BOARD_HAUPPAUGE_HVR1850:
1357         case CX23885_BOARD_HAUPPAUGE_HVR1290:
1358                 ret = cx23888_ir_probe(dev);
1359                 if (ret)
1360                         break;
1361                 dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_888_IR);
1362                 v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
1363                                  ir_rxtx_pin_cfg_count, ir_rxtx_pin_cfg);
1364                 /*
1365                  * For these boards we need to invert the Tx output via the
1366                  * IR controller to have the LED off while idle
1367                  */
1368                 v4l2_subdev_call(dev->sd_ir, ir, tx_g_parameters, &params);
1369                 params.enable = false;
1370                 params.shutdown = false;
1371                 params.invert_level = true;
1372                 v4l2_subdev_call(dev->sd_ir, ir, tx_s_parameters, &params);
1373                 params.shutdown = true;
1374                 v4l2_subdev_call(dev->sd_ir, ir, tx_s_parameters, &params);
1375                 break;
1376         case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
1377         case CX23885_BOARD_TEVII_S470:
1378                 if (!enable_885_ir)
1379                         break;
1380                 dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_AV_CORE);
1381                 if (dev->sd_ir == NULL) {
1382                         ret = -ENODEV;
1383                         break;
1384                 }
1385                 v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
1386                                  ir_rx_pin_cfg_count, ir_rx_pin_cfg);
1387                 break;
1388         case CX23885_BOARD_HAUPPAUGE_HVR1250:
1389                 if (!enable_885_ir)
1390                         break;
1391                 dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_AV_CORE);
1392                 if (dev->sd_ir == NULL) {
1393                         ret = -ENODEV;
1394                         break;
1395                 }
1396                 v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
1397                                  ir_rxtx_pin_cfg_count, ir_rxtx_pin_cfg);
1398                 break;
1399         case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
1400                 request_module("ir-kbd-i2c");
1401                 break;
1402         }
1403
1404         return ret;
1405 }
1406
1407 void cx23885_ir_fini(struct cx23885_dev *dev)
1408 {
1409         switch (dev->board) {
1410         case CX23885_BOARD_HAUPPAUGE_HVR1270:
1411         case CX23885_BOARD_HAUPPAUGE_HVR1850:
1412         case CX23885_BOARD_HAUPPAUGE_HVR1290:
1413                 cx23885_irq_remove(dev, PCI_MSK_IR);
1414                 cx23888_ir_remove(dev);
1415                 dev->sd_ir = NULL;
1416                 break;
1417         case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
1418         case CX23885_BOARD_TEVII_S470:
1419         case CX23885_BOARD_HAUPPAUGE_HVR1250:
1420                 cx23885_irq_remove(dev, PCI_MSK_AV_CORE);
1421                 /* sd_ir is a duplicate pointer to the AV Core, just clear it */
1422                 dev->sd_ir = NULL;
1423                 break;
1424         }
1425 }
1426
1427 int netup_jtag_io(void *device, int tms, int tdi, int read_tdo)
1428 {
1429         int data;
1430         int tdo = 0;
1431         struct cx23885_dev *dev = (struct cx23885_dev *)device;
1432         /*TMS*/
1433         data = ((cx_read(GP0_IO)) & (~0x00000002));
1434         data |= (tms ? 0x00020002 : 0x00020000);
1435         cx_write(GP0_IO, data);
1436
1437         /*TDI*/
1438         data = ((cx_read(MC417_RWD)) & (~0x0000a000));
1439         data |= (tdi ? 0x00008000 : 0);
1440         cx_write(MC417_RWD, data);
1441         if (read_tdo)
1442                 tdo = (data & 0x00004000) ? 1 : 0; /*TDO*/
1443
1444         cx_write(MC417_RWD, data | 0x00002000);
1445         udelay(1);
1446         /*TCK*/
1447         cx_write(MC417_RWD, data);
1448
1449         return tdo;
1450 }
1451
1452 void cx23885_ir_pci_int_enable(struct cx23885_dev *dev)
1453 {
1454         switch (dev->board) {
1455         case CX23885_BOARD_HAUPPAUGE_HVR1270:
1456         case CX23885_BOARD_HAUPPAUGE_HVR1850:
1457         case CX23885_BOARD_HAUPPAUGE_HVR1290:
1458                 if (dev->sd_ir)
1459                         cx23885_irq_add_enable(dev, PCI_MSK_IR);
1460                 break;
1461         case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
1462         case CX23885_BOARD_TEVII_S470:
1463         case CX23885_BOARD_HAUPPAUGE_HVR1250:
1464                 if (dev->sd_ir)
1465                         cx23885_irq_add_enable(dev, PCI_MSK_AV_CORE);
1466                 break;
1467         }
1468 }
1469
1470 void cx23885_card_setup(struct cx23885_dev *dev)
1471 {
1472         struct cx23885_tsport *ts1 = &dev->ts1;
1473         struct cx23885_tsport *ts2 = &dev->ts2;
1474
1475         static u8 eeprom[256];
1476
1477         if (dev->i2c_bus[0].i2c_rc == 0) {
1478                 dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1;
1479                 tveeprom_read(&dev->i2c_bus[0].i2c_client,
1480                               eeprom, sizeof(eeprom));
1481         }
1482
1483         switch (dev->board) {
1484         case CX23885_BOARD_HAUPPAUGE_HVR1250:
1485                 if (dev->i2c_bus[0].i2c_rc == 0) {
1486                         if (eeprom[0x80] != 0x84)
1487                                 hauppauge_eeprom(dev, eeprom+0xc0);
1488                         else
1489                                 hauppauge_eeprom(dev, eeprom+0x80);
1490                 }
1491                 break;
1492         case CX23885_BOARD_HAUPPAUGE_HVR1500:
1493         case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
1494         case CX23885_BOARD_HAUPPAUGE_HVR1400:
1495                 if (dev->i2c_bus[0].i2c_rc == 0)
1496                         hauppauge_eeprom(dev, eeprom+0x80);
1497                 break;
1498         case CX23885_BOARD_HAUPPAUGE_HVR1800:
1499         case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
1500         case CX23885_BOARD_HAUPPAUGE_HVR1200:
1501         case CX23885_BOARD_HAUPPAUGE_HVR1700:
1502         case CX23885_BOARD_HAUPPAUGE_HVR1270:
1503         case CX23885_BOARD_HAUPPAUGE_HVR1275:
1504         case CX23885_BOARD_HAUPPAUGE_HVR1255:
1505         case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
1506         case CX23885_BOARD_HAUPPAUGE_HVR1210:
1507         case CX23885_BOARD_HAUPPAUGE_HVR1850:
1508         case CX23885_BOARD_HAUPPAUGE_HVR1290:
1509                 if (dev->i2c_bus[0].i2c_rc == 0)
1510                         hauppauge_eeprom(dev, eeprom+0xc0);
1511                 break;
1512         }
1513
1514         switch (dev->board) {
1515         case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
1516         case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
1517                 ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
1518                 ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1519                 ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1520                 /* break omitted intentionally */
1521         case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
1522                 ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
1523                 ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1524                 ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1525                 break;
1526         case CX23885_BOARD_HAUPPAUGE_HVR1850:
1527         case CX23885_BOARD_HAUPPAUGE_HVR1800:
1528                 /* Defaults for VID B - Analog encoder */
1529                 /* DREQ_POL, SMODE, PUNC_CLK, MCLK_POL Serial bus + punc clk */
1530                 ts1->gen_ctrl_val    = 0x10e;
1531                 ts1->ts_clk_en_val   = 0x1; /* Enable TS_CLK */
1532                 ts1->src_sel_val     = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1533
1534                 /* APB_TSVALERR_POL (active low)*/
1535                 ts1->vld_misc_val    = 0x2000;
1536                 ts1->hw_sop_ctrl_val = (0x47 << 16 | 188 << 4 | 0xc);
1537                 cx_write(0x130184, 0xc);
1538
1539                 /* Defaults for VID C */
1540                 ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
1541                 ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1542                 ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1543                 break;
1544         case CX23885_BOARD_TBS_6920:
1545                 ts1->gen_ctrl_val  = 0x4; /* Parallel */
1546                 ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1547                 ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1548                 break;
1549         case CX23885_BOARD_TEVII_S470:
1550         case CX23885_BOARD_TEVII_S471:
1551         case CX23885_BOARD_DVBWORLD_2005:
1552         case CX23885_BOARD_PROF_8000:
1553                 ts1->gen_ctrl_val  = 0x5; /* Parallel */
1554                 ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1555                 ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1556                 break;
1557         case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
1558         case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
1559         case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
1560                 ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
1561                 ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1562                 ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1563                 ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
1564                 ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1565                 ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1566                 break;
1567         case CX23885_BOARD_MYGICA_X8506:
1568         case CX23885_BOARD_MAGICPRO_PROHDTVE2:
1569                 ts1->gen_ctrl_val  = 0x5; /* Parallel */
1570                 ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1571                 ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1572                 break;
1573         case CX23885_BOARD_MYGICA_X8558PRO:
1574                 ts1->gen_ctrl_val  = 0x5; /* Parallel */
1575                 ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1576                 ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1577                 ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
1578                 ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1579                 ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1580                 break;
1581         case CX23885_BOARD_HAUPPAUGE_HVR1250:
1582         case CX23885_BOARD_HAUPPAUGE_HVR1500:
1583         case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
1584         case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
1585         case CX23885_BOARD_HAUPPAUGE_HVR1200:
1586         case CX23885_BOARD_HAUPPAUGE_HVR1700:
1587         case CX23885_BOARD_HAUPPAUGE_HVR1400:
1588         case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
1589         case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
1590         case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
1591         case CX23885_BOARD_HAUPPAUGE_HVR1270:
1592         case CX23885_BOARD_HAUPPAUGE_HVR1275:
1593         case CX23885_BOARD_HAUPPAUGE_HVR1255:
1594         case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
1595         case CX23885_BOARD_HAUPPAUGE_HVR1210:
1596         case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
1597         case CX23885_BOARD_HAUPPAUGE_HVR1290:
1598         case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
1599         default:
1600                 ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
1601                 ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
1602                 ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
1603         }
1604
1605         /* Certain boards support analog, or require the avcore to be
1606          * loaded, ensure this happens.
1607          */
1608         switch (dev->board) {
1609         case CX23885_BOARD_TEVII_S470:
1610                 /* Currently only enabled for the integrated IR controller */
1611                 if (!enable_885_ir)
1612                         break;
1613         case CX23885_BOARD_HAUPPAUGE_HVR1250:
1614         case CX23885_BOARD_HAUPPAUGE_HVR1800:
1615         case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
1616         case CX23885_BOARD_HAUPPAUGE_HVR1700:
1617         case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
1618         case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
1619         case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
1620         case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
1621         case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
1622         case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
1623         case CX23885_BOARD_HAUPPAUGE_HVR1255:
1624         case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
1625         case CX23885_BOARD_HAUPPAUGE_HVR1270:
1626         case CX23885_BOARD_HAUPPAUGE_HVR1850:
1627         case CX23885_BOARD_MYGICA_X8506:
1628         case CX23885_BOARD_MAGICPRO_PROHDTVE2:
1629         case CX23885_BOARD_HAUPPAUGE_HVR1290:
1630         case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
1631         case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
1632         case CX23885_BOARD_HAUPPAUGE_HVR1500:
1633         case CX23885_BOARD_MPX885:
1634         case CX23885_BOARD_MYGICA_X8507:
1635         case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
1636                 dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1637                                 &dev->i2c_bus[2].i2c_adap,
1638                                 "cx25840", 0x88 >> 1, NULL);
1639                 if (dev->sd_cx25840) {
1640                         dev->sd_cx25840->grp_id = CX23885_HW_AV_CORE;
1641                         v4l2_subdev_call(dev->sd_cx25840, core, load_fw);
1642                 }
1643                 break;
1644         }
1645
1646         /* AUX-PLL 27MHz CLK */
1647         switch (dev->board) {
1648         case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
1649                 netup_initialize(dev);
1650                 break;
1651         case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF: {
1652                 int ret;
1653                 const struct firmware *fw;
1654                 const char *filename = "dvb-netup-altera-01.fw";
1655                 char *action = "configure";
1656                 static struct netup_card_info cinfo;
1657                 struct altera_config netup_config = {
1658                         .dev = dev,
1659                         .action = action,
1660                         .jtag_io = netup_jtag_io,
1661                 };
1662
1663                 netup_initialize(dev);
1664
1665                 netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo);
1666                 if (netup_card_rev)
1667                         cinfo.rev = netup_card_rev;
1668
1669                 switch (cinfo.rev) {
1670                 case 0x4:
1671                         filename = "dvb-netup-altera-04.fw";
1672                         break;
1673                 default:
1674                         filename = "dvb-netup-altera-01.fw";
1675                         break;
1676                 }
1677                 printk(KERN_INFO "NetUP card rev=0x%x fw_filename=%s\n",
1678                                 cinfo.rev, filename);
1679
1680                 ret = request_firmware(&fw, filename, &dev->pci->dev);
1681                 if (ret != 0)
1682                         printk(KERN_ERR "did not find the firmware file. (%s) "
1683                         "Please see linux/Documentation/dvb/ for more details "
1684                         "on firmware-problems.", filename);
1685                 else
1686                         altera_init(&netup_config, fw);
1687
1688                 release_firmware(fw);
1689                 break;
1690         }
1691         }
1692 }
1693
1694 /* ------------------------------------------------------------------ */