cx23885-dvb.c 29.7 KB
Newer Older
1 2 3
/*
 *  Driver for the Conexant CX23885 PCIe bridge
 *
4
 *  Copyright (c) 2006 Steven Toth <stoth@linuxtv.org>
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/kthread.h>
#include <linux/file.h>
#include <linux/suspend.h>

#include "cx23885.h"
#include <media/v4l2-common.h>

33
#include "dvb_ca_en50221.h"
34
#include "s5h1409.h"
35
#include "s5h1411.h"
36
#include "mt2131.h"
37
#include "tda8290.h"
38
#include "tda18271.h"
39
#include "lgdt330x.h"
40
#include "xc5000.h"
41
#include "max2165.h"
42
#include "tda10048.h"
43
#include "tuner-xc2028.h"
44
#include "tuner-simple.h"
45 46
#include "dib7000p.h"
#include "dibx000_common.h"
47
#include "zl10353.h"
48
#include "stv0900.h"
49
#include "stv0900_reg.h"
50 51
#include "stv6110.h"
#include "lnbh24.h"
52
#include "cx24116.h"
53
#include "cimax2.h"
54
#include "lgs8gxx.h"
55 56
#include "netup-eeprom.h"
#include "netup-init.h"
57
#include "lgdt3305.h"
58
#include "atbm8830.h"
59 60
#include "ds3000.h"
#include "cx23885-f300.h"
61

62
static unsigned int debug;
63

64 65 66 67
#define dprintk(level, fmt, arg...)\
	do { if (debug >= level)\
		printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\
	} while (0)
68 69 70

/* ------------------------------------------------------------------ */

71 72 73 74
static unsigned int alt_tuner;
module_param(alt_tuner, int, 0644);
MODULE_PARM_DESC(alt_tuner, "Enable alternate tuner configuration");

75 76
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);

77 78
/* ------------------------------------------------------------------ */

79 80 81 82 83 84 85 86 87 88 89 90 91
static int dvb_buf_setup(struct videobuf_queue *q,
			 unsigned int *count, unsigned int *size)
{
	struct cx23885_tsport *port = q->priv_data;

	port->ts_packet_size  = 188 * 4;
	port->ts_packet_count = 32;

	*size  = port->ts_packet_size * port->ts_packet_count;
	*count = 32;
	return 0;
}

92 93
static int dvb_buf_prepare(struct videobuf_queue *q,
			   struct videobuf_buffer *vb, enum v4l2_field field)
94 95
{
	struct cx23885_tsport *port = q->priv_data;
96
	return cx23885_buf_prepare(q, port, (struct cx23885_buffer *)vb, field);
97 98 99 100 101
}

static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
{
	struct cx23885_tsport *port = q->priv_data;
102
	cx23885_buf_queue(port, (struct cx23885_buffer *)vb);
103 104
}

105 106
static void dvb_buf_release(struct videobuf_queue *q,
			    struct videobuf_buffer *vb)
107
{
108
	cx23885_free_buffer(q, (struct cx23885_buffer *)vb);
109 110 111 112 113 114 115 116 117
}

static struct videobuf_queue_ops dvb_qops = {
	.buf_setup    = dvb_buf_setup,
	.buf_prepare  = dvb_buf_prepare,
	.buf_queue    = dvb_buf_queue,
	.buf_release  = dvb_buf_release,
};

118
static struct s5h1409_config hauppauge_generic_config = {
119 120 121
	.demod_address = 0x32 >> 1,
	.output_mode   = S5H1409_SERIAL_OUTPUT,
	.gpio          = S5H1409_GPIO_ON,
122
	.qam_if        = 44000,
123
	.inversion     = S5H1409_INVERSION_OFF,
124 125
	.status_mode   = S5H1409_DEMODLOCKING,
	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
126 127
};

128 129 130 131
static struct tda10048_config hauppauge_hvr1200_config = {
	.demod_address    = 0x10 >> 1,
	.output_mode      = TDA10048_SERIAL_OUTPUT,
	.fwbulkwritelen   = TDA10048_BULKWRITE_200,
132
	.inversion        = TDA10048_INVERSION_ON,
133 134 135
	.dtv6_if_freq_khz = TDA10048_IF_3300,
	.dtv7_if_freq_khz = TDA10048_IF_3800,
	.dtv8_if_freq_khz = TDA10048_IF_4300,
136
	.clk_freq_khz     = TDA10048_CLK_16000,
137 138
};

139 140 141 142 143
static struct tda10048_config hauppauge_hvr1210_config = {
	.demod_address    = 0x10 >> 1,
	.output_mode      = TDA10048_SERIAL_OUTPUT,
	.fwbulkwritelen   = TDA10048_BULKWRITE_200,
	.inversion        = TDA10048_INVERSION_ON,
144 145 146
	.dtv6_if_freq_khz = TDA10048_IF_3300,
	.dtv7_if_freq_khz = TDA10048_IF_3500,
	.dtv8_if_freq_khz = TDA10048_IF_4000,
147 148 149
	.clk_freq_khz     = TDA10048_CLK_16000,
};

150 151 152 153 154 155
static struct s5h1409_config hauppauge_ezqam_config = {
	.demod_address = 0x32 >> 1,
	.output_mode   = S5H1409_SERIAL_OUTPUT,
	.gpio          = S5H1409_GPIO_OFF,
	.qam_if        = 4000,
	.inversion     = S5H1409_INVERSION_ON,
156 157
	.status_mode   = S5H1409_DEMODLOCKING,
	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
158 159
};

