rt2800: initialize BBP_R104 on proper subroutines
[linux/fpc-iii.git] / drivers / media / pci / cx88 / cx88-dvb.c
blob053ed1ba1d85f34810b37dd78681d2cd5b9541e4
1 /*
3 * device driver for Conexant 2388x based TV cards
4 * MPEG Transport Stream (DVB) routines
6 * (c) 2004, 2005 Chris Pascoe <c.pascoe@itee.uq.edu.au>
7 * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/device.h>
27 #include <linux/fs.h>
28 #include <linux/kthread.h>
29 #include <linux/file.h>
30 #include <linux/suspend.h>
32 #include "cx88.h"
33 #include "dvb-pll.h"
34 #include <media/v4l2-common.h>
36 #include "mt352.h"
37 #include "mt352_priv.h"
38 #include "cx88-vp3054-i2c.h"
39 #include "zl10353.h"
40 #include "cx22702.h"
41 #include "or51132.h"
42 #include "lgdt330x.h"
43 #include "s5h1409.h"
44 #include "xc4000.h"
45 #include "xc5000.h"
46 #include "nxt200x.h"
47 #include "cx24123.h"
48 #include "isl6421.h"
49 #include "tuner-simple.h"
50 #include "tda9887.h"
51 #include "s5h1411.h"
52 #include "stv0299.h"
53 #include "z0194a.h"
54 #include "stv0288.h"
55 #include "stb6000.h"
56 #include "cx24116.h"
57 #include "stv0900.h"
58 #include "stb6100.h"
59 #include "stb6100_proc.h"
60 #include "mb86a16.h"
61 #include "ts2020.h"
62 #include "ds3000.h"
64 MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
65 MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
66 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
67 MODULE_LICENSE("GPL");
68 MODULE_VERSION(CX88_VERSION);
70 static unsigned int debug;
71 module_param(debug, int, 0644);
72 MODULE_PARM_DESC(debug,"enable debug messages [dvb]");
74 static unsigned int dvb_buf_tscnt = 32;
75 module_param(dvb_buf_tscnt, int, 0644);
76 MODULE_PARM_DESC(dvb_buf_tscnt, "DVB Buffer TS count [dvb]");
78 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
80 #define dprintk(level,fmt, arg...) if (debug >= level) \
81 printk(KERN_DEBUG "%s/2-dvb: " fmt, core->name, ## arg)
83 /* ------------------------------------------------------------------ */
85 static int dvb_buf_setup(struct videobuf_queue *q,
86 unsigned int *count, unsigned int *size)
88 struct cx8802_dev *dev = q->priv_data;
90 dev->ts_packet_size = 188 * 4;
91 dev->ts_packet_count = dvb_buf_tscnt;
93 *size = dev->ts_packet_size * dev->ts_packet_count;
94 *count = dvb_buf_tscnt;
95 return 0;
98 static int dvb_buf_prepare(struct videobuf_queue *q,
99 struct videobuf_buffer *vb, enum v4l2_field field)
101 struct cx8802_dev *dev = q->priv_data;
102 return cx8802_buf_prepare(q, dev, (struct cx88_buffer*)vb,field);
105 static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
107 struct cx8802_dev *dev = q->priv_data;
108 cx8802_buf_queue(dev, (struct cx88_buffer*)vb);
111 static void dvb_buf_release(struct videobuf_queue *q,
112 struct videobuf_buffer *vb)
114 cx88_free_buffer(q, (struct cx88_buffer*)vb);
117 static const struct videobuf_queue_ops dvb_qops = {
118 .buf_setup = dvb_buf_setup,
119 .buf_prepare = dvb_buf_prepare,
120 .buf_queue = dvb_buf_queue,
121 .buf_release = dvb_buf_release,
124 /* ------------------------------------------------------------------ */
126 static int cx88_dvb_bus_ctrl(struct dvb_frontend* fe, int acquire)
128 struct cx8802_dev *dev= fe->dvb->priv;
129 struct cx8802_driver *drv = NULL;
130 int ret = 0;
131 int fe_id;
133 fe_id = videobuf_dvb_find_frontend(&dev->frontends, fe);
134 if (!fe_id) {
135 printk(KERN_ERR "%s() No frontend found\n", __func__);
136 return -EINVAL;
139 mutex_lock(&dev->core->lock);
140 drv = cx8802_get_driver(dev, CX88_MPEG_DVB);
141 if (drv) {
142 if (acquire){
143 dev->frontends.active_fe_id = fe_id;
144 ret = drv->request_acquire(drv);
145 } else {
146 ret = drv->request_release(drv);
147 dev->frontends.active_fe_id = 0;
150 mutex_unlock(&dev->core->lock);
152 return ret;
155 static void cx88_dvb_gate_ctrl(struct cx88_core *core, int open)
157 struct videobuf_dvb_frontends *f;
158 struct videobuf_dvb_frontend *fe;
160 if (!core->dvbdev)
161 return;
163 f = &core->dvbdev->frontends;
165 if (!f)
166 return;
168 if (f->gate <= 1) /* undefined or fe0 */
169 fe = videobuf_dvb_get_frontend(f, 1);
170 else
171 fe = videobuf_dvb_get_frontend(f, f->gate);
173 if (fe && fe->dvb.frontend && fe->dvb.frontend->ops.i2c_gate_ctrl)
174 fe->dvb.frontend->ops.i2c_gate_ctrl(fe->dvb.frontend, open);
177 /* ------------------------------------------------------------------ */
179 static int dvico_fusionhdtv_demod_init(struct dvb_frontend* fe)
181 static const u8 clock_config [] = { CLOCK_CTL, 0x38, 0x39 };
182 static const u8 reset [] = { RESET, 0x80 };
183 static const u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
184 static const u8 agc_cfg [] = { AGC_TARGET, 0x24, 0x20 };
185 static const u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
186 static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
188 mt352_write(fe, clock_config, sizeof(clock_config));
189 udelay(200);
190 mt352_write(fe, reset, sizeof(reset));
191 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
193 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
194 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
195 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
196 return 0;
199 static int dvico_dual_demod_init(struct dvb_frontend *fe)
201 static const u8 clock_config [] = { CLOCK_CTL, 0x38, 0x38 };
202 static const u8 reset [] = { RESET, 0x80 };
203 static const u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
204 static const u8 agc_cfg [] = { AGC_TARGET, 0x28, 0x20 };
205 static const u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
206 static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
208 mt352_write(fe, clock_config, sizeof(clock_config));
209 udelay(200);
210 mt352_write(fe, reset, sizeof(reset));
211 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
213 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
214 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
215 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
217 return 0;
220 static int dntv_live_dvbt_demod_init(struct dvb_frontend* fe)
222 static const u8 clock_config [] = { 0x89, 0x38, 0x39 };
223 static const u8 reset [] = { 0x50, 0x80 };
224 static const u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 };
225 static const u8 agc_cfg [] = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF,
226 0x00, 0xFF, 0x00, 0x40, 0x40 };
227 static const u8 dntv_extra[] = { 0xB5, 0x7A };
228 static const u8 capt_range_cfg[] = { 0x75, 0x32 };
230 mt352_write(fe, clock_config, sizeof(clock_config));
231 udelay(2000);
232 mt352_write(fe, reset, sizeof(reset));
233 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
235 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
236 udelay(2000);
237 mt352_write(fe, dntv_extra, sizeof(dntv_extra));
238 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
240 return 0;
243 static const struct mt352_config dvico_fusionhdtv = {
244 .demod_address = 0x0f,
245 .demod_init = dvico_fusionhdtv_demod_init,
248 static const struct mt352_config dntv_live_dvbt_config = {
249 .demod_address = 0x0f,
250 .demod_init = dntv_live_dvbt_demod_init,
253 static const struct mt352_config dvico_fusionhdtv_dual = {
254 .demod_address = 0x0f,
255 .demod_init = dvico_dual_demod_init,
258 static const struct zl10353_config cx88_terratec_cinergy_ht_pci_mkii_config = {
259 .demod_address = (0x1e >> 1),
260 .no_tuner = 1,
261 .if2 = 45600,
264 static struct mb86a16_config twinhan_vp1027 = {
265 .demod_address = 0x08,
268 #if IS_ENABLED(CONFIG_VIDEO_CX88_VP3054)
269 static int dntv_live_dvbt_pro_demod_init(struct dvb_frontend* fe)
271 static const u8 clock_config [] = { 0x89, 0x38, 0x38 };
272 static const u8 reset [] = { 0x50, 0x80 };
273 static const u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 };
274 static const u8 agc_cfg [] = { 0x67, 0x10, 0x20, 0x00, 0xFF, 0xFF,
275 0x00, 0xFF, 0x00, 0x40, 0x40 };
276 static const u8 dntv_extra[] = { 0xB5, 0x7A };
277 static const u8 capt_range_cfg[] = { 0x75, 0x32 };
279 mt352_write(fe, clock_config, sizeof(clock_config));
280 udelay(2000);
281 mt352_write(fe, reset, sizeof(reset));
282 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
284 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
285 udelay(2000);
286 mt352_write(fe, dntv_extra, sizeof(dntv_extra));
287 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
289 return 0;
292 static const struct mt352_config dntv_live_dvbt_pro_config = {
293 .demod_address = 0x0f,
294 .no_tuner = 1,
295 .demod_init = dntv_live_dvbt_pro_demod_init,
297 #endif
299 static const struct zl10353_config dvico_fusionhdtv_hybrid = {
300 .demod_address = 0x0f,
301 .no_tuner = 1,
304 static const struct zl10353_config dvico_fusionhdtv_xc3028 = {
305 .demod_address = 0x0f,
306 .if2 = 45600,
307 .no_tuner = 1,
310 static const struct mt352_config dvico_fusionhdtv_mt352_xc3028 = {
311 .demod_address = 0x0f,
312 .if2 = 4560,
313 .no_tuner = 1,
314 .demod_init = dvico_fusionhdtv_demod_init,
317 static const struct zl10353_config dvico_fusionhdtv_plus_v1_1 = {
318 .demod_address = 0x0f,
321 static const struct cx22702_config connexant_refboard_config = {
322 .demod_address = 0x43,
323 .output_mode = CX22702_SERIAL_OUTPUT,
326 static const struct cx22702_config hauppauge_hvr_config = {
327 .demod_address = 0x63,
328 .output_mode = CX22702_SERIAL_OUTPUT,
331 static int or51132_set_ts_param(struct dvb_frontend* fe, int is_punctured)
333 struct cx8802_dev *dev= fe->dvb->priv;
334 dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
335 return 0;
338 static const struct or51132_config pchdtv_hd3000 = {
339 .demod_address = 0x15,
340 .set_ts_params = or51132_set_ts_param,
343 static int lgdt330x_pll_rf_set(struct dvb_frontend* fe, int index)
345 struct cx8802_dev *dev= fe->dvb->priv;
346 struct cx88_core *core = dev->core;
348 dprintk(1, "%s: index = %d\n", __func__, index);
349 if (index == 0)
350 cx_clear(MO_GP0_IO, 8);
351 else
352 cx_set(MO_GP0_IO, 8);
353 return 0;
356 static int lgdt330x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
358 struct cx8802_dev *dev= fe->dvb->priv;
359 if (is_punctured)
360 dev->ts_gen_cntrl |= 0x04;
361 else
362 dev->ts_gen_cntrl &= ~0x04;
363 return 0;
366 static struct lgdt330x_config fusionhdtv_3_gold = {
367 .demod_address = 0x0e,
368 .demod_chip = LGDT3302,
369 .serial_mpeg = 0x04, /* TPSERIAL for 3302 in TOP_CONTROL */
370 .set_ts_params = lgdt330x_set_ts_param,
373 static const struct lgdt330x_config fusionhdtv_5_gold = {
374 .demod_address = 0x0e,
375 .demod_chip = LGDT3303,
376 .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
377 .set_ts_params = lgdt330x_set_ts_param,
380 static const struct lgdt330x_config pchdtv_hd5500 = {
381 .demod_address = 0x59,
382 .demod_chip = LGDT3303,
383 .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
384 .set_ts_params = lgdt330x_set_ts_param,
387 static int nxt200x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
389 struct cx8802_dev *dev= fe->dvb->priv;
390 dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
391 return 0;
394 static const struct nxt200x_config ati_hdtvwonder = {
395 .demod_address = 0x0a,
396 .set_ts_params = nxt200x_set_ts_param,
399 static int cx24123_set_ts_param(struct dvb_frontend* fe,
400 int is_punctured)
402 struct cx8802_dev *dev= fe->dvb->priv;
403 dev->ts_gen_cntrl = 0x02;
404 return 0;
407 static int kworld_dvbs_100_set_voltage(struct dvb_frontend* fe,
408 fe_sec_voltage_t voltage)
410 struct cx8802_dev *dev= fe->dvb->priv;
411 struct cx88_core *core = dev->core;
413 if (voltage == SEC_VOLTAGE_OFF)
414 cx_write(MO_GP0_IO, 0x000006fb);
415 else
416 cx_write(MO_GP0_IO, 0x000006f9);
418 if (core->prev_set_voltage)
419 return core->prev_set_voltage(fe, voltage);
420 return 0;
423 static int geniatech_dvbs_set_voltage(struct dvb_frontend *fe,
424 fe_sec_voltage_t voltage)
426 struct cx8802_dev *dev= fe->dvb->priv;
427 struct cx88_core *core = dev->core;
429 if (voltage == SEC_VOLTAGE_OFF) {
430 dprintk(1,"LNB Voltage OFF\n");
431 cx_write(MO_GP0_IO, 0x0000efff);
434 if (core->prev_set_voltage)
435 return core->prev_set_voltage(fe, voltage);
436 return 0;
439 static int tevii_dvbs_set_voltage(struct dvb_frontend *fe,
440 fe_sec_voltage_t voltage)
442 struct cx8802_dev *dev= fe->dvb->priv;
443 struct cx88_core *core = dev->core;
445 cx_set(MO_GP0_IO, 0x6040);
446 switch (voltage) {
447 case SEC_VOLTAGE_13:
448 cx_clear(MO_GP0_IO, 0x20);
449 break;
450 case SEC_VOLTAGE_18:
451 cx_set(MO_GP0_IO, 0x20);
452 break;
453 case SEC_VOLTAGE_OFF:
454 cx_clear(MO_GP0_IO, 0x20);
455 break;
458 if (core->prev_set_voltage)
459 return core->prev_set_voltage(fe, voltage);
460 return 0;
463 static int vp1027_set_voltage(struct dvb_frontend *fe,
464 fe_sec_voltage_t voltage)
466 struct cx8802_dev *dev = fe->dvb->priv;
467 struct cx88_core *core = dev->core;
469 switch (voltage) {
470 case SEC_VOLTAGE_13:
471 dprintk(1, "LNB SEC Voltage=13\n");
472 cx_write(MO_GP0_IO, 0x00001220);
473 break;
474 case SEC_VOLTAGE_18:
475 dprintk(1, "LNB SEC Voltage=18\n");
476 cx_write(MO_GP0_IO, 0x00001222);
477 break;
478 case SEC_VOLTAGE_OFF:
479 dprintk(1, "LNB Voltage OFF\n");
480 cx_write(MO_GP0_IO, 0x00001230);
481 break;
484 if (core->prev_set_voltage)
485 return core->prev_set_voltage(fe, voltage);
486 return 0;
489 static const struct cx24123_config geniatech_dvbs_config = {
490 .demod_address = 0x55,
491 .set_ts_params = cx24123_set_ts_param,
494 static const struct cx24123_config hauppauge_novas_config = {
495 .demod_address = 0x55,
496 .set_ts_params = cx24123_set_ts_param,
499 static const struct cx24123_config kworld_dvbs_100_config = {
500 .demod_address = 0x15,
501 .set_ts_params = cx24123_set_ts_param,
502 .lnb_polarity = 1,
505 static const struct s5h1409_config pinnacle_pctv_hd_800i_config = {
506 .demod_address = 0x32 >> 1,
507 .output_mode = S5H1409_PARALLEL_OUTPUT,
508 .gpio = S5H1409_GPIO_ON,
509 .qam_if = 44000,
510 .inversion = S5H1409_INVERSION_OFF,
511 .status_mode = S5H1409_DEMODLOCKING,
512 .mpeg_timing = S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
515 static const struct s5h1409_config dvico_hdtv5_pci_nano_config = {
516 .demod_address = 0x32 >> 1,
517 .output_mode = S5H1409_SERIAL_OUTPUT,
518 .gpio = S5H1409_GPIO_OFF,
519 .inversion = S5H1409_INVERSION_OFF,
520 .status_mode = S5H1409_DEMODLOCKING,
521 .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
524 static const struct s5h1409_config kworld_atsc_120_config = {
525 .demod_address = 0x32 >> 1,
526 .output_mode = S5H1409_SERIAL_OUTPUT,
527 .gpio = S5H1409_GPIO_OFF,
528 .inversion = S5H1409_INVERSION_OFF,
529 .status_mode = S5H1409_DEMODLOCKING,
530 .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
533 static const struct xc5000_config pinnacle_pctv_hd_800i_tuner_config = {
534 .i2c_address = 0x64,
535 .if_khz = 5380,
538 static const struct zl10353_config cx88_pinnacle_hybrid_pctv = {
539 .demod_address = (0x1e >> 1),
540 .no_tuner = 1,
541 .if2 = 45600,
544 static const struct zl10353_config cx88_geniatech_x8000_mt = {
545 .demod_address = (0x1e >> 1),
546 .no_tuner = 1,
547 .disable_i2c_gate_ctrl = 1,
550 static const struct s5h1411_config dvico_fusionhdtv7_config = {
551 .output_mode = S5H1411_SERIAL_OUTPUT,
552 .gpio = S5H1411_GPIO_ON,
553 .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
554 .qam_if = S5H1411_IF_44000,
555 .vsb_if = S5H1411_IF_44000,
556 .inversion = S5H1411_INVERSION_OFF,
557 .status_mode = S5H1411_DEMODLOCKING
560 static const struct xc5000_config dvico_fusionhdtv7_tuner_config = {
561 .i2c_address = 0xc2 >> 1,
562 .if_khz = 5380,
565 static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
567 struct dvb_frontend *fe;
568 struct videobuf_dvb_frontend *fe0 = NULL;
569 struct xc2028_ctrl ctl;
570 struct xc2028_config cfg = {
571 .i2c_adap = &dev->core->i2c_adap,
572 .i2c_addr = addr,
573 .ctrl = &ctl,
576 /* Get the first frontend */
577 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
578 if (!fe0)
579 return -EINVAL;
581 if (!fe0->dvb.frontend) {
582 printk(KERN_ERR "%s/2: dvb frontend not attached. "
583 "Can't attach xc3028\n",
584 dev->core->name);
585 return -EINVAL;
589 * Some xc3028 devices may be hidden by an I2C gate. This is known
590 * to happen with some s5h1409-based devices.
591 * Now that I2C gate is open, sets up xc3028 configuration
593 cx88_setup_xc3028(dev->core, &ctl);
595 fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
596 if (!fe) {
597 printk(KERN_ERR "%s/2: xc3028 attach failed\n",
598 dev->core->name);
599 dvb_frontend_detach(fe0->dvb.frontend);
600 dvb_unregister_frontend(fe0->dvb.frontend);
601 fe0->dvb.frontend = NULL;
602 return -EINVAL;
605 printk(KERN_INFO "%s/2: xc3028 attached\n",
606 dev->core->name);
608 return 0;
611 static int attach_xc4000(struct cx8802_dev *dev, struct xc4000_config *cfg)
613 struct dvb_frontend *fe;
614 struct videobuf_dvb_frontend *fe0 = NULL;
616 /* Get the first frontend */
617 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
618 if (!fe0)
619 return -EINVAL;
621 if (!fe0->dvb.frontend) {
622 printk(KERN_ERR "%s/2: dvb frontend not attached. "
623 "Can't attach xc4000\n",
624 dev->core->name);
625 return -EINVAL;
628 fe = dvb_attach(xc4000_attach, fe0->dvb.frontend, &dev->core->i2c_adap,
629 cfg);
630 if (!fe) {
631 printk(KERN_ERR "%s/2: xc4000 attach failed\n",
632 dev->core->name);
633 dvb_frontend_detach(fe0->dvb.frontend);
634 dvb_unregister_frontend(fe0->dvb.frontend);
635 fe0->dvb.frontend = NULL;
636 return -EINVAL;
639 printk(KERN_INFO "%s/2: xc4000 attached\n", dev->core->name);
641 return 0;
644 static int cx24116_set_ts_param(struct dvb_frontend *fe,
645 int is_punctured)
647 struct cx8802_dev *dev = fe->dvb->priv;
648 dev->ts_gen_cntrl = 0x2;
650 return 0;
653 static int stv0900_set_ts_param(struct dvb_frontend *fe,
654 int is_punctured)
656 struct cx8802_dev *dev = fe->dvb->priv;
657 dev->ts_gen_cntrl = 0;
659 return 0;
662 static int cx24116_reset_device(struct dvb_frontend *fe)
664 struct cx8802_dev *dev = fe->dvb->priv;
665 struct cx88_core *core = dev->core;
667 /* Reset the part */
668 /* Put the cx24116 into reset */
669 cx_write(MO_SRST_IO, 0);
670 msleep(10);
671 /* Take the cx24116 out of reset */
672 cx_write(MO_SRST_IO, 1);
673 msleep(10);
675 return 0;
678 static const struct cx24116_config hauppauge_hvr4000_config = {
679 .demod_address = 0x05,
680 .set_ts_params = cx24116_set_ts_param,
681 .reset_device = cx24116_reset_device,
684 static const struct cx24116_config tevii_s460_config = {
685 .demod_address = 0x55,
686 .set_ts_params = cx24116_set_ts_param,
687 .reset_device = cx24116_reset_device,
690 static int ds3000_set_ts_param(struct dvb_frontend *fe,
691 int is_punctured)
693 struct cx8802_dev *dev = fe->dvb->priv;
694 dev->ts_gen_cntrl = 4;
696 return 0;
699 static struct ds3000_config tevii_ds3000_config = {
700 .demod_address = 0x68,
701 .set_ts_params = ds3000_set_ts_param,
704 static struct ts2020_config tevii_ts2020_config = {
705 .tuner_address = 0x60,
706 .clk_out_div = 1,
709 static const struct stv0900_config prof_7301_stv0900_config = {
710 .demod_address = 0x6a,
711 /* demod_mode = 0,*/
712 .xtal = 27000000,
713 .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
714 .diseqc_mode = 2,/* 2/3 PWM */
715 .tun1_maddress = 0,/* 0x60 */
716 .tun1_adc = 0,/* 2 Vpp */
717 .path1_mode = 3,
718 .set_ts_params = stv0900_set_ts_param,
721 static const struct stb6100_config prof_7301_stb6100_config = {
722 .tuner_address = 0x60,
723 .refclock = 27000000,
726 static const struct stv0299_config tevii_tuner_sharp_config = {
727 .demod_address = 0x68,
728 .inittab = sharp_z0194a_inittab,
729 .mclk = 88000000UL,
730 .invert = 1,
731 .skip_reinit = 0,
732 .lock_output = 1,
733 .volt13_op0_op1 = STV0299_VOLT13_OP1,
734 .min_delay_ms = 100,
735 .set_symbol_rate = sharp_z0194a_set_symbol_rate,
736 .set_ts_params = cx24116_set_ts_param,
739 static const struct stv0288_config tevii_tuner_earda_config = {
740 .demod_address = 0x68,
741 .min_delay_ms = 100,
742 .set_ts_params = cx24116_set_ts_param,
745 static int cx8802_alloc_frontends(struct cx8802_dev *dev)
747 struct cx88_core *core = dev->core;
748 struct videobuf_dvb_frontend *fe = NULL;
749 int i;
751 mutex_init(&dev->frontends.lock);
752 INIT_LIST_HEAD(&dev->frontends.felist);
754 if (!core->board.num_frontends)
755 return -ENODEV;
757 printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
758 core->board.num_frontends);
759 for (i = 1; i <= core->board.num_frontends; i++) {
760 fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
761 if (!fe) {
762 printk(KERN_ERR "%s() failed to alloc\n", __func__);
763 videobuf_dvb_dealloc_frontends(&dev->frontends);
764 return -ENOMEM;
767 return 0;
772 static const u8 samsung_smt_7020_inittab[] = {
773 0x01, 0x15,
774 0x02, 0x00,
775 0x03, 0x00,
776 0x04, 0x7D,
777 0x05, 0x0F,
778 0x06, 0x02,
779 0x07, 0x00,
780 0x08, 0x60,
782 0x0A, 0xC2,
783 0x0B, 0x00,
784 0x0C, 0x01,
785 0x0D, 0x81,
786 0x0E, 0x44,
787 0x0F, 0x09,
788 0x10, 0x3C,
789 0x11, 0x84,
790 0x12, 0xDA,
791 0x13, 0x99,
792 0x14, 0x8D,
793 0x15, 0xCE,
794 0x16, 0xE8,
795 0x17, 0x43,
796 0x18, 0x1C,
797 0x19, 0x1B,
798 0x1A, 0x1D,
800 0x1C, 0x12,
801 0x1D, 0x00,
802 0x1E, 0x00,
803 0x1F, 0x00,
804 0x20, 0x00,
805 0x21, 0x00,
806 0x22, 0x00,
807 0x23, 0x00,
809 0x28, 0x02,
810 0x29, 0x28,
811 0x2A, 0x14,
812 0x2B, 0x0F,
813 0x2C, 0x09,
814 0x2D, 0x05,
816 0x31, 0x1F,
817 0x32, 0x19,
818 0x33, 0xFC,
819 0x34, 0x13,
820 0xff, 0xff,
824 static int samsung_smt_7020_tuner_set_params(struct dvb_frontend *fe)
826 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
827 struct cx8802_dev *dev = fe->dvb->priv;
828 u8 buf[4];
829 u32 div;
830 struct i2c_msg msg = {
831 .addr = 0x61,
832 .flags = 0,
833 .buf = buf,
834 .len = sizeof(buf) };
836 div = c->frequency / 125;
838 buf[0] = (div >> 8) & 0x7f;
839 buf[1] = div & 0xff;
840 buf[2] = 0x84; /* 0xC4 */
841 buf[3] = 0x00;
843 if (c->frequency < 1500000)
844 buf[3] |= 0x10;
846 if (fe->ops.i2c_gate_ctrl)
847 fe->ops.i2c_gate_ctrl(fe, 1);
849 if (i2c_transfer(&dev->core->i2c_adap, &msg, 1) != 1)
850 return -EIO;
852 return 0;
855 static int samsung_smt_7020_set_tone(struct dvb_frontend *fe,
856 fe_sec_tone_mode_t tone)
858 struct cx8802_dev *dev = fe->dvb->priv;
859 struct cx88_core *core = dev->core;
861 cx_set(MO_GP0_IO, 0x0800);
863 switch (tone) {
864 case SEC_TONE_ON:
865 cx_set(MO_GP0_IO, 0x08);
866 break;
867 case SEC_TONE_OFF:
868 cx_clear(MO_GP0_IO, 0x08);
869 break;
870 default:
871 return -EINVAL;
874 return 0;
877 static int samsung_smt_7020_set_voltage(struct dvb_frontend *fe,
878 fe_sec_voltage_t voltage)
880 struct cx8802_dev *dev = fe->dvb->priv;
881 struct cx88_core *core = dev->core;
883 u8 data;
884 struct i2c_msg msg = {
885 .addr = 8,
886 .flags = 0,
887 .buf = &data,
888 .len = sizeof(data) };
890 cx_set(MO_GP0_IO, 0x8000);
892 switch (voltage) {
893 case SEC_VOLTAGE_OFF:
894 break;
895 case SEC_VOLTAGE_13:
896 data = ISL6421_EN1 | ISL6421_LLC1;
897 cx_clear(MO_GP0_IO, 0x80);
898 break;
899 case SEC_VOLTAGE_18:
900 data = ISL6421_EN1 | ISL6421_LLC1 | ISL6421_VSEL1;
901 cx_clear(MO_GP0_IO, 0x80);
902 break;
903 default:
904 return -EINVAL;
907 return (i2c_transfer(&dev->core->i2c_adap, &msg, 1) == 1) ? 0 : -EIO;
910 static int samsung_smt_7020_stv0299_set_symbol_rate(struct dvb_frontend *fe,
911 u32 srate, u32 ratio)
913 u8 aclk = 0;
914 u8 bclk = 0;
916 if (srate < 1500000) {
917 aclk = 0xb7;
918 bclk = 0x47;
919 } else if (srate < 3000000) {
920 aclk = 0xb7;
921 bclk = 0x4b;
922 } else if (srate < 7000000) {
923 aclk = 0xb7;
924 bclk = 0x4f;
925 } else if (srate < 14000000) {
926 aclk = 0xb7;
927 bclk = 0x53;
928 } else if (srate < 30000000) {
929 aclk = 0xb6;
930 bclk = 0x53;
931 } else if (srate < 45000000) {
932 aclk = 0xb4;
933 bclk = 0x51;
936 stv0299_writereg(fe, 0x13, aclk);
937 stv0299_writereg(fe, 0x14, bclk);
938 stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
939 stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
940 stv0299_writereg(fe, 0x21, ratio & 0xf0);
942 return 0;
946 static const struct stv0299_config samsung_stv0299_config = {
947 .demod_address = 0x68,
948 .inittab = samsung_smt_7020_inittab,
949 .mclk = 88000000UL,
950 .invert = 0,
951 .skip_reinit = 0,
952 .lock_output = STV0299_LOCKOUTPUT_LK,
953 .volt13_op0_op1 = STV0299_VOLT13_OP1,
954 .min_delay_ms = 100,
955 .set_symbol_rate = samsung_smt_7020_stv0299_set_symbol_rate,
958 static int dvb_register(struct cx8802_dev *dev)
960 struct cx88_core *core = dev->core;
961 struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
962 int mfe_shared = 0; /* bus not shared by default */
963 int res = -EINVAL;
965 if (0 != core->i2c_rc) {
966 printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
967 goto frontend_detach;
970 /* Get the first frontend */
971 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
972 if (!fe0)
973 goto frontend_detach;
975 /* multi-frontend gate control is undefined or defaults to fe0 */
976 dev->frontends.gate = 0;
978 /* Sets the gate control callback to be used by i2c command calls */
979 core->gate_ctrl = cx88_dvb_gate_ctrl;
981 /* init frontend(s) */
982 switch (core->boardnr) {
983 case CX88_BOARD_HAUPPAUGE_DVB_T1:
984 fe0->dvb.frontend = dvb_attach(cx22702_attach,
985 &connexant_refboard_config,
986 &core->i2c_adap);
987 if (fe0->dvb.frontend != NULL) {
988 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
989 0x61, &core->i2c_adap,
990 DVB_PLL_THOMSON_DTT759X))
991 goto frontend_detach;
993 break;
994 case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
995 case CX88_BOARD_CONEXANT_DVB_T1:
996 case CX88_BOARD_KWORLD_DVB_T_CX22702:
997 case CX88_BOARD_WINFAST_DTV1000:
998 fe0->dvb.frontend = dvb_attach(cx22702_attach,
999 &connexant_refboard_config,
1000 &core->i2c_adap);
1001 if (fe0->dvb.frontend != NULL) {
1002 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1003 0x60, &core->i2c_adap,
1004 DVB_PLL_THOMSON_DTT7579))
1005 goto frontend_detach;
1007 break;
1008 case CX88_BOARD_WINFAST_DTV2000H:
1009 case CX88_BOARD_HAUPPAUGE_HVR1100:
1010 case CX88_BOARD_HAUPPAUGE_HVR1100LP:
1011 case CX88_BOARD_HAUPPAUGE_HVR1300:
1012 fe0->dvb.frontend = dvb_attach(cx22702_attach,
1013 &hauppauge_hvr_config,
1014 &core->i2c_adap);
1015 if (fe0->dvb.frontend != NULL) {
1016 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1017 &core->i2c_adap, 0x61,
1018 TUNER_PHILIPS_FMD1216ME_MK3))
1019 goto frontend_detach;
1021 break;
1022 case CX88_BOARD_WINFAST_DTV2000H_J:
1023 fe0->dvb.frontend = dvb_attach(cx22702_attach,
1024 &hauppauge_hvr_config,
1025 &core->i2c_adap);
1026 if (fe0->dvb.frontend != NULL) {
1027 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1028 &core->i2c_adap, 0x61,
1029 TUNER_PHILIPS_FMD1216MEX_MK3))
1030 goto frontend_detach;
1032 break;
1033 case CX88_BOARD_HAUPPAUGE_HVR3000:
1034 /* MFE frontend 1 */
1035 mfe_shared = 1;
1036 dev->frontends.gate = 2;
1037 /* DVB-S init */
1038 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1039 &hauppauge_novas_config,
1040 &dev->core->i2c_adap);
1041 if (fe0->dvb.frontend) {
1042 if (!dvb_attach(isl6421_attach,
1043 fe0->dvb.frontend,
1044 &dev->core->i2c_adap,
1045 0x08, ISL6421_DCL, 0x00, false))
1046 goto frontend_detach;
1048 /* MFE frontend 2 */
1049 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
1050 if (!fe1)
1051 goto frontend_detach;
1052 /* DVB-T init */
1053 fe1->dvb.frontend = dvb_attach(cx22702_attach,
1054 &hauppauge_hvr_config,
1055 &dev->core->i2c_adap);
1056 if (fe1->dvb.frontend) {
1057 fe1->dvb.frontend->id = 1;
1058 if (!dvb_attach(simple_tuner_attach,
1059 fe1->dvb.frontend,
1060 &dev->core->i2c_adap,
1061 0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1062 goto frontend_detach;
1064 break;
1065 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
1066 fe0->dvb.frontend = dvb_attach(mt352_attach,
1067 &dvico_fusionhdtv,
1068 &core->i2c_adap);
1069 if (fe0->dvb.frontend != NULL) {
1070 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1071 0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1072 goto frontend_detach;
1073 break;
1075 /* ZL10353 replaces MT352 on later cards */
1076 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1077 &dvico_fusionhdtv_plus_v1_1,
1078 &core->i2c_adap);
1079 if (fe0->dvb.frontend != NULL) {
1080 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1081 0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1082 goto frontend_detach;
1084 break;
1085 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
1086 /* The tin box says DEE1601, but it seems to be DTT7579
1087 * compatible, with a slightly different MT352 AGC gain. */
1088 fe0->dvb.frontend = dvb_attach(mt352_attach,
1089 &dvico_fusionhdtv_dual,
1090 &core->i2c_adap);
1091 if (fe0->dvb.frontend != NULL) {
1092 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1093 0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1094 goto frontend_detach;
1095 break;
1097 /* ZL10353 replaces MT352 on later cards */
1098 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1099 &dvico_fusionhdtv_plus_v1_1,
1100 &core->i2c_adap);
1101 if (fe0->dvb.frontend != NULL) {
1102 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1103 0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1104 goto frontend_detach;
1106 break;
1107 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
1108 fe0->dvb.frontend = dvb_attach(mt352_attach,
1109 &dvico_fusionhdtv,
1110 &core->i2c_adap);
1111 if (fe0->dvb.frontend != NULL) {
1112 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1113 0x61, NULL, DVB_PLL_LG_Z201))
1114 goto frontend_detach;
1116 break;
1117 case CX88_BOARD_KWORLD_DVB_T:
1118 case CX88_BOARD_DNTV_LIVE_DVB_T:
1119 case CX88_BOARD_ADSTECH_DVB_T_PCI:
1120 fe0->dvb.frontend = dvb_attach(mt352_attach,
1121 &dntv_live_dvbt_config,
1122 &core->i2c_adap);
1123 if (fe0->dvb.frontend != NULL) {
1124 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1125 0x61, NULL, DVB_PLL_UNKNOWN_1))
1126 goto frontend_detach;
1128 break;
1129 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
1130 #if IS_ENABLED(CONFIG_VIDEO_CX88_VP3054)
1131 /* MT352 is on a secondary I2C bus made from some GPIO lines */
1132 fe0->dvb.frontend = dvb_attach(mt352_attach, &dntv_live_dvbt_pro_config,
1133 &dev->vp3054->adap);
1134 if (fe0->dvb.frontend != NULL) {
1135 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1136 &core->i2c_adap, 0x61,
1137 TUNER_PHILIPS_FMD1216ME_MK3))
1138 goto frontend_detach;
1140 #else
1141 printk(KERN_ERR "%s/2: built without vp3054 support\n",
1142 core->name);
1143 #endif
1144 break;
1145 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
1146 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1147 &dvico_fusionhdtv_hybrid,
1148 &core->i2c_adap);
1149 if (fe0->dvb.frontend != NULL) {
1150 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1151 &core->i2c_adap, 0x61,
1152 TUNER_THOMSON_FE6600))
1153 goto frontend_detach;
1155 break;
1156 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
1157 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1158 &dvico_fusionhdtv_xc3028,
1159 &core->i2c_adap);
1160 if (fe0->dvb.frontend == NULL)
1161 fe0->dvb.frontend = dvb_attach(mt352_attach,
1162 &dvico_fusionhdtv_mt352_xc3028,
1163 &core->i2c_adap);
1165 * On this board, the demod provides the I2C bus pullup.
1166 * We must not permit gate_ctrl to be performed, or
1167 * the xc3028 cannot communicate on the bus.
1169 if (fe0->dvb.frontend)
1170 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1171 if (attach_xc3028(0x61, dev) < 0)
1172 goto frontend_detach;
1173 break;
1174 case CX88_BOARD_PCHDTV_HD3000:
1175 fe0->dvb.frontend = dvb_attach(or51132_attach, &pchdtv_hd3000,
1176 &core->i2c_adap);
1177 if (fe0->dvb.frontend != NULL) {
1178 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1179 &core->i2c_adap, 0x61,
1180 TUNER_THOMSON_DTT761X))
1181 goto frontend_detach;
1183 break;
1184 case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q:
1185 dev->ts_gen_cntrl = 0x08;
1187 /* Do a hardware reset of chip before using it. */
1188 cx_clear(MO_GP0_IO, 1);
1189 mdelay(100);
1190 cx_set(MO_GP0_IO, 1);
1191 mdelay(200);
1193 /* Select RF connector callback */
1194 fusionhdtv_3_gold.pll_rf_set = lgdt330x_pll_rf_set;
1195 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1196 &fusionhdtv_3_gold,
1197 &core->i2c_adap);
1198 if (fe0->dvb.frontend != NULL) {
1199 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1200 &core->i2c_adap, 0x61,
1201 TUNER_MICROTUNE_4042FI5))
1202 goto frontend_detach;
1204 break;
1205 case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T:
1206 dev->ts_gen_cntrl = 0x08;
1208 /* Do a hardware reset of chip before using it. */
1209 cx_clear(MO_GP0_IO, 1);
1210 mdelay(100);
1211 cx_set(MO_GP0_IO, 9);
1212 mdelay(200);
1213 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1214 &fusionhdtv_3_gold,
1215 &core->i2c_adap);
1216 if (fe0->dvb.frontend != NULL) {
1217 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1218 &core->i2c_adap, 0x61,
1219 TUNER_THOMSON_DTT761X))
1220 goto frontend_detach;
1222 break;
1223 case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD:
1224 dev->ts_gen_cntrl = 0x08;
1226 /* Do a hardware reset of chip before using it. */
1227 cx_clear(MO_GP0_IO, 1);
1228 mdelay(100);
1229 cx_set(MO_GP0_IO, 1);
1230 mdelay(200);
1231 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1232 &fusionhdtv_5_gold,
1233 &core->i2c_adap);
1234 if (fe0->dvb.frontend != NULL) {
1235 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1236 &core->i2c_adap, 0x61,
1237 TUNER_LG_TDVS_H06XF))
1238 goto frontend_detach;
1239 if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
1240 &core->i2c_adap, 0x43))
1241 goto frontend_detach;
1243 break;
1244 case CX88_BOARD_PCHDTV_HD5500:
1245 dev->ts_gen_cntrl = 0x08;
1247 /* Do a hardware reset of chip before using it. */
1248 cx_clear(MO_GP0_IO, 1);
1249 mdelay(100);
1250 cx_set(MO_GP0_IO, 1);
1251 mdelay(200);
1252 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1253 &pchdtv_hd5500,
1254 &core->i2c_adap);
1255 if (fe0->dvb.frontend != NULL) {
1256 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1257 &core->i2c_adap, 0x61,
1258 TUNER_LG_TDVS_H06XF))
1259 goto frontend_detach;
1260 if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
1261 &core->i2c_adap, 0x43))
1262 goto frontend_detach;
1264 break;
1265 case CX88_BOARD_ATI_HDTVWONDER:
1266 fe0->dvb.frontend = dvb_attach(nxt200x_attach,
1267 &ati_hdtvwonder,
1268 &core->i2c_adap);
1269 if (fe0->dvb.frontend != NULL) {
1270 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1271 &core->i2c_adap, 0x61,
1272 TUNER_PHILIPS_TUV1236D))
1273 goto frontend_detach;
1275 break;
1276 case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
1277 case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
1278 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1279 &hauppauge_novas_config,
1280 &core->i2c_adap);
1281 if (fe0->dvb.frontend) {
1282 bool override_tone;
1284 if (core->model == 92001)
1285 override_tone = true;
1286 else
1287 override_tone = false;
1289 if (!dvb_attach(isl6421_attach, fe0->dvb.frontend,
1290 &core->i2c_adap, 0x08, ISL6421_DCL, 0x00,
1291 override_tone))
1292 goto frontend_detach;
1294 break;
1295 case CX88_BOARD_KWORLD_DVBS_100:
1296 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1297 &kworld_dvbs_100_config,
1298 &core->i2c_adap);
1299 if (fe0->dvb.frontend) {
1300 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1301 fe0->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage;
1303 break;
1304 case CX88_BOARD_GENIATECH_DVBS:
1305 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1306 &geniatech_dvbs_config,
1307 &core->i2c_adap);
1308 if (fe0->dvb.frontend) {
1309 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1310 fe0->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage;
1312 break;
1313 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
1314 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1315 &pinnacle_pctv_hd_800i_config,
1316 &core->i2c_adap);
1317 if (fe0->dvb.frontend != NULL) {
1318 if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
1319 &core->i2c_adap,
1320 &pinnacle_pctv_hd_800i_tuner_config))
1321 goto frontend_detach;
1323 break;
1324 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
1325 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1326 &dvico_hdtv5_pci_nano_config,
1327 &core->i2c_adap);
1328 if (fe0->dvb.frontend != NULL) {
1329 struct dvb_frontend *fe;
1330 struct xc2028_config cfg = {
1331 .i2c_adap = &core->i2c_adap,
1332 .i2c_addr = 0x61,
1334 static struct xc2028_ctrl ctl = {
1335 .fname = XC2028_DEFAULT_FIRMWARE,
1336 .max_len = 64,
1337 .scode_table = XC3028_FE_OREN538,
1340 fe = dvb_attach(xc2028_attach,
1341 fe0->dvb.frontend, &cfg);
1342 if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
1343 fe->ops.tuner_ops.set_config(fe, &ctl);
1345 break;
1346 case CX88_BOARD_PINNACLE_HYBRID_PCTV:
1347 case CX88_BOARD_WINFAST_DTV1800H:
1348 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1349 &cx88_pinnacle_hybrid_pctv,
1350 &core->i2c_adap);
1351 if (fe0->dvb.frontend) {
1352 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1353 if (attach_xc3028(0x61, dev) < 0)
1354 goto frontend_detach;
1356 break;
1357 case CX88_BOARD_WINFAST_DTV1800H_XC4000:
1358 case CX88_BOARD_WINFAST_DTV2000H_PLUS:
1359 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1360 &cx88_pinnacle_hybrid_pctv,
1361 &core->i2c_adap);
1362 if (fe0->dvb.frontend) {
1363 struct xc4000_config cfg = {
1364 .i2c_address = 0x61,
1365 .default_pm = 0,
1366 .dvb_amplitude = 134,
1367 .set_smoothedcvbs = 1,
1368 .if_khz = 4560
1370 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1371 if (attach_xc4000(dev, &cfg) < 0)
1372 goto frontend_detach;
1374 break;
1375 case CX88_BOARD_GENIATECH_X8000_MT:
1376 dev->ts_gen_cntrl = 0x00;
1378 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1379 &cx88_geniatech_x8000_mt,
1380 &core->i2c_adap);
1381 if (attach_xc3028(0x61, dev) < 0)
1382 goto frontend_detach;
1383 break;
1384 case CX88_BOARD_KWORLD_ATSC_120:
1385 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1386 &kworld_atsc_120_config,
1387 &core->i2c_adap);
1388 if (attach_xc3028(0x61, dev) < 0)
1389 goto frontend_detach;
1390 break;
1391 case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
1392 fe0->dvb.frontend = dvb_attach(s5h1411_attach,
1393 &dvico_fusionhdtv7_config,
1394 &core->i2c_adap);
1395 if (fe0->dvb.frontend != NULL) {
1396 if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
1397 &core->i2c_adap,
1398 &dvico_fusionhdtv7_tuner_config))
1399 goto frontend_detach;
1401 break;
1402 case CX88_BOARD_HAUPPAUGE_HVR4000:
1403 /* MFE frontend 1 */
1404 mfe_shared = 1;
1405 dev->frontends.gate = 2;
1406 /* DVB-S/S2 Init */
1407 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1408 &hauppauge_hvr4000_config,
1409 &dev->core->i2c_adap);
1410 if (fe0->dvb.frontend) {
1411 if (!dvb_attach(isl6421_attach,
1412 fe0->dvb.frontend,
1413 &dev->core->i2c_adap,
1414 0x08, ISL6421_DCL, 0x00, false))
1415 goto frontend_detach;
1417 /* MFE frontend 2 */
1418 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
1419 if (!fe1)
1420 goto frontend_detach;
1421 /* DVB-T Init */
1422 fe1->dvb.frontend = dvb_attach(cx22702_attach,
1423 &hauppauge_hvr_config,
1424 &dev->core->i2c_adap);
1425 if (fe1->dvb.frontend) {
1426 fe1->dvb.frontend->id = 1;
1427 if (!dvb_attach(simple_tuner_attach,
1428 fe1->dvb.frontend,
1429 &dev->core->i2c_adap,
1430 0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1431 goto frontend_detach;
1433 break;
1434 case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
1435 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1436 &hauppauge_hvr4000_config,
1437 &dev->core->i2c_adap);
1438 if (fe0->dvb.frontend) {
1439 if (!dvb_attach(isl6421_attach,
1440 fe0->dvb.frontend,
1441 &dev->core->i2c_adap,
1442 0x08, ISL6421_DCL, 0x00, false))
1443 goto frontend_detach;
1445 break;
1446 case CX88_BOARD_PROF_6200:
1447 case CX88_BOARD_TBS_8910:
1448 case CX88_BOARD_TEVII_S420:
1449 fe0->dvb.frontend = dvb_attach(stv0299_attach,
1450 &tevii_tuner_sharp_config,
1451 &core->i2c_adap);
1452 if (fe0->dvb.frontend != NULL) {
1453 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
1454 &core->i2c_adap, DVB_PLL_OPERA1))
1455 goto frontend_detach;
1456 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1457 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1459 } else {
1460 fe0->dvb.frontend = dvb_attach(stv0288_attach,
1461 &tevii_tuner_earda_config,
1462 &core->i2c_adap);
1463 if (fe0->dvb.frontend != NULL) {
1464 if (!dvb_attach(stb6000_attach, fe0->dvb.frontend, 0x61,
1465 &core->i2c_adap))
1466 goto frontend_detach;
1467 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1468 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1471 break;
1472 case CX88_BOARD_TEVII_S460:
1473 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1474 &tevii_s460_config,
1475 &core->i2c_adap);
1476 if (fe0->dvb.frontend != NULL)
1477 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1478 break;
1479 case CX88_BOARD_TEVII_S464:
1480 fe0->dvb.frontend = dvb_attach(ds3000_attach,
1481 &tevii_ds3000_config,
1482 &core->i2c_adap);
1483 if (fe0->dvb.frontend != NULL) {
1484 dvb_attach(ts2020_attach, fe0->dvb.frontend,
1485 &tevii_ts2020_config, &core->i2c_adap);
1486 fe0->dvb.frontend->ops.set_voltage =
1487 tevii_dvbs_set_voltage;
1489 break;
1490 case CX88_BOARD_OMICOM_SS4_PCI:
1491 case CX88_BOARD_TBS_8920:
1492 case CX88_BOARD_PROF_7300:
1493 case CX88_BOARD_SATTRADE_ST4200:
1494 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1495 &hauppauge_hvr4000_config,
1496 &core->i2c_adap);
1497 if (fe0->dvb.frontend != NULL)
1498 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1499 break;
1500 case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
1501 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1502 &cx88_terratec_cinergy_ht_pci_mkii_config,
1503 &core->i2c_adap);
1504 if (fe0->dvb.frontend) {
1505 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1506 if (attach_xc3028(0x61, dev) < 0)
1507 goto frontend_detach;
1509 break;
1510 case CX88_BOARD_PROF_7301:{
1511 struct dvb_tuner_ops *tuner_ops = NULL;
1513 fe0->dvb.frontend = dvb_attach(stv0900_attach,
1514 &prof_7301_stv0900_config,
1515 &core->i2c_adap, 0);
1516 if (fe0->dvb.frontend != NULL) {
1517 if (!dvb_attach(stb6100_attach, fe0->dvb.frontend,
1518 &prof_7301_stb6100_config,
1519 &core->i2c_adap))
1520 goto frontend_detach;
1522 tuner_ops = &fe0->dvb.frontend->ops.tuner_ops;
1523 tuner_ops->set_frequency = stb6100_set_freq;
1524 tuner_ops->get_frequency = stb6100_get_freq;
1525 tuner_ops->set_bandwidth = stb6100_set_bandw;
1526 tuner_ops->get_bandwidth = stb6100_get_bandw;
1528 core->prev_set_voltage =
1529 fe0->dvb.frontend->ops.set_voltage;
1530 fe0->dvb.frontend->ops.set_voltage =
1531 tevii_dvbs_set_voltage;
1533 break;
1535 case CX88_BOARD_SAMSUNG_SMT_7020:
1536 dev->ts_gen_cntrl = 0x08;
1538 cx_set(MO_GP0_IO, 0x0101);
1540 cx_clear(MO_GP0_IO, 0x01);
1541 mdelay(100);
1542 cx_set(MO_GP0_IO, 0x01);
1543 mdelay(200);
1545 fe0->dvb.frontend = dvb_attach(stv0299_attach,
1546 &samsung_stv0299_config,
1547 &dev->core->i2c_adap);
1548 if (fe0->dvb.frontend) {
1549 fe0->dvb.frontend->ops.tuner_ops.set_params =
1550 samsung_smt_7020_tuner_set_params;
1551 fe0->dvb.frontend->tuner_priv =
1552 &dev->core->i2c_adap;
1553 fe0->dvb.frontend->ops.set_voltage =
1554 samsung_smt_7020_set_voltage;
1555 fe0->dvb.frontend->ops.set_tone =
1556 samsung_smt_7020_set_tone;
1559 break;
1560 case CX88_BOARD_TWINHAN_VP1027_DVBS:
1561 dev->ts_gen_cntrl = 0x00;
1562 fe0->dvb.frontend = dvb_attach(mb86a16_attach,
1563 &twinhan_vp1027,
1564 &core->i2c_adap);
1565 if (fe0->dvb.frontend) {
1566 core->prev_set_voltage =
1567 fe0->dvb.frontend->ops.set_voltage;
1568 fe0->dvb.frontend->ops.set_voltage =
1569 vp1027_set_voltage;
1571 break;
1573 default:
1574 printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
1575 core->name);
1576 break;
1579 if ( (NULL == fe0->dvb.frontend) || (fe1 && NULL == fe1->dvb.frontend) ) {
1580 printk(KERN_ERR
1581 "%s/2: frontend initialization failed\n",
1582 core->name);
1583 goto frontend_detach;
1585 /* define general-purpose callback pointer */
1586 fe0->dvb.frontend->callback = cx88_tuner_callback;
1588 /* Ensure all frontends negotiate bus access */
1589 fe0->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1590 if (fe1)
1591 fe1->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1593 /* Put the analog decoder in standby to keep it quiet */
1594 call_all(core, core, s_power, 0);
1596 /* register everything */
1597 res = videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1598 &dev->pci->dev, adapter_nr, mfe_shared);
1599 if (res)
1600 goto frontend_detach;
1601 return res;
1603 frontend_detach:
1604 core->gate_ctrl = NULL;
1605 videobuf_dvb_dealloc_frontends(&dev->frontends);
1606 return res;
1609 /* ----------------------------------------------------------- */
1611 /* CX8802 MPEG -> mini driver - We have been given the hardware */
1612 static int cx8802_dvb_advise_acquire(struct cx8802_driver *drv)
1614 struct cx88_core *core = drv->core;
1615 int err = 0;
1616 dprintk( 1, "%s\n", __func__);
1618 switch (core->boardnr) {
1619 case CX88_BOARD_HAUPPAUGE_HVR1300:
1620 /* We arrive here with either the cx23416 or the cx22702
1621 * on the bus. Take the bus from the cx23416 and enable the
1622 * cx22702 demod
1624 /* Toggle reset on cx22702 leaving i2c active */
1625 cx_set(MO_GP0_IO, 0x00000080);
1626 udelay(1000);
1627 cx_clear(MO_GP0_IO, 0x00000080);
1628 udelay(50);
1629 cx_set(MO_GP0_IO, 0x00000080);
1630 udelay(1000);
1631 /* enable the cx22702 pins */
1632 cx_clear(MO_GP0_IO, 0x00000004);
1633 udelay(1000);
1634 break;
1636 case CX88_BOARD_HAUPPAUGE_HVR3000:
1637 case CX88_BOARD_HAUPPAUGE_HVR4000:
1638 /* Toggle reset on cx22702 leaving i2c active */
1639 cx_set(MO_GP0_IO, 0x00000080);
1640 udelay(1000);
1641 cx_clear(MO_GP0_IO, 0x00000080);
1642 udelay(50);
1643 cx_set(MO_GP0_IO, 0x00000080);
1644 udelay(1000);
1645 switch (core->dvbdev->frontends.active_fe_id) {
1646 case 1: /* DVB-S/S2 Enabled */
1647 /* tri-state the cx22702 pins */
1648 cx_set(MO_GP0_IO, 0x00000004);
1649 /* Take the cx24116/cx24123 out of reset */
1650 cx_write(MO_SRST_IO, 1);
1651 core->dvbdev->ts_gen_cntrl = 0x02; /* Parallel IO */
1652 break;
1653 case 2: /* DVB-T Enabled */
1654 /* Put the cx24116/cx24123 into reset */
1655 cx_write(MO_SRST_IO, 0);
1656 /* enable the cx22702 pins */
1657 cx_clear(MO_GP0_IO, 0x00000004);
1658 core->dvbdev->ts_gen_cntrl = 0x0c; /* Serial IO */
1659 break;
1661 udelay(1000);
1662 break;
1664 case CX88_BOARD_WINFAST_DTV2000H_PLUS:
1665 /* set RF input to AIR for DVB-T (GPIO 16) */
1666 cx_write(MO_GP2_IO, 0x0101);
1667 break;
1669 default:
1670 err = -ENODEV;
1672 return err;
1675 /* CX8802 MPEG -> mini driver - We no longer have the hardware */
1676 static int cx8802_dvb_advise_release(struct cx8802_driver *drv)
1678 struct cx88_core *core = drv->core;
1679 int err = 0;
1680 dprintk( 1, "%s\n", __func__);
1682 switch (core->boardnr) {
1683 case CX88_BOARD_HAUPPAUGE_HVR1300:
1684 /* Do Nothing, leave the cx22702 on the bus. */
1685 break;
1686 case CX88_BOARD_HAUPPAUGE_HVR3000:
1687 case CX88_BOARD_HAUPPAUGE_HVR4000:
1688 break;
1689 default:
1690 err = -ENODEV;
1692 return err;
1695 static int cx8802_dvb_probe(struct cx8802_driver *drv)
1697 struct cx88_core *core = drv->core;
1698 struct cx8802_dev *dev = drv->core->dvbdev;
1699 int err;
1700 struct videobuf_dvb_frontend *fe;
1701 int i;
1703 dprintk( 1, "%s\n", __func__);
1704 dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
1705 core->boardnr,
1706 core->name,
1707 core->pci_bus,
1708 core->pci_slot);
1710 err = -ENODEV;
1711 if (!(core->board.mpeg & CX88_MPEG_DVB))
1712 goto fail_core;
1714 /* If vp3054 isn't enabled, a stub will just return 0 */
1715 err = vp3054_i2c_probe(dev);
1716 if (0 != err)
1717 goto fail_core;
1719 /* dvb stuff */
1720 printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
1721 dev->ts_gen_cntrl = 0x0c;
1723 err = cx8802_alloc_frontends(dev);
1724 if (err)
1725 goto fail_core;
1727 err = -ENODEV;
1728 for (i = 1; i <= core->board.num_frontends; i++) {
1729 fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
1730 if (fe == NULL) {
1731 printk(KERN_ERR "%s() failed to get frontend(%d)\n",
1732 __func__, i);
1733 goto fail_probe;
1735 videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
1736 &dev->pci->dev, &dev->slock,
1737 V4L2_BUF_TYPE_VIDEO_CAPTURE,
1738 V4L2_FIELD_TOP,
1739 sizeof(struct cx88_buffer),
1740 dev, NULL);
1741 /* init struct videobuf_dvb */
1742 fe->dvb.name = dev->core->name;
1745 err = dvb_register(dev);
1746 if (err)
1747 /* frontends/adapter de-allocated in dvb_register */
1748 printk(KERN_ERR "%s/2: dvb_register failed (err = %d)\n",
1749 core->name, err);
1750 return err;
1751 fail_probe:
1752 videobuf_dvb_dealloc_frontends(&core->dvbdev->frontends);
1753 fail_core:
1754 return err;
1757 static int cx8802_dvb_remove(struct cx8802_driver *drv)
1759 struct cx88_core *core = drv->core;
1760 struct cx8802_dev *dev = drv->core->dvbdev;
1762 dprintk( 1, "%s\n", __func__);
1764 videobuf_dvb_unregister_bus(&dev->frontends);
1766 vp3054_i2c_remove(dev);
1768 core->gate_ctrl = NULL;
1770 return 0;
1773 static struct cx8802_driver cx8802_dvb_driver = {
1774 .type_id = CX88_MPEG_DVB,
1775 .hw_access = CX8802_DRVCTL_SHARED,
1776 .probe = cx8802_dvb_probe,
1777 .remove = cx8802_dvb_remove,
1778 .advise_acquire = cx8802_dvb_advise_acquire,
1779 .advise_release = cx8802_dvb_advise_release,
1782 static int __init dvb_init(void)
1784 printk(KERN_INFO "cx88/2: cx2388x dvb driver version %s loaded\n",
1785 CX88_VERSION);
1786 return cx8802_register_driver(&cx8802_dvb_driver);
1789 static void __exit dvb_fini(void)
1791 cx8802_unregister_driver(&cx8802_dvb_driver);
1794 module_init(dvb_init);
1795 module_exit(dvb_fini);