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