160
static struct s5h1409_config hauppauge_hvr1800lp_config = {
161 162 163
	.demod_address = 0x32 >> 1,
	.output_mode   = S5H1409_SERIAL_OUTPUT,
	.gpio          = S5H1409_GPIO_OFF,
164
	.qam_if        = 44000,
165
	.inversion     = S5H1409_INVERSION_OFF,
166 167
	.status_mode   = S5H1409_DEMODLOCKING,
	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
168 169
};

170 171 172 173 174
static struct s5h1409_config hauppauge_hvr1500_config = {
	.demod_address = 0x32 >> 1,
	.output_mode   = S5H1409_SERIAL_OUTPUT,
	.gpio          = S5H1409_GPIO_OFF,
	.inversion     = S5H1409_INVERSION_OFF,
175 176
	.status_mode   = S5H1409_DEMODLOCKING,
	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
177 178
};

179
static struct mt2131_config hauppauge_generic_tunerconfig = {
180 181 182
	0x61
};

183 184 185 186 187 188
static struct lgdt330x_config fusionhdtv_5_express = {
	.demod_address = 0x0e,
	.demod_chip = LGDT3303,
	.serial_mpeg = 0x40,
};

189 190 191 192 193 194
static struct s5h1409_config hauppauge_hvr1500q_config = {
	.demod_address = 0x32 >> 1,
	.output_mode   = S5H1409_SERIAL_OUTPUT,
	.gpio          = S5H1409_GPIO_ON,
	.qam_if        = 44000,
	.inversion     = S5H1409_INVERSION_OFF,
195 196
	.status_mode   = S5H1409_DEMODLOCKING,
	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
197 198
};

199 200 201 202 203 204 205 206 207 208
static struct s5h1409_config dvico_s5h1409_config = {
	.demod_address = 0x32 >> 1,
	.output_mode   = S5H1409_SERIAL_OUTPUT,
	.gpio          = S5H1409_GPIO_ON,
	.qam_if        = 44000,
	.inversion     = S5H1409_INVERSION_OFF,
	.status_mode   = S5H1409_DEMODLOCKING,
	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
};

209 210 211 212 213 214 215 216 217 218
static struct s5h1411_config dvico_s5h1411_config = {
	.output_mode   = S5H1411_SERIAL_OUTPUT,
	.gpio          = S5H1411_GPIO_ON,
	.qam_if        = S5H1411_IF_44000,
	.vsb_if        = S5H1411_IF_44000,
	.inversion     = S5H1411_INVERSION_OFF,
	.status_mode   = S5H1411_DEMODLOCKING,
	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
};

219 220 221 222 223 224 225 226 227 228
static struct s5h1411_config hcw_s5h1411_config = {
	.output_mode   = S5H1411_SERIAL_OUTPUT,
	.gpio          = S5H1411_GPIO_OFF,
	.vsb_if        = S5H1411_IF_44000,
	.qam_if        = S5H1411_IF_4000,
	.inversion     = S5H1411_INVERSION_ON,
	.status_mode   = S5H1411_DEMODLOCKING,
	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
};

229
static struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
230 231
	.i2c_address      = 0x61,
	.if_khz           = 5380,
232 233
};

234 235 236 237 238
static struct xc5000_config dvico_xc5000_tunerconfig = {
	.i2c_address      = 0x64,
	.if_khz           = 5380,
};

239 240 241 242
static struct tda829x_config tda829x_no_probe = {
	.probe_tuner = TDA829X_DONT_PROBE,
};

243
static struct tda18271_std_map hauppauge_tda18271_std_map = {
244 245 246 247
	.atsc_6   = { .if_freq = 5380, .agc_mode = 3, .std = 3,
		      .if_lvl = 6, .rfagc_top = 0x37 },
	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 0,
		      .if_lvl = 6, .rfagc_top = 0x37 },
248 249
};

250 251 252 253 254 255 256 257 258
static struct tda18271_std_map hauppauge_hvr1200_tda18271_std_map = {
	.dvbt_6   = { .if_freq = 3300, .agc_mode = 3, .std = 4,
		      .if_lvl = 1, .rfagc_top = 0x37, },
	.dvbt_7   = { .if_freq = 3800, .agc_mode = 3, .std = 5,
		      .if_lvl = 1, .rfagc_top = 0x37, },
	.dvbt_8   = { .if_freq = 4300, .agc_mode = 3, .std = 6,
		      .if_lvl = 1, .rfagc_top = 0x37, },
};

259 260 261
static struct tda18271_config hauppauge_tda18271_config = {
	.std_map = &hauppauge_tda18271_std_map,
	.gate    = TDA18271_GATE_ANALOG,
262
	.output_opt = TDA18271_OUTPUT_LT_OFF,
263 264
};

265
static struct tda18271_config hauppauge_hvr1200_tuner_config = {
266
	.std_map = &hauppauge_hvr1200_tda18271_std_map,
267
	.gate    = TDA18271_GATE_ANALOG,
268
	.output_opt = TDA18271_OUTPUT_LT_OFF,
269 270
};

271 272
static struct tda18271_config hauppauge_hvr1210_tuner_config = {
	.gate    = TDA18271_GATE_DIGITAL,
273
	.output_opt = TDA18271_OUTPUT_LT_OFF,
274 275
};

