xref: /linux/drivers/media/pci/saa7164/saa7164-cards.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*c942fddfSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2443c1228SSteven Toth /*
3443c1228SSteven Toth  *  Driver for the NXP SAA7164 PCIe bridge
4443c1228SSteven Toth  *
563a412ecSSteven Toth  *  Copyright (c) 2010-2015 Steven Toth <stoth@kernellabs.com>
6443c1228SSteven Toth  */
7443c1228SSteven Toth 
8443c1228SSteven Toth #include <linux/init.h>
9443c1228SSteven Toth #include <linux/module.h>
10443c1228SSteven Toth #include <linux/pci.h>
11443c1228SSteven Toth #include <linux/delay.h>
12443c1228SSteven Toth 
13443c1228SSteven Toth #include "saa7164.h"
14443c1228SSteven Toth 
15443c1228SSteven Toth /* The Bridge API needs to understand register widths (in bytes) for the
16443c1228SSteven Toth  * attached I2C devices, so we can simplify the virtual i2c mechansms
17443c1228SSteven Toth  * and keep the -i2c.c implementation clean.
18443c1228SSteven Toth  */
19504b29cbSSteven Toth #define REGLEN_0bit	0
20443c1228SSteven Toth #define REGLEN_8bit	1
21443c1228SSteven Toth #define REGLEN_16bit	2
22443c1228SSteven Toth 
23443c1228SSteven Toth struct saa7164_board saa7164_boards[] = {
24443c1228SSteven Toth 	[SAA7164_BOARD_UNKNOWN] = {
25443c1228SSteven Toth 		/* Bridge will not load any firmware, without knowing
26443c1228SSteven Toth 		 * the rev this would be fatal. */
27443c1228SSteven Toth 		.name		= "Unknown",
28443c1228SSteven Toth 	},
29443c1228SSteven Toth 	[SAA7164_BOARD_UNKNOWN_REV2] = {
30443c1228SSteven Toth 		/* Bridge will load the v2 f/w and dump descriptors */
31443c1228SSteven Toth 		/* Required during new board bringup */
32443c1228SSteven Toth 		.name		= "Generic Rev2",
33443c1228SSteven Toth 		.chiprev	= SAA7164_CHIP_REV2,
34443c1228SSteven Toth 	},
35443c1228SSteven Toth 	[SAA7164_BOARD_UNKNOWN_REV3] = {
36443c1228SSteven Toth 		/* Bridge will load the v2 f/w and dump descriptors */
37443c1228SSteven Toth 		/* Required during new board bringup */
38443c1228SSteven Toth 		.name		= "Generic Rev3",
39443c1228SSteven Toth 		.chiprev	= SAA7164_CHIP_REV3,
40443c1228SSteven Toth 	},
41443c1228SSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2200] = {
42443c1228SSteven Toth 		.name		= "Hauppauge WinTV-HVR2200",
43443c1228SSteven Toth 		.porta		= SAA7164_MPEG_DVB,
44443c1228SSteven Toth 		.portb		= SAA7164_MPEG_DVB,
457615e434SSteven Toth 		.portc		= SAA7164_MPEG_ENCODER,
467615e434SSteven Toth 		.portd		= SAA7164_MPEG_ENCODER,
47e8ce2f21SSteven Toth 		.porte		= SAA7164_MPEG_VBI,
48e8ce2f21SSteven Toth 		.portf		= SAA7164_MPEG_VBI,
49443c1228SSteven Toth 		.chiprev	= SAA7164_CHIP_REV3,
50443c1228SSteven Toth 		.unit		= {{
5130015c1eSSteven Toth 			.id		= 0x1d,
52443c1228SSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
53443c1228SSteven Toth 			.name		= "4K EEPROM",
54443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
55443c1228SSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
56443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
57443c1228SSteven Toth 		}, {
58443c1228SSteven Toth 			.id		= 0x04,
59443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
60443c1228SSteven Toth 			.name		= "TDA18271-1",
61443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
62443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
63443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
64443c1228SSteven Toth 		}, {
65443c1228SSteven Toth 			.id		= 0x1b,
66443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
67443c1228SSteven Toth 			.name		= "TDA18271-2",
68443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
69443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
70443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
71443c1228SSteven Toth 		}, {
72443c1228SSteven Toth 			.id		= 0x1e,
73443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
74443c1228SSteven Toth 			.name		= "TDA10048-1",
75443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
76443c1228SSteven Toth 			.i2c_bus_addr	= 0x10 >> 1,
77443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
78443c1228SSteven Toth 		}, {
79443c1228SSteven Toth 			.id		= 0x1f,
80443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
81443c1228SSteven Toth 			.name		= "TDA10048-2",
82443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
83443c1228SSteven Toth 			.i2c_bus_addr	= 0x12 >> 1,
84443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
85443c1228SSteven Toth 		} },
86443c1228SSteven Toth 	},
87443c1228SSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2200_2] = {
88443c1228SSteven Toth 		.name		= "Hauppauge WinTV-HVR2200",
89443c1228SSteven Toth 		.porta		= SAA7164_MPEG_DVB,
90443c1228SSteven Toth 		.portb		= SAA7164_MPEG_DVB,
917615e434SSteven Toth 		.portc		= SAA7164_MPEG_ENCODER,
927615e434SSteven Toth 		.portd		= SAA7164_MPEG_ENCODER,
93e8ce2f21SSteven Toth 		.porte		= SAA7164_MPEG_VBI,
94e8ce2f21SSteven Toth 		.portf		= SAA7164_MPEG_VBI,
95443c1228SSteven Toth 		.chiprev	= SAA7164_CHIP_REV2,
96443c1228SSteven Toth 		.unit		= {{
97443c1228SSteven Toth 			.id		= 0x06,
98443c1228SSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
99443c1228SSteven Toth 			.name		= "4K EEPROM",
100443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
101443c1228SSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
102443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
103443c1228SSteven Toth 		}, {
104443c1228SSteven Toth 			.id		= 0x04,
105443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
106443c1228SSteven Toth 			.name		= "TDA18271-1",
107443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
108443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
109443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
110443c1228SSteven Toth 		}, {
111443c1228SSteven Toth 			.id		= 0x05,
112443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
113443c1228SSteven Toth 			.name		= "TDA10048-1",
114443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
115443c1228SSteven Toth 			.i2c_bus_addr	= 0x10 >> 1,
116443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
117443c1228SSteven Toth 		}, {
118443c1228SSteven Toth 			.id		= 0x1e,
119443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
120443c1228SSteven Toth 			.name		= "TDA18271-2",
121443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
122443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
123443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
124443c1228SSteven Toth 		}, {
125443c1228SSteven Toth 			.id		= 0x1f,
126443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
127443c1228SSteven Toth 			.name		= "TDA10048-2",
128443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
129443c1228SSteven Toth 			.i2c_bus_addr	= 0x12 >> 1,
130443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
131443c1228SSteven Toth 		} },
132443c1228SSteven Toth 	},
133443c1228SSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2200_3] = {
134443c1228SSteven Toth 		.name		= "Hauppauge WinTV-HVR2200",
135443c1228SSteven Toth 		.porta		= SAA7164_MPEG_DVB,
136443c1228SSteven Toth 		.portb		= SAA7164_MPEG_DVB,
1377615e434SSteven Toth 		.portc		= SAA7164_MPEG_ENCODER,
1387615e434SSteven Toth 		.portd		= SAA7164_MPEG_ENCODER,
139e8ce2f21SSteven Toth 		.porte		= SAA7164_MPEG_VBI,
140e8ce2f21SSteven Toth 		.portf		= SAA7164_MPEG_VBI,
141443c1228SSteven Toth 		.chiprev	= SAA7164_CHIP_REV2,
142443c1228SSteven Toth 		.unit		= {{
14330015c1eSSteven Toth 			.id		= 0x1d,
144443c1228SSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
145443c1228SSteven Toth 			.name		= "4K EEPROM",
146443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
147443c1228SSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
148443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
149443c1228SSteven Toth 		}, {
150443c1228SSteven Toth 			.id		= 0x04,
151443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
152443c1228SSteven Toth 			.name		= "TDA18271-1",
153443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
154443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
155443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
156443c1228SSteven Toth 		}, {
157443c1228SSteven Toth 			.id		= 0x05,
158443c1228SSteven Toth 			.type		= SAA7164_UNIT_ANALOG_DEMODULATOR,
159443c1228SSteven Toth 			.name		= "TDA8290-1",
160443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
161443c1228SSteven Toth 			.i2c_bus_addr	= 0x84 >> 1,
162443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
163443c1228SSteven Toth 		}, {
164443c1228SSteven Toth 			.id		= 0x1b,
165443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
166443c1228SSteven Toth 			.name		= "TDA18271-2",
167443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
168443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
169443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
170443c1228SSteven Toth 		}, {
171443c1228SSteven Toth 			.id		= 0x1c,
172443c1228SSteven Toth 			.type		= SAA7164_UNIT_ANALOG_DEMODULATOR,
173443c1228SSteven Toth 			.name		= "TDA8290-2",
174443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
175443c1228SSteven Toth 			.i2c_bus_addr	= 0x84 >> 1,
176443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
177443c1228SSteven Toth 		}, {
178443c1228SSteven Toth 			.id		= 0x1e,
179443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
180443c1228SSteven Toth 			.name		= "TDA10048-1",
181443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
182443c1228SSteven Toth 			.i2c_bus_addr	= 0x10 >> 1,
183443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
184443c1228SSteven Toth 		}, {
185443c1228SSteven Toth 			.id		= 0x1f,
186443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
187443c1228SSteven Toth 			.name		= "TDA10048-2",
188443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
189443c1228SSteven Toth 			.i2c_bus_addr	= 0x12 >> 1,
190443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
191443c1228SSteven Toth 		} },
192443c1228SSteven Toth 	},
19362dd28d0STony Jago 	[SAA7164_BOARD_HAUPPAUGE_HVR2200_4] = {
19462dd28d0STony Jago 		.name		= "Hauppauge WinTV-HVR2200",
19562dd28d0STony Jago 		.porta		= SAA7164_MPEG_DVB,
19662dd28d0STony Jago 		.portb		= SAA7164_MPEG_DVB,
19762dd28d0STony Jago 		.portc		= SAA7164_MPEG_ENCODER,
19862dd28d0STony Jago 		.portd		= SAA7164_MPEG_ENCODER,
19962dd28d0STony Jago 		.porte		= SAA7164_MPEG_VBI,
20062dd28d0STony Jago 		.portf		= SAA7164_MPEG_VBI,
20162dd28d0STony Jago 		.chiprev	= SAA7164_CHIP_REV3,
20262dd28d0STony Jago 		.unit		= {{
20362dd28d0STony Jago 			.id		= 0x1d,
20462dd28d0STony Jago 			.type		= SAA7164_UNIT_EEPROM,
20562dd28d0STony Jago 			.name		= "4K EEPROM",
20662dd28d0STony Jago 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
20762dd28d0STony Jago 			.i2c_bus_addr	= 0xa0 >> 1,
20862dd28d0STony Jago 			.i2c_reg_len	= REGLEN_8bit,
20962dd28d0STony Jago 		}, {
21062dd28d0STony Jago 			.id		= 0x04,
21162dd28d0STony Jago 			.type		= SAA7164_UNIT_TUNER,
21262dd28d0STony Jago 			.name		= "TDA18271-1",
21362dd28d0STony Jago 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
21462dd28d0STony Jago 			.i2c_bus_addr	= 0xc0 >> 1,
21562dd28d0STony Jago 			.i2c_reg_len	= REGLEN_8bit,
21662dd28d0STony Jago 		}, {
21762dd28d0STony Jago 			.id		= 0x05,
21862dd28d0STony Jago 			.type		= SAA7164_UNIT_ANALOG_DEMODULATOR,
21962dd28d0STony Jago 			.name		= "TDA8290-1",
22062dd28d0STony Jago 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
22162dd28d0STony Jago 			.i2c_bus_addr	= 0x84 >> 1,
22262dd28d0STony Jago 			.i2c_reg_len	= REGLEN_8bit,
22362dd28d0STony Jago 		}, {
22462dd28d0STony Jago 			.id		= 0x1b,
22562dd28d0STony Jago 			.type		= SAA7164_UNIT_TUNER,
22662dd28d0STony Jago 			.name		= "TDA18271-2",
22762dd28d0STony Jago 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
22862dd28d0STony Jago 			.i2c_bus_addr	= 0xc0 >> 1,
22962dd28d0STony Jago 			.i2c_reg_len	= REGLEN_8bit,
23062dd28d0STony Jago 		}, {
23162dd28d0STony Jago 			.id		= 0x1c,
23262dd28d0STony Jago 			.type		= SAA7164_UNIT_ANALOG_DEMODULATOR,
23362dd28d0STony Jago 			.name		= "TDA8290-2",
23462dd28d0STony Jago 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
23562dd28d0STony Jago 			.i2c_bus_addr	= 0x84 >> 1,
23662dd28d0STony Jago 			.i2c_reg_len	= REGLEN_8bit,
23762dd28d0STony Jago 		}, {
23862dd28d0STony Jago 			.id		= 0x1e,
23962dd28d0STony Jago 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
24062dd28d0STony Jago 			.name		= "TDA10048-1",
24162dd28d0STony Jago 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
24262dd28d0STony Jago 			.i2c_bus_addr	= 0x10 >> 1,
24362dd28d0STony Jago 			.i2c_reg_len	= REGLEN_8bit,
24462dd28d0STony Jago 		}, {
24562dd28d0STony Jago 			.id		= 0x1f,
24662dd28d0STony Jago 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
24762dd28d0STony Jago 			.name		= "TDA10048-2",
24862dd28d0STony Jago 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
24962dd28d0STony Jago 			.i2c_bus_addr	= 0x12 >> 1,
25062dd28d0STony Jago 			.i2c_reg_len	= REGLEN_8bit,
25162dd28d0STony Jago 		} },
25262dd28d0STony Jago 	},
253443c1228SSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2250] = {
254443c1228SSteven Toth 		.name		= "Hauppauge WinTV-HVR2250",
255443c1228SSteven Toth 		.porta		= SAA7164_MPEG_DVB,
256443c1228SSteven Toth 		.portb		= SAA7164_MPEG_DVB,
2577615e434SSteven Toth 		.portc		= SAA7164_MPEG_ENCODER,
2587615e434SSteven Toth 		.portd		= SAA7164_MPEG_ENCODER,
259e8ce2f21SSteven Toth 		.porte		= SAA7164_MPEG_VBI,
260e8ce2f21SSteven Toth 		.portf		= SAA7164_MPEG_VBI,
261443c1228SSteven Toth 		.chiprev	= SAA7164_CHIP_REV3,
262443c1228SSteven Toth 		.unit		= {{
263443c1228SSteven Toth 			.id		= 0x22,
264443c1228SSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
265443c1228SSteven Toth 			.name		= "4K EEPROM",
266443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
267443c1228SSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
268443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
269443c1228SSteven Toth 		}, {
270443c1228SSteven Toth 			.id		= 0x04,
271443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
272443c1228SSteven Toth 			.name		= "TDA18271-1",
273443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
274443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
275443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
276443c1228SSteven Toth 		}, {
277443c1228SSteven Toth 			.id		= 0x07,
278443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
279443c1228SSteven Toth 			.name		= "CX24228/S5H1411-1 (TOP)",
280443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
281443c1228SSteven Toth 			.i2c_bus_addr	= 0x32 >> 1,
282443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
283443c1228SSteven Toth 		}, {
284443c1228SSteven Toth 			.id		= 0x08,
285443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
286443c1228SSteven Toth 			.name		= "CX24228/S5H1411-1 (QAM)",
287443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
288443c1228SSteven Toth 			.i2c_bus_addr	= 0x34 >> 1,
289443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
290443c1228SSteven Toth 		}, {
291443c1228SSteven Toth 			.id		= 0x1e,
292443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
293443c1228SSteven Toth 			.name		= "TDA18271-2",
294443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
295443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
296443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
297443c1228SSteven Toth 		}, {
298443c1228SSteven Toth 			.id		= 0x20,
299443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
300443c1228SSteven Toth 			.name		= "CX24228/S5H1411-2 (TOP)",
301443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
302443c1228SSteven Toth 			.i2c_bus_addr	= 0x32 >> 1,
303443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
304443c1228SSteven Toth 		}, {
305443c1228SSteven Toth 			.id		= 0x23,
306443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
307443c1228SSteven Toth 			.name		= "CX24228/S5H1411-2 (QAM)",
308443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
309443c1228SSteven Toth 			.i2c_bus_addr	= 0x34 >> 1,
310443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
311443c1228SSteven Toth 		} },
312443c1228SSteven Toth 	},
313443c1228SSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2250_2] = {
314443c1228SSteven Toth 		.name		= "Hauppauge WinTV-HVR2250",
315443c1228SSteven Toth 		.porta		= SAA7164_MPEG_DVB,
316443c1228SSteven Toth 		.portb		= SAA7164_MPEG_DVB,
3177615e434SSteven Toth 		.portc		= SAA7164_MPEG_ENCODER,
3187615e434SSteven Toth 		.portd		= SAA7164_MPEG_ENCODER,
319e8ce2f21SSteven Toth 		.porte		= SAA7164_MPEG_VBI,
320e8ce2f21SSteven Toth 		.portf		= SAA7164_MPEG_VBI,
321443c1228SSteven Toth 		.chiprev	= SAA7164_CHIP_REV3,
322443c1228SSteven Toth 		.unit		= {{
32330015c1eSSteven Toth 			.id		= 0x28,
324443c1228SSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
325443c1228SSteven Toth 			.name		= "4K EEPROM",
326443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
327443c1228SSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
328443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
329443c1228SSteven Toth 		}, {
330443c1228SSteven Toth 			.id		= 0x04,
331443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
332443c1228SSteven Toth 			.name		= "TDA18271-1",
333443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
334443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
335443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
336443c1228SSteven Toth 		}, {
337443c1228SSteven Toth 			.id		= 0x07,
338443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
339443c1228SSteven Toth 			.name		= "CX24228/S5H1411-1 (TOP)",
340443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
341443c1228SSteven Toth 			.i2c_bus_addr	= 0x32 >> 1,
342443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
343443c1228SSteven Toth 		}, {
344443c1228SSteven Toth 			.id		= 0x08,
345443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
346443c1228SSteven Toth 			.name		= "CX24228/S5H1411-1 (QAM)",
347443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
348443c1228SSteven Toth 			.i2c_bus_addr	= 0x34 >> 1,
349443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
350443c1228SSteven Toth 		}, {
351443c1228SSteven Toth 			.id		= 0x24,
352443c1228SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
353443c1228SSteven Toth 			.name		= "TDA18271-2",
354443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
355443c1228SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
356443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
357443c1228SSteven Toth 		}, {
358443c1228SSteven Toth 			.id		= 0x26,
359443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
360443c1228SSteven Toth 			.name		= "CX24228/S5H1411-2 (TOP)",
361443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
362443c1228SSteven Toth 			.i2c_bus_addr	= 0x32 >> 1,
363443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
364443c1228SSteven Toth 		}, {
365443c1228SSteven Toth 			.id		= 0x29,
366443c1228SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
367443c1228SSteven Toth 			.name		= "CX24228/S5H1411-2 (QAM)",
368443c1228SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
369443c1228SSteven Toth 			.i2c_bus_addr	= 0x34 >> 1,
370443c1228SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
371443c1228SSteven Toth 		} },
372443c1228SSteven Toth 	},
373e3335222SSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2250_3] = {
374e3335222SSteven Toth 		.name		= "Hauppauge WinTV-HVR2250",
375e3335222SSteven Toth 		.porta		= SAA7164_MPEG_DVB,
376e3335222SSteven Toth 		.portb		= SAA7164_MPEG_DVB,
3777615e434SSteven Toth 		.portc		= SAA7164_MPEG_ENCODER,
3787615e434SSteven Toth 		.portd		= SAA7164_MPEG_ENCODER,
379e8ce2f21SSteven Toth 		.porte		= SAA7164_MPEG_VBI,
380e8ce2f21SSteven Toth 		.portf		= SAA7164_MPEG_VBI,
381e3335222SSteven Toth 		.chiprev	= SAA7164_CHIP_REV3,
382e3335222SSteven Toth 		.unit		= {{
38330015c1eSSteven Toth 			.id		= 0x26,
384e3335222SSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
385e3335222SSteven Toth 			.name		= "4K EEPROM",
386e3335222SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
387e3335222SSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
388e3335222SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
389e3335222SSteven Toth 		}, {
390e3335222SSteven Toth 			.id		= 0x04,
391e3335222SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
392e3335222SSteven Toth 			.name		= "TDA18271-1",
393e3335222SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
394e3335222SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
395e3335222SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
396e3335222SSteven Toth 		}, {
397e3335222SSteven Toth 			.id		= 0x07,
398e3335222SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
399e3335222SSteven Toth 			.name		= "CX24228/S5H1411-1 (TOP)",
400e3335222SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
401e3335222SSteven Toth 			.i2c_bus_addr	= 0x32 >> 1,
402e3335222SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
403e3335222SSteven Toth 		}, {
404e3335222SSteven Toth 			.id		= 0x08,
405e3335222SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
406e3335222SSteven Toth 			.name		= "CX24228/S5H1411-1 (QAM)",
407e3335222SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
408e3335222SSteven Toth 			.i2c_bus_addr	= 0x34 >> 1,
409e3335222SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
410e3335222SSteven Toth 		}, {
411e3335222SSteven Toth 			.id		= 0x22,
412e3335222SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
413e3335222SSteven Toth 			.name		= "TDA18271-2",
414e3335222SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
415e3335222SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
416e3335222SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
417e3335222SSteven Toth 		}, {
418e3335222SSteven Toth 			.id		= 0x24,
419e3335222SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
420e3335222SSteven Toth 			.name		= "CX24228/S5H1411-2 (TOP)",
421e3335222SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
422e3335222SSteven Toth 			.i2c_bus_addr	= 0x32 >> 1,
423e3335222SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
424e3335222SSteven Toth 		}, {
425e3335222SSteven Toth 			.id		= 0x27,
426e3335222SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
427e3335222SSteven Toth 			.name		= "CX24228/S5H1411-2 (QAM)",
428e3335222SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
429e3335222SSteven Toth 			.i2c_bus_addr	= 0x34 >> 1,
430e3335222SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
431e3335222SSteven Toth 		} },
432e3335222SSteven Toth 	},
433de2fb698SSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2200_5] = {
434de2fb698SSteven Toth 		.name		= "Hauppauge WinTV-HVR2200",
435de2fb698SSteven Toth 		.porta		= SAA7164_MPEG_DVB,
436de2fb698SSteven Toth 		.portb		= SAA7164_MPEG_DVB,
437de2fb698SSteven Toth 		.chiprev	= SAA7164_CHIP_REV3,
438de2fb698SSteven Toth 		.unit		= {{
439de2fb698SSteven Toth 			.id		= 0x23,
440de2fb698SSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
441de2fb698SSteven Toth 			.name		= "4K EEPROM",
442de2fb698SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
443de2fb698SSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
444de2fb698SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
445de2fb698SSteven Toth 		}, {
446de2fb698SSteven Toth 			.id		= 0x04,
447de2fb698SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
448de2fb698SSteven Toth 			.name		= "TDA18271-1",
449de2fb698SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
450de2fb698SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
451de2fb698SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
452de2fb698SSteven Toth 		}, {
453de2fb698SSteven Toth 			.id		= 0x05,
454de2fb698SSteven Toth 			.type		= SAA7164_UNIT_ANALOG_DEMODULATOR,
455de2fb698SSteven Toth 			.name		= "TDA8290-1",
456de2fb698SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
457de2fb698SSteven Toth 			.i2c_bus_addr	= 0x84 >> 1,
458de2fb698SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
459de2fb698SSteven Toth 		}, {
460de2fb698SSteven Toth 			.id		= 0x21,
461de2fb698SSteven Toth 			.type		= SAA7164_UNIT_TUNER,
462de2fb698SSteven Toth 			.name		= "TDA18271-2",
463de2fb698SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
464de2fb698SSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
465de2fb698SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
466de2fb698SSteven Toth 		}, {
467de2fb698SSteven Toth 			.id		= 0x22,
468de2fb698SSteven Toth 			.type		= SAA7164_UNIT_ANALOG_DEMODULATOR,
469de2fb698SSteven Toth 			.name		= "TDA8290-2",
470de2fb698SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
471de2fb698SSteven Toth 			.i2c_bus_addr	= 0x84 >> 1,
472de2fb698SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
473de2fb698SSteven Toth 		}, {
474de2fb698SSteven Toth 			.id		= 0x24,
475de2fb698SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
476de2fb698SSteven Toth 			.name		= "TDA10048-1",
477de2fb698SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
478de2fb698SSteven Toth 			.i2c_bus_addr	= 0x10 >> 1,
479de2fb698SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
480de2fb698SSteven Toth 		}, {
481de2fb698SSteven Toth 			.id		= 0x25,
482de2fb698SSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
483de2fb698SSteven Toth 			.name		= "TDA10048-2",
484de2fb698SSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
485de2fb698SSteven Toth 			.i2c_bus_addr	= 0x12 >> 1,
486de2fb698SSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
487de2fb698SSteven Toth 		} },
488de2fb698SSteven Toth 	},
489504b29cbSSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2255proto] = {
490504b29cbSSteven Toth 		.name		= "Hauppauge WinTV-HVR2255(proto)",
491504b29cbSSteven Toth 		.porta		= SAA7164_MPEG_DVB,
492504b29cbSSteven Toth 		.portb		= SAA7164_MPEG_DVB,
493504b29cbSSteven Toth 		.portc		= SAA7164_MPEG_ENCODER,
494504b29cbSSteven Toth 		.portd		= SAA7164_MPEG_ENCODER,
495504b29cbSSteven Toth 		.porte		= SAA7164_MPEG_VBI,
496504b29cbSSteven Toth 		.portf		= SAA7164_MPEG_VBI,
497504b29cbSSteven Toth 		.chiprev	= SAA7164_CHIP_REV3,
498504b29cbSSteven Toth 		.unit		= {{
499504b29cbSSteven Toth 			.id		= 0x27,
500504b29cbSSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
501504b29cbSSteven Toth 			.name		= "4K EEPROM",
502504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
503504b29cbSSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
504504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
505504b29cbSSteven Toth 		}, {
506504b29cbSSteven Toth 			.id		= 0x04,
507504b29cbSSteven Toth 			.type		= SAA7164_UNIT_TUNER,
508504b29cbSSteven Toth 			.name		= "SI2157-1",
509504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
510504b29cbSSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
511504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_0bit,
512504b29cbSSteven Toth 		}, {
513504b29cbSSteven Toth 			.id		= 0x06,
514504b29cbSSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
515504b29cbSSteven Toth 			.name		= "LGDT3306",
516504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
517504b29cbSSteven Toth 			.i2c_bus_addr	= 0xb2 >> 1,
518504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
519504b29cbSSteven Toth 		}, {
520504b29cbSSteven Toth 			.id		= 0x24,
521504b29cbSSteven Toth 			.type		= SAA7164_UNIT_TUNER,
522504b29cbSSteven Toth 			.name		= "SI2157-2",
523504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
524504b29cbSSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
525504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_0bit,
526504b29cbSSteven Toth 		}, {
527504b29cbSSteven Toth 			.id		= 0x26,
528504b29cbSSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
529504b29cbSSteven Toth 			.name		= "LGDT3306-2",
530504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
531504b29cbSSteven Toth 			.i2c_bus_addr	= 0x1c >> 1,
532504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
533504b29cbSSteven Toth 		} },
534504b29cbSSteven Toth 	},
535504b29cbSSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2255] = {
536504b29cbSSteven Toth 		.name		= "Hauppauge WinTV-HVR2255",
537504b29cbSSteven Toth 		.porta		= SAA7164_MPEG_DVB,
538504b29cbSSteven Toth 		.portb		= SAA7164_MPEG_DVB,
539504b29cbSSteven Toth 		.portc		= SAA7164_MPEG_ENCODER,
540504b29cbSSteven Toth 		.portd		= SAA7164_MPEG_ENCODER,
541504b29cbSSteven Toth 		.porte		= SAA7164_MPEG_VBI,
542504b29cbSSteven Toth 		.portf		= SAA7164_MPEG_VBI,
543504b29cbSSteven Toth 		.chiprev	= SAA7164_CHIP_REV3,
544504b29cbSSteven Toth 		.unit		= {{
545504b29cbSSteven Toth 			.id		= 0x28,
546504b29cbSSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
547504b29cbSSteven Toth 			.name		= "4K EEPROM",
548504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
549504b29cbSSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
550504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
551504b29cbSSteven Toth 		}, {
552504b29cbSSteven Toth 			.id		= 0x04,
553504b29cbSSteven Toth 			.type		= SAA7164_UNIT_TUNER,
554504b29cbSSteven Toth 			.name		= "SI2157-1",
555504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
556504b29cbSSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
557504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_0bit,
558504b29cbSSteven Toth 		}, {
559504b29cbSSteven Toth 			.id		= 0x06,
560504b29cbSSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
561504b29cbSSteven Toth 			.name		= "LGDT3306-1",
562504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
563504b29cbSSteven Toth 			.i2c_bus_addr	= 0xb2 >> 1,
564504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
565504b29cbSSteven Toth 		}, {
566504b29cbSSteven Toth 			.id		= 0x25,
567504b29cbSSteven Toth 			.type		= SAA7164_UNIT_TUNER,
568504b29cbSSteven Toth 			.name		= "SI2157-2",
569504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
570504b29cbSSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
571504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_0bit,
572504b29cbSSteven Toth 		}, {
573504b29cbSSteven Toth 			.id		= 0x27,
574504b29cbSSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
575504b29cbSSteven Toth 			.name		= "LGDT3306-2",
576504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
577504b29cbSSteven Toth 			.i2c_bus_addr	= 0x1c >> 1,
578504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
579504b29cbSSteven Toth 		} },
580504b29cbSSteven Toth 	},
581504b29cbSSteven Toth 	[SAA7164_BOARD_HAUPPAUGE_HVR2205] = {
582504b29cbSSteven Toth 		.name		= "Hauppauge WinTV-HVR2205",
583504b29cbSSteven Toth 		.porta		= SAA7164_MPEG_DVB,
584504b29cbSSteven Toth 		.portb		= SAA7164_MPEG_DVB,
585504b29cbSSteven Toth 		.portc		= SAA7164_MPEG_ENCODER,
586504b29cbSSteven Toth 		.portd		= SAA7164_MPEG_ENCODER,
587504b29cbSSteven Toth 		.porte		= SAA7164_MPEG_VBI,
588504b29cbSSteven Toth 		.portf		= SAA7164_MPEG_VBI,
589504b29cbSSteven Toth 		.chiprev	= SAA7164_CHIP_REV3,
590504b29cbSSteven Toth 		.unit		= {{
591504b29cbSSteven Toth 			.id		= 0x28,
592504b29cbSSteven Toth 			.type		= SAA7164_UNIT_EEPROM,
593504b29cbSSteven Toth 			.name		= "4K EEPROM",
594504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
595504b29cbSSteven Toth 			.i2c_bus_addr	= 0xa0 >> 1,
596504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_8bit,
597504b29cbSSteven Toth 		}, {
598504b29cbSSteven Toth 			.id		= 0x04,
599504b29cbSSteven Toth 			.type		= SAA7164_UNIT_TUNER,
600504b29cbSSteven Toth 			.name		= "SI2157-1",
601504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_0,
602504b29cbSSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
603504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_0bit,
604504b29cbSSteven Toth 		}, {
605504b29cbSSteven Toth 			.id		= 0x06,
606504b29cbSSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
607504b29cbSSteven Toth 			.name		= "SI2168-1",
608504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
609504b29cbSSteven Toth 			.i2c_bus_addr	= 0xc8 >> 1,
610d9768728SOlli Salonen 			.i2c_reg_len	= REGLEN_0bit,
611504b29cbSSteven Toth 		}, {
612504b29cbSSteven Toth 			.id		= 0x25,
613504b29cbSSteven Toth 			.type		= SAA7164_UNIT_TUNER,
614504b29cbSSteven Toth 			.name		= "SI2157-2",
615504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_1,
616504b29cbSSteven Toth 			.i2c_bus_addr	= 0xc0 >> 1,
617504b29cbSSteven Toth 			.i2c_reg_len	= REGLEN_0bit,
618504b29cbSSteven Toth 		}, {
619504b29cbSSteven Toth 			.id		= 0x27,
620504b29cbSSteven Toth 			.type		= SAA7164_UNIT_DIGITAL_DEMODULATOR,
621504b29cbSSteven Toth 			.name		= "SI2168-2",
622504b29cbSSteven Toth 			.i2c_bus_nr	= SAA7164_I2C_BUS_2,
623504b29cbSSteven Toth 			.i2c_bus_addr	= 0xcc >> 1,
624d9768728SOlli Salonen 			.i2c_reg_len	= REGLEN_0bit,
625504b29cbSSteven Toth 		} },
626504b29cbSSteven Toth 	},
627443c1228SSteven Toth };
628443c1228SSteven Toth const unsigned int saa7164_bcount = ARRAY_SIZE(saa7164_boards);
629443c1228SSteven Toth 
630443c1228SSteven Toth /* ------------------------------------------------------------------ */
631443c1228SSteven Toth /* PCI subsystem IDs                                                  */
632443c1228SSteven Toth 
633443c1228SSteven Toth struct saa7164_subid saa7164_subids[] = {
634443c1228SSteven Toth 	{
635443c1228SSteven Toth 		.subvendor = 0x0070,
636443c1228SSteven Toth 		.subdevice = 0x8880,
637443c1228SSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2250,
638443c1228SSteven Toth 	}, {
639443c1228SSteven Toth 		.subvendor = 0x0070,
640443c1228SSteven Toth 		.subdevice = 0x8810,
641443c1228SSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2250,
642443c1228SSteven Toth 	}, {
643443c1228SSteven Toth 		.subvendor = 0x0070,
644443c1228SSteven Toth 		.subdevice = 0x8980,
645443c1228SSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2200,
646443c1228SSteven Toth 	}, {
647443c1228SSteven Toth 		.subvendor = 0x0070,
648443c1228SSteven Toth 		.subdevice = 0x8900,
649443c1228SSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2200_2,
650443c1228SSteven Toth 	}, {
651443c1228SSteven Toth 		.subvendor = 0x0070,
652443c1228SSteven Toth 		.subdevice = 0x8901,
653443c1228SSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2200_3,
654443c1228SSteven Toth 	}, {
655443c1228SSteven Toth 		.subvendor = 0x0070,
656443c1228SSteven Toth 		.subdevice = 0x88A1,
657e3335222SSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2250_3,
658443c1228SSteven Toth 	}, {
659443c1228SSteven Toth 		.subvendor = 0x0070,
660443c1228SSteven Toth 		.subdevice = 0x8891,
661443c1228SSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2250_2,
6623a360cedSSteven Toth 	}, {
6633a360cedSSteven Toth 		.subvendor = 0x0070,
6643a360cedSSteven Toth 		.subdevice = 0x8851,
6653a360cedSSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2250_2,
66662dd28d0STony Jago 	}, {
66762dd28d0STony Jago 		.subvendor = 0x0070,
66862dd28d0STony Jago 		.subdevice = 0x8940,
66962dd28d0STony Jago 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2200_4,
670de2fb698SSteven Toth 	}, {
671de2fb698SSteven Toth 		.subvendor = 0x0070,
672de2fb698SSteven Toth 		.subdevice = 0x8953,
673de2fb698SSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2200_5,
674504b29cbSSteven Toth 	}, {
675504b29cbSSteven Toth 		.subvendor = 0x0070,
676504b29cbSSteven Toth 		.subdevice = 0xf111,
677504b29cbSSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2255,
67816790554SMauro Carvalho Chehab 		/* Prototype card left here for documentation purposes.
679504b29cbSSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2255proto,
680504b29cbSSteven Toth 		*/
681504b29cbSSteven Toth 	}, {
682504b29cbSSteven Toth 		.subvendor = 0x0070,
683504b29cbSSteven Toth 		.subdevice = 0xf123,
684504b29cbSSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2205,
685504b29cbSSteven Toth 	}, {
686504b29cbSSteven Toth 		.subvendor = 0x0070,
687504b29cbSSteven Toth 		.subdevice = 0xf120,
688504b29cbSSteven Toth 		.card      = SAA7164_BOARD_HAUPPAUGE_HVR2205,
689443c1228SSteven Toth 	},
690443c1228SSteven Toth };
691443c1228SSteven Toth const unsigned int saa7164_idcount = ARRAY_SIZE(saa7164_subids);
692443c1228SSteven Toth 
saa7164_card_list(struct saa7164_dev * dev)693443c1228SSteven Toth void saa7164_card_list(struct saa7164_dev *dev)
694443c1228SSteven Toth {
695443c1228SSteven Toth 	int i;
696443c1228SSteven Toth 
697443c1228SSteven Toth 	if (0 == dev->pci->subsystem_vendor &&
698443c1228SSteven Toth 	    0 == dev->pci->subsystem_device) {
699443c1228SSteven Toth 		printk(KERN_ERR
700443c1228SSteven Toth 			"%s: Board has no valid PCIe Subsystem ID and can't\n"
701443c1228SSteven Toth 			"%s: be autodetected. Pass card=<n> insmod option to\n"
702443c1228SSteven Toth 			"%s: workaround that. Send complaints to the vendor\n"
703443c1228SSteven Toth 			"%s: of the TV card. Best regards,\n"
704443c1228SSteven Toth 			"%s:         -- tux\n",
705443c1228SSteven Toth 			dev->name, dev->name, dev->name, dev->name, dev->name);
706443c1228SSteven Toth 	} else {
707443c1228SSteven Toth 		printk(KERN_ERR
708443c1228SSteven Toth 			"%s: Your board isn't known (yet) to the driver.\n"
709443c1228SSteven Toth 			"%s: Try to pick one of the existing card configs via\n"
710443c1228SSteven Toth 			"%s: card=<n> insmod option.  Updating to the latest\n"
711443c1228SSteven Toth 			"%s: version might help as well.\n",
712443c1228SSteven Toth 			dev->name, dev->name, dev->name, dev->name);
713443c1228SSteven Toth 	}
714443c1228SSteven Toth 
71524f711c1SMauro Carvalho Chehab 	printk(KERN_ERR "%s: Here are valid choices for the card=<n> insmod option:\n",
71624f711c1SMauro Carvalho Chehab 	       dev->name);
717443c1228SSteven Toth 
718443c1228SSteven Toth 	for (i = 0; i < saa7164_bcount; i++)
719443c1228SSteven Toth 		printk(KERN_ERR "%s:    card=%d -> %s\n",
720443c1228SSteven Toth 		       dev->name, i, saa7164_boards[i].name);
721443c1228SSteven Toth }
722443c1228SSteven Toth 
723443c1228SSteven Toth /* TODO: clean this define up into the -cards.c structs */
724443c1228SSteven Toth #define PCIEBRIDGE_UNITID 2
725443c1228SSteven Toth 
saa7164_gpio_setup(struct saa7164_dev * dev)726443c1228SSteven Toth void saa7164_gpio_setup(struct saa7164_dev *dev)
727443c1228SSteven Toth {
728443c1228SSteven Toth 	switch (dev->board) {
729443c1228SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2200:
730443c1228SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_2:
731443c1228SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_3:
73262dd28d0STony Jago 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_4:
733de2fb698SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_5:
734443c1228SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2250:
735443c1228SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2250_2:
736e3335222SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2250_3:
737504b29cbSSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2255proto:
738504b29cbSSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2255:
739504b29cbSSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2205:
740443c1228SSteven Toth 		/*
741504b29cbSSteven Toth 		HVR2200 / HVR2250
742443c1228SSteven Toth 		GPIO 2: s5h1411 / tda10048-1 demod reset
743443c1228SSteven Toth 		GPIO 3: s5h1411 / tda10048-2 demod reset
744443c1228SSteven Toth 		GPIO 7: IRBlaster Zilog reset
745443c1228SSteven Toth 		 */
746443c1228SSteven Toth 
747504b29cbSSteven Toth 		/* HVR2255
748504b29cbSSteven Toth 		 * GPIO 2: lgdg3306-1 demod reset
749504b29cbSSteven Toth 		 * GPIO 3: lgdt3306-2 demod reset
750504b29cbSSteven Toth 		 */
751504b29cbSSteven Toth 
752504b29cbSSteven Toth 		/* HVR2205
753504b29cbSSteven Toth 		 * GPIO 2: si2168-1 demod reset
754504b29cbSSteven Toth 		 * GPIO 3: si2168-2 demod reset
755504b29cbSSteven Toth 		 */
756504b29cbSSteven Toth 
757443c1228SSteven Toth 		/* Reset parts by going in and out of reset */
758443c1228SSteven Toth 		saa7164_api_clear_gpiobit(dev, PCIEBRIDGE_UNITID, 2);
759443c1228SSteven Toth 		saa7164_api_clear_gpiobit(dev, PCIEBRIDGE_UNITID, 3);
760443c1228SSteven Toth 
761bc250684SSteven Toth 		msleep(20);
762443c1228SSteven Toth 
763443c1228SSteven Toth 		saa7164_api_set_gpiobit(dev, PCIEBRIDGE_UNITID, 2);
764443c1228SSteven Toth 		saa7164_api_set_gpiobit(dev, PCIEBRIDGE_UNITID, 3);
765443c1228SSteven Toth 		break;
766443c1228SSteven Toth 	}
767443c1228SSteven Toth }
768443c1228SSteven Toth 
hauppauge_eeprom(struct saa7164_dev * dev,u8 * eeprom_data)769443c1228SSteven Toth static void hauppauge_eeprom(struct saa7164_dev *dev, u8 *eeprom_data)
770443c1228SSteven Toth {
771443c1228SSteven Toth 	struct tveeprom tv;
772443c1228SSteven Toth 
773446aba66SMauro Carvalho Chehab 	tveeprom_hauppauge_analog(&tv, eeprom_data);
774443c1228SSteven Toth 
775443c1228SSteven Toth 	/* Make sure we support the board model */
776443c1228SSteven Toth 	switch (tv.model) {
777443c1228SSteven Toth 	case 88001:
778443c1228SSteven Toth 		/* Development board - Limit circulation */
779443c1228SSteven Toth 		/* WinTV-HVR2250 (PCIe, Retail, full-height bracket)
780443c1228SSteven Toth 		 * ATSC/QAM (TDA18271/S5H1411) and basic analog, no IR, FM */
781443c1228SSteven Toth 	case 88021:
782443c1228SSteven Toth 		/* WinTV-HVR2250 (PCIe, Retail, full-height bracket)
783443c1228SSteven Toth 		 * ATSC/QAM (TDA18271/S5H1411) and basic analog, MCE CIR, FM */
784443c1228SSteven Toth 		break;
785443c1228SSteven Toth 	case 88041:
786443c1228SSteven Toth 		/* WinTV-HVR2250 (PCIe, Retail, full-height bracket)
787443c1228SSteven Toth 		 * ATSC/QAM (TDA18271/S5H1411) and basic analog, no IR, FM */
788443c1228SSteven Toth 		break;
789443c1228SSteven Toth 	case 88061:
790443c1228SSteven Toth 		/* WinTV-HVR2250 (PCIe, Retail, full-height bracket)
791443c1228SSteven Toth 		 * ATSC/QAM (TDA18271/S5H1411) and basic analog, FM */
792443c1228SSteven Toth 		break;
793443c1228SSteven Toth 	case 89519:
794443c1228SSteven Toth 	case 89609:
795443c1228SSteven Toth 		/* WinTV-HVR2200 (PCIe, Retail, full-height)
796443c1228SSteven Toth 		 * DVB-T (TDA18271/TDA10048) and basic analog, no IR */
797443c1228SSteven Toth 		break;
798443c1228SSteven Toth 	case 89619:
799443c1228SSteven Toth 		/* WinTV-HVR2200 (PCIe, Retail, half-height)
800443c1228SSteven Toth 		 * DVB-T (TDA18271/TDA10048) and basic analog, no IR */
801443c1228SSteven Toth 		break;
802504b29cbSSteven Toth 	case 151009:
803504b29cbSSteven Toth 		/* First production board rev B2I6 */
804504b29cbSSteven Toth 		/* WinTV-HVR2205 (PCIe, Retail, full-height bracket)
805504b29cbSSteven Toth 		 * DVB-T/T2/C (SI2157/SI2168) and basic analog, FM */
806504b29cbSSteven Toth 		break;
807504b29cbSSteven Toth 	case 151609:
808504b29cbSSteven Toth 		/* First production board rev B2I6 */
809504b29cbSSteven Toth 		/* WinTV-HVR2205 (PCIe, Retail, half-height bracket)
810504b29cbSSteven Toth 		 * DVB-T/T2/C (SI2157/SI2168) and basic analog, FM */
811504b29cbSSteven Toth 		break;
812504b29cbSSteven Toth 	case 151061:
813504b29cbSSteven Toth 		/* First production board rev B1I6 */
814504b29cbSSteven Toth 		/* WinTV-HVR2255 (PCIe, Retail, full-height bracket)
815504b29cbSSteven Toth 		 * ATSC/QAM (SI2157/LGDT3306) and basic analog, FM */
816504b29cbSSteven Toth 		break;
817443c1228SSteven Toth 	default:
818443c1228SSteven Toth 		printk(KERN_ERR "%s: Warning: Unknown Hauppauge model #%d\n",
819443c1228SSteven Toth 			dev->name, tv.model);
820443c1228SSteven Toth 		break;
821443c1228SSteven Toth 	}
822443c1228SSteven Toth 
823443c1228SSteven Toth 	printk(KERN_INFO "%s: Hauppauge eeprom: model=%d\n", dev->name,
824443c1228SSteven Toth 		tv.model);
825443c1228SSteven Toth }
826443c1228SSteven Toth 
saa7164_card_setup(struct saa7164_dev * dev)827443c1228SSteven Toth void saa7164_card_setup(struct saa7164_dev *dev)
828443c1228SSteven Toth {
829443c1228SSteven Toth 	static u8 eeprom[256];
830443c1228SSteven Toth 
831443c1228SSteven Toth 	if (dev->i2c_bus[0].i2c_rc == 0) {
832443c1228SSteven Toth 		if (saa7164_api_read_eeprom(dev, &eeprom[0],
833443c1228SSteven Toth 			sizeof(eeprom)) < 0)
834443c1228SSteven Toth 			return;
835443c1228SSteven Toth 	}
836443c1228SSteven Toth 
837443c1228SSteven Toth 	switch (dev->board) {
838443c1228SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2200:
839443c1228SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_2:
840443c1228SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_3:
84162dd28d0STony Jago 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_4:
842de2fb698SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_5:
843443c1228SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2250:
844c303e3e1SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2250_2:
845e3335222SSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2250_3:
846504b29cbSSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2255proto:
847504b29cbSSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2255:
848504b29cbSSteven Toth 	case SAA7164_BOARD_HAUPPAUGE_HVR2205:
849443c1228SSteven Toth 		hauppauge_eeprom(dev, &eeprom[0]);
850443c1228SSteven Toth 		break;
851443c1228SSteven Toth 	}
852443c1228SSteven Toth }
853443c1228SSteven Toth 
854443c1228SSteven Toth /* With most other drivers, the kernel expects to communicate with subdrivers
855443c1228SSteven Toth  * through i2c. This bridge does not allow that, it does not expose any direct
856443c1228SSteven Toth  * access to I2C. Instead we have to communicate through the device f/w for
857443c1228SSteven Toth  * register access to 'processing units'. Each unit has a unique
858443c1228SSteven Toth  * id, regardless of how the physical implementation occurs across
85916790554SMauro Carvalho Chehab  * the three physical i2c buses. The being said if we want leverge of
860443c1228SSteven Toth  * the existing kernel drivers for tuners and demods we have to 'speak i2c',
861443c1228SSteven Toth  * to this bridge implements 3 virtual i2c buses. This is a helper function
862443c1228SSteven Toth  * for those.
863443c1228SSteven Toth  *
864443c1228SSteven Toth  * Description: Translate the kernels notion of an i2c address and bus into
865443c1228SSteven Toth  * the appropriate unitid.
866443c1228SSteven Toth  */
saa7164_i2caddr_to_unitid(struct saa7164_i2c * bus,int addr)867443c1228SSteven Toth int saa7164_i2caddr_to_unitid(struct saa7164_i2c *bus, int addr)
868443c1228SSteven Toth {
869443c1228SSteven Toth 	/* For a given bus and i2c device address, return the saa7164 unique
870443c1228SSteven Toth 	 * unitid. < 0 on error */
871443c1228SSteven Toth 
872443c1228SSteven Toth 	struct saa7164_dev *dev = bus->dev;
873443c1228SSteven Toth 	struct saa7164_unit *unit;
874443c1228SSteven Toth 	int i;
875443c1228SSteven Toth 
876443c1228SSteven Toth 	for (i = 0; i < SAA7164_MAX_UNITS; i++) {
877443c1228SSteven Toth 		unit = &saa7164_boards[dev->board].unit[i];
878443c1228SSteven Toth 
879443c1228SSteven Toth 		if (unit->type == SAA7164_UNIT_UNDEFINED)
880443c1228SSteven Toth 			continue;
881443c1228SSteven Toth 		if ((bus->nr == unit->i2c_bus_nr) &&
882443c1228SSteven Toth 			(addr == unit->i2c_bus_addr))
883443c1228SSteven Toth 			return unit->id;
884443c1228SSteven Toth 	}
885443c1228SSteven Toth 
886443c1228SSteven Toth 	return -1;
887443c1228SSteven Toth }
888443c1228SSteven Toth 
889443c1228SSteven Toth /* The 7164 API needs to know the i2c register length in advance.
890443c1228SSteven Toth  * this is a helper function. Based on a specific chip addr and bus return the
891443c1228SSteven Toth  * reg length.
892443c1228SSteven Toth  */
saa7164_i2caddr_to_reglen(struct saa7164_i2c * bus,int addr)893443c1228SSteven Toth int saa7164_i2caddr_to_reglen(struct saa7164_i2c *bus, int addr)
894443c1228SSteven Toth {
895443c1228SSteven Toth 	/* For a given bus and i2c device address, return the
896443c1228SSteven Toth 	 * saa7164 registry address width. < 0 on error
897443c1228SSteven Toth 	 */
898443c1228SSteven Toth 
899443c1228SSteven Toth 	struct saa7164_dev *dev = bus->dev;
900443c1228SSteven Toth 	struct saa7164_unit *unit;
901443c1228SSteven Toth 	int i;
902443c1228SSteven Toth 
903443c1228SSteven Toth 	for (i = 0; i < SAA7164_MAX_UNITS; i++) {
904443c1228SSteven Toth 		unit = &saa7164_boards[dev->board].unit[i];
905443c1228SSteven Toth 
906443c1228SSteven Toth 		if (unit->type == SAA7164_UNIT_UNDEFINED)
907443c1228SSteven Toth 			continue;
908443c1228SSteven Toth 
909443c1228SSteven Toth 		if ((bus->nr == unit->i2c_bus_nr) &&
910443c1228SSteven Toth 			(addr == unit->i2c_bus_addr))
911443c1228SSteven Toth 			return unit->i2c_reg_len;
912443c1228SSteven Toth 	}
913443c1228SSteven Toth 
914443c1228SSteven Toth 	return -1;
915443c1228SSteven Toth }
916443c1228SSteven Toth /* TODO: implement a 'findeeprom' functio like the above and fix any other
917443c1228SSteven Toth  * eeprom related todo's in -api.c.
918443c1228SSteven Toth  */
919443c1228SSteven Toth 
920443c1228SSteven Toth /* Translate a unitid into a x readable device name, for display purposes.  */
saa7164_unitid_name(struct saa7164_dev * dev,u8 unitid)921443c1228SSteven Toth char *saa7164_unitid_name(struct saa7164_dev *dev, u8 unitid)
922443c1228SSteven Toth {
923443c1228SSteven Toth 	char *undefed = "UNDEFINED";
924443c1228SSteven Toth 	char *bridge = "BRIDGE";
925443c1228SSteven Toth 	struct saa7164_unit *unit;
926443c1228SSteven Toth 	int i;
927443c1228SSteven Toth 
928443c1228SSteven Toth 	if (unitid == 0)
929443c1228SSteven Toth 		return bridge;
930443c1228SSteven Toth 
931443c1228SSteven Toth 	for (i = 0; i < SAA7164_MAX_UNITS; i++) {
932443c1228SSteven Toth 		unit = &saa7164_boards[dev->board].unit[i];
933443c1228SSteven Toth 
934443c1228SSteven Toth 		if (unit->type == SAA7164_UNIT_UNDEFINED)
935443c1228SSteven Toth 			continue;
936443c1228SSteven Toth 
937443c1228SSteven Toth 		if (unitid == unit->id)
938443c1228SSteven Toth 				return unit->name;
939443c1228SSteven Toth 	}
940443c1228SSteven Toth 
941443c1228SSteven Toth 	return undefed;
942443c1228SSteven Toth }
943443c1228SSteven Toth 
944