xref: /linux/drivers/media/pci/saa7164/saa7164-dvb.c (revision e9f0878c4b2004ac19581274c1ae4c61ae3ca70e)
1 /*
2  *  Driver for the NXP SAA7164 PCIe bridge
3  *
4  *  Copyright (c) 2010-2015 Steven Toth <stoth@kernellabs.com>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *
15  *  GNU General Public License for more details.
16  */
17 
18 #include "saa7164.h"
19 
20 #include "tda10048.h"
21 #include "tda18271.h"
22 #include "s5h1411.h"
23 #include "si2157.h"
24 #include "si2168.h"
25 #include "lgdt3306a.h"
26 
27 #define DRIVER_NAME "saa7164"
28 
29 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
30 
31 /* addr is in the card struct, get it from there */
32 static struct tda10048_config hauppauge_hvr2200_1_config = {
33 	.demod_address    = 0x10 >> 1,
34 	.output_mode      = TDA10048_SERIAL_OUTPUT,
35 	.fwbulkwritelen   = TDA10048_BULKWRITE_200,
36 	.inversion        = TDA10048_INVERSION_ON,
37 	.dtv6_if_freq_khz = TDA10048_IF_3300,
38 	.dtv7_if_freq_khz = TDA10048_IF_3500,
39 	.dtv8_if_freq_khz = TDA10048_IF_4000,
40 	.clk_freq_khz     = TDA10048_CLK_16000,
41 };
42 static struct tda10048_config hauppauge_hvr2200_2_config = {
43 	.demod_address    = 0x12 >> 1,
44 	.output_mode      = TDA10048_SERIAL_OUTPUT,
45 	.fwbulkwritelen   = TDA10048_BULKWRITE_200,
46 	.inversion        = TDA10048_INVERSION_ON,
47 	.dtv6_if_freq_khz = TDA10048_IF_3300,
48 	.dtv7_if_freq_khz = TDA10048_IF_3500,
49 	.dtv8_if_freq_khz = TDA10048_IF_4000,
50 	.clk_freq_khz     = TDA10048_CLK_16000,
51 };
52 
53 static struct tda18271_std_map hauppauge_tda18271_std_map = {
54 	.atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 3,
55 		      .if_lvl = 6, .rfagc_top = 0x37 },
56 	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 0,
57 		      .if_lvl = 6, .rfagc_top = 0x37 },
58 };
59 
60 static struct tda18271_config hauppauge_hvr22x0_tuner_config = {
61 	.std_map	= &hauppauge_tda18271_std_map,
62 	.gate		= TDA18271_GATE_ANALOG,
63 	.role		= TDA18271_MASTER,
64 };
65 
66 static struct tda18271_config hauppauge_hvr22x0s_tuner_config = {
67 	.std_map	= &hauppauge_tda18271_std_map,
68 	.gate		= TDA18271_GATE_ANALOG,
69 	.role		= TDA18271_SLAVE,
70 	.output_opt     = TDA18271_OUTPUT_LT_OFF,
71 	.rf_cal_on_startup = 1
72 };
73 
74 static struct s5h1411_config hauppauge_s5h1411_config = {
75 	.output_mode   = S5H1411_SERIAL_OUTPUT,
76 	.gpio          = S5H1411_GPIO_ON,
77 	.qam_if        = S5H1411_IF_4000,
78 	.vsb_if        = S5H1411_IF_3250,
79 	.inversion     = S5H1411_INVERSION_ON,
80 	.status_mode   = S5H1411_DEMODLOCKING,
81 	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
82 };
83 
84 static struct lgdt3306a_config hauppauge_hvr2255a_config = {
85 	.i2c_addr               = 0xb2 >> 1,
86 	.qam_if_khz             = 4000,
87 	.vsb_if_khz             = 3250,
88 	.deny_i2c_rptr          = 1, /* Disabled */
89 	.spectral_inversion     = 0, /* Disabled */
90 	.mpeg_mode              = LGDT3306A_MPEG_SERIAL,
91 	.tpclk_edge             = LGDT3306A_TPCLK_RISING_EDGE,
92 	.tpvalid_polarity       = LGDT3306A_TP_VALID_HIGH,
93 	.xtalMHz                = 25, /* 24 or 25 */
94 };
95 
96 static struct lgdt3306a_config hauppauge_hvr2255b_config = {
97 	.i2c_addr               = 0x1c >> 1,
98 	.qam_if_khz             = 4000,
99 	.vsb_if_khz             = 3250,
100 	.deny_i2c_rptr          = 1, /* Disabled */
101 	.spectral_inversion     = 0, /* Disabled */
102 	.mpeg_mode              = LGDT3306A_MPEG_SERIAL,
103 	.tpclk_edge             = LGDT3306A_TPCLK_RISING_EDGE,
104 	.tpvalid_polarity       = LGDT3306A_TP_VALID_HIGH,
105 	.xtalMHz                = 25, /* 24 or 25 */
106 };
107 
108 static struct si2157_config hauppauge_hvr2255_tuner_config = {
109 	.inversion = 1,
110 	.if_port = 1,
111 };
112 
113 static int si2157_attach(struct saa7164_port *port, struct i2c_adapter *adapter,
114 	struct dvb_frontend *fe, u8 addr8bit, struct si2157_config *cfg)
115 {
116 	struct i2c_board_info bi;
117 	struct i2c_client *tuner;
118 
119 	cfg->fe = fe;
120 
121 	memset(&bi, 0, sizeof(bi));
122 
123 	strlcpy(bi.type, "si2157", I2C_NAME_SIZE);
124 	bi.platform_data = cfg;
125 	bi.addr = addr8bit >> 1;
126 
127 	request_module(bi.type);
128 
129 	tuner = i2c_new_device(adapter, &bi);
130 	if (tuner == NULL || tuner->dev.driver == NULL)
131 		return -ENODEV;
132 
133 	if (!try_module_get(tuner->dev.driver->owner)) {
134 		i2c_unregister_device(tuner);
135 		return -ENODEV;
136 	}
137 
138 	port->i2c_client_tuner = tuner;
139 
140 	return 0;
141 }
142 
143 static int saa7164_dvb_stop_port(struct saa7164_port *port)
144 {
145 	struct saa7164_dev *dev = port->dev;
146 	int ret;
147 
148 	ret = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
149 	if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
150 		printk(KERN_ERR "%s() stop transition failed, ret = 0x%x\n",
151 			__func__, ret);
152 		ret = -EIO;
153 	} else {
154 		dprintk(DBGLVL_DVB, "%s()    Stopped\n", __func__);
155 		ret = 0;
156 	}
157 
158 	return ret;
159 }
160 
161 static int saa7164_dvb_acquire_port(struct saa7164_port *port)
162 {
163 	struct saa7164_dev *dev = port->dev;
164 	int ret;
165 
166 	ret = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE);
167 	if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
168 		printk(KERN_ERR "%s() acquire transition failed, ret = 0x%x\n",
169 			__func__, ret);
170 		ret = -EIO;
171 	} else {
172 		dprintk(DBGLVL_DVB, "%s() Acquired\n", __func__);
173 		ret = 0;
174 	}
175 
176 	return ret;
177 }
178 
179 static int saa7164_dvb_pause_port(struct saa7164_port *port)
180 {
181 	struct saa7164_dev *dev = port->dev;
182 	int ret;
183 
184 	ret = saa7164_api_transition_port(port, SAA_DMASTATE_PAUSE);
185 	if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
186 		printk(KERN_ERR "%s() pause transition failed, ret = 0x%x\n",
187 			__func__, ret);
188 		ret = -EIO;
189 	} else {
190 		dprintk(DBGLVL_DVB, "%s()   Paused\n", __func__);
191 		ret = 0;
192 	}
193 
194 	return ret;
195 }
196 
197 /* Firmware is very windows centric, meaning you have to transition
198  * the part through AVStream / KS Windows stages, forwards or backwards.
199  * States are: stopped, acquired (h/w), paused, started.
200  */
201 static int saa7164_dvb_stop_streaming(struct saa7164_port *port)
202 {
203 	struct saa7164_dev *dev = port->dev;
204 	struct saa7164_buffer *buf;
205 	struct list_head *p, *q;
206 	int ret;
207 
208 	dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
209 
210 	ret = saa7164_dvb_pause_port(port);
211 	ret = saa7164_dvb_acquire_port(port);
212 	ret = saa7164_dvb_stop_port(port);
213 
214 	/* Mark the hardware buffers as free */
215 	mutex_lock(&port->dmaqueue_lock);
216 	list_for_each_safe(p, q, &port->dmaqueue.list) {
217 		buf = list_entry(p, struct saa7164_buffer, list);
218 		buf->flags = SAA7164_BUFFER_FREE;
219 	}
220 	mutex_unlock(&port->dmaqueue_lock);
221 
222 	return ret;
223 }
224 
225 static int saa7164_dvb_start_port(struct saa7164_port *port)
226 {
227 	struct saa7164_dev *dev = port->dev;
228 	int ret = 0, result;
229 
230 	dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
231 
232 	saa7164_buffer_cfg_port(port);
233 
234 	/* Acquire the hardware */
235 	result = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE);
236 	if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
237 		printk(KERN_ERR "%s() acquire transition failed, res = 0x%x\n",
238 			__func__, result);
239 
240 		/* Stop the hardware, regardless */
241 		result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
242 		if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
243 			printk(KERN_ERR "%s() acquire/forced stop transition failed, res = 0x%x\n",
244 			       __func__, result);
245 		}
246 		ret = -EIO;
247 		goto out;
248 	} else
249 		dprintk(DBGLVL_DVB, "%s()   Acquired\n", __func__);
250 
251 	/* Pause the hardware */
252 	result = saa7164_api_transition_port(port, SAA_DMASTATE_PAUSE);
253 	if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
254 		printk(KERN_ERR "%s() pause transition failed, res = 0x%x\n",
255 				__func__, result);
256 
257 		/* Stop the hardware, regardless */
258 		result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
259 		if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
260 			printk(KERN_ERR "%s() pause/forced stop transition failed, res = 0x%x\n",
261 			       __func__, result);
262 		}
263 
264 		ret = -EIO;
265 		goto out;
266 	} else
267 		dprintk(DBGLVL_DVB, "%s()   Paused\n", __func__);
268 
269 	/* Start the hardware */
270 	result = saa7164_api_transition_port(port, SAA_DMASTATE_RUN);
271 	if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
272 		printk(KERN_ERR "%s() run transition failed, result = 0x%x\n",
273 				__func__, result);
274 
275 		/* Stop the hardware, regardless */
276 		result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
277 		if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
278 			printk(KERN_ERR "%s() run/forced stop transition failed, res = 0x%x\n",
279 			       __func__, result);
280 		}
281 
282 		ret = -EIO;
283 	} else
284 		dprintk(DBGLVL_DVB, "%s()   Running\n", __func__);
285 
286 out:
287 	return ret;
288 }
289 
290 static int saa7164_dvb_start_feed(struct dvb_demux_feed *feed)
291 {
292 	struct dvb_demux *demux = feed->demux;
293 	struct saa7164_port *port = (struct saa7164_port *) demux->priv;
294 	struct saa7164_dvb *dvb = &port->dvb;
295 	struct saa7164_dev *dev = port->dev;
296 	int ret = 0;
297 
298 	dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
299 
300 	if (!demux->dmx.frontend)
301 		return -EINVAL;
302 
303 	if (dvb) {
304 		mutex_lock(&dvb->lock);
305 		if (dvb->feeding++ == 0) {
306 			/* Start transport */
307 			ret = saa7164_dvb_start_port(port);
308 		}
309 		mutex_unlock(&dvb->lock);
310 		dprintk(DBGLVL_DVB, "%s(port=%d) now feeding = %d\n",
311 			__func__, port->nr, dvb->feeding);
312 	}
313 
314 	return ret;
315 }
316 
317 static int saa7164_dvb_stop_feed(struct dvb_demux_feed *feed)
318 {
319 	struct dvb_demux *demux = feed->demux;
320 	struct saa7164_port *port = (struct saa7164_port *) demux->priv;
321 	struct saa7164_dvb *dvb = &port->dvb;
322 	struct saa7164_dev *dev = port->dev;
323 	int ret = 0;
324 
325 	dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
326 
327 	if (dvb) {
328 		mutex_lock(&dvb->lock);
329 		if (--dvb->feeding == 0) {
330 			/* Stop transport */
331 			ret = saa7164_dvb_stop_streaming(port);
332 		}
333 		mutex_unlock(&dvb->lock);
334 		dprintk(DBGLVL_DVB, "%s(port=%d) now feeding = %d\n",
335 			__func__, port->nr, dvb->feeding);
336 	}
337 
338 	return ret;
339 }
340 
341 static int dvb_register(struct saa7164_port *port)
342 {
343 	struct saa7164_dvb *dvb = &port->dvb;
344 	struct saa7164_dev *dev = port->dev;
345 	struct saa7164_buffer *buf;
346 	int result, i;
347 
348 	dprintk(DBGLVL_DVB, "%s(port=%d)\n", __func__, port->nr);
349 
350 	if (port->type != SAA7164_MPEG_DVB)
351 		BUG();
352 
353 	/* Sanity check that the PCI configuration space is active */
354 	if (port->hwcfg.BARLocation == 0) {
355 		result = -ENOMEM;
356 		printk(KERN_ERR "%s: dvb_register_adapter failed (errno = %d), NO PCI configuration\n",
357 			DRIVER_NAME, result);
358 		goto fail_adapter;
359 	}
360 
361 	/* Init and establish defaults */
362 	port->hw_streamingparams.bitspersample = 8;
363 	port->hw_streamingparams.samplesperline = 188;
364 	port->hw_streamingparams.numberoflines =
365 		(SAA7164_TS_NUMBER_OF_LINES * 188) / 188;
366 
367 	port->hw_streamingparams.pitch = 188;
368 	port->hw_streamingparams.linethreshold = 0;
369 	port->hw_streamingparams.pagetablelistvirt = NULL;
370 	port->hw_streamingparams.pagetablelistphys = NULL;
371 	port->hw_streamingparams.numpagetables = 2 +
372 		((SAA7164_TS_NUMBER_OF_LINES * 188) / PAGE_SIZE);
373 
374 	port->hw_streamingparams.numpagetableentries = port->hwcfg.buffercount;
375 
376 	/* Allocate the PCI resources */
377 	for (i = 0; i < port->hwcfg.buffercount; i++) {
378 		buf = saa7164_buffer_alloc(port,
379 			port->hw_streamingparams.numberoflines *
380 			port->hw_streamingparams.pitch);
381 
382 		if (!buf) {
383 			result = -ENOMEM;
384 			printk(KERN_ERR "%s: dvb_register_adapter failed (errno = %d), unable to allocate buffers\n",
385 				DRIVER_NAME, result);
386 			goto fail_adapter;
387 		}
388 
389 		mutex_lock(&port->dmaqueue_lock);
390 		list_add_tail(&buf->list, &port->dmaqueue.list);
391 		mutex_unlock(&port->dmaqueue_lock);
392 	}
393 
394 	/* register adapter */
395 	result = dvb_register_adapter(&dvb->adapter, DRIVER_NAME, THIS_MODULE,
396 			&dev->pci->dev, adapter_nr);
397 	if (result < 0) {
398 		printk(KERN_ERR "%s: dvb_register_adapter failed (errno = %d)\n",
399 		       DRIVER_NAME, result);
400 		goto fail_adapter;
401 	}
402 	dvb->adapter.priv = port;
403 
404 	/* register frontend */
405 	result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
406 	if (result < 0) {
407 		printk(KERN_ERR "%s: dvb_register_frontend failed (errno = %d)\n",
408 		       DRIVER_NAME, result);
409 		goto fail_frontend;
410 	}
411 
412 	/* register demux stuff */
413 	dvb->demux.dmx.capabilities =
414 		DMX_TS_FILTERING | DMX_SECTION_FILTERING |
415 		DMX_MEMORY_BASED_FILTERING;
416 	dvb->demux.priv       = port;
417 	dvb->demux.filternum  = 256;
418 	dvb->demux.feednum    = 256;
419 	dvb->demux.start_feed = saa7164_dvb_start_feed;
420 	dvb->demux.stop_feed  = saa7164_dvb_stop_feed;
421 	result = dvb_dmx_init(&dvb->demux);
422 	if (result < 0) {
423 		printk(KERN_ERR "%s: dvb_dmx_init failed (errno = %d)\n",
424 		       DRIVER_NAME, result);
425 		goto fail_dmx;
426 	}
427 
428 	dvb->dmxdev.filternum    = 256;
429 	dvb->dmxdev.demux        = &dvb->demux.dmx;
430 	dvb->dmxdev.capabilities = 0;
431 	result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
432 	if (result < 0) {
433 		printk(KERN_ERR "%s: dvb_dmxdev_init failed (errno = %d)\n",
434 		       DRIVER_NAME, result);
435 		goto fail_dmxdev;
436 	}
437 
438 	dvb->fe_hw.source = DMX_FRONTEND_0;
439 	result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
440 	if (result < 0) {
441 		printk(KERN_ERR "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
442 		       DRIVER_NAME, result);
443 		goto fail_fe_hw;
444 	}
445 
446 	dvb->fe_mem.source = DMX_MEMORY_FE;
447 	result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
448 	if (result < 0) {
449 		printk(KERN_ERR "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
450 		       DRIVER_NAME, result);
451 		goto fail_fe_mem;
452 	}
453 
454 	result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
455 	if (result < 0) {
456 		printk(KERN_ERR "%s: connect_frontend failed (errno = %d)\n",
457 		       DRIVER_NAME, result);
458 		goto fail_fe_conn;
459 	}
460 
461 	/* register network adapter */
462 	dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
463 	return 0;
464 
465 fail_fe_conn:
466 	dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
467 fail_fe_mem:
468 	dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
469 fail_fe_hw:
470 	dvb_dmxdev_release(&dvb->dmxdev);
471 fail_dmxdev:
472 	dvb_dmx_release(&dvb->demux);
473 fail_dmx:
474 	dvb_unregister_frontend(dvb->frontend);
475 fail_frontend:
476 	dvb_frontend_detach(dvb->frontend);
477 	dvb_unregister_adapter(&dvb->adapter);
478 fail_adapter:
479 	return result;
480 }
481 
482 int saa7164_dvb_unregister(struct saa7164_port *port)
483 {
484 	struct saa7164_dvb *dvb = &port->dvb;
485 	struct saa7164_dev *dev = port->dev;
486 	struct saa7164_buffer *b;
487 	struct list_head *c, *n;
488 	struct i2c_client *client;
489 
490 	dprintk(DBGLVL_DVB, "%s()\n", __func__);
491 
492 	if (port->type != SAA7164_MPEG_DVB)
493 		BUG();
494 
495 	/* Remove any allocated buffers */
496 	mutex_lock(&port->dmaqueue_lock);
497 	list_for_each_safe(c, n, &port->dmaqueue.list) {
498 		b = list_entry(c, struct saa7164_buffer, list);
499 		list_del(c);
500 		saa7164_buffer_dealloc(b);
501 	}
502 	mutex_unlock(&port->dmaqueue_lock);
503 
504 	if (dvb->frontend == NULL)
505 		return 0;
506 
507 	/* remove I2C client for tuner */
508 	client = port->i2c_client_tuner;
509 	if (client) {
510 		module_put(client->dev.driver->owner);
511 		i2c_unregister_device(client);
512 	}
513 
514 	/* remove I2C client for demodulator */
515 	client = port->i2c_client_demod;
516 	if (client) {
517 		module_put(client->dev.driver->owner);
518 		i2c_unregister_device(client);
519 	}
520 
521 	dvb_net_release(&dvb->net);
522 	dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
523 	dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
524 	dvb_dmxdev_release(&dvb->dmxdev);
525 	dvb_dmx_release(&dvb->demux);
526 	dvb_unregister_frontend(dvb->frontend);
527 	dvb_frontend_detach(dvb->frontend);
528 	dvb_unregister_adapter(&dvb->adapter);
529 	return 0;
530 }
531 
532 /* All the DVB attach calls go here, this function get's modified
533  * for each new card.
534  */
535 int saa7164_dvb_register(struct saa7164_port *port)
536 {
537 	struct saa7164_dev *dev = port->dev;
538 	struct saa7164_dvb *dvb = &port->dvb;
539 	struct saa7164_i2c *i2c_bus = NULL;
540 	struct si2168_config si2168_config;
541 	struct si2157_config si2157_config;
542 	struct i2c_adapter *adapter;
543 	struct i2c_board_info info;
544 	struct i2c_client *client_demod;
545 	struct i2c_client *client_tuner;
546 	int ret;
547 
548 	dprintk(DBGLVL_DVB, "%s()\n", __func__);
549 
550 	/* init frontend */
551 	switch (dev->board) {
552 	case SAA7164_BOARD_HAUPPAUGE_HVR2200:
553 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_2:
554 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_3:
555 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_4:
556 	case SAA7164_BOARD_HAUPPAUGE_HVR2200_5:
557 		i2c_bus = &dev->i2c_bus[port->nr + 1];
558 		switch (port->nr) {
559 		case 0:
560 			port->dvb.frontend = dvb_attach(tda10048_attach,
561 				&hauppauge_hvr2200_1_config,
562 				&i2c_bus->i2c_adap);
563 
564 			if (port->dvb.frontend != NULL) {
565 				/* TODO: addr is in the card struct */
566 				dvb_attach(tda18271_attach, port->dvb.frontend,
567 					0xc0 >> 1, &i2c_bus->i2c_adap,
568 					&hauppauge_hvr22x0_tuner_config);
569 			}
570 
571 			break;
572 		case 1:
573 			port->dvb.frontend = dvb_attach(tda10048_attach,
574 				&hauppauge_hvr2200_2_config,
575 				&i2c_bus->i2c_adap);
576 
577 			if (port->dvb.frontend != NULL) {
578 				/* TODO: addr is in the card struct */
579 				dvb_attach(tda18271_attach, port->dvb.frontend,
580 					0xc0 >> 1, &i2c_bus->i2c_adap,
581 					&hauppauge_hvr22x0s_tuner_config);
582 			}
583 
584 			break;
585 		}
586 		break;
587 	case SAA7164_BOARD_HAUPPAUGE_HVR2250:
588 	case SAA7164_BOARD_HAUPPAUGE_HVR2250_2:
589 	case SAA7164_BOARD_HAUPPAUGE_HVR2250_3:
590 		i2c_bus = &dev->i2c_bus[port->nr + 1];
591 
592 		port->dvb.frontend = dvb_attach(s5h1411_attach,
593 			&hauppauge_s5h1411_config,
594 			&i2c_bus->i2c_adap);
595 
596 		if (port->dvb.frontend != NULL) {
597 			if (port->nr == 0) {
598 				/* Master TDA18271 */
599 				/* TODO: addr is in the card struct */
600 				dvb_attach(tda18271_attach, port->dvb.frontend,
601 					0xc0 >> 1, &i2c_bus->i2c_adap,
602 					&hauppauge_hvr22x0_tuner_config);
603 			} else {
604 				/* Slave TDA18271 */
605 				dvb_attach(tda18271_attach, port->dvb.frontend,
606 					0xc0 >> 1, &i2c_bus->i2c_adap,
607 					&hauppauge_hvr22x0s_tuner_config);
608 			}
609 		}
610 
611 		break;
612 	case SAA7164_BOARD_HAUPPAUGE_HVR2255proto:
613 	case SAA7164_BOARD_HAUPPAUGE_HVR2255:
614 		i2c_bus = &dev->i2c_bus[2];
615 
616 		if (port->nr == 0) {
617 			port->dvb.frontend = dvb_attach(lgdt3306a_attach,
618 				&hauppauge_hvr2255a_config, &i2c_bus->i2c_adap);
619 		} else {
620 			port->dvb.frontend = dvb_attach(lgdt3306a_attach,
621 				&hauppauge_hvr2255b_config, &i2c_bus->i2c_adap);
622 		}
623 
624 		if (port->dvb.frontend != NULL) {
625 
626 			if (port->nr == 0) {
627 				si2157_attach(port, &dev->i2c_bus[0].i2c_adap,
628 					      port->dvb.frontend, 0xc0,
629 					      &hauppauge_hvr2255_tuner_config);
630 			} else {
631 				si2157_attach(port, &dev->i2c_bus[1].i2c_adap,
632 					      port->dvb.frontend, 0xc0,
633 					      &hauppauge_hvr2255_tuner_config);
634 			}
635 		}
636 		break;
637 	case SAA7164_BOARD_HAUPPAUGE_HVR2205:
638 
639 		if (port->nr == 0) {
640 			/* attach frontend */
641 			memset(&si2168_config, 0, sizeof(si2168_config));
642 			si2168_config.i2c_adapter = &adapter;
643 			si2168_config.fe = &port->dvb.frontend;
644 			si2168_config.ts_mode = SI2168_TS_SERIAL;
645 			memset(&info, 0, sizeof(struct i2c_board_info));
646 			strlcpy(info.type, "si2168", I2C_NAME_SIZE);
647 			info.addr = 0xc8 >> 1;
648 			info.platform_data = &si2168_config;
649 			request_module(info.type);
650 			client_demod = i2c_new_device(&dev->i2c_bus[2].i2c_adap,
651 						      &info);
652 			if (!client_demod || !client_demod->dev.driver)
653 				goto frontend_detach;
654 
655 			if (!try_module_get(client_demod->dev.driver->owner)) {
656 				i2c_unregister_device(client_demod);
657 				goto frontend_detach;
658 			}
659 			port->i2c_client_demod = client_demod;
660 
661 			/* attach tuner */
662 			memset(&si2157_config, 0, sizeof(si2157_config));
663 			si2157_config.if_port = 1;
664 			si2157_config.fe = port->dvb.frontend;
665 			memset(&info, 0, sizeof(struct i2c_board_info));
666 			strlcpy(info.type, "si2157", I2C_NAME_SIZE);
667 			info.addr = 0xc0 >> 1;
668 			info.platform_data = &si2157_config;
669 			request_module(info.type);
670 			client_tuner = i2c_new_device(&dev->i2c_bus[0].i2c_adap,
671 						      &info);
672 			if (!client_tuner || !client_tuner->dev.driver) {
673 				module_put(client_demod->dev.driver->owner);
674 				i2c_unregister_device(client_demod);
675 				goto frontend_detach;
676 			}
677 			if (!try_module_get(client_tuner->dev.driver->owner)) {
678 				i2c_unregister_device(client_tuner);
679 				module_put(client_demod->dev.driver->owner);
680 				i2c_unregister_device(client_demod);
681 				goto frontend_detach;
682 			}
683 			port->i2c_client_tuner = client_tuner;
684 		} else {
685 			/* attach frontend */
686 			memset(&si2168_config, 0, sizeof(si2168_config));
687 			si2168_config.i2c_adapter = &adapter;
688 			si2168_config.fe = &port->dvb.frontend;
689 			si2168_config.ts_mode = SI2168_TS_SERIAL;
690 			memset(&info, 0, sizeof(struct i2c_board_info));
691 			strlcpy(info.type, "si2168", I2C_NAME_SIZE);
692 			info.addr = 0xcc >> 1;
693 			info.platform_data = &si2168_config;
694 			request_module(info.type);
695 			client_demod = i2c_new_device(&dev->i2c_bus[2].i2c_adap,
696 						      &info);
697 			if (!client_demod || !client_demod->dev.driver)
698 				goto frontend_detach;
699 
700 			if (!try_module_get(client_demod->dev.driver->owner)) {
701 				i2c_unregister_device(client_demod);
702 				goto frontend_detach;
703 			}
704 			port->i2c_client_demod = client_demod;
705 
706 			/* attach tuner */
707 			memset(&si2157_config, 0, sizeof(si2157_config));
708 			si2157_config.fe = port->dvb.frontend;
709 			si2157_config.if_port = 1;
710 			memset(&info, 0, sizeof(struct i2c_board_info));
711 			strlcpy(info.type, "si2157", I2C_NAME_SIZE);
712 			info.addr = 0xc0 >> 1;
713 			info.platform_data = &si2157_config;
714 			request_module(info.type);
715 			client_tuner = i2c_new_device(&dev->i2c_bus[1].i2c_adap,
716 						      &info);
717 			if (!client_tuner || !client_tuner->dev.driver) {
718 				module_put(client_demod->dev.driver->owner);
719 				i2c_unregister_device(client_demod);
720 				goto frontend_detach;
721 			}
722 			if (!try_module_get(client_tuner->dev.driver->owner)) {
723 				i2c_unregister_device(client_tuner);
724 				module_put(client_demod->dev.driver->owner);
725 				i2c_unregister_device(client_demod);
726 				goto frontend_detach;
727 			}
728 			port->i2c_client_tuner = client_tuner;
729 		}
730 
731 		break;
732 	default:
733 		printk(KERN_ERR "%s: The frontend isn't supported\n",
734 		       dev->name);
735 		break;
736 	}
737 	if (NULL == dvb->frontend) {
738 		printk(KERN_ERR "%s() Frontend initialization failed\n",
739 		       __func__);
740 		return -1;
741 	}
742 
743 	/* register everything */
744 	ret = dvb_register(port);
745 	if (ret < 0) {
746 		if (dvb->frontend->ops.release)
747 			dvb->frontend->ops.release(dvb->frontend);
748 		return ret;
749 	}
750 
751 	return 0;
752 
753 frontend_detach:
754 	printk(KERN_ERR "%s() Frontend/I2C initialization failed\n", __func__);
755 	return -1;
756 }
757 
758