276
static struct tda18271_std_map hauppauge_hvr127x_std_map = {
277 278 279 280 281 282
	.atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 4,
		      .if_lvl = 1, .rfagc_top = 0x58 },
	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 5,
		      .if_lvl = 1, .rfagc_top = 0x58 },
};

283 284
static struct tda18271_config hauppauge_hvr127x_config = {
	.std_map = &hauppauge_hvr127x_std_map,
285
	.output_opt = TDA18271_OUTPUT_LT_OFF,
286 287
};

288
static struct lgdt3305_config hauppauge_lgdt3305_config = {
289 290 291 292 293 294 295 296 297 298
	.i2c_addr           = 0x0e,
	.mpeg_mode          = LGDT3305_MPEG_SERIAL,
	.tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
	.tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
	.deny_i2c_rptr      = 1,
	.spectral_inversion = 1,
	.qam_if_khz         = 4000,
	.vsb_if_khz         = 3250,
};

299
static struct dibx000_agc_config xc3028_agc_config = {
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
	BAND_VHF | BAND_UHF,	/* band_caps */

	/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
	 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
	 * P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0,
	 * P_agc_nb_est=2, P_agc_write=0
	 */
	(0 << 15) | (0 << 14) | (0 << 11) | (0 << 10) | (0 << 9) | (0 << 8) |
		(3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), /* setup */

	712,	/* inv_gain */
	21,	/* time_stabiliz */

	0,	/* alpha_level */
	118,	/* thlock */

	0,	/* wbd_inv */
	2867,	/* wbd_ref */
	0,	/* wbd_sel */
	2,	/* wbd_alpha */

	0,	/* agc1_max */
	0,	/* agc1_min */
	39718,	/* agc2_max */
	9930,	/* agc2_min */
	0,	/* agc1_pt1 */
	0,	/* agc1_pt2 */
	0,	/* agc1_pt3 */
	0,	/* agc1_slope1 */
	0,	/* agc1_slope2 */
	0,	/* agc2_pt1 */
	128,	/* agc2_pt2 */
	29,	/* agc2_slope1 */
	29,	/* agc2_slope2 */

	17,	/* alpha_mant */
	27,	/* alpha_exp */
	23,	/* beta_mant */
	51,	/* beta_exp */

	1,	/* perform_agc_softsplit */
};

/* PLL Configuration for COFDM BW_MHz = 8.000000
 * With external clock = 30.000000 */
345
static struct dibx000_bandwidth_config xc3028_bw_config = {
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
	60000,	/* internal */
	30000,	/* sampling */
	1,	/* pll_cfg: prediv */
	8,	/* pll_cfg: ratio */
	3,	/* pll_cfg: range */
	1,	/* pll_cfg: reset */
	0,	/* pll_cfg: bypass */
	0,	/* misc: refdiv */
	0,	/* misc: bypclk_div */
	1,	/* misc: IO_CLK_en_core */
	1,	/* misc: ADClkSrc */
	0,	/* misc: modulo */
	(3 << 14) | (1 << 12) | (524 << 0), /* sad_cfg: refsel, sel, freq_15k */
	(1 << 25) | 5816102, /* ifreq = 5.200000 MHz */
	20452225, /* timf */
	30000000  /* xtal_hz */
};

static struct dib7000p_config hauppauge_hvr1400_dib7000_config = {
	.output_mpeg2_in_188_bytes = 1,
	.hostbus_diversity = 1,
	.tuner_is_baseband = 0,
	.update_lna  = NULL,

	.agc_config_count = 1,
	.agc = &xc3028_agc_config,
	.bw  = &xc3028_bw_config,

	.gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS,
	.gpio_val = DIB7000P_GPIO_DEFAULT_VALUES,
	.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,

	.pwm_freq_div = 0,
	.agc_control  = NULL,
	.spur_protect = 0,

	.output_mode = OUTMODE_MPEG2_SERIAL,
};

385 386 387 388
static struct zl10353_config dvico_fusionhdtv_xc3028 = {
	.demod_address = 0x0f,
	.if2           = 45600,
	.no_tuner      = 1,
389
	.disable_i2c_gate_ctrl = 1,
390 391
};

392 393 394 395 396 397 398 399 400 401 402 403 404
static struct stv0900_reg stv0900_ts_regs[] = {
	{ R0900_TSGENERAL, 0x00 },
	{ R0900_P1_TSSPEED, 0x40 },
	{ R0900_P2_TSSPEED, 0x40 },
	{ R0900_P1_TSCFGM, 0xc0 },
	{ R0900_P2_TSCFGM, 0xc0 },
	{ R0900_P1_TSCFGH, 0xe0 },
	{ R0900_P2_TSCFGH, 0xe0 },
	{ R0900_P1_TSCFGL, 0x20 },
	{ R0900_P2_TSCFGL, 0x20 },
	{ 0xffff, 0xff }, /* terminate */
};

405 406
static struct stv0900_config netup_stv0900_config = {
	.demod_address = 0x68,
407
	.demod_mode = 1, /* dual */
408
	.xtal = 8000000,
409 410
	.clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
	.diseqc_mode = 2,/* 2/3 PWM */
411
	.ts_config_regs = stv0900_ts_regs,
412 413 414 415 416 417 418 419
	.tun1_maddress = 0,/* 0x60 */
	.tun2_maddress = 3,/* 0x63 */
	.tun1_adc = 1,/* 1 Vpp */
	.tun2_adc = 1,/* 1 Vpp */
};

