1b285192aSMauro Carvalho Chehab /*
2b285192aSMauro Carvalho Chehab  *  Driver for the Conexant CX23885 PCIe bridge
3b285192aSMauro Carvalho Chehab  *
4b285192aSMauro Carvalho Chehab  *  Copyright (c) 2006 Steven Toth <stoth@linuxtv.org>
5b285192aSMauro Carvalho Chehab  *
6b285192aSMauro Carvalho Chehab  *  This program is free software; you can redistribute it and/or modify
7b285192aSMauro Carvalho Chehab  *  it under the terms of the GNU General Public License as published by
8b285192aSMauro Carvalho Chehab  *  the Free Software Foundation; either version 2 of the License, or
9b285192aSMauro Carvalho Chehab  *  (at your option) any later version.
10b285192aSMauro Carvalho Chehab  *
11b285192aSMauro Carvalho Chehab  *  This program is distributed in the hope that it will be useful,
12b285192aSMauro Carvalho Chehab  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13b285192aSMauro Carvalho Chehab  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14b285192aSMauro Carvalho Chehab  *
15b285192aSMauro Carvalho Chehab  *  GNU General Public License for more details.
16b285192aSMauro Carvalho Chehab  */
17b285192aSMauro Carvalho Chehab 
18e39682b5SMauro Carvalho Chehab #include "cx23885.h"
19e39682b5SMauro Carvalho Chehab 
20b285192aSMauro Carvalho Chehab #include <linux/init.h>
21b285192aSMauro Carvalho Chehab #include <linux/module.h>
22b285192aSMauro Carvalho Chehab #include <linux/pci.h>
23b285192aSMauro Carvalho Chehab #include <linux/delay.h>
24d647f0b7SMauro Carvalho Chehab #include <media/drv-intf/cx25840.h>
25b285192aSMauro Carvalho Chehab #include <linux/firmware.h>
26b285192aSMauro Carvalho Chehab #include <misc/altera.h>
27b285192aSMauro Carvalho Chehab 
28b285192aSMauro Carvalho Chehab #include "tuner-xc2028.h"
29b285192aSMauro Carvalho Chehab #include "netup-eeprom.h"
30b285192aSMauro Carvalho Chehab #include "netup-init.h"
31b285192aSMauro Carvalho Chehab #include "altera-ci.h"
32b285192aSMauro Carvalho Chehab #include "xc4000.h"
33b285192aSMauro Carvalho Chehab #include "xc5000.h"
34b285192aSMauro Carvalho Chehab #include "cx23888-ir.h"
35b285192aSMauro Carvalho Chehab 
3689343055SAnton Nurkin static unsigned int netup_card_rev = 4;
37b285192aSMauro Carvalho Chehab module_param(netup_card_rev, int, 0644);
38b285192aSMauro Carvalho Chehab MODULE_PARM_DESC(netup_card_rev,
39b285192aSMauro Carvalho Chehab 		"NetUP Dual DVB-T/C CI card revision");
40b285192aSMauro Carvalho Chehab static unsigned int enable_885_ir;
41b285192aSMauro Carvalho Chehab module_param(enable_885_ir, int, 0644);
42b285192aSMauro Carvalho Chehab MODULE_PARM_DESC(enable_885_ir,
43b285192aSMauro Carvalho Chehab 		 "Enable integrated IR controller for supported\n"
44b285192aSMauro Carvalho Chehab 		 "\t\t    CX2388[57] boards that are wired for it:\n"
45b285192aSMauro Carvalho Chehab 		 "\t\t\tHVR-1250 (reported safe)\n"
46b285192aSMauro Carvalho Chehab 		 "\t\t\tTerraTec Cinergy T PCIe Dual (not well tested, appears to be safe)\n"
47b285192aSMauro Carvalho Chehab 		 "\t\t\tTeVii S470 (reported unsafe)\n"
48b285192aSMauro Carvalho Chehab 		 "\t\t    This can cause an interrupt storm with some cards.\n"
49b285192aSMauro Carvalho Chehab 		 "\t\t    Default: 0 [Disabled]");
50b285192aSMauro Carvalho Chehab 
51b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------ */
52b285192aSMauro Carvalho Chehab /* board config info                                                  */
53b285192aSMauro Carvalho Chehab 
54b285192aSMauro Carvalho Chehab struct cx23885_board cx23885_boards[] = {
55b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_UNKNOWN] = {
56b285192aSMauro Carvalho Chehab 		.name		= "UNKNOWN/GENERIC",
57b285192aSMauro Carvalho Chehab 		/* Ensure safe default for unknown boards */
58b285192aSMauro Carvalho Chehab 		.clk_freq       = 0,
59b285192aSMauro Carvalho Chehab 		.input          = {{
60b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
61b285192aSMauro Carvalho Chehab 			.vmux   = 0,
62b285192aSMauro Carvalho Chehab 		}, {
63b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE2,
64b285192aSMauro Carvalho Chehab 			.vmux   = 1,
65b285192aSMauro Carvalho Chehab 		}, {
66b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE3,
67b285192aSMauro Carvalho Chehab 			.vmux   = 2,
68b285192aSMauro Carvalho Chehab 		}, {
69b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE4,
70b285192aSMauro Carvalho Chehab 			.vmux   = 3,
71b285192aSMauro Carvalho Chehab 		} },
72b285192aSMauro Carvalho Chehab 	},
73b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1800lp] = {
74b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1800lp",
75b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
76b285192aSMauro Carvalho Chehab 		.input          = {{
77b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_TELEVISION,
78b285192aSMauro Carvalho Chehab 			.vmux   = 0,
79b285192aSMauro Carvalho Chehab 			.gpio0  = 0xff00,
80b285192aSMauro Carvalho Chehab 		}, {
81b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_DEBUG,
82b285192aSMauro Carvalho Chehab 			.vmux   = 0,
83b285192aSMauro Carvalho Chehab 			.gpio0  = 0xff01,
84b285192aSMauro Carvalho Chehab 		}, {
85b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
86b285192aSMauro Carvalho Chehab 			.vmux   = 1,
87b285192aSMauro Carvalho Chehab 			.gpio0  = 0xff02,
88b285192aSMauro Carvalho Chehab 		}, {
89b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_SVIDEO,
90b285192aSMauro Carvalho Chehab 			.vmux   = 2,
91b285192aSMauro Carvalho Chehab 			.gpio0  = 0xff02,
92b285192aSMauro Carvalho Chehab 		} },
93b285192aSMauro Carvalho Chehab 	},
94b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1800] = {
95b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1800",
96b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
97b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_ENCODER,
98b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
99b285192aSMauro Carvalho Chehab 		.tuner_type	= TUNER_PHILIPS_TDA8290,
100b285192aSMauro Carvalho Chehab 		.tuner_addr	= 0x42, /* 0x84 >> 1 */
101b285192aSMauro Carvalho Chehab 		.tuner_bus	= 1,
102b285192aSMauro Carvalho Chehab 		.input          = {{
103b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_TELEVISION,
104b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
105b285192aSMauro Carvalho Chehab 					CX25840_VIN5_CH2 |
106b285192aSMauro Carvalho Chehab 					CX25840_VIN2_CH1,
107b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO8,
108b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
109b285192aSMauro Carvalho Chehab 		}, {
110b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
111b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
112b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
113b285192aSMauro Carvalho Chehab 					CX25840_VIN6_CH1,
114b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
115b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
116b285192aSMauro Carvalho Chehab 		}, {
117b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_SVIDEO,
118b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
119b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
120b285192aSMauro Carvalho Chehab 					CX25840_VIN8_CH1 |
121b285192aSMauro Carvalho Chehab 					CX25840_SVIDEO_ON,
122b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
123b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
124b285192aSMauro Carvalho Chehab 		} },
125b285192aSMauro Carvalho Chehab 	},
126b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1250] = {
127b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1250",
128b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
129b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
130b285192aSMauro Carvalho Chehab #ifdef MT2131_NO_ANALOG_SUPPORT_YET
131b285192aSMauro Carvalho Chehab 		.tuner_type	= TUNER_PHILIPS_TDA8290,
132b285192aSMauro Carvalho Chehab 		.tuner_addr	= 0x42, /* 0x84 >> 1 */
133b285192aSMauro Carvalho Chehab 		.tuner_bus	= 1,
134b285192aSMauro Carvalho Chehab #endif
135b285192aSMauro Carvalho Chehab 		.force_bff	= 1,
136b285192aSMauro Carvalho Chehab 		.input          = {{
137b285192aSMauro Carvalho Chehab #ifdef MT2131_NO_ANALOG_SUPPORT_YET
138b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_TELEVISION,
139b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
140b285192aSMauro Carvalho Chehab 					CX25840_VIN5_CH2 |
141b285192aSMauro Carvalho Chehab 					CX25840_VIN2_CH1,
142b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO8,
143b285192aSMauro Carvalho Chehab 			.gpio0  = 0xff00,
144b285192aSMauro Carvalho Chehab 		}, {
145b285192aSMauro Carvalho Chehab #endif
146b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
147b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
148b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
149b285192aSMauro Carvalho Chehab 					CX25840_VIN6_CH1,
150b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
151b285192aSMauro Carvalho Chehab 			.gpio0  = 0xff02,
152b285192aSMauro Carvalho Chehab 		}, {
153b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_SVIDEO,
154b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
155b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
156b285192aSMauro Carvalho Chehab 					CX25840_VIN8_CH1 |
157b285192aSMauro Carvalho Chehab 					CX25840_SVIDEO_ON,
158b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
159b285192aSMauro Carvalho Chehab 			.gpio0  = 0xff02,
160b285192aSMauro Carvalho Chehab 		} },
161b285192aSMauro Carvalho Chehab 	},
162b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP] = {
163b285192aSMauro Carvalho Chehab 		.name		= "DViCO FusionHDTV5 Express",
164b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
165b285192aSMauro Carvalho Chehab 	},
166b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1500Q] = {
167b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1500Q",
168b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
169b285192aSMauro Carvalho Chehab 	},
170b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1500] = {
171b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1500",
172b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
173b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
174b285192aSMauro Carvalho Chehab 		.tuner_type	= TUNER_XC2028,
175b285192aSMauro Carvalho Chehab 		.tuner_addr	= 0x61, /* 0xc2 >> 1 */
176b285192aSMauro Carvalho Chehab 		.input          = {{
177b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_TELEVISION,
178b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
179b285192aSMauro Carvalho Chehab 					CX25840_VIN5_CH2 |
180b285192aSMauro Carvalho Chehab 					CX25840_VIN2_CH1,
181b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
182b285192aSMauro Carvalho Chehab 		}, {
183b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
184b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
185b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
186b285192aSMauro Carvalho Chehab 					CX25840_VIN6_CH1,
187b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
188b285192aSMauro Carvalho Chehab 		}, {
189b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_SVIDEO,
190b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
191b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
192b285192aSMauro Carvalho Chehab 					CX25840_VIN8_CH1 |
193b285192aSMauro Carvalho Chehab 					CX25840_SVIDEO_ON,
194b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
195b285192aSMauro Carvalho Chehab 		} },
196b285192aSMauro Carvalho Chehab 	},
197b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1200] = {
198b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1200",
199b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
200b285192aSMauro Carvalho Chehab 	},
201b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1700] = {
202b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1700",
203b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
204b285192aSMauro Carvalho Chehab 	},
205b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1400] = {
206b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1400",
207b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
208b285192aSMauro Carvalho Chehab 	},
209b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP] = {
210b285192aSMauro Carvalho Chehab 		.name		= "DViCO FusionHDTV7 Dual Express",
211b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
212b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
213b285192aSMauro Carvalho Chehab 	},
214b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP] = {
215b285192aSMauro Carvalho Chehab 		.name		= "DViCO FusionHDTV DVB-T Dual Express",
216b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
217b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
218b285192aSMauro Carvalho Chehab 	},
219b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H] = {
220b285192aSMauro Carvalho Chehab 		.name		= "Leadtek Winfast PxDVR3200 H",
221b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
222b285192aSMauro Carvalho Chehab 	},
223642ca1a0SAnca Emanuel 	[CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200] = {
224642ca1a0SAnca Emanuel 		.name		= "Leadtek Winfast PxPVR2200",
225642ca1a0SAnca Emanuel 		.porta		= CX23885_ANALOG_VIDEO,
226642ca1a0SAnca Emanuel 		.tuner_type	= TUNER_XC2028,
227642ca1a0SAnca Emanuel 		.tuner_addr	= 0x61,
228642ca1a0SAnca Emanuel 		.tuner_bus	= 1,
229642ca1a0SAnca Emanuel 		.input		= {{
230642ca1a0SAnca Emanuel 			.type	= CX23885_VMUX_TELEVISION,
231642ca1a0SAnca Emanuel 			.vmux	= CX25840_VIN2_CH1 |
232642ca1a0SAnca Emanuel 				  CX25840_VIN5_CH2,
233642ca1a0SAnca Emanuel 			.amux	= CX25840_AUDIO8,
234642ca1a0SAnca Emanuel 			.gpio0	= 0x704040,
235642ca1a0SAnca Emanuel 		}, {
236642ca1a0SAnca Emanuel 			.type	= CX23885_VMUX_COMPOSITE1,
237642ca1a0SAnca Emanuel 			.vmux	= CX25840_COMPOSITE1,
238642ca1a0SAnca Emanuel 			.amux	= CX25840_AUDIO7,
239642ca1a0SAnca Emanuel 			.gpio0	= 0x704040,
240642ca1a0SAnca Emanuel 		}, {
241642ca1a0SAnca Emanuel 			.type	= CX23885_VMUX_SVIDEO,
242642ca1a0SAnca Emanuel 			.vmux	= CX25840_SVIDEO_LUMA3 |
243642ca1a0SAnca Emanuel 				  CX25840_SVIDEO_CHROMA4,
244642ca1a0SAnca Emanuel 			.amux	= CX25840_AUDIO7,
245642ca1a0SAnca Emanuel 			.gpio0	= 0x704040,
246642ca1a0SAnca Emanuel 		}, {
247642ca1a0SAnca Emanuel 			.type	= CX23885_VMUX_COMPONENT,
248642ca1a0SAnca Emanuel 			.vmux	= CX25840_VIN7_CH1 |
249642ca1a0SAnca Emanuel 				  CX25840_VIN6_CH2 |
250642ca1a0SAnca Emanuel 				  CX25840_VIN8_CH3 |
251642ca1a0SAnca Emanuel 				  CX25840_COMPONENT_ON,
252642ca1a0SAnca Emanuel 			.amux	= CX25840_AUDIO7,
253642ca1a0SAnca Emanuel 			.gpio0	= 0x704040,
254642ca1a0SAnca Emanuel 		} },
255642ca1a0SAnca Emanuel 	},
256b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000] = {
257b285192aSMauro Carvalho Chehab 		.name		= "Leadtek Winfast PxDVR3200 H XC4000",
258b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
259b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
260b285192aSMauro Carvalho Chehab 		.tuner_type	= TUNER_XC4000,
261b285192aSMauro Carvalho Chehab 		.tuner_addr	= 0x61,
262b285192aSMauro Carvalho Chehab 		.radio_type	= UNSET,
263b285192aSMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
264b285192aSMauro Carvalho Chehab 		.input		= {{
265b285192aSMauro Carvalho Chehab 			.type	= CX23885_VMUX_TELEVISION,
266b285192aSMauro Carvalho Chehab 			.vmux	= CX25840_VIN2_CH1 |
267b285192aSMauro Carvalho Chehab 				  CX25840_VIN5_CH2 |
268b285192aSMauro Carvalho Chehab 				  CX25840_NONE0_CH3,
269b285192aSMauro Carvalho Chehab 		}, {
270b285192aSMauro Carvalho Chehab 			.type	= CX23885_VMUX_COMPOSITE1,
271b285192aSMauro Carvalho Chehab 			.vmux	= CX25840_COMPOSITE1,
272b285192aSMauro Carvalho Chehab 		}, {
273b285192aSMauro Carvalho Chehab 			.type	= CX23885_VMUX_SVIDEO,
274b285192aSMauro Carvalho Chehab 			.vmux	= CX25840_SVIDEO_LUMA3 |
275b285192aSMauro Carvalho Chehab 				  CX25840_SVIDEO_CHROMA4,
276b285192aSMauro Carvalho Chehab 		}, {
277b285192aSMauro Carvalho Chehab 			.type	= CX23885_VMUX_COMPONENT,
278b285192aSMauro Carvalho Chehab 			.vmux	= CX25840_VIN7_CH1 |
279b285192aSMauro Carvalho Chehab 				  CX25840_VIN6_CH2 |
280b285192aSMauro Carvalho Chehab 				  CX25840_VIN8_CH3 |
281b285192aSMauro Carvalho Chehab 				  CX25840_COMPONENT_ON,
282b285192aSMauro Carvalho Chehab 		} },
283b285192aSMauro Carvalho Chehab 	},
284b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_COMPRO_VIDEOMATE_E650F] = {
285b285192aSMauro Carvalho Chehab 		.name		= "Compro VideoMate E650F",
286b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
287b285192aSMauro Carvalho Chehab 	},
288b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_TBS_6920] = {
289b285192aSMauro Carvalho Chehab 		.name		= "TurboSight TBS 6920",
290b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
291b285192aSMauro Carvalho Chehab 	},
292e6001482SLuis Alves 	[CX23885_BOARD_TBS_6980] = {
293e6001482SLuis Alves 		.name		= "TurboSight TBS 6980",
294e6001482SLuis Alves 		.portb		= CX23885_MPEG_DVB,
295e6001482SLuis Alves 		.portc		= CX23885_MPEG_DVB,
296e6001482SLuis Alves 	},
297e6001482SLuis Alves 	[CX23885_BOARD_TBS_6981] = {
298e6001482SLuis Alves 		.name		= "TurboSight TBS 6981",
299e6001482SLuis Alves 		.portb		= CX23885_MPEG_DVB,
300e6001482SLuis Alves 		.portc		= CX23885_MPEG_DVB,
301e6001482SLuis Alves 	},
302b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_TEVII_S470] = {
303b285192aSMauro Carvalho Chehab 		.name		= "TeVii S470",
304b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
305b285192aSMauro Carvalho Chehab 	},
306b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_DVBWORLD_2005] = {
307b285192aSMauro Carvalho Chehab 		.name		= "DVBWorld DVB-S2 2005",
308b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
309b285192aSMauro Carvalho Chehab 	},
310b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_NETUP_DUAL_DVBS2_CI] = {
311b285192aSMauro Carvalho Chehab 		.ci_type	= 1,
312b285192aSMauro Carvalho Chehab 		.name		= "NetUP Dual DVB-S2 CI",
313b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
314b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
315b285192aSMauro Carvalho Chehab 	},
316b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1270] = {
317b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1270",
318b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
319b285192aSMauro Carvalho Chehab 	},
320b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1275] = {
321b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1275",
322b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
323b285192aSMauro Carvalho Chehab 	},
324b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1255] = {
325b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1255",
326b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
327b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
328b285192aSMauro Carvalho Chehab 		.tuner_type	= TUNER_ABSENT,
329b285192aSMauro Carvalho Chehab 		.tuner_addr	= 0x42, /* 0x84 >> 1 */
330b285192aSMauro Carvalho Chehab 		.force_bff	= 1,
331b285192aSMauro Carvalho Chehab 		.input          = {{
332b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_TELEVISION,
333b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
334b285192aSMauro Carvalho Chehab 					CX25840_VIN5_CH2 |
335b285192aSMauro Carvalho Chehab 					CX25840_VIN2_CH1 |
336b285192aSMauro Carvalho Chehab 					CX25840_DIF_ON,
337b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO8,
338b285192aSMauro Carvalho Chehab 		}, {
339b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
340b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
341b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
342b285192aSMauro Carvalho Chehab 					CX25840_VIN6_CH1,
343b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
344b285192aSMauro Carvalho Chehab 		}, {
345b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_SVIDEO,
346b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
347b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
348b285192aSMauro Carvalho Chehab 					CX25840_VIN8_CH1 |
349b285192aSMauro Carvalho Chehab 					CX25840_SVIDEO_ON,
350b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
351b285192aSMauro Carvalho Chehab 		} },
352b285192aSMauro Carvalho Chehab 	},
353b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1255_22111] = {
354b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1255",
355b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
356b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
357b285192aSMauro Carvalho Chehab 		.tuner_type	= TUNER_ABSENT,
358b285192aSMauro Carvalho Chehab 		.tuner_addr	= 0x42, /* 0x84 >> 1 */
359b285192aSMauro Carvalho Chehab 		.force_bff	= 1,
360b285192aSMauro Carvalho Chehab 		.input          = {{
361b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_TELEVISION,
362b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
363b285192aSMauro Carvalho Chehab 					CX25840_VIN5_CH2 |
364b285192aSMauro Carvalho Chehab 					CX25840_VIN2_CH1 |
365b285192aSMauro Carvalho Chehab 					CX25840_DIF_ON,
366b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO8,
367b285192aSMauro Carvalho Chehab 		}, {
368b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_SVIDEO,
369b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
370b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
371b285192aSMauro Carvalho Chehab 					CX25840_VIN8_CH1 |
372b285192aSMauro Carvalho Chehab 					CX25840_SVIDEO_ON,
373b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
374b285192aSMauro Carvalho Chehab 		} },
375b285192aSMauro Carvalho Chehab 	},
376b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1210] = {
377b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1210",
378b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
379b285192aSMauro Carvalho Chehab 	},
380b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_MYGICA_X8506] = {
381b285192aSMauro Carvalho Chehab 		.name		= "Mygica X8506 DMB-TH",
382b285192aSMauro Carvalho Chehab 		.tuner_type = TUNER_XC5000,
383b285192aSMauro Carvalho Chehab 		.tuner_addr = 0x61,
384b285192aSMauro Carvalho Chehab 		.tuner_bus	= 1,
385b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
386b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
387b285192aSMauro Carvalho Chehab 		.input		= {
388b285192aSMauro Carvalho Chehab 			{
389b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_TELEVISION,
390b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPOSITE2,
391b285192aSMauro Carvalho Chehab 			},
392b285192aSMauro Carvalho Chehab 			{
393b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_COMPOSITE1,
394b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPOSITE8,
395b285192aSMauro Carvalho Chehab 			},
396b285192aSMauro Carvalho Chehab 			{
397b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_SVIDEO,
398b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_SVIDEO_LUMA3 |
399b285192aSMauro Carvalho Chehab 						CX25840_SVIDEO_CHROMA4,
400b285192aSMauro Carvalho Chehab 			},
401b285192aSMauro Carvalho Chehab 			{
402b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_COMPONENT,
403b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPONENT_ON |
404b285192aSMauro Carvalho Chehab 					CX25840_VIN1_CH1 |
405b285192aSMauro Carvalho Chehab 					CX25840_VIN6_CH2 |
406b285192aSMauro Carvalho Chehab 					CX25840_VIN7_CH3,
407b285192aSMauro Carvalho Chehab 			},
408b285192aSMauro Carvalho Chehab 		},
409b285192aSMauro Carvalho Chehab 	},
410b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_MAGICPRO_PROHDTVE2] = {
411b285192aSMauro Carvalho Chehab 		.name		= "Magic-Pro ProHDTV Extreme 2",
412b285192aSMauro Carvalho Chehab 		.tuner_type = TUNER_XC5000,
413b285192aSMauro Carvalho Chehab 		.tuner_addr = 0x61,
414b285192aSMauro Carvalho Chehab 		.tuner_bus	= 1,
415b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
416b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
417b285192aSMauro Carvalho Chehab 		.input		= {
418b285192aSMauro Carvalho Chehab 			{
419b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_TELEVISION,
420b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPOSITE2,
421b285192aSMauro Carvalho Chehab 			},
422b285192aSMauro Carvalho Chehab 			{
423b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_COMPOSITE1,
424b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPOSITE8,
425b285192aSMauro Carvalho Chehab 			},
426b285192aSMauro Carvalho Chehab 			{
427b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_SVIDEO,
428b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_SVIDEO_LUMA3 |
429b285192aSMauro Carvalho Chehab 						CX25840_SVIDEO_CHROMA4,
430b285192aSMauro Carvalho Chehab 			},
431b285192aSMauro Carvalho Chehab 			{
432b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_COMPONENT,
433b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPONENT_ON |
434b285192aSMauro Carvalho Chehab 					CX25840_VIN1_CH1 |
435b285192aSMauro Carvalho Chehab 					CX25840_VIN6_CH2 |
436b285192aSMauro Carvalho Chehab 					CX25840_VIN7_CH3,
437b285192aSMauro Carvalho Chehab 			},
438b285192aSMauro Carvalho Chehab 		},
439b285192aSMauro Carvalho Chehab 	},
440b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1850] = {
441b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1850",
442b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
443b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_ENCODER,
444b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
445b285192aSMauro Carvalho Chehab 		.tuner_type	= TUNER_ABSENT,
446b285192aSMauro Carvalho Chehab 		.tuner_addr	= 0x42, /* 0x84 >> 1 */
447b285192aSMauro Carvalho Chehab 		.force_bff	= 1,
448b285192aSMauro Carvalho Chehab 		.input          = {{
449b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_TELEVISION,
450b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
451b285192aSMauro Carvalho Chehab 					CX25840_VIN5_CH2 |
452b285192aSMauro Carvalho Chehab 					CX25840_VIN2_CH1 |
453b285192aSMauro Carvalho Chehab 					CX25840_DIF_ON,
454b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO8,
455b285192aSMauro Carvalho Chehab 		}, {
456b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
457b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
458b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
459b285192aSMauro Carvalho Chehab 					CX25840_VIN6_CH1,
460b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
461b285192aSMauro Carvalho Chehab 		}, {
462b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_SVIDEO,
463b285192aSMauro Carvalho Chehab 			.vmux   =	CX25840_VIN7_CH3 |
464b285192aSMauro Carvalho Chehab 					CX25840_VIN4_CH2 |
465b285192aSMauro Carvalho Chehab 					CX25840_VIN8_CH1 |
466b285192aSMauro Carvalho Chehab 					CX25840_SVIDEO_ON,
467b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
468b285192aSMauro Carvalho Chehab 		} },
469b285192aSMauro Carvalho Chehab 	},
470b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_COMPRO_VIDEOMATE_E800] = {
471b285192aSMauro Carvalho Chehab 		.name		= "Compro VideoMate E800",
472b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
473b285192aSMauro Carvalho Chehab 	},
474b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_HAUPPAUGE_HVR1290] = {
475b285192aSMauro Carvalho Chehab 		.name		= "Hauppauge WinTV-HVR1290",
476b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
477b285192aSMauro Carvalho Chehab 	},
478b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_MYGICA_X8558PRO] = {
479b285192aSMauro Carvalho Chehab 		.name		= "Mygica X8558 PRO DMB-TH",
480b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
481b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
482b285192aSMauro Carvalho Chehab 	},
483b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_LEADTEK_WINFAST_PXTV1200] = {
484b285192aSMauro Carvalho Chehab 		.name           = "LEADTEK WinFast PxTV1200",
485b285192aSMauro Carvalho Chehab 		.porta          = CX23885_ANALOG_VIDEO,
486b285192aSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
487b285192aSMauro Carvalho Chehab 		.tuner_addr     = 0x61,
488b285192aSMauro Carvalho Chehab 		.tuner_bus	= 1,
489b285192aSMauro Carvalho Chehab 		.input          = {{
490b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_TELEVISION,
491b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_VIN2_CH1 |
492b285192aSMauro Carvalho Chehab 				  CX25840_VIN5_CH2 |
493b285192aSMauro Carvalho Chehab 				  CX25840_NONE0_CH3,
494b285192aSMauro Carvalho Chehab 		}, {
495b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
496b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_COMPOSITE1,
497b285192aSMauro Carvalho Chehab 		}, {
498b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_SVIDEO,
499b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_SVIDEO_LUMA3 |
500b285192aSMauro Carvalho Chehab 				  CX25840_SVIDEO_CHROMA4,
501b285192aSMauro Carvalho Chehab 		}, {
502b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPONENT,
503b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_VIN7_CH1 |
504b285192aSMauro Carvalho Chehab 				  CX25840_VIN6_CH2 |
505b285192aSMauro Carvalho Chehab 				  CX25840_VIN8_CH3 |
506b285192aSMauro Carvalho Chehab 				  CX25840_COMPONENT_ON,
507b285192aSMauro Carvalho Chehab 		} },
508b285192aSMauro Carvalho Chehab 	},
509b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_GOTVIEW_X5_3D_HYBRID] = {
510b285192aSMauro Carvalho Chehab 		.name		= "GoTView X5 3D Hybrid",
511b285192aSMauro Carvalho Chehab 		.tuner_type	= TUNER_XC5000,
512b285192aSMauro Carvalho Chehab 		.tuner_addr	= 0x64,
513b285192aSMauro Carvalho Chehab 		.tuner_bus	= 1,
514b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
515b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
516b285192aSMauro Carvalho Chehab 		.input          = {{
517b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_TELEVISION,
518b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_VIN2_CH1 |
519b285192aSMauro Carvalho Chehab 				  CX25840_VIN5_CH2,
520b285192aSMauro Carvalho Chehab 			.gpio0	= 0x02,
521b285192aSMauro Carvalho Chehab 		}, {
522b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
523b285192aSMauro Carvalho Chehab 			.vmux   = CX23885_VMUX_COMPOSITE1,
524b285192aSMauro Carvalho Chehab 		}, {
525b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_SVIDEO,
526b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_SVIDEO_LUMA3 |
527b285192aSMauro Carvalho Chehab 				  CX25840_SVIDEO_CHROMA4,
528b285192aSMauro Carvalho Chehab 		} },
529b285192aSMauro Carvalho Chehab 	},
530b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF] = {
531b285192aSMauro Carvalho Chehab 		.ci_type	= 2,
532b285192aSMauro Carvalho Chehab 		.name		= "NetUP Dual DVB-T/C-CI RF",
533b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
534b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
535b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
536b285192aSMauro Carvalho Chehab 		.num_fds_portb	= 2,
537b285192aSMauro Carvalho Chehab 		.num_fds_portc	= 2,
538b285192aSMauro Carvalho Chehab 		.tuner_type	= TUNER_XC5000,
539b285192aSMauro Carvalho Chehab 		.tuner_addr	= 0x64,
540b285192aSMauro Carvalho Chehab 		.input          = { {
541b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_TELEVISION,
542b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPOSITE1,
543b285192aSMauro Carvalho Chehab 		} },
544b285192aSMauro Carvalho Chehab 	},
545b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_MPX885] = {
546b285192aSMauro Carvalho Chehab 		.name		= "MPX-885",
547b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
548b285192aSMauro Carvalho Chehab 		.input          = {{
549b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE1,
550b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_COMPOSITE1,
551b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO6,
552b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
553b285192aSMauro Carvalho Chehab 		}, {
554b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE2,
555b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_COMPOSITE2,
556b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO6,
557b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
558b285192aSMauro Carvalho Chehab 		}, {
559b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE3,
560b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_COMPOSITE3,
561b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
562b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
563b285192aSMauro Carvalho Chehab 		}, {
564b285192aSMauro Carvalho Chehab 			.type   = CX23885_VMUX_COMPOSITE4,
565b285192aSMauro Carvalho Chehab 			.vmux   = CX25840_COMPOSITE4,
566b285192aSMauro Carvalho Chehab 			.amux   = CX25840_AUDIO7,
567b285192aSMauro Carvalho Chehab 			.gpio0  = 0,
568b285192aSMauro Carvalho Chehab 		} },
569b285192aSMauro Carvalho Chehab 	},
570b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_MYGICA_X8507] = {
5710d1b5265SMauro Carvalho Chehab 		.name		= "Mygica X8502/X8507 ISDB-T",
572b285192aSMauro Carvalho Chehab 		.tuner_type = TUNER_XC5000,
573b285192aSMauro Carvalho Chehab 		.tuner_addr = 0x61,
574b285192aSMauro Carvalho Chehab 		.tuner_bus	= 1,
575b285192aSMauro Carvalho Chehab 		.porta		= CX23885_ANALOG_VIDEO,
5760d1b5265SMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
577b285192aSMauro Carvalho Chehab 		.input		= {
578b285192aSMauro Carvalho Chehab 			{
579b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_TELEVISION,
580b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPOSITE2,
581b285192aSMauro Carvalho Chehab 				.amux   = CX25840_AUDIO8,
582b285192aSMauro Carvalho Chehab 			},
583b285192aSMauro Carvalho Chehab 			{
584b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_COMPOSITE1,
585b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPOSITE8,
586082c0576SAlfredo Jesús Delaiti 				.amux   = CX25840_AUDIO7,
587b285192aSMauro Carvalho Chehab 			},
588b285192aSMauro Carvalho Chehab 			{
589b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_SVIDEO,
590b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_SVIDEO_LUMA3 |
591b285192aSMauro Carvalho Chehab 						CX25840_SVIDEO_CHROMA4,
592082c0576SAlfredo Jesús Delaiti 				.amux   = CX25840_AUDIO7,
593b285192aSMauro Carvalho Chehab 			},
594b285192aSMauro Carvalho Chehab 			{
595b285192aSMauro Carvalho Chehab 				.type   = CX23885_VMUX_COMPONENT,
596b285192aSMauro Carvalho Chehab 				.vmux   = CX25840_COMPONENT_ON |
597b285192aSMauro Carvalho Chehab 					CX25840_VIN1_CH1 |
598b285192aSMauro Carvalho Chehab 					CX25840_VIN6_CH2 |
599b285192aSMauro Carvalho Chehab 					CX25840_VIN7_CH3,
600082c0576SAlfredo Jesús Delaiti 				.amux   = CX25840_AUDIO7,
601b285192aSMauro Carvalho Chehab 			},
602b285192aSMauro Carvalho Chehab 		},
603b285192aSMauro Carvalho Chehab 	},
604b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL] = {
605b285192aSMauro Carvalho Chehab 		.name		= "TerraTec Cinergy T PCIe Dual",
606b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
607b285192aSMauro Carvalho Chehab 		.portc		= CX23885_MPEG_DVB,
608b285192aSMauro Carvalho Chehab 	},
609b285192aSMauro Carvalho Chehab 	[CX23885_BOARD_TEVII_S471] = {
610b285192aSMauro Carvalho Chehab 		.name		= "TeVii S471",
611b285192aSMauro Carvalho Chehab 		.portb		= CX23885_MPEG_DVB,
612f667190bSMariusz Bia?o?czyk 	},
613f667190bSMariusz Bia?o?czyk 	[CX23885_BOARD_PROF_8000] = {
614f667190bSMariusz Bia?o?czyk 		.name		= "Prof Revolution DVB-S2 8000",
615f667190bSMariusz Bia?o?czyk 		.portb		= CX23885_MPEG_DVB,
6167c62f5a1SMichael Krufky 	},
6177c62f5a1SMichael Krufky 	[CX23885_BOARD_HAUPPAUGE_HVR4400] = {
618721f3223SMatthias Schwarzott 		.name		= "Hauppauge WinTV-HVR4400/HVR5500",
61936efec48SMatthias Schwarzott 		.porta		= CX23885_ANALOG_VIDEO,
6207c62f5a1SMichael Krufky 		.portb		= CX23885_MPEG_DVB,
62136efec48SMatthias Schwarzott 		.portc		= CX23885_MPEG_DVB,
62236efec48SMatthias Schwarzott 		.tuner_type	= TUNER_NXP_TDA18271,
62336efec48SMatthias Schwarzott 		.tuner_addr	= 0x60, /* 0xc0 >> 1 */
62436efec48SMatthias Schwarzott 		.tuner_bus	= 1,
6257c62f5a1SMichael Krufky 	},
626721f3223SMatthias Schwarzott 	[CX23885_BOARD_HAUPPAUGE_STARBURST] = {
627721f3223SMatthias Schwarzott 		.name		= "Hauppauge WinTV Starburst",
628721f3223SMatthias Schwarzott 		.portb		= CX23885_MPEG_DVB,
629721f3223SMatthias Schwarzott 	},
630e8d42373SOleh Kravchenko 	[CX23885_BOARD_AVERMEDIA_HC81R] = {
631e8d42373SOleh Kravchenko 		.name		= "AVerTV Hybrid Express Slim HC81R",
632e8d42373SOleh Kravchenko 		.tuner_type	= TUNER_XC2028,
633e8d42373SOleh Kravchenko 		.tuner_addr	= 0x61, /* 0xc2 >> 1 */
634e8d42373SOleh Kravchenko 		.tuner_bus	= 1,
635e8d42373SOleh Kravchenko 		.porta		= CX23885_ANALOG_VIDEO,
636e8d42373SOleh Kravchenko 		.input          = {{
637e8d42373SOleh Kravchenko 			.type   = CX23885_VMUX_TELEVISION,
638e8d42373SOleh Kravchenko 			.vmux   = CX25840_VIN2_CH1 |
639e8d42373SOleh Kravchenko 				  CX25840_VIN5_CH2 |
640e8d42373SOleh Kravchenko 				  CX25840_NONE0_CH3 |
641e8d42373SOleh Kravchenko 				  CX25840_NONE1_CH3,
642e8d42373SOleh Kravchenko 			.amux   = CX25840_AUDIO8,
643e8d42373SOleh Kravchenko 		}, {
644e8d42373SOleh Kravchenko 			.type   = CX23885_VMUX_SVIDEO,
645e8d42373SOleh Kravchenko 			.vmux   = CX25840_VIN8_CH1 |
646e8d42373SOleh Kravchenko 				  CX25840_NONE_CH2 |
647e8d42373SOleh Kravchenko 				  CX25840_VIN7_CH3 |
648e8d42373SOleh Kravchenko 				  CX25840_SVIDEO_ON,
649e8d42373SOleh Kravchenko 			.amux   = CX25840_AUDIO6,
650e8d42373SOleh Kravchenko 		}, {
651e8d42373SOleh Kravchenko 			.type   = CX23885_VMUX_COMPONENT,
652e8d42373SOleh Kravchenko 			.vmux   = CX25840_VIN1_CH1 |
653e8d42373SOleh Kravchenko 				  CX25840_NONE_CH2 |
654e8d42373SOleh Kravchenko 				  CX25840_NONE0_CH3 |
655e8d42373SOleh Kravchenko 				  CX25840_NONE1_CH3,
656e8d42373SOleh Kravchenko 			.amux   = CX25840_AUDIO6,
657e8d42373SOleh Kravchenko 		} },
658cce11b09SHans Verkuil 	},
65946b21bbaSJames Harper 	[CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2] = {
66046b21bbaSJames Harper 		.name		= "DViCO FusionHDTV DVB-T Dual Express2",
66146b21bbaSJames Harper 		.portb		= CX23885_MPEG_DVB,
66246b21bbaSJames Harper 		.portc		= CX23885_MPEG_DVB,
66346b21bbaSJames Harper 	},
664cce11b09SHans Verkuil 	[CX23885_BOARD_HAUPPAUGE_IMPACTVCBE] = {
665cce11b09SHans Verkuil 		.name		= "Hauppauge ImpactVCB-e",
666cce11b09SHans Verkuil 		.tuner_type	= TUNER_ABSENT,
667cce11b09SHans Verkuil 		.porta		= CX23885_ANALOG_VIDEO,
668cce11b09SHans Verkuil 		.input          = {{
669cce11b09SHans Verkuil 			.type   = CX23885_VMUX_COMPOSITE1,
670cce11b09SHans Verkuil 			.vmux   = CX25840_VIN7_CH3 |
671cce11b09SHans Verkuil 				  CX25840_VIN4_CH2 |
672cce11b09SHans Verkuil 				  CX25840_VIN6_CH1,
673cce11b09SHans Verkuil 			.amux   = CX25840_AUDIO7,
674cce11b09SHans Verkuil 		}, {
675cce11b09SHans Verkuil 			.type   = CX23885_VMUX_SVIDEO,
676cce11b09SHans Verkuil 			.vmux   = CX25840_VIN7_CH3 |
677cce11b09SHans Verkuil 				  CX25840_VIN4_CH2 |
678cce11b09SHans Verkuil 				  CX25840_VIN8_CH1 |
679cce11b09SHans Verkuil 				  CX25840_SVIDEO_ON,
680cce11b09SHans Verkuil 			.amux   = CX25840_AUDIO7,
681cce11b09SHans Verkuil 		} },
682cce11b09SHans Verkuil 	},
68329442266SOlli Salonen 	[CX23885_BOARD_DVBSKY_T9580] = {
68429442266SOlli Salonen 		.name		= "DVBSky T9580",
68529442266SOlli Salonen 		.portb		= CX23885_MPEG_DVB,
68629442266SOlli Salonen 		.portc		= CX23885_MPEG_DVB,
68729442266SOlli Salonen 	},
68882c10276SOlli Salonen 	[CX23885_BOARD_DVBSKY_T980C] = {
68982c10276SOlli Salonen 		.name		= "DVBSky T980C",
69082c10276SOlli Salonen 		.portb		= CX23885_MPEG_DVB,
69182c10276SOlli Salonen 	},
6920e6c7b01Snibble.max 	[CX23885_BOARD_DVBSKY_S950C] = {
6930e6c7b01Snibble.max 		.name		= "DVBSky S950C",
6940e6c7b01Snibble.max 		.portb		= CX23885_MPEG_DVB,
6950e6c7b01Snibble.max 	},
69661b103e8SOlli Salonen 	[CX23885_BOARD_TT_CT2_4500_CI] = {
69761b103e8SOlli Salonen 		.name		= "Technotrend TT-budget CT2-4500 CI",
69861b103e8SOlli Salonen 		.portb		= CX23885_MPEG_DVB,
69961b103e8SOlli Salonen 	},
700cba5480cSnibble.max 	[CX23885_BOARD_DVBSKY_S950] = {
701cba5480cSnibble.max 		.name		= "DVBSky S950",
702cba5480cSnibble.max 		.portb		= CX23885_MPEG_DVB,
703cba5480cSnibble.max 	},
704c29d6a83Snibble.max 	[CX23885_BOARD_DVBSKY_S952] = {
705c29d6a83Snibble.max 		.name		= "DVBSky S952",
706c29d6a83Snibble.max 		.portb		= CX23885_MPEG_DVB,
707c29d6a83Snibble.max 		.portc		= CX23885_MPEG_DVB,
708c29d6a83Snibble.max 	},
709c02ef64aSNibble Max 	[CX23885_BOARD_DVBSKY_T982] = {
710c02ef64aSNibble Max 		.name		= "DVBSky T982",
711c02ef64aSNibble Max 		.portb		= CX23885_MPEG_DVB,
712c02ef64aSNibble Max 		.portc		= CX23885_MPEG_DVB,
713c02ef64aSNibble Max 	},
7141fc77d01SAntti Palosaari 	[CX23885_BOARD_HAUPPAUGE_HVR5525] = {
7151fc77d01SAntti Palosaari 		.name		= "Hauppauge WinTV-HVR5525",
7161fc77d01SAntti Palosaari 		.portb		= CX23885_MPEG_DVB,
7171fc77d01SAntti Palosaari 		.portc		= CX23885_MPEG_DVB,
7181fc77d01SAntti Palosaari 	},
7196c43a217SHans Verkuil 	[CX23885_BOARD_VIEWCAST_260E] = {
7206c43a217SHans Verkuil 		.name		= "ViewCast 260e",
7216c43a217SHans Verkuil 		.porta		= CX23885_ANALOG_VIDEO,
7226c43a217SHans Verkuil 		.force_bff	= 1,
7236c43a217SHans Verkuil 		.input          = {{
7246c43a217SHans Verkuil 			.type   = CX23885_VMUX_COMPOSITE1,
7256c43a217SHans Verkuil 			.vmux   = CX25840_VIN6_CH1,
7266c43a217SHans Verkuil 			.amux   = CX25840_AUDIO7,
7276c43a217SHans Verkuil 		}, {
7286c43a217SHans Verkuil 			.type   = CX23885_VMUX_SVIDEO,
7296c43a217SHans Verkuil 			.vmux   = CX25840_VIN7_CH3 |
7306c43a217SHans Verkuil 					CX25840_VIN5_CH1 |
7316c43a217SHans Verkuil 					CX25840_SVIDEO_ON,
7326c43a217SHans Verkuil 			.amux   = CX25840_AUDIO7,
7336c43a217SHans Verkuil 		}, {
7346c43a217SHans Verkuil 			.type   = CX23885_VMUX_COMPONENT,
7356c43a217SHans Verkuil 			.vmux   = CX25840_VIN7_CH3 |
7366c43a217SHans Verkuil 					CX25840_VIN6_CH2 |
7376c43a217SHans Verkuil 					CX25840_VIN5_CH1 |
7386c43a217SHans Verkuil 					CX25840_COMPONENT_ON,
7396c43a217SHans Verkuil 			.amux   = CX25840_AUDIO7,
7406c43a217SHans Verkuil 		} },
7416c43a217SHans Verkuil 	},
7426c43a217SHans Verkuil 	[CX23885_BOARD_VIEWCAST_460E] = {
7436c43a217SHans Verkuil 		.name		= "ViewCast 460e",
7446c43a217SHans Verkuil 		.porta		= CX23885_ANALOG_VIDEO,
7456c43a217SHans Verkuil 		.force_bff	= 1,
7466c43a217SHans Verkuil 		.input          = {{
7476c43a217SHans Verkuil 			.type   = CX23885_VMUX_COMPOSITE1,
7486c43a217SHans Verkuil 			.vmux   = CX25840_VIN4_CH1,
7496c43a217SHans Verkuil 			.amux   = CX25840_AUDIO7,
7506c43a217SHans Verkuil 		}, {
7516c43a217SHans Verkuil 			.type   = CX23885_VMUX_SVIDEO,
7526c43a217SHans Verkuil 			.vmux   = CX25840_VIN7_CH3 |
7536c43a217SHans Verkuil 					CX25840_VIN6_CH1 |
7546c43a217SHans Verkuil 					CX25840_SVIDEO_ON,
7556c43a217SHans Verkuil 			.amux   = CX25840_AUDIO7,
7566c43a217SHans Verkuil 		}, {
7576c43a217SHans Verkuil 			.type   = CX23885_VMUX_COMPONENT,
7586c43a217SHans Verkuil 			.vmux   = CX25840_VIN7_CH3 |
7596c43a217SHans Verkuil 					CX25840_VIN6_CH1 |
7606c43a217SHans Verkuil 					CX25840_VIN5_CH2 |
7616c43a217SHans Verkuil 					CX25840_COMPONENT_ON,
7626c43a217SHans Verkuil 			.amux   = CX25840_AUDIO7,
7636c43a217SHans Verkuil 		}, {
7646c43a217SHans Verkuil 			.type   = CX23885_VMUX_COMPOSITE2,
7656c43a217SHans Verkuil 			.vmux   = CX25840_VIN6_CH1,
7666c43a217SHans Verkuil 			.amux   = CX25840_AUDIO7,
7676c43a217SHans Verkuil 		} },
7686c43a217SHans Verkuil 	},
76910a5210eSStephen Backway 	[CX23885_BOARD_HAUPPAUGE_QUADHD_DVB] = {
77010a5210eSStephen Backway 		.name        = "Hauppauge WinTV-QuadHD-DVB",
77110a5210eSStephen Backway 		.portb        = CX23885_MPEG_DVB,
77210a5210eSStephen Backway 		.portc        = CX23885_MPEG_DVB,
77310a5210eSStephen Backway 	},
774dd9ad4fbSStephen Backway 	[CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC] = {
775dd9ad4fbSStephen Backway 		.name        = "Hauppauge WinTV-QuadHD-ATSC",
776dd9ad4fbSStephen Backway 		.portb        = CX23885_MPEG_DVB,
777dd9ad4fbSStephen Backway 		.portc        = CX23885_MPEG_DVB,
778dd9ad4fbSStephen Backway 	},
779b285192aSMauro Carvalho Chehab };
780b285192aSMauro Carvalho Chehab const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards);
781b285192aSMauro Carvalho Chehab 
782b285192aSMauro Carvalho Chehab /* ------------------------------------------------------------------ */
783b285192aSMauro Carvalho Chehab /* PCI subsystem IDs                                                  */
784b285192aSMauro Carvalho Chehab 
785b285192aSMauro Carvalho Chehab struct cx23885_subid cx23885_subids[] = {
786b285192aSMauro Carvalho Chehab 	{
787b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
788b285192aSMauro Carvalho Chehab 		.subdevice = 0x3400,
789b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_UNKNOWN,
790b285192aSMauro Carvalho Chehab 	}, {
791b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
792b285192aSMauro Carvalho Chehab 		.subdevice = 0x7600,
793b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800lp,
794b285192aSMauro Carvalho Chehab 	}, {
795b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
796b285192aSMauro Carvalho Chehab 		.subdevice = 0x7800,
797b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
798b285192aSMauro Carvalho Chehab 	}, {
799b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
800b285192aSMauro Carvalho Chehab 		.subdevice = 0x7801,
801b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
802b285192aSMauro Carvalho Chehab 	}, {
803b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
804b285192aSMauro Carvalho Chehab 		.subdevice = 0x7809,
805b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
806b285192aSMauro Carvalho Chehab 	}, {
807b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
808b285192aSMauro Carvalho Chehab 		.subdevice = 0x7911,
809b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1250,
810b285192aSMauro Carvalho Chehab 	}, {
811b285192aSMauro Carvalho Chehab 		.subvendor = 0x18ac,
812b285192aSMauro Carvalho Chehab 		.subdevice = 0xd500,
813b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP,
814b285192aSMauro Carvalho Chehab 	}, {
815b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
816b285192aSMauro Carvalho Chehab 		.subdevice = 0x7790,
817b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1500Q,
818b285192aSMauro Carvalho Chehab 	}, {
819b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
820b285192aSMauro Carvalho Chehab 		.subdevice = 0x7797,
821b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1500Q,
822b285192aSMauro Carvalho Chehab 	}, {
823b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
824b285192aSMauro Carvalho Chehab 		.subdevice = 0x7710,
825b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1500,
826b285192aSMauro Carvalho Chehab 	}, {
827b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
828b285192aSMauro Carvalho Chehab 		.subdevice = 0x7717,
829b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1500,
830b285192aSMauro Carvalho Chehab 	}, {
831b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
832b285192aSMauro Carvalho Chehab 		.subdevice = 0x71d1,
833b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1200,
834b285192aSMauro Carvalho Chehab 	}, {
835b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
836b285192aSMauro Carvalho Chehab 		.subdevice = 0x71d3,
837b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1200,
838b285192aSMauro Carvalho Chehab 	}, {
839b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
840b285192aSMauro Carvalho Chehab 		.subdevice = 0x8101,
841b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1700,
842b285192aSMauro Carvalho Chehab 	}, {
843b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
844b285192aSMauro Carvalho Chehab 		.subdevice = 0x8010,
845b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1400,
846b285192aSMauro Carvalho Chehab 	}, {
847b285192aSMauro Carvalho Chehab 		.subvendor = 0x18ac,
848b285192aSMauro Carvalho Chehab 		.subdevice = 0xd618,
849b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP,
850b285192aSMauro Carvalho Chehab 	}, {
851b285192aSMauro Carvalho Chehab 		.subvendor = 0x18ac,
852b285192aSMauro Carvalho Chehab 		.subdevice = 0xdb78,
853b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP,
854b285192aSMauro Carvalho Chehab 	}, {
855b285192aSMauro Carvalho Chehab 		.subvendor = 0x107d,
856b285192aSMauro Carvalho Chehab 		.subdevice = 0x6681,
857b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H,
858b285192aSMauro Carvalho Chehab 	}, {
859b285192aSMauro Carvalho Chehab 		.subvendor = 0x107d,
860642ca1a0SAnca Emanuel 		.subdevice = 0x6f21,
861642ca1a0SAnca Emanuel 		.card      = CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200,
862642ca1a0SAnca Emanuel 	}, {
863642ca1a0SAnca Emanuel 		.subvendor = 0x107d,
864b285192aSMauro Carvalho Chehab 		.subdevice = 0x6f39,
865b285192aSMauro Carvalho Chehab 		.card	   = CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000,
866b285192aSMauro Carvalho Chehab 	}, {
867b285192aSMauro Carvalho Chehab 		.subvendor = 0x185b,
868b285192aSMauro Carvalho Chehab 		.subdevice = 0xe800,
869b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_COMPRO_VIDEOMATE_E650F,
870b285192aSMauro Carvalho Chehab 	}, {
871b285192aSMauro Carvalho Chehab 		.subvendor = 0x6920,
872b285192aSMauro Carvalho Chehab 		.subdevice = 0x8888,
873b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_TBS_6920,
874b285192aSMauro Carvalho Chehab 	}, {
875e6001482SLuis Alves 		.subvendor = 0x6980,
876e6001482SLuis Alves 		.subdevice = 0x8888,
877e6001482SLuis Alves 		.card      = CX23885_BOARD_TBS_6980,
878e6001482SLuis Alves 	}, {
879e6001482SLuis Alves 		.subvendor = 0x6981,
880e6001482SLuis Alves 		.subdevice = 0x8888,
881e6001482SLuis Alves 		.card      = CX23885_BOARD_TBS_6981,
882e6001482SLuis Alves 	}, {
883b285192aSMauro Carvalho Chehab 		.subvendor = 0xd470,
884b285192aSMauro Carvalho Chehab 		.subdevice = 0x9022,
885b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_TEVII_S470,
886b285192aSMauro Carvalho Chehab 	}, {
887b285192aSMauro Carvalho Chehab 		.subvendor = 0x0001,
888b285192aSMauro Carvalho Chehab 		.subdevice = 0x2005,
889b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_DVBWORLD_2005,
890b285192aSMauro Carvalho Chehab 	}, {
891b285192aSMauro Carvalho Chehab 		.subvendor = 0x1b55,
892b285192aSMauro Carvalho Chehab 		.subdevice = 0x2a2c,
893b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_NETUP_DUAL_DVBS2_CI,
894b285192aSMauro Carvalho Chehab 	}, {
895b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
896b285192aSMauro Carvalho Chehab 		.subdevice = 0x2211,
897b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1270,
898b285192aSMauro Carvalho Chehab 	}, {
899b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
900b285192aSMauro Carvalho Chehab 		.subdevice = 0x2215,
901b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1275,
902b285192aSMauro Carvalho Chehab 	}, {
903b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
904b285192aSMauro Carvalho Chehab 		.subdevice = 0x221d,
905b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1275,
906b285192aSMauro Carvalho Chehab 	}, {
907b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
908b285192aSMauro Carvalho Chehab 		.subdevice = 0x2251,
909b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1255,
910b285192aSMauro Carvalho Chehab 	}, {
911b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
912b285192aSMauro Carvalho Chehab 		.subdevice = 0x2259,
913b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1255_22111,
914b285192aSMauro Carvalho Chehab 	}, {
915b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
916b285192aSMauro Carvalho Chehab 		.subdevice = 0x2291,
917b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
918b285192aSMauro Carvalho Chehab 	}, {
919b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
920b285192aSMauro Carvalho Chehab 		.subdevice = 0x2295,
921b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
922b285192aSMauro Carvalho Chehab 	}, {
923b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
924b285192aSMauro Carvalho Chehab 		.subdevice = 0x2299,
925b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
926b285192aSMauro Carvalho Chehab 	}, {
927b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
928b285192aSMauro Carvalho Chehab 		.subdevice = 0x229d,
929b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
930b285192aSMauro Carvalho Chehab 	}, {
931b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
932b285192aSMauro Carvalho Chehab 		.subdevice = 0x22f0,
933b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
934b285192aSMauro Carvalho Chehab 	}, {
935b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
936b285192aSMauro Carvalho Chehab 		.subdevice = 0x22f1,
937b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1255,
938b285192aSMauro Carvalho Chehab 	}, {
939b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
940b285192aSMauro Carvalho Chehab 		.subdevice = 0x22f2,
941b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1275,
942b285192aSMauro Carvalho Chehab 	}, {
943b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
944b285192aSMauro Carvalho Chehab 		.subdevice = 0x22f3,
945b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
946b285192aSMauro Carvalho Chehab 	}, {
947b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
948b285192aSMauro Carvalho Chehab 		.subdevice = 0x22f4,
949b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
950b285192aSMauro Carvalho Chehab 	}, {
951b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
952b285192aSMauro Carvalho Chehab 		.subdevice = 0x22f5,
953b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
954b285192aSMauro Carvalho Chehab 	}, {
955b285192aSMauro Carvalho Chehab 		.subvendor = 0x14f1,
956b285192aSMauro Carvalho Chehab 		.subdevice = 0x8651,
957b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_MYGICA_X8506,
958b285192aSMauro Carvalho Chehab 	}, {
959b285192aSMauro Carvalho Chehab 		.subvendor = 0x14f1,
960b285192aSMauro Carvalho Chehab 		.subdevice = 0x8657,
961b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_MAGICPRO_PROHDTVE2,
962b285192aSMauro Carvalho Chehab 	}, {
963b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
964b285192aSMauro Carvalho Chehab 		.subdevice = 0x8541,
965b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1850,
966b285192aSMauro Carvalho Chehab 	}, {
967b285192aSMauro Carvalho Chehab 		.subvendor = 0x1858,
968b285192aSMauro Carvalho Chehab 		.subdevice = 0xe800,
969b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_COMPRO_VIDEOMATE_E800,
970b285192aSMauro Carvalho Chehab 	}, {
971b285192aSMauro Carvalho Chehab 		.subvendor = 0x0070,
972b285192aSMauro Carvalho Chehab 		.subdevice = 0x8551,
973b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_HAUPPAUGE_HVR1290,
974b285192aSMauro Carvalho Chehab 	}, {
975b285192aSMauro Carvalho Chehab 		.subvendor = 0x14f1,
976b285192aSMauro Carvalho Chehab 		.subdevice = 0x8578,
977b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_MYGICA_X8558PRO,
978b285192aSMauro Carvalho Chehab 	}, {
979b285192aSMauro Carvalho Chehab 		.subvendor = 0x107d,
980b285192aSMauro Carvalho Chehab 		.subdevice = 0x6f22,
981b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_LEADTEK_WINFAST_PXTV1200,
982b285192aSMauro Carvalho Chehab 	}, {
983b285192aSMauro Carvalho Chehab 		.subvendor = 0x5654,
984b285192aSMauro Carvalho Chehab 		.subdevice = 0x2390,
985b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_GOTVIEW_X5_3D_HYBRID,
986b285192aSMauro Carvalho Chehab 	}, {
987b285192aSMauro Carvalho Chehab 		.subvendor = 0x1b55,
988b285192aSMauro Carvalho Chehab 		.subdevice = 0xe2e4,
989b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF,
990b285192aSMauro Carvalho Chehab 	}, {
991b285192aSMauro Carvalho Chehab 		.subvendor = 0x14f1,
992b285192aSMauro Carvalho Chehab 		.subdevice = 0x8502,
993b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_MYGICA_X8507,
994b285192aSMauro Carvalho Chehab 	}, {
995b285192aSMauro Carvalho Chehab 		.subvendor = 0x153b,
996b285192aSMauro Carvalho Chehab 		.subdevice = 0x117e,
997b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL,
998b285192aSMauro Carvalho Chehab 	}, {
999b285192aSMauro Carvalho Chehab 		.subvendor = 0xd471,
1000b285192aSMauro Carvalho Chehab 		.subdevice = 0x9022,
1001b285192aSMauro Carvalho Chehab 		.card      = CX23885_BOARD_TEVII_S471,
1002f667190bSMariusz Bia?o?czyk 	}, {
1003f667190bSMariusz Bia?o?czyk 		.subvendor = 0x8000,
1004f667190bSMariusz Bia?o?czyk 		.subdevice = 0x3034,
1005f667190bSMariusz Bia?o?czyk 		.card      = CX23885_BOARD_PROF_8000,
10067c62f5a1SMichael Krufky 	}, {
10077c62f5a1SMichael Krufky 		.subvendor = 0x0070,
10087c62f5a1SMichael Krufky 		.subdevice = 0xc108,
1009721f3223SMatthias Schwarzott 		.card      = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-4400 (Model 121xxx, Hybrid DVB-T/S2, IR) */
10107c62f5a1SMichael Krufky 	}, {
10117c62f5a1SMichael Krufky 		.subvendor = 0x0070,
10127c62f5a1SMichael Krufky 		.subdevice = 0xc138,
1013721f3223SMatthias Schwarzott 		.card      = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */
10147c62f5a1SMichael Krufky 	}, {
10157c62f5a1SMichael Krufky 		.subvendor = 0x0070,
10167c62f5a1SMichael Krufky 		.subdevice = 0xc12a,
1017721f3223SMatthias Schwarzott 		.card      = CX23885_BOARD_HAUPPAUGE_STARBURST, /* Hauppauge WinTV Starburst (Model 121x00, DVB-S2, IR) */
10187c62f5a1SMichael Krufky 	}, {
10197c62f5a1SMichael Krufky 		.subvendor = 0x0070,
10207c62f5a1SMichael Krufky 		.subdevice = 0xc1f8,
1021721f3223SMatthias Schwarzott 		.card      = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */
1022e8d42373SOleh Kravchenko 	}, {
1023e8d42373SOleh Kravchenko 		.subvendor = 0x1461,
1024e8d42373SOleh Kravchenko 		.subdevice = 0xd939,
1025e8d42373SOleh Kravchenko 		.card      = CX23885_BOARD_AVERMEDIA_HC81R,
1026cce11b09SHans Verkuil 	}, {
1027cce11b09SHans Verkuil 		.subvendor = 0x0070,
1028cce11b09SHans Verkuil 		.subdevice = 0x7133,
1029cce11b09SHans Verkuil 		.card      = CX23885_BOARD_HAUPPAUGE_IMPACTVCBE,
103046b21bbaSJames Harper 	}, {
103146b21bbaSJames Harper 		.subvendor = 0x18ac,
103246b21bbaSJames Harper 		.subdevice = 0xdb98,
103346b21bbaSJames Harper 		.card      = CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2,
103429442266SOlli Salonen 	}, {
103529442266SOlli Salonen 		.subvendor = 0x4254,
103629442266SOlli Salonen 		.subdevice = 0x9580,
103729442266SOlli Salonen 		.card      = CX23885_BOARD_DVBSKY_T9580,
103882c10276SOlli Salonen 	}, {
103982c10276SOlli Salonen 		.subvendor = 0x4254,
104082c10276SOlli Salonen 		.subdevice = 0x980c,
104182c10276SOlli Salonen 		.card      = CX23885_BOARD_DVBSKY_T980C,
10420e6c7b01Snibble.max 	}, {
10430e6c7b01Snibble.max 		.subvendor = 0x4254,
10440e6c7b01Snibble.max 		.subdevice = 0x950c,
10450e6c7b01Snibble.max 		.card      = CX23885_BOARD_DVBSKY_S950C,
104661b103e8SOlli Salonen 	}, {
104761b103e8SOlli Salonen 		.subvendor = 0x13c2,
104861b103e8SOlli Salonen 		.subdevice = 0x3013,
104961b103e8SOlli Salonen 		.card      = CX23885_BOARD_TT_CT2_4500_CI,
1050cba5480cSnibble.max 	}, {
1051cba5480cSnibble.max 		.subvendor = 0x4254,
1052cba5480cSnibble.max 		.subdevice = 0x0950,
1053cba5480cSnibble.max 		.card      = CX23885_BOARD_DVBSKY_S950,
1054c29d6a83Snibble.max 	}, {
1055c29d6a83Snibble.max 		.subvendor = 0x4254,
1056c29d6a83Snibble.max 		.subdevice = 0x0952,
1057c29d6a83Snibble.max 		.card      = CX23885_BOARD_DVBSKY_S952,
1058c02ef64aSNibble Max 	}, {
1059c02ef64aSNibble Max 		.subvendor = 0x4254,
1060c02ef64aSNibble Max 		.subdevice = 0x0982,
1061c02ef64aSNibble Max 		.card      = CX23885_BOARD_DVBSKY_T982,
10621fc77d01SAntti Palosaari 	}, {
10631fc77d01SAntti Palosaari 		.subvendor = 0x0070,
10641fc77d01SAntti Palosaari 		.subdevice = 0xf038,
10651fc77d01SAntti Palosaari 		.card      = CX23885_BOARD_HAUPPAUGE_HVR5525,
10666c43a217SHans Verkuil 	}, {
10676c43a217SHans Verkuil 		.subvendor = 0x1576,
10686c43a217SHans Verkuil 		.subdevice = 0x0260,
10696c43a217SHans Verkuil 		.card      = CX23885_BOARD_VIEWCAST_260E,
10706c43a217SHans Verkuil 	}, {
10716c43a217SHans Verkuil 		.subvendor = 0x1576,
10726c43a217SHans Verkuil 		.subdevice = 0x0460,
10736c43a217SHans Verkuil 		.card      = CX23885_BOARD_VIEWCAST_460E,
107410a5210eSStephen Backway 	}, {
107510a5210eSStephen Backway 		.subvendor = 0x0070,
107610a5210eSStephen Backway 		.subdevice = 0x6a28,
107710a5210eSStephen Backway 		.card      = CX23885_BOARD_HAUPPAUGE_QUADHD_DVB, /* Tuner Pair 1 */
107810a5210eSStephen Backway 	}, {
107910a5210eSStephen Backway 		.subvendor = 0x0070,
108010a5210eSStephen Backway 		.subdevice = 0x6b28,
108110a5210eSStephen Backway 		.card      = CX23885_BOARD_HAUPPAUGE_QUADHD_DVB, /* Tuner Pair 2 */
1082dd9ad4fbSStephen Backway 	}, {
1083dd9ad4fbSStephen Backway 		.subvendor = 0x0070,
1084dd9ad4fbSStephen Backway 		.subdevice = 0x6a18,
1085dd9ad4fbSStephen Backway 		.card      = CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC, /* Tuner Pair 1 */
1086dd9ad4fbSStephen Backway 	}, {
1087dd9ad4fbSStephen Backway 		.subvendor = 0x0070,
1088dd9ad4fbSStephen Backway 		.subdevice = 0x6b18,
1089dd9ad4fbSStephen Backway 		.card      = CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC, /* Tuner Pair 2 */
1090b285192aSMauro Carvalho Chehab 	},
1091b285192aSMauro Carvalho Chehab };
1092b285192aSMauro Carvalho Chehab const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids);
1093b285192aSMauro Carvalho Chehab 
1094b285192aSMauro Carvalho Chehab void cx23885_card_list(struct cx23885_dev *dev)
1095b285192aSMauro Carvalho Chehab {
1096b285192aSMauro Carvalho Chehab 	int i;
1097b285192aSMauro Carvalho Chehab 
1098b285192aSMauro Carvalho Chehab 	if (0 == dev->pci->subsystem_vendor &&
1099b285192aSMauro Carvalho Chehab 	    0 == dev->pci->subsystem_device) {
1100e39682b5SMauro Carvalho Chehab 		pr_info("%s: Board has no valid PCIe Subsystem ID and can't\n"
1101b285192aSMauro Carvalho Chehab 			"%s: be autodetected. Pass card=<n> insmod option\n"
1102b285192aSMauro Carvalho Chehab 			"%s: to workaround that. Redirect complaints to the\n"
1103b285192aSMauro Carvalho Chehab 			"%s: vendor of the TV card.  Best regards,\n"
1104b285192aSMauro Carvalho Chehab 			"%s:         -- tux\n",
1105b285192aSMauro Carvalho Chehab 			dev->name, dev->name, dev->name, dev->name, dev->name);
1106b285192aSMauro Carvalho Chehab 	} else {
1107e39682b5SMauro Carvalho Chehab 		pr_info("%s: Your board isn't known (yet) to the driver.\n"
1108b285192aSMauro Carvalho Chehab 			"%s: Try to pick one of the existing card configs via\n"
1109b285192aSMauro Carvalho Chehab 			"%s: card=<n> insmod option.  Updating to the latest\n"
1110b285192aSMauro Carvalho Chehab 			"%s: version might help as well.\n",
1111b285192aSMauro Carvalho Chehab 			dev->name, dev->name, dev->name, dev->name);
1112b285192aSMauro Carvalho Chehab 	}
1113e39682b5SMauro Carvalho Chehab 	pr_info("%s: Here is a list of valid choices for the card=<n> insmod option:\n",
1114b285192aSMauro Carvalho Chehab 	       dev->name);
1115b285192aSMauro Carvalho Chehab 	for (i = 0; i < cx23885_bcount; i++)
1116e39682b5SMauro Carvalho Chehab 		pr_info("%s:    card=%d -> %s\n",
1117b285192aSMauro Carvalho Chehab 			dev->name, i, cx23885_boards[i].name);
1118b285192aSMauro Carvalho Chehab }
1119b285192aSMauro Carvalho Chehab 
11206c43a217SHans Verkuil static void viewcast_eeprom(struct cx23885_dev *dev, u8 *eeprom_data)
11216c43a217SHans Verkuil {
11226c43a217SHans Verkuil 	u32 sn;
11236c43a217SHans Verkuil 
11246c43a217SHans Verkuil 	/* The serial number record begins with tag 0x59 */
11256c43a217SHans Verkuil 	if (*(eeprom_data + 0x00) != 0x59) {
11266c43a217SHans Verkuil 		pr_info("%s() eeprom records are undefined, no serial number\n",
11276c43a217SHans Verkuil 			__func__);
11286c43a217SHans Verkuil 		return;
11296c43a217SHans Verkuil 	}
11306c43a217SHans Verkuil 
11316c43a217SHans Verkuil 	sn =	(*(eeprom_data + 0x06) << 24) |
11326c43a217SHans Verkuil 		(*(eeprom_data + 0x05) << 16) |
11336c43a217SHans Verkuil 		(*(eeprom_data + 0x04) << 8) |
11346c43a217SHans Verkuil 		(*(eeprom_data + 0x03));
11356c43a217SHans Verkuil 
11366c43a217SHans Verkuil 	pr_info("%s: card '%s' sn# MM%d\n",
11376c43a217SHans Verkuil 		dev->name,
11386c43a217SHans Verkuil 		cx23885_boards[dev->board].name,
11396c43a217SHans Verkuil 		sn);
11406c43a217SHans Verkuil }
11416c43a217SHans Verkuil 
1142b285192aSMauro Carvalho Chehab static void hauppauge_eeprom(struct cx23885_dev *dev, u8 *eeprom_data)
1143b285192aSMauro Carvalho Chehab {
1144b285192aSMauro Carvalho Chehab 	struct tveeprom tv;
1145b285192aSMauro Carvalho Chehab 
1146446aba66SMauro Carvalho Chehab 	tveeprom_hauppauge_analog(&tv, eeprom_data);
1147b285192aSMauro Carvalho Chehab 
1148b285192aSMauro Carvalho Chehab 	/* Make sure we support the board model */
1149b285192aSMauro Carvalho Chehab 	switch (tv.model) {
1150b285192aSMauro Carvalho Chehab 	case 22001:
1151b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1270 (PCIe, Retail, half height)
1152b285192aSMauro Carvalho Chehab 		 * ATSC/QAM and basic analog, IR Blast */
1153b285192aSMauro Carvalho Chehab 	case 22009:
1154b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1210 (PCIe, Retail, half height)
1155b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog, IR Blast */
1156b285192aSMauro Carvalho Chehab 	case 22011:
1157b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1270 (PCIe, Retail, half height)
1158b285192aSMauro Carvalho Chehab 		 * ATSC/QAM and basic analog, IR Recv */
1159b285192aSMauro Carvalho Chehab 	case 22019:
1160b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1210 (PCIe, Retail, half height)
1161b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog, IR Recv */
1162b285192aSMauro Carvalho Chehab 	case 22021:
1163b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1275 (PCIe, Retail, half height)
1164b285192aSMauro Carvalho Chehab 		 * ATSC/QAM and basic analog, IR Recv */
1165b285192aSMauro Carvalho Chehab 	case 22029:
1166b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1210 (PCIe, Retail, half height)
1167b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog, IR Recv */
1168b285192aSMauro Carvalho Chehab 	case 22101:
1169b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1270 (PCIe, Retail, full height)
1170b285192aSMauro Carvalho Chehab 		 * ATSC/QAM and basic analog, IR Blast */
1171b285192aSMauro Carvalho Chehab 	case 22109:
1172b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1210 (PCIe, Retail, full height)
1173b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog, IR Blast */
1174b285192aSMauro Carvalho Chehab 	case 22111:
1175b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1270 (PCIe, Retail, full height)
1176b285192aSMauro Carvalho Chehab 		 * ATSC/QAM and basic analog, IR Recv */
1177b285192aSMauro Carvalho Chehab 	case 22119:
1178b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1210 (PCIe, Retail, full height)
1179b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog, IR Recv */
1180b285192aSMauro Carvalho Chehab 	case 22121:
1181b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1275 (PCIe, Retail, full height)
1182b285192aSMauro Carvalho Chehab 		 * ATSC/QAM and basic analog, IR Recv */
1183b285192aSMauro Carvalho Chehab 	case 22129:
1184b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1210 (PCIe, Retail, full height)
1185b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog, IR Recv */
1186b285192aSMauro Carvalho Chehab 	case 71009:
1187b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1200 (PCIe, Retail, full height)
1188b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog */
1189cce11b09SHans Verkuil 	case 71100:
1190cce11b09SHans Verkuil 		/* WinTV-ImpactVCB-e (PCIe, Retail, half height)
1191cce11b09SHans Verkuil 		 * Basic analog */
1192b285192aSMauro Carvalho Chehab 	case 71359:
1193b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1200 (PCIe, OEM, half height)
1194b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog */
1195b285192aSMauro Carvalho Chehab 	case 71439:
1196b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1200 (PCIe, OEM, half height)
1197b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog */
1198b285192aSMauro Carvalho Chehab 	case 71449:
1199b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1200 (PCIe, OEM, full height)
1200b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog */
1201b285192aSMauro Carvalho Chehab 	case 71939:
1202b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1200 (PCIe, OEM, half height)
1203b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog */
1204b285192aSMauro Carvalho Chehab 	case 71949:
1205b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1200 (PCIe, OEM, full height)
1206b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog */
1207b285192aSMauro Carvalho Chehab 	case 71959:
1208b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1200 (PCIe, OEM, full height)
1209b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog */
1210b285192aSMauro Carvalho Chehab 	case 71979:
1211b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1200 (PCIe, OEM, half height)
1212b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog */
1213b285192aSMauro Carvalho Chehab 	case 71999:
1214b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1200 (PCIe, OEM, full height)
1215b285192aSMauro Carvalho Chehab 		 * DVB-T and basic analog */
1216b285192aSMauro Carvalho Chehab 	case 76601:
1217b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1800lp (PCIe, Retail, No IR, Dual
1218b285192aSMauro Carvalho Chehab 			channel ATSC and MPEG2 HW Encoder */
1219b285192aSMauro Carvalho Chehab 	case 77001:
1220b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1500 (Express Card, OEM, No IR, ATSC
1221b285192aSMauro Carvalho Chehab 			and Basic analog */
1222b285192aSMauro Carvalho Chehab 	case 77011:
1223b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1500 (Express Card, Retail, No IR, ATSC
1224b285192aSMauro Carvalho Chehab 			and Basic analog */
1225b285192aSMauro Carvalho Chehab 	case 77041:
1226b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1500Q (Express Card, OEM, No IR, ATSC/QAM
1227b285192aSMauro Carvalho Chehab 			and Basic analog */
1228b285192aSMauro Carvalho Chehab 	case 77051:
1229b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1500Q (Express Card, Retail, No IR, ATSC/QAM
1230b285192aSMauro Carvalho Chehab 			and Basic analog */
1231b285192aSMauro Carvalho Chehab 	case 78011:
1232b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1800 (PCIe, Retail, 3.5mm in, IR, No FM,
1233b285192aSMauro Carvalho Chehab 			Dual channel ATSC and MPEG2 HW Encoder */
1234b285192aSMauro Carvalho Chehab 	case 78501:
1235b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
1236b285192aSMauro Carvalho Chehab 			Dual channel ATSC and MPEG2 HW Encoder */
1237b285192aSMauro Carvalho Chehab 	case 78521:
1238b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
1239b285192aSMauro Carvalho Chehab 			Dual channel ATSC and MPEG2 HW Encoder */
1240b285192aSMauro Carvalho Chehab 	case 78531:
1241b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, No FM,
1242b285192aSMauro Carvalho Chehab 			Dual channel ATSC and MPEG2 HW Encoder */
1243b285192aSMauro Carvalho Chehab 	case 78631:
1244b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1800 (PCIe, OEM, No IR, No FM,
1245b285192aSMauro Carvalho Chehab 			Dual channel ATSC and MPEG2 HW Encoder */
1246b285192aSMauro Carvalho Chehab 	case 79001:
1247b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1250 (PCIe, Retail, IR, full height,
1248b285192aSMauro Carvalho Chehab 			ATSC and Basic analog */
1249b285192aSMauro Carvalho Chehab 	case 79101:
1250b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1250 (PCIe, Retail, IR, half height,
1251b285192aSMauro Carvalho Chehab 			ATSC and Basic analog */
1252b285192aSMauro Carvalho Chehab 	case 79501:
1253b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1250 (PCIe, No IR, half height,
1254b285192aSMauro Carvalho Chehab 			ATSC [at least] and Basic analog) */
1255b285192aSMauro Carvalho Chehab 	case 79561:
1256b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
1257b285192aSMauro Carvalho Chehab 			ATSC and Basic analog */
1258b285192aSMauro Carvalho Chehab 	case 79571:
1259b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1250 (PCIe, OEM, No IR, full height,
1260b285192aSMauro Carvalho Chehab 		 ATSC and Basic analog */
1261b285192aSMauro Carvalho Chehab 	case 79671:
1262b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
1263b285192aSMauro Carvalho Chehab 			ATSC and Basic analog */
1264b285192aSMauro Carvalho Chehab 	case 80019:
1265b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1400 (Express Card, Retail, IR,
1266b285192aSMauro Carvalho Chehab 		 * DVB-T and Basic analog */
1267b285192aSMauro Carvalho Chehab 	case 81509:
1268b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1700 (PCIe, OEM, No IR, half height)
1269b285192aSMauro Carvalho Chehab 		 * DVB-T and MPEG2 HW Encoder */
1270b285192aSMauro Carvalho Chehab 	case 81519:
1271b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1700 (PCIe, OEM, No IR, full height)
1272b285192aSMauro Carvalho Chehab 		 * DVB-T and MPEG2 HW Encoder */
1273b285192aSMauro Carvalho Chehab 		break;
1274b285192aSMauro Carvalho Chehab 	case 85021:
1275b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1850 (PCIe, Retail, 3.5mm in, IR, FM,
1276b285192aSMauro Carvalho Chehab 			Dual channel ATSC and MPEG2 HW Encoder */
1277b285192aSMauro Carvalho Chehab 		break;
1278b285192aSMauro Carvalho Chehab 	case 85721:
1279b285192aSMauro Carvalho Chehab 		/* WinTV-HVR1290 (PCIe, OEM, RCA in, IR,
1280b285192aSMauro Carvalho Chehab 			Dual channel ATSC and Basic analog */
128182cf5f4fSMatthias Schwarzott 	case 121019:
128282cf5f4fSMatthias Schwarzott 		/* WinTV-HVR4400 (PCIe, DVB-S2, DVB-C/T) */
128382cf5f4fSMatthias Schwarzott 		break;
128482cf5f4fSMatthias Schwarzott 	case 121029:
128582cf5f4fSMatthias Schwarzott 		/* WinTV-HVR5500 (PCIe, DVB-S2, DVB-C/T) */
128682cf5f4fSMatthias Schwarzott 		break;
12871fc77d01SAntti Palosaari 	case 150329:
12881fc77d01SAntti Palosaari 		/* WinTV-HVR5525 (PCIe, DVB-S/S2, DVB-T/T2/C) */
1289b285192aSMauro Carvalho Chehab 		break;
129010a5210eSStephen Backway 	case 166100:
129110a5210eSStephen Backway 		/* WinTV-QuadHD (DVB) Tuner Pair 1 (PCIe, IR, half height,
129210a5210eSStephen Backway 		   DVB-T/T2/C, DVB-T/T2/C */
129310a5210eSStephen Backway 		break;
129410a5210eSStephen Backway 	case 166101:
129510a5210eSStephen Backway 		/* WinTV-QuadHD (DVB) Tuner Pair 2 (PCIe, IR, half height,
129610a5210eSStephen Backway 		   DVB-T/T2/C, DVB-T/T2/C */
129710a5210eSStephen Backway 		break;
1298dd9ad4fbSStephen Backway 	case 165100:
1299dd9ad4fbSStephen Backway 		/*
1300dd9ad4fbSStephen Backway 		 * WinTV-QuadHD (ATSC) Tuner Pair 1 (PCIe, IR, half height,
1301dd9ad4fbSStephen Backway 		 * ATSC, ATSC
1302dd9ad4fbSStephen Backway 		 */
1303dd9ad4fbSStephen Backway 		break;
1304dd9ad4fbSStephen Backway 	case 165101:
1305dd9ad4fbSStephen Backway 		/*
1306dd9ad4fbSStephen Backway 		 * WinTV-QuadHD (DVB) Tuner Pair 2 (PCIe, IR, half height,
1307dd9ad4fbSStephen Backway 		 * ATSC, ATSC
1308dd9ad4fbSStephen Backway 		 */
1309dd9ad4fbSStephen Backway 		break;
1310b285192aSMauro Carvalho Chehab 	default:
1311e39682b5SMauro Carvalho Chehab 		pr_warn("%s: warning: unknown hauppauge model #%d\n",
1312b285192aSMauro Carvalho Chehab 			dev->name, tv.model);
1313b285192aSMauro Carvalho Chehab 		break;
1314b285192aSMauro Carvalho Chehab 	}
1315b285192aSMauro Carvalho Chehab 
1316e39682b5SMauro Carvalho Chehab 	pr_info("%s: hauppauge eeprom: model=%d\n",
1317b285192aSMauro Carvalho Chehab 		dev->name, tv.model);
1318b285192aSMauro Carvalho Chehab }
1319b285192aSMauro Carvalho Chehab 
1320e6001482SLuis Alves /* Some TBS cards require initing a chip using a bitbanged SPI attached
1321e6001482SLuis Alves    to the cx23885 gpio's. If this chip doesn't get init'ed the demod
1322e6001482SLuis Alves    doesn't respond to any command. */
1323e6001482SLuis Alves static void tbs_card_init(struct cx23885_dev *dev)
1324e6001482SLuis Alves {
1325e6001482SLuis Alves 	int i;
1326e6001482SLuis Alves 	const u8 buf[] = {
1327e6001482SLuis Alves 		0xe0, 0x06, 0x66, 0x33, 0x65,
1328e6001482SLuis Alves 		0x01, 0x17, 0x06, 0xde};
1329e6001482SLuis Alves 
1330e6001482SLuis Alves 	switch (dev->board) {
1331e6001482SLuis Alves 	case CX23885_BOARD_TBS_6980:
1332e6001482SLuis Alves 	case CX23885_BOARD_TBS_6981:
1333e6001482SLuis Alves 		cx_set(GP0_IO, 0x00070007);
1334e6001482SLuis Alves 		usleep_range(1000, 10000);
1335e6001482SLuis Alves 		cx_clear(GP0_IO, 2);
1336e6001482SLuis Alves 		usleep_range(1000, 10000);
1337e6001482SLuis Alves 		for (i = 0; i < 9 * 8; i++) {
1338e6001482SLuis Alves 			cx_clear(GP0_IO, 7);
1339e6001482SLuis Alves 			usleep_range(1000, 10000);
1340e6001482SLuis Alves 			cx_set(GP0_IO,
1341e6001482SLuis Alves 				((buf[i >> 3] >> (7 - (i & 7))) & 1) | 4);
1342e6001482SLuis Alves 			usleep_range(1000, 10000);
1343e6001482SLuis Alves 		}
1344e6001482SLuis Alves 		cx_set(GP0_IO, 7);
1345e6001482SLuis Alves 		break;
1346e6001482SLuis Alves 	}
1347e6001482SLuis Alves }
1348e6001482SLuis Alves 
1349b285192aSMauro Carvalho Chehab int cx23885_tuner_callback(void *priv, int component, int command, int arg)
1350b285192aSMauro Carvalho Chehab {
1351b285192aSMauro Carvalho Chehab 	struct cx23885_tsport *port = priv;
1352b285192aSMauro Carvalho Chehab 	struct cx23885_dev *dev = port->dev;
1353b285192aSMauro Carvalho Chehab 	u32 bitmask = 0;
1354b285192aSMauro Carvalho Chehab 
1355b285192aSMauro Carvalho Chehab 	if ((command == XC2028_RESET_CLK) || (command == XC2028_I2C_FLUSH))
1356b285192aSMauro Carvalho Chehab 		return 0;
1357b285192aSMauro Carvalho Chehab 
1358b285192aSMauro Carvalho Chehab 	if (command != 0) {
1359e39682b5SMauro Carvalho Chehab 		pr_err("%s(): Unknown command 0x%x.\n",
1360b285192aSMauro Carvalho Chehab 		       __func__, command);
1361b285192aSMauro Carvalho Chehab 		return -EINVAL;
1362b285192aSMauro Carvalho Chehab 	}
1363b285192aSMauro Carvalho Chehab 
1364b285192aSMauro Carvalho Chehab 	switch (dev->board) {
1365b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1400:
1366b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500:
1367b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
1368b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
1369642ca1a0SAnca Emanuel 	case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
1370b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
1371b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
1372b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
1373b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
1374b285192aSMauro Carvalho Chehab 		/* Tuner Reset Command */
1375b285192aSMauro Carvalho Chehab 		bitmask = 0x04;
1376b285192aSMauro Carvalho Chehab 		break;
1377b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
1378b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
137946b21bbaSJames Harper 	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
1380b285192aSMauro Carvalho Chehab 		/* Two identical tuners on two different i2c buses,
1381b285192aSMauro Carvalho Chehab 		 * we need to reset the correct gpio. */
1382b285192aSMauro Carvalho Chehab 		if (port->nr == 1)
1383b285192aSMauro Carvalho Chehab 			bitmask = 0x01;
1384b285192aSMauro Carvalho Chehab 		else if (port->nr == 2)
1385b285192aSMauro Carvalho Chehab 			bitmask = 0x04;
1386b285192aSMauro Carvalho Chehab 		break;
1387b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
1388b285192aSMauro Carvalho Chehab 		/* Tuner Reset Command */
1389b285192aSMauro Carvalho Chehab 		bitmask = 0x02;
1390b285192aSMauro Carvalho Chehab 		break;
1391b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
1392b285192aSMauro Carvalho Chehab 		altera_ci_tuner_reset(dev, port->nr);
1393b285192aSMauro Carvalho Chehab 		break;
1394e8d42373SOleh Kravchenko 	case CX23885_BOARD_AVERMEDIA_HC81R:
1395e8d42373SOleh Kravchenko 		/* XC3028L Reset Command */
1396e8d42373SOleh Kravchenko 		bitmask = 1 << 2;
1397e8d42373SOleh Kravchenko 		break;
1398b285192aSMauro Carvalho Chehab 	}
1399b285192aSMauro Carvalho Chehab 
1400b285192aSMauro Carvalho Chehab 	if (bitmask) {
1401b285192aSMauro Carvalho Chehab 		/* Drive the tuner into reset and back out */
1402b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, bitmask);
1403b285192aSMauro Carvalho Chehab 		mdelay(200);
1404b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, bitmask);
1405b285192aSMauro Carvalho Chehab 	}
1406b285192aSMauro Carvalho Chehab 
1407b285192aSMauro Carvalho Chehab 	return 0;
1408b285192aSMauro Carvalho Chehab }
1409b285192aSMauro Carvalho Chehab 
1410b285192aSMauro Carvalho Chehab void cx23885_gpio_setup(struct cx23885_dev *dev)
1411b285192aSMauro Carvalho Chehab {
1412b285192aSMauro Carvalho Chehab 	switch (dev->board) {
1413b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1250:
1414b285192aSMauro Carvalho Chehab 		/* GPIO-0 cx24227 demodulator reset */
1415b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00010001); /* Bring the part out of reset */
1416b285192aSMauro Carvalho Chehab 		break;
1417b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500:
1418b285192aSMauro Carvalho Chehab 		/* GPIO-0 cx24227 demodulator */
1419b285192aSMauro Carvalho Chehab 		/* GPIO-2 xc3028 tuner */
1420b285192aSMauro Carvalho Chehab 
1421b285192aSMauro Carvalho Chehab 		/* Put the parts into reset */
1422b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00050000);
1423b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, 0x00000005);
1424b285192aSMauro Carvalho Chehab 		msleep(5);
1425b285192aSMauro Carvalho Chehab 
1426b285192aSMauro Carvalho Chehab 		/* Bring the parts out of reset */
1427b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00050005);
1428b285192aSMauro Carvalho Chehab 		break;
1429b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
1430b285192aSMauro Carvalho Chehab 		/* GPIO-0 cx24227 demodulator reset */
1431b285192aSMauro Carvalho Chehab 		/* GPIO-2 xc5000 tuner reset */
1432b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00050005); /* Bring the part out of reset */
1433b285192aSMauro Carvalho Chehab 		break;
1434b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1800:
1435b285192aSMauro Carvalho Chehab 		/* GPIO-0 656_CLK */
1436b285192aSMauro Carvalho Chehab 		/* GPIO-1 656_D0 */
1437b285192aSMauro Carvalho Chehab 		/* GPIO-2 8295A Reset */
1438b285192aSMauro Carvalho Chehab 		/* GPIO-3-10 cx23417 data0-7 */
1439b285192aSMauro Carvalho Chehab 		/* GPIO-11-14 cx23417 addr0-3 */
1440b285192aSMauro Carvalho Chehab 		/* GPIO-15-18 cx23417 READY, CS, RD, WR */
1441b285192aSMauro Carvalho Chehab 		/* GPIO-19 IR_RX */
1442b285192aSMauro Carvalho Chehab 
1443b285192aSMauro Carvalho Chehab 		/* CX23417 GPIO's */
1444b285192aSMauro Carvalho Chehab 		/* EIO15 Zilog Reset */
1445b285192aSMauro Carvalho Chehab 		/* EIO14 S5H1409/CX24227 Reset */
1446b285192aSMauro Carvalho Chehab 		mc417_gpio_enable(dev, GPIO_15 | GPIO_14, 1);
1447b285192aSMauro Carvalho Chehab 
1448b285192aSMauro Carvalho Chehab 		/* Put the demod into reset and protect the eeprom */
1449b285192aSMauro Carvalho Chehab 		mc417_gpio_clear(dev, GPIO_15 | GPIO_14);
1450b285192aSMauro Carvalho Chehab 		mdelay(100);
1451b285192aSMauro Carvalho Chehab 
1452b285192aSMauro Carvalho Chehab 		/* Bring the demod and blaster out of reset */
1453b285192aSMauro Carvalho Chehab 		mc417_gpio_set(dev, GPIO_15 | GPIO_14);
1454b285192aSMauro Carvalho Chehab 		mdelay(100);
1455b285192aSMauro Carvalho Chehab 
1456b285192aSMauro Carvalho Chehab 		/* Force the TDA8295A into reset and back */
1457b285192aSMauro Carvalho Chehab 		cx23885_gpio_enable(dev, GPIO_2, 1);
1458b285192aSMauro Carvalho Chehab 		cx23885_gpio_set(dev, GPIO_2);
1459b285192aSMauro Carvalho Chehab 		mdelay(20);
1460b285192aSMauro Carvalho Chehab 		cx23885_gpio_clear(dev, GPIO_2);
1461b285192aSMauro Carvalho Chehab 		mdelay(20);
1462b285192aSMauro Carvalho Chehab 		cx23885_gpio_set(dev, GPIO_2);
1463b285192aSMauro Carvalho Chehab 		mdelay(20);
1464b285192aSMauro Carvalho Chehab 		break;
1465b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1200:
1466b285192aSMauro Carvalho Chehab 		/* GPIO-0 tda10048 demodulator reset */
1467b285192aSMauro Carvalho Chehab 		/* GPIO-2 tda18271 tuner reset */
1468b285192aSMauro Carvalho Chehab 
1469b285192aSMauro Carvalho Chehab 		/* Put the parts into reset and back */
1470b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00050000);
1471b285192aSMauro Carvalho Chehab 		mdelay(20);
1472b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, 0x00000005);
1473b285192aSMauro Carvalho Chehab 		mdelay(20);
1474b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00050005);
1475b285192aSMauro Carvalho Chehab 		break;
1476b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1700:
1477b285192aSMauro Carvalho Chehab 		/* GPIO-0 TDA10048 demodulator reset */
1478b285192aSMauro Carvalho Chehab 		/* GPIO-2 TDA8295A Reset */
1479b285192aSMauro Carvalho Chehab 		/* GPIO-3-10 cx23417 data0-7 */
1480b285192aSMauro Carvalho Chehab 		/* GPIO-11-14 cx23417 addr0-3 */
1481b285192aSMauro Carvalho Chehab 		/* GPIO-15-18 cx23417 READY, CS, RD, WR */
1482b285192aSMauro Carvalho Chehab 
1483b285192aSMauro Carvalho Chehab 		/* The following GPIO's are on the interna AVCore (cx25840) */
1484b285192aSMauro Carvalho Chehab 		/* GPIO-19 IR_RX */
1485b285192aSMauro Carvalho Chehab 		/* GPIO-20 IR_TX 416/DVBT Select */
1486b285192aSMauro Carvalho Chehab 		/* GPIO-21 IIS DAT */
1487b285192aSMauro Carvalho Chehab 		/* GPIO-22 IIS WCLK */
1488b285192aSMauro Carvalho Chehab 		/* GPIO-23 IIS BCLK */
1489b285192aSMauro Carvalho Chehab 
1490b285192aSMauro Carvalho Chehab 		/* Put the parts into reset and back */
1491b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00050000);
1492b285192aSMauro Carvalho Chehab 		mdelay(20);
1493b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, 0x00000005);
1494b285192aSMauro Carvalho Chehab 		mdelay(20);
1495b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00050005);
1496b285192aSMauro Carvalho Chehab 		break;
1497b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1400:
1498b285192aSMauro Carvalho Chehab 		/* GPIO-0  Dibcom7000p demodulator reset */
1499b285192aSMauro Carvalho Chehab 		/* GPIO-2  xc3028L tuner reset */
1500b285192aSMauro Carvalho Chehab 		/* GPIO-13 LED */
1501b285192aSMauro Carvalho Chehab 
1502b285192aSMauro Carvalho Chehab 		/* Put the parts into reset and back */
1503b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00050000);
1504b285192aSMauro Carvalho Chehab 		mdelay(20);
1505b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, 0x00000005);
1506b285192aSMauro Carvalho Chehab 		mdelay(20);
1507b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00050005);
1508b285192aSMauro Carvalho Chehab 		break;
1509b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
1510b285192aSMauro Carvalho Chehab 		/* GPIO-0 xc5000 tuner reset i2c bus 0 */
1511b285192aSMauro Carvalho Chehab 		/* GPIO-1 s5h1409 demod reset i2c bus 0 */
1512b285192aSMauro Carvalho Chehab 		/* GPIO-2 xc5000 tuner reset i2c bus 1 */
1513b285192aSMauro Carvalho Chehab 		/* GPIO-3 s5h1409 demod reset i2c bus 0 */
1514b285192aSMauro Carvalho Chehab 
1515b285192aSMauro Carvalho Chehab 		/* Put the parts into reset and back */
1516b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x000f0000);
1517b285192aSMauro Carvalho Chehab 		mdelay(20);
1518b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, 0x0000000f);
1519b285192aSMauro Carvalho Chehab 		mdelay(20);
1520b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x000f000f);
1521b285192aSMauro Carvalho Chehab 		break;
1522b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
152346b21bbaSJames Harper 	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
1524b285192aSMauro Carvalho Chehab 		/* GPIO-0 portb xc3028 reset */
1525b285192aSMauro Carvalho Chehab 		/* GPIO-1 portb zl10353 reset */
1526b285192aSMauro Carvalho Chehab 		/* GPIO-2 portc xc3028 reset */
1527b285192aSMauro Carvalho Chehab 		/* GPIO-3 portc zl10353 reset */
1528b285192aSMauro Carvalho Chehab 
1529b285192aSMauro Carvalho Chehab 		/* Put the parts into reset and back */
1530b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x000f0000);
1531b285192aSMauro Carvalho Chehab 		mdelay(20);
1532b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, 0x0000000f);
1533b285192aSMauro Carvalho Chehab 		mdelay(20);
1534b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x000f000f);
1535b285192aSMauro Carvalho Chehab 		break;
1536b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
1537642ca1a0SAnca Emanuel 	case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
1538b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
1539b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
1540b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
1541b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
1542b285192aSMauro Carvalho Chehab 		/* GPIO-2  xc3028 tuner reset */
1543b285192aSMauro Carvalho Chehab 
1544b285192aSMauro Carvalho Chehab 		/* The following GPIO's are on the internal AVCore (cx25840) */
1545b285192aSMauro Carvalho Chehab 		/* GPIO-?  zl10353 demod reset */
1546b285192aSMauro Carvalho Chehab 
1547b285192aSMauro Carvalho Chehab 		/* Put the parts into reset and back */
1548b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00040000);
1549b285192aSMauro Carvalho Chehab 		mdelay(20);
1550b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, 0x00000004);
1551b285192aSMauro Carvalho Chehab 		mdelay(20);
1552b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00040004);
1553b285192aSMauro Carvalho Chehab 		break;
1554b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TBS_6920:
1555e6001482SLuis Alves 	case CX23885_BOARD_TBS_6980:
1556e6001482SLuis Alves 	case CX23885_BOARD_TBS_6981:
1557f667190bSMariusz Bia?o?czyk 	case CX23885_BOARD_PROF_8000:
1558b285192aSMauro Carvalho Chehab 		cx_write(MC417_CTL, 0x00000036);
1559b285192aSMauro Carvalho Chehab 		cx_write(MC417_OEN, 0x00001000);
1560b285192aSMauro Carvalho Chehab 		cx_set(MC417_RWD, 0x00000002);
1561b285192aSMauro Carvalho Chehab 		mdelay(200);
1562b285192aSMauro Carvalho Chehab 		cx_clear(MC417_RWD, 0x00000800);
1563b285192aSMauro Carvalho Chehab 		mdelay(200);
1564b285192aSMauro Carvalho Chehab 		cx_set(MC417_RWD, 0x00000800);
1565b285192aSMauro Carvalho Chehab 		mdelay(200);
1566b285192aSMauro Carvalho Chehab 		break;
1567b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
1568b285192aSMauro Carvalho Chehab 		/* GPIO-0 INTA from CiMax1
1569b285192aSMauro Carvalho Chehab 		   GPIO-1 INTB from CiMax2
1570b285192aSMauro Carvalho Chehab 		   GPIO-2 reset chips
1571b285192aSMauro Carvalho Chehab 		   GPIO-3 to GPIO-10 data/addr for CA
1572b285192aSMauro Carvalho Chehab 		   GPIO-11 ~CS0 to CiMax1
1573b285192aSMauro Carvalho Chehab 		   GPIO-12 ~CS1 to CiMax2
1574b285192aSMauro Carvalho Chehab 		   GPIO-13 ADL0 load LSB addr
1575b285192aSMauro Carvalho Chehab 		   GPIO-14 ADL1 load MSB addr
1576b285192aSMauro Carvalho Chehab 		   GPIO-15 ~RDY from CiMax
1577b285192aSMauro Carvalho Chehab 		   GPIO-17 ~RD to CiMax
1578b285192aSMauro Carvalho Chehab 		   GPIO-18 ~WR to CiMax
1579b285192aSMauro Carvalho Chehab 		 */
1580b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00040000); /* GPIO as out */
1581b285192aSMauro Carvalho Chehab 		/* GPIO1 and GPIO2 as INTA and INTB from CiMaxes, reset low */
1582b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, 0x00030004);
1583b285192aSMauro Carvalho Chehab 		mdelay(100);/* reset delay */
1584b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00040004); /* GPIO as out, reset high */
1585b285192aSMauro Carvalho Chehab 		cx_write(MC417_CTL, 0x00000037);/* enable GPIO3-18 pins */
1586b285192aSMauro Carvalho Chehab 		/* GPIO-15 IN as ~ACK, rest as OUT */
1587b285192aSMauro Carvalho Chehab 		cx_write(MC417_OEN, 0x00001000);
1588b285192aSMauro Carvalho Chehab 		/* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */
1589b285192aSMauro Carvalho Chehab 		cx_write(MC417_RWD, 0x0000c300);
1590b285192aSMauro Carvalho Chehab 		/* enable irq */
1591b285192aSMauro Carvalho Chehab 		cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
1592b285192aSMauro Carvalho Chehab 		break;
1593b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1270:
1594b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1275:
1595b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255:
1596b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
1597b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1210:
1598b285192aSMauro Carvalho Chehab 		/* GPIO-5 RF Control: 0 = RF1 Terrestrial, 1 = RF2 Cable */
1599b285192aSMauro Carvalho Chehab 		/* GPIO-6 I2C Gate which can isolate the demod from the bus */
1600b285192aSMauro Carvalho Chehab 		/* GPIO-9 Demod reset */
1601b285192aSMauro Carvalho Chehab 
1602b285192aSMauro Carvalho Chehab 		/* Put the parts into reset and back */
1603b285192aSMauro Carvalho Chehab 		cx23885_gpio_enable(dev, GPIO_9 | GPIO_6 | GPIO_5, 1);
1604b285192aSMauro Carvalho Chehab 		cx23885_gpio_set(dev, GPIO_9 | GPIO_6 | GPIO_5);
1605b285192aSMauro Carvalho Chehab 		cx23885_gpio_clear(dev, GPIO_9);
1606b285192aSMauro Carvalho Chehab 		mdelay(20);
1607b285192aSMauro Carvalho Chehab 		cx23885_gpio_set(dev, GPIO_9);
1608b285192aSMauro Carvalho Chehab 		break;
1609b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MYGICA_X8506:
1610b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
1611b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MYGICA_X8507:
1612b285192aSMauro Carvalho Chehab 		/* GPIO-0 (0)Analog / (1)Digital TV */
1613b285192aSMauro Carvalho Chehab 		/* GPIO-1 reset XC5000 */
16140d1b5265SMauro Carvalho Chehab 		/* GPIO-2 demod reset */
1615b285192aSMauro Carvalho Chehab 		cx23885_gpio_enable(dev, GPIO_0 | GPIO_1 | GPIO_2, 1);
1616b285192aSMauro Carvalho Chehab 		cx23885_gpio_clear(dev, GPIO_1 | GPIO_2);
1617b285192aSMauro Carvalho Chehab 		mdelay(100);
1618b285192aSMauro Carvalho Chehab 		cx23885_gpio_set(dev, GPIO_0 | GPIO_1 | GPIO_2);
1619b285192aSMauro Carvalho Chehab 		mdelay(100);
1620b285192aSMauro Carvalho Chehab 		break;
1621b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MYGICA_X8558PRO:
1622b285192aSMauro Carvalho Chehab 		/* GPIO-0 reset first ATBM8830 */
1623b285192aSMauro Carvalho Chehab 		/* GPIO-1 reset second ATBM8830 */
1624b285192aSMauro Carvalho Chehab 		cx23885_gpio_enable(dev, GPIO_0 | GPIO_1, 1);
1625b285192aSMauro Carvalho Chehab 		cx23885_gpio_clear(dev, GPIO_0 | GPIO_1);
1626b285192aSMauro Carvalho Chehab 		mdelay(100);
1627b285192aSMauro Carvalho Chehab 		cx23885_gpio_set(dev, GPIO_0 | GPIO_1);
1628b285192aSMauro Carvalho Chehab 		mdelay(100);
1629b285192aSMauro Carvalho Chehab 		break;
1630b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1850:
1631b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1290:
1632b285192aSMauro Carvalho Chehab 		/* GPIO-0 656_CLK */
1633b285192aSMauro Carvalho Chehab 		/* GPIO-1 656_D0 */
1634b285192aSMauro Carvalho Chehab 		/* GPIO-2 Wake# */
1635b285192aSMauro Carvalho Chehab 		/* GPIO-3-10 cx23417 data0-7 */
1636b285192aSMauro Carvalho Chehab 		/* GPIO-11-14 cx23417 addr0-3 */
1637b285192aSMauro Carvalho Chehab 		/* GPIO-15-18 cx23417 READY, CS, RD, WR */
1638b285192aSMauro Carvalho Chehab 		/* GPIO-19 IR_RX */
1639b285192aSMauro Carvalho Chehab 		/* GPIO-20 C_IR_TX */
1640b285192aSMauro Carvalho Chehab 		/* GPIO-21 I2S DAT */
1641b285192aSMauro Carvalho Chehab 		/* GPIO-22 I2S WCLK */
1642b285192aSMauro Carvalho Chehab 		/* GPIO-23 I2S BCLK */
1643b285192aSMauro Carvalho Chehab 		/* ALT GPIO: EXP GPIO LATCH */
1644b285192aSMauro Carvalho Chehab 
1645b285192aSMauro Carvalho Chehab 		/* CX23417 GPIO's */
1646b285192aSMauro Carvalho Chehab 		/* GPIO-14 S5H1411/CX24228 Reset */
1647b285192aSMauro Carvalho Chehab 		/* GPIO-13 EEPROM write protect */
1648b285192aSMauro Carvalho Chehab 		mc417_gpio_enable(dev, GPIO_14 | GPIO_13, 1);
1649b285192aSMauro Carvalho Chehab 
1650b285192aSMauro Carvalho Chehab 		/* Put the demod into reset and protect the eeprom */
1651b285192aSMauro Carvalho Chehab 		mc417_gpio_clear(dev, GPIO_14 | GPIO_13);
1652b285192aSMauro Carvalho Chehab 		mdelay(100);
1653b285192aSMauro Carvalho Chehab 
1654b285192aSMauro Carvalho Chehab 		/* Bring the demod out of reset */
1655b285192aSMauro Carvalho Chehab 		mc417_gpio_set(dev, GPIO_14);
1656b285192aSMauro Carvalho Chehab 		mdelay(100);
1657b285192aSMauro Carvalho Chehab 
1658b285192aSMauro Carvalho Chehab 		/* CX24228 GPIO */
1659b285192aSMauro Carvalho Chehab 		/* Connected to IF / Mux */
1660b285192aSMauro Carvalho Chehab 		break;
1661b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
1662b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00010001); /* Bring the part out of reset */
1663b285192aSMauro Carvalho Chehab 		break;
1664b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
1665b285192aSMauro Carvalho Chehab 		/* GPIO-0 ~INT in
1666b285192aSMauro Carvalho Chehab 		   GPIO-1 TMS out
1667b285192aSMauro Carvalho Chehab 		   GPIO-2 ~reset chips out
1668b285192aSMauro Carvalho Chehab 		   GPIO-3 to GPIO-10 data/addr for CA in/out
1669b285192aSMauro Carvalho Chehab 		   GPIO-11 ~CS out
1670b285192aSMauro Carvalho Chehab 		   GPIO-12 ADDR out
1671b285192aSMauro Carvalho Chehab 		   GPIO-13 ~WR out
1672b285192aSMauro Carvalho Chehab 		   GPIO-14 ~RD out
1673b285192aSMauro Carvalho Chehab 		   GPIO-15 ~RDY in
1674b285192aSMauro Carvalho Chehab 		   GPIO-16 TCK out
1675b285192aSMauro Carvalho Chehab 		   GPIO-17 TDO in
1676b285192aSMauro Carvalho Chehab 		   GPIO-18 TDI out
1677b285192aSMauro Carvalho Chehab 		 */
1678b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00060000); /* GPIO-1,2 as out */
1679b285192aSMauro Carvalho Chehab 		/* GPIO-0 as INT, reset & TMS low */
1680b285192aSMauro Carvalho Chehab 		cx_clear(GP0_IO, 0x00010006);
1681b285192aSMauro Carvalho Chehab 		mdelay(100);/* reset delay */
1682b285192aSMauro Carvalho Chehab 		cx_set(GP0_IO, 0x00000004); /* reset high */
1683b285192aSMauro Carvalho Chehab 		cx_write(MC417_CTL, 0x00000037);/* enable GPIO-3..18 pins */
1684b285192aSMauro Carvalho Chehab 		/* GPIO-17 is TDO in, GPIO-15 is ~RDY in, rest is out */
1685b285192aSMauro Carvalho Chehab 		cx_write(MC417_OEN, 0x00005000);
1686b285192aSMauro Carvalho Chehab 		/* ~RD, ~WR high; ADDR low; ~CS high */
1687b285192aSMauro Carvalho Chehab 		cx_write(MC417_RWD, 0x00000d00);
1688b285192aSMauro Carvalho Chehab 		/* enable irq */
1689b285192aSMauro Carvalho Chehab 		cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
1690b285192aSMauro Carvalho Chehab 		break;
16917c62f5a1SMichael Krufky 	case CX23885_BOARD_HAUPPAUGE_HVR4400:
1692721f3223SMatthias Schwarzott 	case CX23885_BOARD_HAUPPAUGE_STARBURST:
16937c62f5a1SMichael Krufky 		/* GPIO-8 tda10071 demod reset */
1694721f3223SMatthias Schwarzott 		/* GPIO-9 si2165 demod reset (only HVR4400/HVR5500)*/
16957c62f5a1SMichael Krufky 
16967c62f5a1SMichael Krufky 		/* Put the parts into reset and back */
169736efec48SMatthias Schwarzott 		cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1);
169836efec48SMatthias Schwarzott 
169936efec48SMatthias Schwarzott 		cx23885_gpio_clear(dev, GPIO_8 | GPIO_9);
17007c62f5a1SMichael Krufky 		mdelay(100);
170136efec48SMatthias Schwarzott 		cx23885_gpio_set(dev, GPIO_8 | GPIO_9);
17027c62f5a1SMichael Krufky 		mdelay(100);
170336efec48SMatthias Schwarzott 
17047c62f5a1SMichael Krufky 		break;
1705e8d42373SOleh Kravchenko 	case CX23885_BOARD_AVERMEDIA_HC81R:
1706e8d42373SOleh Kravchenko 		cx_clear(MC417_CTL, 1);
1707e8d42373SOleh Kravchenko 		/* GPIO-0,1,2 setup direction as output */
1708e8d42373SOleh Kravchenko 		cx_set(GP0_IO, 0x00070000);
1709e8d42373SOleh Kravchenko 		mdelay(10);
1710e8d42373SOleh Kravchenko 		/* AF9013 demod reset */
1711e8d42373SOleh Kravchenko 		cx_set(GP0_IO, 0x00010001);
1712e8d42373SOleh Kravchenko 		mdelay(10);
1713e8d42373SOleh Kravchenko 		cx_clear(GP0_IO, 0x00010001);
1714e8d42373SOleh Kravchenko 		mdelay(10);
1715e8d42373SOleh Kravchenko 		cx_set(GP0_IO, 0x00010001);
1716e8d42373SOleh Kravchenko 		mdelay(10);
1717e8d42373SOleh Kravchenko 		/* demod tune? */
1718e8d42373SOleh Kravchenko 		cx_clear(GP0_IO, 0x00030003);
1719e8d42373SOleh Kravchenko 		mdelay(10);
1720e8d42373SOleh Kravchenko 		cx_set(GP0_IO, 0x00020002);
1721e8d42373SOleh Kravchenko 		mdelay(10);
1722e8d42373SOleh Kravchenko 		cx_set(GP0_IO, 0x00010001);
1723e8d42373SOleh Kravchenko 		mdelay(10);
1724e8d42373SOleh Kravchenko 		cx_clear(GP0_IO, 0x00020002);
1725e8d42373SOleh Kravchenko 		/* XC3028L tuner reset */
1726e8d42373SOleh Kravchenko 		cx_set(GP0_IO, 0x00040004);
1727e8d42373SOleh Kravchenko 		cx_clear(GP0_IO, 0x00040004);
1728e8d42373SOleh Kravchenko 		cx_set(GP0_IO, 0x00040004);
1729e8d42373SOleh Kravchenko 		mdelay(60);
1730e8d42373SOleh Kravchenko 		break;
173129442266SOlli Salonen 	case CX23885_BOARD_DVBSKY_T9580:
1732c29d6a83Snibble.max 	case CX23885_BOARD_DVBSKY_S952:
1733c02ef64aSNibble Max 	case CX23885_BOARD_DVBSKY_T982:
173429442266SOlli Salonen 		/* enable GPIO3-18 pins */
173529442266SOlli Salonen 		cx_write(MC417_CTL, 0x00000037);
173629442266SOlli Salonen 		cx23885_gpio_enable(dev, GPIO_2 | GPIO_11, 1);
173729442266SOlli Salonen 		cx23885_gpio_clear(dev, GPIO_2 | GPIO_11);
173829442266SOlli Salonen 		mdelay(100);
173929442266SOlli Salonen 		cx23885_gpio_set(dev, GPIO_2 | GPIO_11);
174029442266SOlli Salonen 		break;
174182c10276SOlli Salonen 	case CX23885_BOARD_DVBSKY_T980C:
17420e6c7b01Snibble.max 	case CX23885_BOARD_DVBSKY_S950C:
174361b103e8SOlli Salonen 	case CX23885_BOARD_TT_CT2_4500_CI:
174482c10276SOlli Salonen 		/*
174582c10276SOlli Salonen 		 * GPIO-0 INTA from CiMax, input
174682c10276SOlli Salonen 		 * GPIO-1 reset CiMax, output, high active
174782c10276SOlli Salonen 		 * GPIO-2 reset demod, output, low active
174882c10276SOlli Salonen 		 * GPIO-3 to GPIO-10 data/addr for CAM
174982c10276SOlli Salonen 		 * GPIO-11 ~CS0 to CiMax1
175082c10276SOlli Salonen 		 * GPIO-12 ~CS1 to CiMax2
175182c10276SOlli Salonen 		 * GPIO-13 ADL0 load LSB addr
175282c10276SOlli Salonen 		 * GPIO-14 ADL1 load MSB addr
175382c10276SOlli Salonen 		 * GPIO-15 ~RDY from CiMax
175482c10276SOlli Salonen 		 * GPIO-17 ~RD to CiMax
175582c10276SOlli Salonen 		 * GPIO-18 ~WR to CiMax
175682c10276SOlli Salonen 		 */
175782c10276SOlli Salonen 
175882c10276SOlli Salonen 		cx_set(GP0_IO, 0x00060002); /* GPIO 1/2 as output */
175982c10276SOlli Salonen 		cx_clear(GP0_IO, 0x00010004); /* GPIO 0 as input */
176082c10276SOlli Salonen 		mdelay(100); /* reset delay */
176182c10276SOlli Salonen 		cx_set(GP0_IO, 0x00060004); /* GPIO as out, reset high */
176282c10276SOlli Salonen 		cx_clear(GP0_IO, 0x00010002);
176382c10276SOlli Salonen 		cx_write(MC417_CTL, 0x00000037); /* enable GPIO3-18 pins */
176482c10276SOlli Salonen 
176582c10276SOlli Salonen 		/* GPIO-15 IN as ~ACK, rest as OUT */
176682c10276SOlli Salonen 		cx_write(MC417_OEN, 0x00001000);
176782c10276SOlli Salonen 
176882c10276SOlli Salonen 		/* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */
176982c10276SOlli Salonen 		cx_write(MC417_RWD, 0x0000c300);
177082c10276SOlli Salonen 
177182c10276SOlli Salonen 		/* enable irq */
177282c10276SOlli Salonen 		cx_write(GPIO_ISM, 0x00000000); /* INTERRUPTS active low */
1773cba5480cSnibble.max 		break;
1774cba5480cSnibble.max 	case CX23885_BOARD_DVBSKY_S950:
1775cba5480cSnibble.max 		cx23885_gpio_enable(dev, GPIO_2, 1);
1776cba5480cSnibble.max 		cx23885_gpio_clear(dev, GPIO_2);
1777cba5480cSnibble.max 		msleep(100);
1778cba5480cSnibble.max 		cx23885_gpio_set(dev, GPIO_2);
1779cba5480cSnibble.max 		break;
17801fc77d01SAntti Palosaari 	case CX23885_BOARD_HAUPPAUGE_HVR5525:
178110a5210eSStephen Backway 	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
1782dd9ad4fbSStephen Backway 	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
17831fc77d01SAntti Palosaari 		/*
178410a5210eSStephen Backway 		 * HVR5525 GPIO Details:
17851fc77d01SAntti Palosaari 		 *  GPIO-00 IR_WIDE
17861fc77d01SAntti Palosaari 		 *  GPIO-02 wake#
17871fc77d01SAntti Palosaari 		 *  GPIO-03 VAUX Pres.
17881fc77d01SAntti Palosaari 		 *  GPIO-07 PROG#
17891fc77d01SAntti Palosaari 		 *  GPIO-08 SAT_RESN
17901fc77d01SAntti Palosaari 		 *  GPIO-09 TER_RESN
17911fc77d01SAntti Palosaari 		 *  GPIO-10 B2_SENSE
17921fc77d01SAntti Palosaari 		 *  GPIO-11 B1_SENSE
17931fc77d01SAntti Palosaari 		 *  GPIO-15 IR_LED_STATUS
17941fc77d01SAntti Palosaari 		 *  GPIO-19 IR_NARROW
17951fc77d01SAntti Palosaari 		 *  GPIO-20 Blauster1
17961fc77d01SAntti Palosaari 		 *  ALTGPIO VAUX_SWITCH
17971fc77d01SAntti Palosaari 		 *  AUX_PLL_CLK : Blaster2
17981fc77d01SAntti Palosaari 		 */
17991fc77d01SAntti Palosaari 		/* Put the parts into reset and back */
18001fc77d01SAntti Palosaari 		cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1);
18011fc77d01SAntti Palosaari 		cx23885_gpio_clear(dev, GPIO_8 | GPIO_9);
18021fc77d01SAntti Palosaari 		msleep(100);
18031fc77d01SAntti Palosaari 		cx23885_gpio_set(dev, GPIO_8 | GPIO_9);
18041fc77d01SAntti Palosaari 		msleep(100);
18051fc77d01SAntti Palosaari 		break;
18066c43a217SHans Verkuil 	case CX23885_BOARD_VIEWCAST_260E:
18076c43a217SHans Verkuil 	case CX23885_BOARD_VIEWCAST_460E:
18086c43a217SHans Verkuil 		/* For documentation purposes, it's worth noting that this
18096c43a217SHans Verkuil 		 * card does not have any GPIO's connected to subcomponents.
18106c43a217SHans Verkuil 		 */
18116c43a217SHans Verkuil 		break;
1812b285192aSMauro Carvalho Chehab 	}
1813b285192aSMauro Carvalho Chehab }
1814b285192aSMauro Carvalho Chehab 
1815b285192aSMauro Carvalho Chehab int cx23885_ir_init(struct cx23885_dev *dev)
1816b285192aSMauro Carvalho Chehab {
1817b285192aSMauro Carvalho Chehab 	static struct v4l2_subdev_io_pin_config ir_rxtx_pin_cfg[] = {
1818b285192aSMauro Carvalho Chehab 		{
1819b285192aSMauro Carvalho Chehab 			.flags	  = V4L2_SUBDEV_IO_PIN_INPUT,
1820b285192aSMauro Carvalho Chehab 			.pin	  = CX23885_PIN_IR_RX_GPIO19,
1821b285192aSMauro Carvalho Chehab 			.function = CX23885_PAD_IR_RX,
1822b285192aSMauro Carvalho Chehab 			.value	  = 0,
1823b285192aSMauro Carvalho Chehab 			.strength = CX25840_PIN_DRIVE_MEDIUM,
1824b285192aSMauro Carvalho Chehab 		}, {
1825b285192aSMauro Carvalho Chehab 			.flags	  = V4L2_SUBDEV_IO_PIN_OUTPUT,
1826b285192aSMauro Carvalho Chehab 			.pin	  = CX23885_PIN_IR_TX_GPIO20,
1827b285192aSMauro Carvalho Chehab 			.function = CX23885_PAD_IR_TX,
1828b285192aSMauro Carvalho Chehab 			.value	  = 0,
1829b285192aSMauro Carvalho Chehab 			.strength = CX25840_PIN_DRIVE_MEDIUM,
1830b285192aSMauro Carvalho Chehab 		}
1831b285192aSMauro Carvalho Chehab 	};
1832b285192aSMauro Carvalho Chehab 	const size_t ir_rxtx_pin_cfg_count = ARRAY_SIZE(ir_rxtx_pin_cfg);
1833b285192aSMauro Carvalho Chehab 
1834b285192aSMauro Carvalho Chehab 	static struct v4l2_subdev_io_pin_config ir_rx_pin_cfg[] = {
1835b285192aSMauro Carvalho Chehab 		{
1836b285192aSMauro Carvalho Chehab 			.flags	  = V4L2_SUBDEV_IO_PIN_INPUT,
1837b285192aSMauro Carvalho Chehab 			.pin	  = CX23885_PIN_IR_RX_GPIO19,
1838b285192aSMauro Carvalho Chehab 			.function = CX23885_PAD_IR_RX,
1839b285192aSMauro Carvalho Chehab 			.value	  = 0,
1840b285192aSMauro Carvalho Chehab 			.strength = CX25840_PIN_DRIVE_MEDIUM,
1841b285192aSMauro Carvalho Chehab 		}
1842b285192aSMauro Carvalho Chehab 	};
1843b285192aSMauro Carvalho Chehab 	const size_t ir_rx_pin_cfg_count = ARRAY_SIZE(ir_rx_pin_cfg);
1844b285192aSMauro Carvalho Chehab 
1845b285192aSMauro Carvalho Chehab 	struct v4l2_subdev_ir_parameters params;
1846b285192aSMauro Carvalho Chehab 	int ret = 0;
1847b285192aSMauro Carvalho Chehab 	switch (dev->board) {
1848b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500:
1849b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
1850b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1800:
1851b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1200:
1852b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1400:
1853b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1275:
1854b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255:
1855b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
1856b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1210:
185710a5210eSStephen Backway 	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
1858dd9ad4fbSStephen Backway 	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
1859b285192aSMauro Carvalho Chehab 		/* FIXME: Implement me */
1860b285192aSMauro Carvalho Chehab 		break;
1861b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1270:
1862b285192aSMauro Carvalho Chehab 		ret = cx23888_ir_probe(dev);
1863b285192aSMauro Carvalho Chehab 		if (ret)
1864b285192aSMauro Carvalho Chehab 			break;
1865b285192aSMauro Carvalho Chehab 		dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_888_IR);
1866b285192aSMauro Carvalho Chehab 		v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
1867b285192aSMauro Carvalho Chehab 				 ir_rx_pin_cfg_count, ir_rx_pin_cfg);
1868b285192aSMauro Carvalho Chehab 		break;
1869b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1850:
1870b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1290:
1871b285192aSMauro Carvalho Chehab 		ret = cx23888_ir_probe(dev);
1872b285192aSMauro Carvalho Chehab 		if (ret)
1873b285192aSMauro Carvalho Chehab 			break;
1874b285192aSMauro Carvalho Chehab 		dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_888_IR);
1875b285192aSMauro Carvalho Chehab 		v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
1876b285192aSMauro Carvalho Chehab 				 ir_rxtx_pin_cfg_count, ir_rxtx_pin_cfg);
1877b285192aSMauro Carvalho Chehab 		/*
1878b285192aSMauro Carvalho Chehab 		 * For these boards we need to invert the Tx output via the
1879b285192aSMauro Carvalho Chehab 		 * IR controller to have the LED off while idle
1880b285192aSMauro Carvalho Chehab 		 */
1881b285192aSMauro Carvalho Chehab 		v4l2_subdev_call(dev->sd_ir, ir, tx_g_parameters, &params);
1882b285192aSMauro Carvalho Chehab 		params.enable = false;
1883b285192aSMauro Carvalho Chehab 		params.shutdown = false;
1884b285192aSMauro Carvalho Chehab 		params.invert_level = true;
1885b285192aSMauro Carvalho Chehab 		v4l2_subdev_call(dev->sd_ir, ir, tx_s_parameters, &params);
1886b285192aSMauro Carvalho Chehab 		params.shutdown = true;
1887b285192aSMauro Carvalho Chehab 		v4l2_subdev_call(dev->sd_ir, ir, tx_s_parameters, &params);
1888b285192aSMauro Carvalho Chehab 		break;
1889b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
1890b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TEVII_S470:
1891e5f670b7SAlfredo Jesús Delaiti 	case CX23885_BOARD_MYGICA_X8507:
1892e6001482SLuis Alves 	case CX23885_BOARD_TBS_6980:
1893e6001482SLuis Alves 	case CX23885_BOARD_TBS_6981:
1894d11a3835Snibble.max 	case CX23885_BOARD_DVBSKY_T9580:
1895070e6661Snibble.max 	case CX23885_BOARD_DVBSKY_T980C:
1896070e6661Snibble.max 	case CX23885_BOARD_DVBSKY_S950C:
189761b103e8SOlli Salonen 	case CX23885_BOARD_TT_CT2_4500_CI:
1898cba5480cSnibble.max 	case CX23885_BOARD_DVBSKY_S950:
1899c29d6a83Snibble.max 	case CX23885_BOARD_DVBSKY_S952:
1900c02ef64aSNibble Max 	case CX23885_BOARD_DVBSKY_T982:
1901b285192aSMauro Carvalho Chehab 		if (!enable_885_ir)
1902b285192aSMauro Carvalho Chehab 			break;
1903b285192aSMauro Carvalho Chehab 		dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_AV_CORE);
1904b285192aSMauro Carvalho Chehab 		if (dev->sd_ir == NULL) {
1905b285192aSMauro Carvalho Chehab 			ret = -ENODEV;
1906b285192aSMauro Carvalho Chehab 			break;
1907b285192aSMauro Carvalho Chehab 		}
1908b285192aSMauro Carvalho Chehab 		v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
1909b285192aSMauro Carvalho Chehab 				 ir_rx_pin_cfg_count, ir_rx_pin_cfg);
1910b285192aSMauro Carvalho Chehab 		break;
1911b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1250:
1912b285192aSMauro Carvalho Chehab 		if (!enable_885_ir)
1913b285192aSMauro Carvalho Chehab 			break;
1914b285192aSMauro Carvalho Chehab 		dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_AV_CORE);
1915b285192aSMauro Carvalho Chehab 		if (dev->sd_ir == NULL) {
1916b285192aSMauro Carvalho Chehab 			ret = -ENODEV;
1917b285192aSMauro Carvalho Chehab 			break;
1918b285192aSMauro Carvalho Chehab 		}
1919b285192aSMauro Carvalho Chehab 		v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
1920b285192aSMauro Carvalho Chehab 				 ir_rxtx_pin_cfg_count, ir_rxtx_pin_cfg);
1921b285192aSMauro Carvalho Chehab 		break;
1922b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
192346b21bbaSJames Harper 	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
1924b285192aSMauro Carvalho Chehab 		request_module("ir-kbd-i2c");
1925b285192aSMauro Carvalho Chehab 		break;
1926b285192aSMauro Carvalho Chehab 	}
1927b285192aSMauro Carvalho Chehab 
1928b285192aSMauro Carvalho Chehab 	return ret;
1929b285192aSMauro Carvalho Chehab }
1930b285192aSMauro Carvalho Chehab 
1931b285192aSMauro Carvalho Chehab void cx23885_ir_fini(struct cx23885_dev *dev)
1932b285192aSMauro Carvalho Chehab {
1933b285192aSMauro Carvalho Chehab 	switch (dev->board) {
1934b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1270:
1935b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1850:
1936b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1290:
1937b285192aSMauro Carvalho Chehab 		cx23885_irq_remove(dev, PCI_MSK_IR);
1938b285192aSMauro Carvalho Chehab 		cx23888_ir_remove(dev);
1939b285192aSMauro Carvalho Chehab 		dev->sd_ir = NULL;
1940b285192aSMauro Carvalho Chehab 		break;
1941b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
1942b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TEVII_S470:
1943b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1250:
1944e5f670b7SAlfredo Jesús Delaiti 	case CX23885_BOARD_MYGICA_X8507:
1945e6001482SLuis Alves 	case CX23885_BOARD_TBS_6980:
1946e6001482SLuis Alves 	case CX23885_BOARD_TBS_6981:
1947d11a3835Snibble.max 	case CX23885_BOARD_DVBSKY_T9580:
1948070e6661Snibble.max 	case CX23885_BOARD_DVBSKY_T980C:
1949070e6661Snibble.max 	case CX23885_BOARD_DVBSKY_S950C:
195061b103e8SOlli Salonen 	case CX23885_BOARD_TT_CT2_4500_CI:
1951cba5480cSnibble.max 	case CX23885_BOARD_DVBSKY_S950:
1952c29d6a83Snibble.max 	case CX23885_BOARD_DVBSKY_S952:
1953c02ef64aSNibble Max 	case CX23885_BOARD_DVBSKY_T982:
1954b285192aSMauro Carvalho Chehab 		cx23885_irq_remove(dev, PCI_MSK_AV_CORE);
1955b285192aSMauro Carvalho Chehab 		/* sd_ir is a duplicate pointer to the AV Core, just clear it */
1956b285192aSMauro Carvalho Chehab 		dev->sd_ir = NULL;
1957b285192aSMauro Carvalho Chehab 		break;
1958b285192aSMauro Carvalho Chehab 	}
1959b285192aSMauro Carvalho Chehab }
1960b285192aSMauro Carvalho Chehab 
1961ada73eeeSMauro Carvalho Chehab static int netup_jtag_io(void *device, int tms, int tdi, int read_tdo)
1962b285192aSMauro Carvalho Chehab {
1963b285192aSMauro Carvalho Chehab 	int data;
1964b285192aSMauro Carvalho Chehab 	int tdo = 0;
1965b285192aSMauro Carvalho Chehab 	struct cx23885_dev *dev = (struct cx23885_dev *)device;
1966b285192aSMauro Carvalho Chehab 	/*TMS*/
1967b285192aSMauro Carvalho Chehab 	data = ((cx_read(GP0_IO)) & (~0x00000002));
1968b285192aSMauro Carvalho Chehab 	data |= (tms ? 0x00020002 : 0x00020000);
1969b285192aSMauro Carvalho Chehab 	cx_write(GP0_IO, data);
1970b285192aSMauro Carvalho Chehab 
1971b285192aSMauro Carvalho Chehab 	/*TDI*/
1972b285192aSMauro Carvalho Chehab 	data = ((cx_read(MC417_RWD)) & (~0x0000a000));
1973b285192aSMauro Carvalho Chehab 	data |= (tdi ? 0x00008000 : 0);
1974b285192aSMauro Carvalho Chehab 	cx_write(MC417_RWD, data);
1975b285192aSMauro Carvalho Chehab 	if (read_tdo)
1976b285192aSMauro Carvalho Chehab 		tdo = (data & 0x00004000) ? 1 : 0; /*TDO*/
1977b285192aSMauro Carvalho Chehab 
1978b285192aSMauro Carvalho Chehab 	cx_write(MC417_RWD, data | 0x00002000);
1979b285192aSMauro Carvalho Chehab 	udelay(1);
1980b285192aSMauro Carvalho Chehab 	/*TCK*/
1981b285192aSMauro Carvalho Chehab 	cx_write(MC417_RWD, data);
1982b285192aSMauro Carvalho Chehab 
1983b285192aSMauro Carvalho Chehab 	return tdo;
1984b285192aSMauro Carvalho Chehab }
1985b285192aSMauro Carvalho Chehab 
1986b285192aSMauro Carvalho Chehab void cx23885_ir_pci_int_enable(struct cx23885_dev *dev)
1987b285192aSMauro Carvalho Chehab {
1988b285192aSMauro Carvalho Chehab 	switch (dev->board) {
1989b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1270:
1990b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1850:
1991b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1290:
1992b285192aSMauro Carvalho Chehab 		if (dev->sd_ir)
1993b285192aSMauro Carvalho Chehab 			cx23885_irq_add_enable(dev, PCI_MSK_IR);
1994b285192aSMauro Carvalho Chehab 		break;
1995b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
1996b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TEVII_S470:
1997b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1250:
1998e5f670b7SAlfredo Jesús Delaiti 	case CX23885_BOARD_MYGICA_X8507:
1999e6001482SLuis Alves 	case CX23885_BOARD_TBS_6980:
2000e6001482SLuis Alves 	case CX23885_BOARD_TBS_6981:
2001d11a3835Snibble.max 	case CX23885_BOARD_DVBSKY_T9580:
2002070e6661Snibble.max 	case CX23885_BOARD_DVBSKY_T980C:
2003070e6661Snibble.max 	case CX23885_BOARD_DVBSKY_S950C:
200461b103e8SOlli Salonen 	case CX23885_BOARD_TT_CT2_4500_CI:
2005cba5480cSnibble.max 	case CX23885_BOARD_DVBSKY_S950:
2006c29d6a83Snibble.max 	case CX23885_BOARD_DVBSKY_S952:
2007c02ef64aSNibble Max 	case CX23885_BOARD_DVBSKY_T982:
2008b285192aSMauro Carvalho Chehab 		if (dev->sd_ir)
2009b285192aSMauro Carvalho Chehab 			cx23885_irq_add_enable(dev, PCI_MSK_AV_CORE);
2010b285192aSMauro Carvalho Chehab 		break;
2011b285192aSMauro Carvalho Chehab 	}
2012b285192aSMauro Carvalho Chehab }
2013b285192aSMauro Carvalho Chehab 
2014b285192aSMauro Carvalho Chehab void cx23885_card_setup(struct cx23885_dev *dev)
2015b285192aSMauro Carvalho Chehab {
2016b285192aSMauro Carvalho Chehab 	struct cx23885_tsport *ts1 = &dev->ts1;
2017b285192aSMauro Carvalho Chehab 	struct cx23885_tsport *ts2 = &dev->ts2;
2018b285192aSMauro Carvalho Chehab 
2019b285192aSMauro Carvalho Chehab 	static u8 eeprom[256];
2020b285192aSMauro Carvalho Chehab 
2021b285192aSMauro Carvalho Chehab 	if (dev->i2c_bus[0].i2c_rc == 0) {
2022b285192aSMauro Carvalho Chehab 		dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1;
2023b285192aSMauro Carvalho Chehab 		tveeprom_read(&dev->i2c_bus[0].i2c_client,
2024b285192aSMauro Carvalho Chehab 			      eeprom, sizeof(eeprom));
2025b285192aSMauro Carvalho Chehab 	}
2026b285192aSMauro Carvalho Chehab 
2027b285192aSMauro Carvalho Chehab 	switch (dev->board) {
2028b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1250:
2029b285192aSMauro Carvalho Chehab 		if (dev->i2c_bus[0].i2c_rc == 0) {
2030b285192aSMauro Carvalho Chehab 			if (eeprom[0x80] != 0x84)
2031b285192aSMauro Carvalho Chehab 				hauppauge_eeprom(dev, eeprom+0xc0);
2032b285192aSMauro Carvalho Chehab 			else
2033b285192aSMauro Carvalho Chehab 				hauppauge_eeprom(dev, eeprom+0x80);
2034b285192aSMauro Carvalho Chehab 		}
2035b285192aSMauro Carvalho Chehab 		break;
2036b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500:
2037b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
2038b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1400:
2039b285192aSMauro Carvalho Chehab 		if (dev->i2c_bus[0].i2c_rc == 0)
2040b285192aSMauro Carvalho Chehab 			hauppauge_eeprom(dev, eeprom+0x80);
2041b285192aSMauro Carvalho Chehab 		break;
2042b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1800:
2043b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
2044b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1200:
2045b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1700:
2046b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1270:
2047b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1275:
2048b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255:
2049b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
2050b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1210:
2051b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1850:
2052b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1290:
20537c62f5a1SMichael Krufky 	case CX23885_BOARD_HAUPPAUGE_HVR4400:
2054721f3223SMatthias Schwarzott 	case CX23885_BOARD_HAUPPAUGE_STARBURST:
2055cce11b09SHans Verkuil 	case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
20561fc77d01SAntti Palosaari 	case CX23885_BOARD_HAUPPAUGE_HVR5525:
205710a5210eSStephen Backway 	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
2058dd9ad4fbSStephen Backway 	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
2059b285192aSMauro Carvalho Chehab 		if (dev->i2c_bus[0].i2c_rc == 0)
2060b285192aSMauro Carvalho Chehab 			hauppauge_eeprom(dev, eeprom+0xc0);
2061b285192aSMauro Carvalho Chehab 		break;
20626c43a217SHans Verkuil 	case CX23885_BOARD_VIEWCAST_260E:
20636c43a217SHans Verkuil 	case CX23885_BOARD_VIEWCAST_460E:
20646c43a217SHans Verkuil 		dev->i2c_bus[1].i2c_client.addr = 0xa0 >> 1;
20656c43a217SHans Verkuil 		tveeprom_read(&dev->i2c_bus[1].i2c_client,
20666c43a217SHans Verkuil 			      eeprom, sizeof(eeprom));
20676c43a217SHans Verkuil 		if (dev->i2c_bus[0].i2c_rc == 0)
20686c43a217SHans Verkuil 			viewcast_eeprom(dev, eeprom);
20696c43a217SHans Verkuil 		break;
2070b285192aSMauro Carvalho Chehab 	}
2071b285192aSMauro Carvalho Chehab 
2072b285192aSMauro Carvalho Chehab 	switch (dev->board) {
2073e8d42373SOleh Kravchenko 	case CX23885_BOARD_AVERMEDIA_HC81R:
2074e8d42373SOleh Kravchenko 		/* Defaults for VID B */
2075e8d42373SOleh Kravchenko 		ts1->gen_ctrl_val  = 0x4; /* Parallel */
2076e8d42373SOleh Kravchenko 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2077e8d42373SOleh Kravchenko 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2078e8d42373SOleh Kravchenko 		/* Defaults for VID C */
2079e8d42373SOleh Kravchenko 		/* DREQ_POL, SMODE, PUNC_CLK, MCLK_POL Serial bus + punc clk */
2080e8d42373SOleh Kravchenko 		ts2->gen_ctrl_val  = 0x10e;
2081e8d42373SOleh Kravchenko 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2082e8d42373SOleh Kravchenko 		ts2->src_sel_val     = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2083e8d42373SOleh Kravchenko 		break;
2084b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
2085b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
208646b21bbaSJames Harper 	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
2087b285192aSMauro Carvalho Chehab 		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2088b285192aSMauro Carvalho Chehab 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2089b285192aSMauro Carvalho Chehab 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
209006eeefe8SMauro Carvalho Chehab 		/* fall-through */
2091b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
2092b285192aSMauro Carvalho Chehab 		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2093b285192aSMauro Carvalho Chehab 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2094b285192aSMauro Carvalho Chehab 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2095b285192aSMauro Carvalho Chehab 		break;
2096b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1850:
2097b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1800:
2098b285192aSMauro Carvalho Chehab 		/* Defaults for VID B - Analog encoder */
2099b285192aSMauro Carvalho Chehab 		/* DREQ_POL, SMODE, PUNC_CLK, MCLK_POL Serial bus + punc clk */
2100b285192aSMauro Carvalho Chehab 		ts1->gen_ctrl_val    = 0x10e;
2101b285192aSMauro Carvalho Chehab 		ts1->ts_clk_en_val   = 0x1; /* Enable TS_CLK */
2102b285192aSMauro Carvalho Chehab 		ts1->src_sel_val     = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2103b285192aSMauro Carvalho Chehab 
2104b285192aSMauro Carvalho Chehab 		/* APB_TSVALERR_POL (active low)*/
2105b285192aSMauro Carvalho Chehab 		ts1->vld_misc_val    = 0x2000;
2106b285192aSMauro Carvalho Chehab 		ts1->hw_sop_ctrl_val = (0x47 << 16 | 188 << 4 | 0xc);
2107b285192aSMauro Carvalho Chehab 		cx_write(0x130184, 0xc);
2108b285192aSMauro Carvalho Chehab 
2109b285192aSMauro Carvalho Chehab 		/* Defaults for VID C */
2110b285192aSMauro Carvalho Chehab 		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2111b285192aSMauro Carvalho Chehab 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2112b285192aSMauro Carvalho Chehab 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2113b285192aSMauro Carvalho Chehab 		break;
2114b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TBS_6920:
2115b285192aSMauro Carvalho Chehab 		ts1->gen_ctrl_val  = 0x4; /* Parallel */
2116b285192aSMauro Carvalho Chehab 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2117b285192aSMauro Carvalho Chehab 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2118b285192aSMauro Carvalho Chehab 		break;
2119b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TEVII_S470:
2120b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TEVII_S471:
2121b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_DVBWORLD_2005:
2122f667190bSMariusz Bia?o?czyk 	case CX23885_BOARD_PROF_8000:
212382c10276SOlli Salonen 	case CX23885_BOARD_DVBSKY_T980C:
21240e6c7b01Snibble.max 	case CX23885_BOARD_DVBSKY_S950C:
212561b103e8SOlli Salonen 	case CX23885_BOARD_TT_CT2_4500_CI:
2126cba5480cSnibble.max 	case CX23885_BOARD_DVBSKY_S950:
2127b285192aSMauro Carvalho Chehab 		ts1->gen_ctrl_val  = 0x5; /* Parallel */
2128b285192aSMauro Carvalho Chehab 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2129b285192aSMauro Carvalho Chehab 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2130b285192aSMauro Carvalho Chehab 		break;
2131b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
2132b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
2133b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
2134b285192aSMauro Carvalho Chehab 		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2135b285192aSMauro Carvalho Chehab 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2136b285192aSMauro Carvalho Chehab 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2137b285192aSMauro Carvalho Chehab 		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2138b285192aSMauro Carvalho Chehab 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2139b285192aSMauro Carvalho Chehab 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2140b285192aSMauro Carvalho Chehab 		break;
2141e6001482SLuis Alves 	case CX23885_BOARD_TBS_6980:
2142e6001482SLuis Alves 	case CX23885_BOARD_TBS_6981:
2143e6001482SLuis Alves 		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2144e6001482SLuis Alves 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2145e6001482SLuis Alves 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2146e6001482SLuis Alves 		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2147e6001482SLuis Alves 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2148e6001482SLuis Alves 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2149e6001482SLuis Alves 		tbs_card_init(dev);
2150e6001482SLuis Alves 		break;
2151b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MYGICA_X8506:
2152b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
21530d1b5265SMauro Carvalho Chehab 	case CX23885_BOARD_MYGICA_X8507:
2154b285192aSMauro Carvalho Chehab 		ts1->gen_ctrl_val  = 0x5; /* Parallel */
2155b285192aSMauro Carvalho Chehab 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2156b285192aSMauro Carvalho Chehab 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2157b285192aSMauro Carvalho Chehab 		break;
2158b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MYGICA_X8558PRO:
2159b285192aSMauro Carvalho Chehab 		ts1->gen_ctrl_val  = 0x5; /* Parallel */
2160b285192aSMauro Carvalho Chehab 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2161b285192aSMauro Carvalho Chehab 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2162b285192aSMauro Carvalho Chehab 		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2163b285192aSMauro Carvalho Chehab 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2164b285192aSMauro Carvalho Chehab 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2165b285192aSMauro Carvalho Chehab 		break;
21667c62f5a1SMichael Krufky 	case CX23885_BOARD_HAUPPAUGE_HVR4400:
21677c62f5a1SMichael Krufky 		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
21687c62f5a1SMichael Krufky 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
21697c62f5a1SMichael Krufky 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
217036efec48SMatthias Schwarzott 		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
217136efec48SMatthias Schwarzott 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
217236efec48SMatthias Schwarzott 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
21737c62f5a1SMichael Krufky 		break;
2174721f3223SMatthias Schwarzott 	case CX23885_BOARD_HAUPPAUGE_STARBURST:
2175721f3223SMatthias Schwarzott 		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2176721f3223SMatthias Schwarzott 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2177721f3223SMatthias Schwarzott 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2178721f3223SMatthias Schwarzott 		break;
217929442266SOlli Salonen 	case CX23885_BOARD_DVBSKY_T9580:
2180c02ef64aSNibble Max 	case CX23885_BOARD_DVBSKY_T982:
218129442266SOlli Salonen 		ts1->gen_ctrl_val  = 0x5; /* Parallel */
218229442266SOlli Salonen 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
218329442266SOlli Salonen 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
218429442266SOlli Salonen 		ts2->gen_ctrl_val  = 0x8; /* Serial bus */
218529442266SOlli Salonen 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
218629442266SOlli Salonen 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
218729442266SOlli Salonen 		break;
2188c29d6a83Snibble.max 	case CX23885_BOARD_DVBSKY_S952:
2189c29d6a83Snibble.max 		ts1->gen_ctrl_val  = 0x5; /* Parallel */
2190c29d6a83Snibble.max 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2191c29d6a83Snibble.max 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2192c29d6a83Snibble.max 		ts2->gen_ctrl_val  = 0xe; /* Serial bus */
2193c29d6a83Snibble.max 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2194c29d6a83Snibble.max 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2195c29d6a83Snibble.max 		break;
21961fc77d01SAntti Palosaari 	case CX23885_BOARD_HAUPPAUGE_HVR5525:
21971fc77d01SAntti Palosaari 		ts1->gen_ctrl_val  = 0x5; /* Parallel */
21981fc77d01SAntti Palosaari 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
21991fc77d01SAntti Palosaari 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
22001fc77d01SAntti Palosaari 		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
22011fc77d01SAntti Palosaari 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
22021fc77d01SAntti Palosaari 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
22031fc77d01SAntti Palosaari 		break;
220410a5210eSStephen Backway 	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
2205dd9ad4fbSStephen Backway 	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
220610a5210eSStephen Backway 		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
220710a5210eSStephen Backway 		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
220810a5210eSStephen Backway 		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
220910a5210eSStephen Backway 		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
221010a5210eSStephen Backway 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
221110a5210eSStephen Backway 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
221210a5210eSStephen Backway 		break;
2213b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1250:
2214b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500:
2215b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
2216b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
2217b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1200:
2218b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1700:
2219b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1400:
2220cce11b09SHans Verkuil 	case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
2221b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
2222642ca1a0SAnca Emanuel 	case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
2223b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
2224b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
2225b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1270:
2226b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1275:
2227b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255:
2228b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
2229b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1210:
2230b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
2231b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1290:
2232b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
2233b285192aSMauro Carvalho Chehab 	default:
2234b285192aSMauro Carvalho Chehab 		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
2235b285192aSMauro Carvalho Chehab 		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
2236b285192aSMauro Carvalho Chehab 		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
2237b285192aSMauro Carvalho Chehab 	}
2238b285192aSMauro Carvalho Chehab 
2239b285192aSMauro Carvalho Chehab 	/* Certain boards support analog, or require the avcore to be
2240b285192aSMauro Carvalho Chehab 	 * loaded, ensure this happens.
2241b285192aSMauro Carvalho Chehab 	 */
2242b285192aSMauro Carvalho Chehab 	switch (dev->board) {
2243b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TEVII_S470:
2244b285192aSMauro Carvalho Chehab 		/* Currently only enabled for the integrated IR controller */
2245b285192aSMauro Carvalho Chehab 		if (!enable_885_ir)
2246b285192aSMauro Carvalho Chehab 			break;
224706eeefe8SMauro Carvalho Chehab 		/* fall-through */
2248b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1250:
2249b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1800:
2250cce11b09SHans Verkuil 	case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
2251b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
2252b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1700:
2253b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
2254642ca1a0SAnca Emanuel 	case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
2255b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
2256b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
2257b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
2258b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
2259b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
2260b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255:
2261b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
2262b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1270:
2263b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1850:
2264b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MYGICA_X8506:
2265b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
2266b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1290:
2267b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
2268b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
2269b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_HAUPPAUGE_HVR1500:
2270b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MPX885:
2271b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_MYGICA_X8507:
2272b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
2273e8d42373SOleh Kravchenko 	case CX23885_BOARD_AVERMEDIA_HC81R:
2274e6001482SLuis Alves 	case CX23885_BOARD_TBS_6980:
2275e6001482SLuis Alves 	case CX23885_BOARD_TBS_6981:
227629442266SOlli Salonen 	case CX23885_BOARD_DVBSKY_T9580:
227782c10276SOlli Salonen 	case CX23885_BOARD_DVBSKY_T980C:
22780e6c7b01Snibble.max 	case CX23885_BOARD_DVBSKY_S950C:
227961b103e8SOlli Salonen 	case CX23885_BOARD_TT_CT2_4500_CI:
2280cba5480cSnibble.max 	case CX23885_BOARD_DVBSKY_S950:
2281c29d6a83Snibble.max 	case CX23885_BOARD_DVBSKY_S952:
2282c02ef64aSNibble Max 	case CX23885_BOARD_DVBSKY_T982:
22836c43a217SHans Verkuil 	case CX23885_BOARD_VIEWCAST_260E:
22846c43a217SHans Verkuil 	case CX23885_BOARD_VIEWCAST_460E:
2285b285192aSMauro Carvalho Chehab 		dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
2286b285192aSMauro Carvalho Chehab 				&dev->i2c_bus[2].i2c_adap,
2287b285192aSMauro Carvalho Chehab 				"cx25840", 0x88 >> 1, NULL);
2288b285192aSMauro Carvalho Chehab 		if (dev->sd_cx25840) {
2289b285192aSMauro Carvalho Chehab 			dev->sd_cx25840->grp_id = CX23885_HW_AV_CORE;
2290b285192aSMauro Carvalho Chehab 			v4l2_subdev_call(dev->sd_cx25840, core, load_fw);
2291b285192aSMauro Carvalho Chehab 		}
2292b285192aSMauro Carvalho Chehab 		break;
2293b285192aSMauro Carvalho Chehab 	}
2294b285192aSMauro Carvalho Chehab 
22956c43a217SHans Verkuil 	switch (dev->board) {
22966c43a217SHans Verkuil 	case CX23885_BOARD_VIEWCAST_260E:
22976c43a217SHans Verkuil 		v4l2_i2c_new_subdev(&dev->v4l2_dev,
22986c43a217SHans Verkuil 				&dev->i2c_bus[0].i2c_adap,
22996c43a217SHans Verkuil 				"cs3308", 0x82 >> 1, NULL);
23006c43a217SHans Verkuil 		break;
23016c43a217SHans Verkuil 	case CX23885_BOARD_VIEWCAST_460E:
23026c43a217SHans Verkuil 		/* This cs3308 controls the audio from the breakout cable */
23036c43a217SHans Verkuil 		v4l2_i2c_new_subdev(&dev->v4l2_dev,
23046c43a217SHans Verkuil 				&dev->i2c_bus[0].i2c_adap,
23056c43a217SHans Verkuil 				"cs3308", 0x80 >> 1, NULL);
23066c43a217SHans Verkuil 		/* This cs3308 controls the audio from the onboard header */
23076c43a217SHans Verkuil 		v4l2_i2c_new_subdev(&dev->v4l2_dev,
23086c43a217SHans Verkuil 				&dev->i2c_bus[0].i2c_adap,
23096c43a217SHans Verkuil 				"cs3308", 0x82 >> 1, NULL);
23106c43a217SHans Verkuil 		break;
23116c43a217SHans Verkuil 	}
23126c43a217SHans Verkuil 
2313b285192aSMauro Carvalho Chehab 	/* AUX-PLL 27MHz CLK */
2314b285192aSMauro Carvalho Chehab 	switch (dev->board) {
2315b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
2316b285192aSMauro Carvalho Chehab 		netup_initialize(dev);
2317b285192aSMauro Carvalho Chehab 		break;
2318b285192aSMauro Carvalho Chehab 	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF: {
2319b285192aSMauro Carvalho Chehab 		int ret;
2320b285192aSMauro Carvalho Chehab 		const struct firmware *fw;
2321b285192aSMauro Carvalho Chehab 		const char *filename = "dvb-netup-altera-01.fw";
2322b285192aSMauro Carvalho Chehab 		char *action = "configure";
2323b285192aSMauro Carvalho Chehab 		static struct netup_card_info cinfo;
2324b285192aSMauro Carvalho Chehab 		struct altera_config netup_config = {
2325b285192aSMauro Carvalho Chehab 			.dev = dev,
2326b285192aSMauro Carvalho Chehab 			.action = action,
2327b285192aSMauro Carvalho Chehab 			.jtag_io = netup_jtag_io,
2328b285192aSMauro Carvalho Chehab 		};
2329b285192aSMauro Carvalho Chehab 
2330b285192aSMauro Carvalho Chehab 		netup_initialize(dev);
2331b285192aSMauro Carvalho Chehab 
2332b285192aSMauro Carvalho Chehab 		netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo);
2333b285192aSMauro Carvalho Chehab 		if (netup_card_rev)
2334b285192aSMauro Carvalho Chehab 			cinfo.rev = netup_card_rev;
2335b285192aSMauro Carvalho Chehab 
2336b285192aSMauro Carvalho Chehab 		switch (cinfo.rev) {
2337b285192aSMauro Carvalho Chehab 		case 0x4:
2338b285192aSMauro Carvalho Chehab 			filename = "dvb-netup-altera-04.fw";
2339b285192aSMauro Carvalho Chehab 			break;
2340b285192aSMauro Carvalho Chehab 		default:
2341b285192aSMauro Carvalho Chehab 			filename = "dvb-netup-altera-01.fw";
2342b285192aSMauro Carvalho Chehab 			break;
2343b285192aSMauro Carvalho Chehab 		}
2344e39682b5SMauro Carvalho Chehab 		pr_info("NetUP card rev=0x%x fw_filename=%s\n",
2345b285192aSMauro Carvalho Chehab 			cinfo.rev, filename);
2346b285192aSMauro Carvalho Chehab 
2347b285192aSMauro Carvalho Chehab 		ret = request_firmware(&fw, filename, &dev->pci->dev);
2348b285192aSMauro Carvalho Chehab 		if (ret != 0)
2349e39682b5SMauro Carvalho Chehab 			pr_err("did not find the firmware file. (%s) Please see linux/Documentation/dvb/ for more details on firmware-problems.",
235007ab29e1SMauro Carvalho Chehab 			       filename);
2351b285192aSMauro Carvalho Chehab 		else
2352b285192aSMauro Carvalho Chehab 			altera_init(&netup_config, fw);
2353b285192aSMauro Carvalho Chehab 
2354b285192aSMauro Carvalho Chehab 		release_firmware(fw);
2355b285192aSMauro Carvalho Chehab 		break;
2356b285192aSMauro Carvalho Chehab 	}
2357b285192aSMauro Carvalho Chehab 	}
2358b285192aSMauro Carvalho Chehab }
2359