static struct stv6110_config netup_stv6110_tunerconfig_a = {
	.i2c_address = 0x60,
420 421
	.mclk = 16000000,
	.clk_div = 1,
422
	.gain = 8, /* +16 dB  - maximum gain */
423 424 425 426
};

static struct stv6110_config netup_stv6110_tunerconfig_b = {
	.i2c_address = 0x63,
427 428
	.mclk = 16000000,
	.clk_div = 1,
429
	.gain = 8, /* +16 dB  - maximum gain */
430 431
};

432
static struct cx24116_config tbs_cx24116_config = {
433
	.demod_address = 0x55,
434 435
};

436 437
static struct ds3000_config tevii_ds3000_config = {
	.demod_address = 0x68,
438 439
};

440 441 442 443
static struct cx24116_config dvbworld_cx24116_config = {
	.demod_address = 0x05,
};

444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
static struct lgs8gxx_config mygica_x8506_lgs8gl5_config = {
	.prod = LGS8GXX_PROD_LGS8GL5,
	.demod_address = 0x19,
	.serial_ts = 0,
	.ts_clk_pol = 1,
	.ts_clk_gated = 1,
	.if_clk_freq = 30400, /* 30.4 MHz */
	.if_freq = 5380, /* 5.38 MHz */
	.if_neg_center = 1,
	.ext_adc = 0,
	.adc_signed = 0,
	.if_neg_edge = 0,
};

static struct xc5000_config mygica_x8506_xc5000_config = {
	.i2c_address = 0x61,
	.if_khz = 5380,
};

463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481
static int cx23885_dvb_set_frontend(struct dvb_frontend *fe,
				    struct dvb_frontend_parameters *param)
{
	struct cx23885_tsport *port = fe->dvb->priv;
	struct cx23885_dev *dev = port->dev;

	switch (dev->board) {
	case CX23885_BOARD_HAUPPAUGE_HVR1275:
		switch (param->u.vsb.modulation) {
		case VSB_8:
			cx23885_gpio_clear(dev, GPIO_5);
			break;
		case QAM_64:
		case QAM_256:
		default:
			cx23885_gpio_set(dev, GPIO_5);
			break;
		}
		break;
482 483 484 485 486
	case CX23885_BOARD_MYGICA_X8506:
	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
		/* Select Digital TV */
		cx23885_gpio_set(dev, GPIO_0);
		break;
487
	}
488
	return 0;
489 490
}

491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515
static int cx23885_dvb_fe_ioctl_override(struct dvb_frontend *fe,
					 unsigned int cmd, void *parg,
					 unsigned int stage)
{
	int err = 0;

	switch (stage) {
	case DVB_FE_IOCTL_PRE:

		switch (cmd) {
		case FE_SET_FRONTEND:
			err = cx23885_dvb_set_frontend(fe,
				(struct dvb_frontend_parameters *) parg);
			break;
		}
		break;

	case DVB_FE_IOCTL_POST:
		/* no post-ioctl handling required */
		break;
	}
	return err;
};


516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535
static struct lgs8gxx_config magicpro_prohdtve2_lgs8g75_config = {
	.prod = LGS8GXX_PROD_LGS8G75,
	.demod_address = 0x19,
	.serial_ts = 0,
	.ts_clk_pol = 1,
	.ts_clk_gated = 1,
	.if_clk_freq = 30400, /* 30.4 MHz */
	.if_freq = 6500, /* 6.50 MHz */
	.if_neg_center = 1,
	.ext_adc = 0,
	.adc_signed = 1,
	.adc_vpp = 2, /* 1.6 Vpp */
	.if_neg_edge = 1,
};

static struct xc5000_config magicpro_prohdtve2_xc5000_config = {
	.i2c_address = 0x61,
	.if_khz = 6500,
};

536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567
static struct atbm8830_config mygica_x8558pro_atbm8830_cfg1 = {
	.prod = ATBM8830_PROD_8830,
	.demod_address = 0x44,
	.serial_ts = 0,
	.ts_sampling_edge = 1,
	.ts_clk_gated = 0,
	.osc_clk_freq = 30400, /* in kHz */
	.if_freq = 0, /* zero IF */
	.zif_swap_iq = 1,
};

static struct max2165_config mygic_x8558pro_max2165_cfg1 = {
	.i2c_address = 0x60,
	.osc_clk = 20
};

static struct atbm8830_config mygica_x8558pro_atbm8830_cfg2 = {
	.prod = ATBM8830_PROD_8830,
	.demod_address = 0x44,
	.serial_ts = 1,
	.ts_sampling_edge = 1,
	.ts_clk_gated = 0,
	.osc_clk_freq = 30400, /* in kHz */
	.if_freq = 0, /* zero IF */
	.zif_swap_iq = 1,
};

static struct max2165_config mygic_x8558pro_max2165_cfg2 = {
	.i2c_address = 0x60,
	.osc_clk = 20
};

568 569 570
static int dvb_register(struct cx23885_tsport *port)
{
	struct cx23885_dev *dev = port->dev;
571
	struct cx23885_i2c *i2c_bus = NULL, *i2c_bus2 = NULL;
572
	struct videobuf_dvb_frontend *fe0;
573
	int ret;
574

575
	/* Get the first frontend */
576
	fe0 = videobuf_dvb_get_frontend(&port->frontends, 1);
577 578
	if (!fe0)
		return -EINVAL;
579 580

	/* init struct videobuf_dvb */
581
	fe0->dvb.name = dev->name;
582 583 584

	/* init frontend */
	switch (dev->board) {
585
	case CX23885_BOARD_HAUPPAUGE_HVR1250:
586
		i2c_bus = &dev->i2c_bus[0];
587
		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
588
						&hauppauge_generic_config,
589
						&i2c_bus->i2c_adap);
590 591
		if (fe0->dvb.frontend != NULL) {
			dvb_attach(mt2131_attach, fe0->dvb.frontend,
592
				   &i2c_bus->i2c_adap,
593
				   &hauppauge_generic_tunerconfig, 0);
594 595
		}
		break;
596
	case CX23885_BOARD_HAUPPAUGE_HVR1270:
597
	case CX23885_BOARD_HAUPPAUGE_HVR1275:
598 599
		i2c_bus = &dev->i2c_bus[0];
		fe0->dvb.frontend = dvb_attach(lgdt3305_attach,
600
					       &hauppauge_lgdt3305_config,
601 602 603 604
					       &i2c_bus->i2c_adap);
		if (fe0->dvb.frontend != NULL) {
			dvb_attach(tda18271_attach, fe0->dvb.frontend,
				   0x60, &dev->i2c_bus[1].i2c_adap,
605
				   &hauppauge_hvr127x_config);
606 607
		}
		break;
608 609 610 611 612 613 614 615 616 617 618
	case CX23885_BOARD_HAUPPAUGE_HVR1255:
		i2c_bus = &dev->i2c_bus[0];
		fe0->dvb.frontend = dvb_attach(s5h1411_attach,
					       &hcw_s5h1411_config,
					       &i2c_bus->i2c_adap);
		if (fe0->dvb.frontend != NULL) {
			dvb_attach(tda18271_attach, fe0->dvb.frontend,
				   0x60, &dev->i2c_bus[1].i2c_adap,
				   &hauppauge_tda18271_config);
		}
		break;
619 620
	case CX23885_BOARD_HAUPPAUGE_HVR1800:
		i2c_bus = &dev->i2c_bus[0];
621
		switch (alt_tuner) {
622
		case 1:
623
			fe0->dvb.frontend =
624 625 626
				dvb_attach(s5h1409_attach,
					   &hauppauge_ezqam_config,
					   &i2c_bus->i2c_adap);
627 628
			if (fe0->dvb.frontend != NULL) {
				dvb_attach(tda829x_attach, fe0->dvb.frontend,
629
					   &dev->i2c_bus[1].i2c_adap, 0x42,
630
					   &tda829x_no_probe);
631
				dvb_attach(tda18271_attach, fe0->dvb.frontend,
632
					   0x60, &dev->i2c_bus[1].i2c_adap,
633
					   &hauppauge_tda18271_config);
634 635 636 637
			}
			break;
		case 0:
		default:
638
			fe0->dvb.frontend =
639 640 641
				dvb_attach(s5h1409_attach,
					   &hauppauge_generic_config,
					   &i2c_bus->i2c_adap);
642 643
			if (fe0->dvb.frontend != NULL)
				dvb_attach(mt2131_attach, fe0->dvb.frontend,
644 645 646 647 648
					   &i2c_bus->i2c_adap,
					   &hauppauge_generic_tunerconfig, 0);
			break;
		}
		break;
649
	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
650
		i2c_bus = &dev->i2c_bus[0];
651
		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
652
						&hauppauge_hvr1800lp_config,
653
						&i2c_bus->i2c_adap);
654 655
		if (fe0->dvb.frontend != NULL) {
			dvb_attach(mt2131_attach, fe0->dvb.frontend,
656
				   &i2c_bus->i2c_adap,
657 658 659
				   &hauppauge_generic_tunerconfig, 0);
		}
		break;
660
	case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
661
		i2c_bus = &dev->i2c_bus[0];
662
		fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
663
						&fusionhdtv_5_express,
664
						&i2c_bus->i2c_adap);
665 666
		if (fe0->dvb.frontend != NULL) {
			dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
667 668
				   &i2c_bus->i2c_adap, 0x61,
				   TUNER_LG_TDVS_H06XF);
669 670
		}
		break;
671 672
	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
		i2c_bus = &dev->i2c_bus[1];
673
		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
674 675
						&hauppauge_hvr1500q_config,
						&dev->i2c_bus[0].i2c_adap);
676 677
		if (fe0->dvb.frontend != NULL)
			dvb_attach(xc5000_attach, fe0->dvb.frontend,
678 679
				   &i2c_bus->i2c_adap,
				   &hauppauge_hvr1500q_tunerconfig);
680
		break;
681 682
	case CX23885_BOARD_HAUPPAUGE_HVR1500:
		i2c_bus = &dev->i2c_bus[1];
683
		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
684 685
						&hauppauge_hvr1500_config,
						&dev->i2c_bus[0].i2c_adap);
686
		if (fe0->dvb.frontend != NULL) {
687 688 689 690 691 692
			struct dvb_frontend *fe;
			struct xc2028_config cfg = {
				.i2c_adap  = &i2c_bus->i2c_adap,
				.i2c_addr  = 0x61,
			};
			static struct xc2028_ctrl ctl = {
693
				.fname       = XC2028_DEFAULT_FIRMWARE,
694
				.max_len     = 64,
695
				.demod       = XC3028_FE_OREN538,
696 697 698
			};

			fe = dvb_attach(xc2028_attach,
699
					fe0->dvb.frontend, &cfg);
700 701 702 703
			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
				fe->ops.tuner_ops.set_config(fe, &ctl);
		}
		break;
704
	case CX23885_BOARD_HAUPPAUGE_HVR1200:
705
	case CX23885_BOARD_HAUPPAUGE_HVR1700:
706
		i2c_bus = &dev->i2c_bus[0];
707
		fe0->dvb.frontend = dvb_attach(tda10048_attach,
708 709
			&hauppauge_hvr1200_config,
			&i2c_bus->i2c_adap);
710 711
		if (fe0->dvb.frontend != NULL) {
			dvb_attach(tda829x_attach, fe0->dvb.frontend,
712 713
				&dev->i2c_bus[1].i2c_adap, 0x42,
				&tda829x_no_probe);
714
			dvb_attach(tda18271_attach, fe0->dvb.frontend,
715 716
				0x60, &dev->i2c_bus[1].i2c_adap,
				&hauppauge_hvr1200_tuner_config);
717 718 719 720 721 722 723 724 725 726 727
		}
		break;
	case CX23885_BOARD_HAUPPAUGE_HVR1210:
		i2c_bus = &dev->i2c_bus[0];
		fe0->dvb.frontend = dvb_attach(tda10048_attach,
			&hauppauge_hvr1210_config,
			&i2c_bus->i2c_adap);
		if (fe0->dvb.frontend != NULL) {
			dvb_attach(tda18271_attach, fe0->dvb.frontend,
				0x60, &dev->i2c_bus[1].i2c_adap,
				&hauppauge_hvr1210_tuner_config);
728 729
		}
		break;
730 731
	case CX23885_BOARD_HAUPPAUGE_HVR1400:
		i2c_bus = &dev->i2c_bus[0];
732
		fe0->dvb.frontend = dvb_attach(dib7000p_attach,
733 734
			&i2c_bus->i2c_adap,
			0x12, &hauppauge_hvr1400_dib7000_config);
735
		if (fe0->dvb.frontend != NULL) {
736 737 738 739 740 741
			struct dvb_frontend *fe;
			struct xc2028_config cfg = {
				.i2c_adap  = &dev->i2c_bus[1].i2c_adap,
				.i2c_addr  = 0x64,
			};
			static struct xc2028_ctrl ctl = {
742
				.fname   = XC3028L_DEFAULT_FIRMWARE,
743 744
				.max_len = 64,
				.demod   = 5000,
745 746
				/* This is true for all demods with
					v36 firmware? */
747
				.type    = XC2028_D2633,
748 749 750
			};

			fe = dvb_attach(xc2028_attach,
751
					fe0->dvb.frontend, &cfg);
752 753 754 755
			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
				fe->ops.tuner_ops.set_config(fe, &ctl);
		}
		break;
756 757 758
	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
		i2c_bus = &dev->i2c_bus[port->nr - 1];

759
		fe0->dvb.frontend = dvb_attach(s5h1409_attach,
760 761
						&dvico_s5h1409_config,
						&i2c_bus->i2c_adap);
762 763
		if (fe0->dvb.frontend == NULL)
			fe0->dvb.frontend = dvb_attach(s5h1411_attach,
764 765
							&dvico_s5h1411_config,
							&i2c_bus->i2c_adap);
766 767
		if (fe0->dvb.frontend != NULL)
			dvb_attach(xc5000_attach, fe0->dvb.frontend,
768 769
				   &i2c_bus->i2c_adap,
				   &dvico_xc5000_tunerconfig);
770
		break;
771 772 773
	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP: {
		i2c_bus = &dev->i2c_bus[port->nr - 1];

774
		fe0->dvb.frontend = dvb_attach(zl10353_attach,
775 776
					       &dvico_fusionhdtv_xc3028,
					       &i2c_bus->i2c_adap);
777
		if (fe0->dvb.frontend != NULL) {
778 779 780 781 782 783
			struct dvb_frontend      *fe;
			struct xc2028_config	  cfg = {
				.i2c_adap  = &i2c_bus->i2c_adap,
				.i2c_addr  = 0x61,
			};
			static struct xc2028_ctrl ctl = {
784
				.fname       = XC2028_DEFAULT_FIRMWARE,
785 786 787 788
				.max_len     = 64,
				.demod       = XC3028_FE_ZARLINK456,
			};

789
			fe = dvb_attach(xc2028_attach, fe0->dvb.frontend,
790 791 792 793 794 795
					&cfg);
			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
				fe->ops.tuner_ops.set_config(fe, &ctl);
		}
		break;
	}
796
	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
797
	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
798
	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
799 800
		i2c_bus = &dev->i2c_bus[0];

801
		fe0->dvb.frontend = dvb_attach(zl10353_attach,
802 803
			&dvico_fusionhdtv_xc3028,
			&i2c_bus->i2c_adap);
804
		if (fe0->dvb.frontend != NULL) {
805 806 807 808 809 810
			struct dvb_frontend      *fe;
			struct xc2028_config	  cfg = {
				.i2c_adap  = &dev->i2c_bus[1].i2c_adap,
				.i2c_addr  = 0x61,
			};
			static struct xc2028_ctrl ctl = {
811
				.fname       = XC2028_DEFAULT_FIRMWARE,
812 813 814 815
				.max_len     = 64,
				.demod       = XC3028_FE_ZARLINK456,
			};

816
			fe = dvb_attach(xc2028_attach, fe0->dvb.frontend,
817 818 819 820
				&cfg);
			if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
				fe->ops.tuner_ops.set_config(fe, &ctl);
		}
821 822
		break;
	case CX23885_BOARD_TBS_6920:
823
		i2c_bus = &dev->i2c_bus[1];
824 825

		fe0->dvb.frontend = dvb_attach(cx24116_attach,
826 827
					&tbs_cx24116_config,
					&i2c_bus->i2c_adap);
828
		if (fe0->dvb.frontend != NULL)
829
			fe0->dvb.frontend->ops.set_voltage = f300_set_voltage;
830

831 832 833 834
		break;
	case CX23885_BOARD_TEVII_S470:
		i2c_bus = &dev->i2c_bus[1];

835 836 837
		fe0->dvb.frontend = dvb_attach(ds3000_attach,
					&tevii_ds3000_config,
					&i2c_bus->i2c_adap);
838
		if (fe0->dvb.frontend != NULL)
839
			fe0->dvb.frontend->ops.set_voltage = f300_set_voltage;
840

841
		break;
842 843 844 845 846 847 848
	case CX23885_BOARD_DVBWORLD_2005:
		i2c_bus = &dev->i2c_bus[1];

		fe0->dvb.frontend = dvb_attach(cx24116_attach,
			&dvbworld_cx24116_config,
			&i2c_bus->i2c_adap);
		break;
849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864
	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
		i2c_bus = &dev->i2c_bus[0];
		switch (port->nr) {
		/* port B */
		case 1:
			fe0->dvb.frontend = dvb_attach(stv0900_attach,
							&netup_stv0900_config,
							&i2c_bus->i2c_adap, 0);
			if (fe0->dvb.frontend != NULL) {
				if (dvb_attach(stv6110_attach,
						fe0->dvb.frontend,
						&netup_stv6110_tunerconfig_a,
						&i2c_bus->i2c_adap)) {
					if (!dvb_attach(lnbh24_attach,
							fe0->dvb.frontend,
							&i2c_bus->i2c_adap,
865 866
							LNBH24_PCL | LNBH24_TTX,
							LNBH24_TEN, 0x09))
867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
						printk(KERN_ERR
							"No LNBH24 found!\n");

				}
			}
			break;
		/* port C */
		case 2:
			fe0->dvb.frontend = dvb_attach(stv0900_attach,
							&netup_stv0900_config,
							&i2c_bus->i2c_adap, 1);
			if (fe0->dvb.frontend != NULL) {
				if (dvb_attach(stv6110_attach,
						fe0->dvb.frontend,
						&netup_stv6110_tunerconfig_b,
						&i2c_bus->i2c_adap)) {
					if (!dvb_attach(lnbh24_attach,
							fe0->dvb.frontend,
							&i2c_bus->i2c_adap,
886 887
							LNBH24_PCL | LNBH24_TTX,
							LNBH24_TEN, 0x0a))
888 889 890 891 892 893 894 895
						printk(KERN_ERR
							"No LNBH24 found!\n");

				}
			}
			break;
		}
		break;
896 897 898 899 900 901 902 903 904 905 906 907 908
	case CX23885_BOARD_MYGICA_X8506:
		i2c_bus = &dev->i2c_bus[0];
		i2c_bus2 = &dev->i2c_bus[1];
		fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
			&mygica_x8506_lgs8gl5_config,
			&i2c_bus->i2c_adap);
		if (fe0->dvb.frontend != NULL) {
			dvb_attach(xc5000_attach,
				fe0->dvb.frontend,
				&i2c_bus2->i2c_adap,
				&mygica_x8506_xc5000_config);
		}
		break;
909 910 911 912 913 914 915 916 917 918 919 920 921
	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
		i2c_bus = &dev->i2c_bus[0];
		i2c_bus2 = &dev->i2c_bus[1];
		fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
			&magicpro_prohdtve2_lgs8g75_config,
			&i2c_bus->i2c_adap);
		if (fe0->dvb.frontend != NULL) {
			dvb_attach(xc5000_attach,
				fe0->dvb.frontend,
				&i2c_bus2->i2c_adap,
				&magicpro_prohdtve2_xc5000_config);
		}
		break;
922
	case CX23885_BOARD_HAUPPAUGE_HVR1850:
923
	case CX23885_BOARD_HAUPPAUGE_HVR1290:
924 925 926 927 928 929 930 931 932
		i2c_bus = &dev->i2c_bus[0];
		fe0->dvb.frontend = dvb_attach(s5h1411_attach,
			&hcw_s5h1411_config,
			&i2c_bus->i2c_adap);
		if (fe0->dvb.frontend != NULL)
			dvb_attach(tda18271_attach, fe0->dvb.frontend,
				0x60, &dev->i2c_bus[0].i2c_adap,
				&hauppauge_tda18271_config);
		break;
933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962
	case CX23885_BOARD_MYGICA_X8558PRO:
		switch (port->nr) {
		/* port B */
		case 1:
			i2c_bus = &dev->i2c_bus[0];
			fe0->dvb.frontend = dvb_attach(atbm8830_attach,
				&mygica_x8558pro_atbm8830_cfg1,
				&i2c_bus->i2c_adap);
			if (fe0->dvb.frontend != NULL) {
				dvb_attach(max2165_attach,
					fe0->dvb.frontend,
					&i2c_bus->i2c_adap,
					&mygic_x8558pro_max2165_cfg1);
			}
			break;
		/* port C */
		case 2:
			i2c_bus = &dev->i2c_bus[1];
			fe0->dvb.frontend = dvb_attach(atbm8830_attach,
				&mygica_x8558pro_atbm8830_cfg2,
				&i2c_bus->i2c_adap);
			if (fe0->dvb.frontend != NULL) {
				dvb_attach(max2165_attach,
					fe0->dvb.frontend,
					&i2c_bus->i2c_adap,
					&mygic_x8558pro_max2165_cfg2);
			}
			break;
		}
		break;
963

964
	default:
965 966
		printk(KERN_INFO "%s: The frontend of your DVB/ATSC card "
			" isn't supported yet\n",
967 968 969
		       dev->name);
		break;
	}
970
	if (NULL == fe0->dvb.frontend) {
971 972
		printk(KERN_ERR "%s: frontend initialization failed\n",
			dev->name);
973 974
		return -1;
	}
975
	/* define general-purpose callback pointer */
976
	fe0->dvb.frontend->callback = cx23885_tuner_callback;
977 978

	/* Put the analog decoder in standby to keep it quiet */
979
	call_all(dev, core, s_power, 0);
980

981 982
	if (fe0->dvb.frontend->ops.analog_ops.standby)
		fe0->dvb.frontend->ops.analog_ops.standby(fe0->dvb.frontend);
983

984
	/* register everything */
985
	ret = videobuf_dvb_register_bus(&port->frontends, THIS_MODULE, port,
986 987
					&dev->pci->dev, adapter_nr, 0,
					cx23885_dvb_fe_ioctl_override);
988

989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012
	/* init CI & MAC */
	switch (dev->board) {
	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI: {
		static struct netup_card_info cinfo;

		netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo);
		memcpy(port->frontends.adapter.proposed_mac,
				cinfo.port[port->nr - 1].mac, 6);
		printk(KERN_INFO "NetUP Dual DVB-S2 CI card port%d MAC="
			"%02X:%02X:%02X:%02X:%02X:%02X\n",
			port->nr,
			port->frontends.adapter.proposed_mac[0],
			port->frontends.adapter.proposed_mac[1],
			port->frontends.adapter.proposed_mac[2],
			port->frontends.adapter.proposed_mac[3],
			port->frontends.adapter.proposed_mac[4],
			port->frontends.adapter.proposed_mac[5]);

		netup_ci_init(port);
		break;
		}
	}

	return ret;
1013 1014 1015 1016
}

int cx23885_dvb_register(struct cx23885_tsport *port)
{
1017 1018

	struct videobuf_dvb_frontend *fe0;
1019
	struct cx23885_dev *dev = port->dev;
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
	int err, i;

	/* Here we need to allocate the correct number of frontends,
	 * as reflected in the cards struct. The reality is that currrently
	 * no cx23885 boards support this - yet. But, if we don't modify this
	 * code then the second frontend would never be allocated (later)
	 * and fail with error before the attach in dvb_register().
	 * Without these changes we risk an OOPS later. The changes here
	 * are for safety, and should provide a good foundation for the
	 * future addition of any multi-frontend cx23885 based boards.
	 */
	printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
		port->num_frontends);
1033

1034
	for (i = 1; i <= port->num_frontends; i++) {
1035
		if (videobuf_dvb_alloc_frontend(
1036
			&port->frontends, i) == NULL) {
1037 1038 1039 1040 1041 1042 1043
			printk(KERN_ERR "%s() failed to alloc\n", __func__);
			return -ENOMEM;
		}

		fe0 = videobuf_dvb_get_frontend(&port->frontends, i);
		if (!fe0)
			err = -EINVAL;
1044

1045
		dprintk(1, "%s\n", __func__);
1046
		dprintk(1, " ->probed by Card=%d Name=%s, PCI %02x:%02x\n",
1047 1048 1049 1050
			dev->board,
			dev->name,
			dev->pci_bus,
			dev->pci_slot);
1051

1052
		err = -ENODEV;
1053

1054 1055
		/* dvb stuff */
		/* We have to init the queue for each frontend on a port. */
1056 1057 1058
		printk(KERN_INFO "%s: cx23885 based dvb card\n", dev->name);
		videobuf_queue_sg_init(&fe0->dvb.dvbq, &dvb_qops,
			    &dev->pci->dev, &port->slock,
1059 1060
			    V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_TOP,
			    sizeof(struct cx23885_buffer), port);
1061
	}
1062 1063
	err = dvb_register(port);
	if (err != 0)
1064 1065
		printk(KERN_ERR "%s() dvb_register failed err = %d\n",
			__func__, err);
1066 1067 1068 1069 1070 1071

	return err;
}

int cx23885_dvb_unregister(struct cx23885_tsport *port)
{
1072 1073
	struct videobuf_dvb_frontend *fe0;

1074 1075 1076 1077 1078 1079 1080
	/* FIXME: in an error condition where the we have
	 * an expected number of frontends (attach problem)
	 * then this might not clean up correctly, if 1
	 * is invalid.
	 * This comment only applies to future boards IF they
	 * implement MFE support.
	 */
1081
	fe0 = videobuf_dvb_get_frontend(&port->frontends, 1);
1082
	if (fe0->dvb.frontend)
1083
		videobuf_dvb_unregister_bus(&port->frontends);
1084

1085 1086 1087 1088 1089
	switch (port->dev->board) {
	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
		netup_ci_exit(port);
		break;
	}
1090

1091 1092
	return 0;
}
1093