Linux 4.19-rc7
[linux-2.6/btrfs-unstable.git] / drivers / media / pci / cx88 / cx88-dvb.c
blob90b208747e0fde3c51eb083e9367c8d19a01be16
1 /*
2 * device driver for Conexant 2388x based TV cards
3 * MPEG Transport Stream (DVB) routines
5 * (c) 2004, 2005 Chris Pascoe <c.pascoe@itee.uq.edu.au>
6 * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
19 #include "cx88.h"
20 #include "dvb-pll.h"
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/device.h>
25 #include <linux/fs.h>
26 #include <linux/kthread.h>
27 #include <linux/file.h>
28 #include <linux/suspend.h>
30 #include <media/v4l2-common.h>
32 #include "mt352.h"
33 #include "mt352_priv.h"
34 #include "cx88-vp3054-i2c.h"
35 #include "zl10353.h"
36 #include "cx22702.h"
37 #include "or51132.h"
38 #include "lgdt330x.h"
39 #include "s5h1409.h"
40 #include "xc4000.h"
41 #include "xc5000.h"
42 #include "nxt200x.h"
43 #include "cx24123.h"
44 #include "isl6421.h"
45 #include "tuner-simple.h"
46 #include "tda9887.h"
47 #include "s5h1411.h"
48 #include "stv0299.h"
49 #include "z0194a.h"
50 #include "stv0288.h"
51 #include "stb6000.h"
52 #include "cx24116.h"
53 #include "stv0900.h"
54 #include "stb6100.h"
55 #include "stb6100_proc.h"
56 #include "mb86a16.h"
57 #include "ts2020.h"
58 #include "ds3000.h"
60 MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
61 MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
62 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
63 MODULE_LICENSE("GPL");
64 MODULE_VERSION(CX88_VERSION);
66 static unsigned int debug;
67 module_param(debug, int, 0644);
68 MODULE_PARM_DESC(debug, "enable debug messages [dvb]");
70 static unsigned int dvb_buf_tscnt = 32;
71 module_param(dvb_buf_tscnt, int, 0644);
72 MODULE_PARM_DESC(dvb_buf_tscnt, "DVB Buffer TS count [dvb]");
74 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
76 #define dprintk(level, fmt, arg...) do { \
77 if (debug >= level) \
78 printk(KERN_DEBUG pr_fmt("%s: dvb:" fmt), \
79 __func__, ##arg); \
80 } while (0)
82 /* ------------------------------------------------------------------ */
84 static int queue_setup(struct vb2_queue *q,
85 unsigned int *num_buffers, unsigned int *num_planes,
86 unsigned int sizes[], struct device *alloc_devs[])
88 struct cx8802_dev *dev = q->drv_priv;
90 *num_planes = 1;
91 dev->ts_packet_size = 188 * 4;
92 dev->ts_packet_count = dvb_buf_tscnt;
93 sizes[0] = dev->ts_packet_size * dev->ts_packet_count;
94 *num_buffers = dvb_buf_tscnt;
95 return 0;
98 static int buffer_prepare(struct vb2_buffer *vb)
100 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
101 struct cx8802_dev *dev = vb->vb2_queue->drv_priv;
102 struct cx88_buffer *buf = container_of(vbuf, struct cx88_buffer, vb);
104 return cx8802_buf_prepare(vb->vb2_queue, dev, buf);
107 static void buffer_finish(struct vb2_buffer *vb)
109 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
110 struct cx8802_dev *dev = vb->vb2_queue->drv_priv;
111 struct cx88_buffer *buf = container_of(vbuf, struct cx88_buffer, vb);
112 struct cx88_riscmem *risc = &buf->risc;
114 if (risc->cpu)
115 pci_free_consistent(dev->pci, risc->size, risc->cpu, risc->dma);
116 memset(risc, 0, sizeof(*risc));
119 static void buffer_queue(struct vb2_buffer *vb)
121 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
122 struct cx8802_dev *dev = vb->vb2_queue->drv_priv;
123 struct cx88_buffer *buf = container_of(vbuf, struct cx88_buffer, vb);
125 cx8802_buf_queue(dev, buf);
128 static int start_streaming(struct vb2_queue *q, unsigned int count)
130 struct cx8802_dev *dev = q->drv_priv;
131 struct cx88_dmaqueue *dmaq = &dev->mpegq;
132 struct cx88_buffer *buf;
134 buf = list_entry(dmaq->active.next, struct cx88_buffer, list);
135 cx8802_start_dma(dev, dmaq, buf);
136 return 0;
139 static void stop_streaming(struct vb2_queue *q)
141 struct cx8802_dev *dev = q->drv_priv;
142 struct cx88_dmaqueue *dmaq = &dev->mpegq;
143 unsigned long flags;
145 cx8802_cancel_buffers(dev);
147 spin_lock_irqsave(&dev->slock, flags);
148 while (!list_empty(&dmaq->active)) {
149 struct cx88_buffer *buf = list_entry(dmaq->active.next,
150 struct cx88_buffer, list);
152 list_del(&buf->list);
153 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
155 spin_unlock_irqrestore(&dev->slock, flags);
158 static const struct vb2_ops dvb_qops = {
159 .queue_setup = queue_setup,
160 .buf_prepare = buffer_prepare,
161 .buf_finish = buffer_finish,
162 .buf_queue = buffer_queue,
163 .wait_prepare = vb2_ops_wait_prepare,
164 .wait_finish = vb2_ops_wait_finish,
165 .start_streaming = start_streaming,
166 .stop_streaming = stop_streaming,
169 /* ------------------------------------------------------------------ */
171 static int cx88_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
173 struct cx8802_dev *dev = fe->dvb->priv;
174 struct cx8802_driver *drv = NULL;
175 int ret = 0;
176 int fe_id;
178 fe_id = vb2_dvb_find_frontend(&dev->frontends, fe);
179 if (!fe_id) {
180 pr_err("%s() No frontend found\n", __func__);
181 return -EINVAL;
184 mutex_lock(&dev->core->lock);
185 drv = cx8802_get_driver(dev, CX88_MPEG_DVB);
186 if (drv) {
187 if (acquire) {
188 dev->frontends.active_fe_id = fe_id;
189 ret = drv->request_acquire(drv);
190 } else {
191 ret = drv->request_release(drv);
192 dev->frontends.active_fe_id = 0;
195 mutex_unlock(&dev->core->lock);
197 return ret;
200 static void cx88_dvb_gate_ctrl(struct cx88_core *core, int open)
202 struct vb2_dvb_frontends *f;
203 struct vb2_dvb_frontend *fe;
205 if (!core->dvbdev)
206 return;
208 f = &core->dvbdev->frontends;
210 if (!f)
211 return;
213 if (f->gate <= 1) /* undefined or fe0 */
214 fe = vb2_dvb_get_frontend(f, 1);
215 else
216 fe = vb2_dvb_get_frontend(f, f->gate);
218 if (fe && fe->dvb.frontend && fe->dvb.frontend->ops.i2c_gate_ctrl)
219 fe->dvb.frontend->ops.i2c_gate_ctrl(fe->dvb.frontend, open);
222 /* ------------------------------------------------------------------ */
224 static int dvico_fusionhdtv_demod_init(struct dvb_frontend *fe)
226 static const u8 clock_config[] = { CLOCK_CTL, 0x38, 0x39 };
227 static const u8 reset[] = { RESET, 0x80 };
228 static const u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
229 static const u8 agc_cfg[] = { AGC_TARGET, 0x24, 0x20 };
230 static const u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
231 static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
233 mt352_write(fe, clock_config, sizeof(clock_config));
234 udelay(200);
235 mt352_write(fe, reset, sizeof(reset));
236 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
238 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
239 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
240 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
241 return 0;
244 static int dvico_dual_demod_init(struct dvb_frontend *fe)
246 static const u8 clock_config[] = { CLOCK_CTL, 0x38, 0x38 };
247 static const u8 reset[] = { RESET, 0x80 };
248 static const u8 adc_ctl_1_cfg[] = { ADC_CTL_1, 0x40 };
249 static const u8 agc_cfg[] = { AGC_TARGET, 0x28, 0x20 };
250 static const u8 gpp_ctl_cfg[] = { GPP_CTL, 0x33 };
251 static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
253 mt352_write(fe, clock_config, sizeof(clock_config));
254 udelay(200);
255 mt352_write(fe, reset, sizeof(reset));
256 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
258 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
259 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
260 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
262 return 0;
265 static int dntv_live_dvbt_demod_init(struct dvb_frontend *fe)
267 static const u8 clock_config[] = { 0x89, 0x38, 0x39 };
268 static const u8 reset[] = { 0x50, 0x80 };
269 static const u8 adc_ctl_1_cfg[] = { 0x8E, 0x40 };
270 static const u8 agc_cfg[] = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF,
271 0x00, 0xFF, 0x00, 0x40, 0x40 };
272 static const u8 dntv_extra[] = { 0xB5, 0x7A };
273 static const u8 capt_range_cfg[] = { 0x75, 0x32 };
275 mt352_write(fe, clock_config, sizeof(clock_config));
276 udelay(2000);
277 mt352_write(fe, reset, sizeof(reset));
278 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
280 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
281 udelay(2000);
282 mt352_write(fe, dntv_extra, sizeof(dntv_extra));
283 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
285 return 0;
288 static const struct mt352_config dvico_fusionhdtv = {
289 .demod_address = 0x0f,
290 .demod_init = dvico_fusionhdtv_demod_init,
293 static const struct mt352_config dntv_live_dvbt_config = {
294 .demod_address = 0x0f,
295 .demod_init = dntv_live_dvbt_demod_init,
298 static const struct mt352_config dvico_fusionhdtv_dual = {
299 .demod_address = 0x0f,
300 .demod_init = dvico_dual_demod_init,
303 static const struct zl10353_config cx88_terratec_cinergy_ht_pci_mkii_config = {
304 .demod_address = (0x1e >> 1),
305 .no_tuner = 1,
306 .if2 = 45600,
309 static const struct mb86a16_config twinhan_vp1027 = {
310 .demod_address = 0x08,
313 #if IS_ENABLED(CONFIG_VIDEO_CX88_VP3054)
314 static int dntv_live_dvbt_pro_demod_init(struct dvb_frontend *fe)
316 static const u8 clock_config[] = { 0x89, 0x38, 0x38 };
317 static const u8 reset[] = { 0x50, 0x80 };
318 static const u8 adc_ctl_1_cfg[] = { 0x8E, 0x40 };
319 static const u8 agc_cfg[] = { 0x67, 0x10, 0x20, 0x00, 0xFF, 0xFF,
320 0x00, 0xFF, 0x00, 0x40, 0x40 };
321 static const u8 dntv_extra[] = { 0xB5, 0x7A };
322 static const u8 capt_range_cfg[] = { 0x75, 0x32 };
324 mt352_write(fe, clock_config, sizeof(clock_config));
325 udelay(2000);
326 mt352_write(fe, reset, sizeof(reset));
327 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
329 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
330 udelay(2000);
331 mt352_write(fe, dntv_extra, sizeof(dntv_extra));
332 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
334 return 0;
337 static const struct mt352_config dntv_live_dvbt_pro_config = {
338 .demod_address = 0x0f,
339 .no_tuner = 1,
340 .demod_init = dntv_live_dvbt_pro_demod_init,
342 #endif
344 static const struct zl10353_config dvico_fusionhdtv_hybrid = {
345 .demod_address = 0x0f,
346 .no_tuner = 1,
349 static const struct zl10353_config dvico_fusionhdtv_xc3028 = {
350 .demod_address = 0x0f,
351 .if2 = 45600,
352 .no_tuner = 1,
355 static const struct mt352_config dvico_fusionhdtv_mt352_xc3028 = {
356 .demod_address = 0x0f,
357 .if2 = 4560,
358 .no_tuner = 1,
359 .demod_init = dvico_fusionhdtv_demod_init,
362 static const struct zl10353_config dvico_fusionhdtv_plus_v1_1 = {
363 .demod_address = 0x0f,
366 static const struct cx22702_config connexant_refboard_config = {
367 .demod_address = 0x43,
368 .output_mode = CX22702_SERIAL_OUTPUT,
371 static const struct cx22702_config hauppauge_hvr_config = {
372 .demod_address = 0x63,
373 .output_mode = CX22702_SERIAL_OUTPUT,
376 static int or51132_set_ts_param(struct dvb_frontend *fe, int is_punctured)
378 struct cx8802_dev *dev = fe->dvb->priv;
380 dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
381 return 0;
384 static const struct or51132_config pchdtv_hd3000 = {
385 .demod_address = 0x15,
386 .set_ts_params = or51132_set_ts_param,
389 static int lgdt330x_pll_rf_set(struct dvb_frontend *fe, int index)
391 struct cx8802_dev *dev = fe->dvb->priv;
392 struct cx88_core *core = dev->core;
394 dprintk(1, "%s: index = %d\n", __func__, index);
395 if (index == 0)
396 cx_clear(MO_GP0_IO, 8);
397 else
398 cx_set(MO_GP0_IO, 8);
399 return 0;
402 static int lgdt330x_set_ts_param(struct dvb_frontend *fe, int is_punctured)
404 struct cx8802_dev *dev = fe->dvb->priv;
406 if (is_punctured)
407 dev->ts_gen_cntrl |= 0x04;
408 else
409 dev->ts_gen_cntrl &= ~0x04;
410 return 0;
413 static struct lgdt330x_config fusionhdtv_3_gold = {
414 .demod_chip = LGDT3302,
415 .serial_mpeg = 0x04, /* TPSERIAL for 3302 in TOP_CONTROL */
416 .set_ts_params = lgdt330x_set_ts_param,
419 static const struct lgdt330x_config fusionhdtv_5_gold = {
420 .demod_chip = LGDT3303,
421 .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
422 .set_ts_params = lgdt330x_set_ts_param,
425 static const struct lgdt330x_config pchdtv_hd5500 = {
426 .demod_chip = LGDT3303,
427 .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
428 .set_ts_params = lgdt330x_set_ts_param,
431 static int nxt200x_set_ts_param(struct dvb_frontend *fe, int is_punctured)
433 struct cx8802_dev *dev = fe->dvb->priv;
435 dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
436 return 0;
439 static const struct nxt200x_config ati_hdtvwonder = {
440 .demod_address = 0x0a,
441 .set_ts_params = nxt200x_set_ts_param,
444 static int cx24123_set_ts_param(struct dvb_frontend *fe,
445 int is_punctured)
447 struct cx8802_dev *dev = fe->dvb->priv;
449 dev->ts_gen_cntrl = 0x02;
450 return 0;
453 static int kworld_dvbs_100_set_voltage(struct dvb_frontend *fe,
454 enum fe_sec_voltage voltage)
456 struct cx8802_dev *dev = fe->dvb->priv;
457 struct cx88_core *core = dev->core;
459 if (voltage == SEC_VOLTAGE_OFF)
460 cx_write(MO_GP0_IO, 0x000006fb);
461 else
462 cx_write(MO_GP0_IO, 0x000006f9);
464 if (core->prev_set_voltage)
465 return core->prev_set_voltage(fe, voltage);
466 return 0;
469 static int geniatech_dvbs_set_voltage(struct dvb_frontend *fe,
470 enum fe_sec_voltage voltage)
472 struct cx8802_dev *dev = fe->dvb->priv;
473 struct cx88_core *core = dev->core;
475 if (voltage == SEC_VOLTAGE_OFF) {
476 dprintk(1, "LNB Voltage OFF\n");
477 cx_write(MO_GP0_IO, 0x0000efff);
480 if (core->prev_set_voltage)
481 return core->prev_set_voltage(fe, voltage);
482 return 0;
485 static int tevii_dvbs_set_voltage(struct dvb_frontend *fe,
486 enum fe_sec_voltage voltage)
488 struct cx8802_dev *dev = fe->dvb->priv;
489 struct cx88_core *core = dev->core;
491 cx_set(MO_GP0_IO, 0x6040);
492 switch (voltage) {
493 case SEC_VOLTAGE_13:
494 cx_clear(MO_GP0_IO, 0x20);
495 break;
496 case SEC_VOLTAGE_18:
497 cx_set(MO_GP0_IO, 0x20);
498 break;
499 case SEC_VOLTAGE_OFF:
500 cx_clear(MO_GP0_IO, 0x20);
501 break;
504 if (core->prev_set_voltage)
505 return core->prev_set_voltage(fe, voltage);
506 return 0;
509 static int vp1027_set_voltage(struct dvb_frontend *fe,
510 enum fe_sec_voltage voltage)
512 struct cx8802_dev *dev = fe->dvb->priv;
513 struct cx88_core *core = dev->core;
515 switch (voltage) {
516 case SEC_VOLTAGE_13:
517 dprintk(1, "LNB SEC Voltage=13\n");
518 cx_write(MO_GP0_IO, 0x00001220);
519 break;
520 case SEC_VOLTAGE_18:
521 dprintk(1, "LNB SEC Voltage=18\n");
522 cx_write(MO_GP0_IO, 0x00001222);
523 break;
524 case SEC_VOLTAGE_OFF:
525 dprintk(1, "LNB Voltage OFF\n");
526 cx_write(MO_GP0_IO, 0x00001230);
527 break;
530 if (core->prev_set_voltage)
531 return core->prev_set_voltage(fe, voltage);
532 return 0;
535 static const struct cx24123_config geniatech_dvbs_config = {
536 .demod_address = 0x55,
537 .set_ts_params = cx24123_set_ts_param,
540 static const struct cx24123_config hauppauge_novas_config = {
541 .demod_address = 0x55,
542 .set_ts_params = cx24123_set_ts_param,
545 static const struct cx24123_config kworld_dvbs_100_config = {
546 .demod_address = 0x15,
547 .set_ts_params = cx24123_set_ts_param,
548 .lnb_polarity = 1,
551 static const struct s5h1409_config pinnacle_pctv_hd_800i_config = {
552 .demod_address = 0x32 >> 1,
553 .output_mode = S5H1409_PARALLEL_OUTPUT,
554 .gpio = S5H1409_GPIO_ON,
555 .qam_if = 44000,
556 .inversion = S5H1409_INVERSION_OFF,
557 .status_mode = S5H1409_DEMODLOCKING,
558 .mpeg_timing = S5H1409_MPEGTIMING_NONCONTINUOUS_NONINVERTING_CLOCK,
561 static const struct s5h1409_config dvico_hdtv5_pci_nano_config = {
562 .demod_address = 0x32 >> 1,
563 .output_mode = S5H1409_SERIAL_OUTPUT,
564 .gpio = S5H1409_GPIO_OFF,
565 .inversion = S5H1409_INVERSION_OFF,
566 .status_mode = S5H1409_DEMODLOCKING,
567 .mpeg_timing = S5H1409_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
570 static const struct s5h1409_config kworld_atsc_120_config = {
571 .demod_address = 0x32 >> 1,
572 .output_mode = S5H1409_SERIAL_OUTPUT,
573 .gpio = S5H1409_GPIO_OFF,
574 .inversion = S5H1409_INVERSION_OFF,
575 .status_mode = S5H1409_DEMODLOCKING,
576 .mpeg_timing = S5H1409_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
579 static const struct xc5000_config pinnacle_pctv_hd_800i_tuner_config = {
580 .i2c_address = 0x64,
581 .if_khz = 5380,
584 static const struct zl10353_config cx88_pinnacle_hybrid_pctv = {
585 .demod_address = (0x1e >> 1),
586 .no_tuner = 1,
587 .if2 = 45600,
590 static const struct zl10353_config cx88_geniatech_x8000_mt = {
591 .demod_address = (0x1e >> 1),
592 .no_tuner = 1,
593 .disable_i2c_gate_ctrl = 1,
596 static const struct s5h1411_config dvico_fusionhdtv7_config = {
597 .output_mode = S5H1411_SERIAL_OUTPUT,
598 .gpio = S5H1411_GPIO_ON,
599 .mpeg_timing = S5H1411_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
600 .qam_if = S5H1411_IF_44000,
601 .vsb_if = S5H1411_IF_44000,
602 .inversion = S5H1411_INVERSION_OFF,
603 .status_mode = S5H1411_DEMODLOCKING
606 static const struct xc5000_config dvico_fusionhdtv7_tuner_config = {
607 .i2c_address = 0xc2 >> 1,
608 .if_khz = 5380,
611 static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
613 struct dvb_frontend *fe;
614 struct vb2_dvb_frontend *fe0 = NULL;
615 struct xc2028_ctrl ctl;
616 struct xc2028_config cfg = {
617 .i2c_adap = &dev->core->i2c_adap,
618 .i2c_addr = addr,
619 .ctrl = &ctl,
622 /* Get the first frontend */
623 fe0 = vb2_dvb_get_frontend(&dev->frontends, 1);
624 if (!fe0)
625 return -EINVAL;
627 if (!fe0->dvb.frontend) {
628 pr_err("dvb frontend not attached. Can't attach xc3028\n");
629 return -EINVAL;
633 * Some xc3028 devices may be hidden by an I2C gate. This is known
634 * to happen with some s5h1409-based devices.
635 * Now that I2C gate is open, sets up xc3028 configuration
637 cx88_setup_xc3028(dev->core, &ctl);
639 fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
640 if (!fe) {
641 pr_err("xc3028 attach failed\n");
642 dvb_frontend_detach(fe0->dvb.frontend);
643 dvb_unregister_frontend(fe0->dvb.frontend);
644 fe0->dvb.frontend = NULL;
645 return -EINVAL;
648 pr_info("xc3028 attached\n");
650 return 0;
653 static int attach_xc4000(struct cx8802_dev *dev, struct xc4000_config *cfg)
655 struct dvb_frontend *fe;
656 struct vb2_dvb_frontend *fe0 = NULL;
658 /* Get the first frontend */
659 fe0 = vb2_dvb_get_frontend(&dev->frontends, 1);
660 if (!fe0)
661 return -EINVAL;
663 if (!fe0->dvb.frontend) {
664 pr_err("dvb frontend not attached. Can't attach xc4000\n");
665 return -EINVAL;
668 fe = dvb_attach(xc4000_attach, fe0->dvb.frontend, &dev->core->i2c_adap,
669 cfg);
670 if (!fe) {
671 pr_err("xc4000 attach failed\n");
672 dvb_frontend_detach(fe0->dvb.frontend);
673 dvb_unregister_frontend(fe0->dvb.frontend);
674 fe0->dvb.frontend = NULL;
675 return -EINVAL;
678 pr_info("xc4000 attached\n");
680 return 0;
683 static int cx24116_set_ts_param(struct dvb_frontend *fe,
684 int is_punctured)
686 struct cx8802_dev *dev = fe->dvb->priv;
688 dev->ts_gen_cntrl = 0x2;
690 return 0;
693 static int stv0900_set_ts_param(struct dvb_frontend *fe,
694 int is_punctured)
696 struct cx8802_dev *dev = fe->dvb->priv;
698 dev->ts_gen_cntrl = 0;
700 return 0;
703 static int cx24116_reset_device(struct dvb_frontend *fe)
705 struct cx8802_dev *dev = fe->dvb->priv;
706 struct cx88_core *core = dev->core;
708 /* Reset the part */
709 /* Put the cx24116 into reset */
710 cx_write(MO_SRST_IO, 0);
711 usleep_range(10000, 20000);
712 /* Take the cx24116 out of reset */
713 cx_write(MO_SRST_IO, 1);
714 usleep_range(10000, 20000);
716 return 0;
719 static const struct cx24116_config hauppauge_hvr4000_config = {
720 .demod_address = 0x05,
721 .set_ts_params = cx24116_set_ts_param,
722 .reset_device = cx24116_reset_device,
725 static const struct cx24116_config tevii_s460_config = {
726 .demod_address = 0x55,
727 .set_ts_params = cx24116_set_ts_param,
728 .reset_device = cx24116_reset_device,
731 static int ds3000_set_ts_param(struct dvb_frontend *fe,
732 int is_punctured)
734 struct cx8802_dev *dev = fe->dvb->priv;
736 dev->ts_gen_cntrl = 4;
738 return 0;
741 static struct ds3000_config tevii_ds3000_config = {
742 .demod_address = 0x68,
743 .set_ts_params = ds3000_set_ts_param,
746 static struct ts2020_config tevii_ts2020_config = {
747 .tuner_address = 0x60,
748 .clk_out_div = 1,
751 static const struct stv0900_config prof_7301_stv0900_config = {
752 .demod_address = 0x6a,
753 /* demod_mode = 0,*/
754 .xtal = 27000000,
755 .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
756 .diseqc_mode = 2,/* 2/3 PWM */
757 .tun1_maddress = 0,/* 0x60 */
758 .tun1_adc = 0,/* 2 Vpp */
759 .path1_mode = 3,
760 .set_ts_params = stv0900_set_ts_param,
763 static const struct stb6100_config prof_7301_stb6100_config = {
764 .tuner_address = 0x60,
765 .refclock = 27000000,
768 static const struct stv0299_config tevii_tuner_sharp_config = {
769 .demod_address = 0x68,
770 .inittab = sharp_z0194a_inittab,
771 .mclk = 88000000UL,
772 .invert = 1,
773 .skip_reinit = 0,
774 .lock_output = 1,
775 .volt13_op0_op1 = STV0299_VOLT13_OP1,
776 .min_delay_ms = 100,
777 .set_symbol_rate = sharp_z0194a_set_symbol_rate,
778 .set_ts_params = cx24116_set_ts_param,
781 static const struct stv0288_config tevii_tuner_earda_config = {
782 .demod_address = 0x68,
783 .min_delay_ms = 100,
784 .set_ts_params = cx24116_set_ts_param,
787 static int cx8802_alloc_frontends(struct cx8802_dev *dev)
789 struct cx88_core *core = dev->core;
790 struct vb2_dvb_frontend *fe = NULL;
791 int i;
793 mutex_init(&dev->frontends.lock);
794 INIT_LIST_HEAD(&dev->frontends.felist);
796 if (!core->board.num_frontends)
797 return -ENODEV;
799 pr_info("%s: allocating %d frontend(s)\n", __func__,
800 core->board.num_frontends);
801 for (i = 1; i <= core->board.num_frontends; i++) {
802 fe = vb2_dvb_alloc_frontend(&dev->frontends, i);
803 if (!fe) {
804 pr_err("%s() failed to alloc\n", __func__);
805 vb2_dvb_dealloc_frontends(&dev->frontends);
806 return -ENOMEM;
809 return 0;
812 static const u8 samsung_smt_7020_inittab[] = {
813 0x01, 0x15,
814 0x02, 0x00,
815 0x03, 0x00,
816 0x04, 0x7D,
817 0x05, 0x0F,
818 0x06, 0x02,
819 0x07, 0x00,
820 0x08, 0x60,
822 0x0A, 0xC2,
823 0x0B, 0x00,
824 0x0C, 0x01,
825 0x0D, 0x81,
826 0x0E, 0x44,
827 0x0F, 0x09,
828 0x10, 0x3C,
829 0x11, 0x84,
830 0x12, 0xDA,
831 0x13, 0x99,
832 0x14, 0x8D,
833 0x15, 0xCE,
834 0x16, 0xE8,
835 0x17, 0x43,
836 0x18, 0x1C,
837 0x19, 0x1B,
838 0x1A, 0x1D,
840 0x1C, 0x12,
841 0x1D, 0x00,
842 0x1E, 0x00,
843 0x1F, 0x00,
844 0x20, 0x00,
845 0x21, 0x00,
846 0x22, 0x00,
847 0x23, 0x00,
849 0x28, 0x02,
850 0x29, 0x28,
851 0x2A, 0x14,
852 0x2B, 0x0F,
853 0x2C, 0x09,
854 0x2D, 0x05,
856 0x31, 0x1F,
857 0x32, 0x19,
858 0x33, 0xFC,
859 0x34, 0x13,
860 0xff, 0xff,
863 static int samsung_smt_7020_tuner_set_params(struct dvb_frontend *fe)
865 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
866 struct cx8802_dev *dev = fe->dvb->priv;
867 u8 buf[4];
868 u32 div;
869 struct i2c_msg msg = {
870 .addr = 0x61,
871 .flags = 0,
872 .buf = buf,
873 .len = sizeof(buf) };
875 div = c->frequency / 125;
877 buf[0] = (div >> 8) & 0x7f;
878 buf[1] = div & 0xff;
879 buf[2] = 0x84; /* 0xC4 */
880 buf[3] = 0x00;
882 if (c->frequency < 1500000)
883 buf[3] |= 0x10;
885 if (fe->ops.i2c_gate_ctrl)
886 fe->ops.i2c_gate_ctrl(fe, 1);
888 if (i2c_transfer(&dev->core->i2c_adap, &msg, 1) != 1)
889 return -EIO;
891 return 0;
894 static int samsung_smt_7020_set_tone(struct dvb_frontend *fe,
895 enum fe_sec_tone_mode tone)
897 struct cx8802_dev *dev = fe->dvb->priv;
898 struct cx88_core *core = dev->core;
900 cx_set(MO_GP0_IO, 0x0800);
902 switch (tone) {
903 case SEC_TONE_ON:
904 cx_set(MO_GP0_IO, 0x08);
905 break;
906 case SEC_TONE_OFF:
907 cx_clear(MO_GP0_IO, 0x08);
908 break;
909 default:
910 return -EINVAL;
913 return 0;
916 static int samsung_smt_7020_set_voltage(struct dvb_frontend *fe,
917 enum fe_sec_voltage voltage)
919 struct cx8802_dev *dev = fe->dvb->priv;
920 struct cx88_core *core = dev->core;
922 u8 data;
923 struct i2c_msg msg = {
924 .addr = 8,
925 .flags = 0,
926 .buf = &data,
927 .len = sizeof(data) };
929 cx_set(MO_GP0_IO, 0x8000);
931 switch (voltage) {
932 case SEC_VOLTAGE_OFF:
933 break;
934 case SEC_VOLTAGE_13:
935 data = ISL6421_EN1 | ISL6421_LLC1;
936 cx_clear(MO_GP0_IO, 0x80);
937 break;
938 case SEC_VOLTAGE_18:
939 data = ISL6421_EN1 | ISL6421_LLC1 | ISL6421_VSEL1;
940 cx_clear(MO_GP0_IO, 0x80);
941 break;
942 default:
943 return -EINVAL;
946 return (i2c_transfer(&dev->core->i2c_adap, &msg, 1) == 1) ? 0 : -EIO;
949 static int samsung_smt_7020_stv0299_set_symbol_rate(struct dvb_frontend *fe,
950 u32 srate, u32 ratio)
952 u8 aclk = 0;
953 u8 bclk = 0;
955 if (srate < 1500000) {
956 aclk = 0xb7;
957 bclk = 0x47;
958 } else if (srate < 3000000) {
959 aclk = 0xb7;
960 bclk = 0x4b;
961 } else if (srate < 7000000) {
962 aclk = 0xb7;
963 bclk = 0x4f;
964 } else if (srate < 14000000) {
965 aclk = 0xb7;
966 bclk = 0x53;
967 } else if (srate < 30000000) {
968 aclk = 0xb6;
969 bclk = 0x53;
970 } else if (srate < 45000000) {
971 aclk = 0xb4;
972 bclk = 0x51;
975 stv0299_writereg(fe, 0x13, aclk);
976 stv0299_writereg(fe, 0x14, bclk);
977 stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
978 stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
979 stv0299_writereg(fe, 0x21, ratio & 0xf0);
981 return 0;
984 static const struct stv0299_config samsung_stv0299_config = {
985 .demod_address = 0x68,
986 .inittab = samsung_smt_7020_inittab,
987 .mclk = 88000000UL,
988 .invert = 0,
989 .skip_reinit = 0,
990 .lock_output = STV0299_LOCKOUTPUT_LK,
991 .volt13_op0_op1 = STV0299_VOLT13_OP1,
992 .min_delay_ms = 100,
993 .set_symbol_rate = samsung_smt_7020_stv0299_set_symbol_rate,
996 static int dvb_register(struct cx8802_dev *dev)
998 struct cx88_core *core = dev->core;
999 struct vb2_dvb_frontend *fe0, *fe1 = NULL;
1000 int mfe_shared = 0; /* bus not shared by default */
1001 int res = -EINVAL;
1003 if (core->i2c_rc != 0) {
1004 pr_err("no i2c-bus available, cannot attach dvb drivers\n");
1005 goto frontend_detach;
1008 /* Get the first frontend */
1009 fe0 = vb2_dvb_get_frontend(&dev->frontends, 1);
1010 if (!fe0)
1011 goto frontend_detach;
1013 /* multi-frontend gate control is undefined or defaults to fe0 */
1014 dev->frontends.gate = 0;
1016 /* Sets the gate control callback to be used by i2c command calls */
1017 core->gate_ctrl = cx88_dvb_gate_ctrl;
1019 /* init frontend(s) */
1020 switch (core->boardnr) {
1021 case CX88_BOARD_HAUPPAUGE_DVB_T1:
1022 fe0->dvb.frontend = dvb_attach(cx22702_attach,
1023 &connexant_refboard_config,
1024 &core->i2c_adap);
1025 if (fe0->dvb.frontend) {
1026 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1027 0x61, &core->i2c_adap,
1028 DVB_PLL_THOMSON_DTT759X))
1029 goto frontend_detach;
1031 break;
1032 case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
1033 case CX88_BOARD_CONEXANT_DVB_T1:
1034 case CX88_BOARD_KWORLD_DVB_T_CX22702:
1035 case CX88_BOARD_WINFAST_DTV1000:
1036 fe0->dvb.frontend = dvb_attach(cx22702_attach,
1037 &connexant_refboard_config,
1038 &core->i2c_adap);
1039 if (fe0->dvb.frontend) {
1040 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1041 0x60, &core->i2c_adap,
1042 DVB_PLL_THOMSON_DTT7579))
1043 goto frontend_detach;
1045 break;
1046 case CX88_BOARD_WINFAST_DTV2000H:
1047 case CX88_BOARD_HAUPPAUGE_HVR1100:
1048 case CX88_BOARD_HAUPPAUGE_HVR1100LP:
1049 case CX88_BOARD_HAUPPAUGE_HVR1300:
1050 fe0->dvb.frontend = dvb_attach(cx22702_attach,
1051 &hauppauge_hvr_config,
1052 &core->i2c_adap);
1053 if (fe0->dvb.frontend) {
1054 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1055 &core->i2c_adap, 0x61,
1056 TUNER_PHILIPS_FMD1216ME_MK3))
1057 goto frontend_detach;
1059 break;
1060 case CX88_BOARD_WINFAST_DTV2000H_J:
1061 fe0->dvb.frontend = dvb_attach(cx22702_attach,
1062 &hauppauge_hvr_config,
1063 &core->i2c_adap);
1064 if (fe0->dvb.frontend) {
1065 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1066 &core->i2c_adap, 0x61,
1067 TUNER_PHILIPS_FMD1216MEX_MK3))
1068 goto frontend_detach;
1070 break;
1071 case CX88_BOARD_HAUPPAUGE_HVR3000:
1072 /* MFE frontend 1 */
1073 mfe_shared = 1;
1074 dev->frontends.gate = 2;
1075 /* DVB-S init */
1076 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1077 &hauppauge_novas_config,
1078 &dev->core->i2c_adap);
1079 if (fe0->dvb.frontend) {
1080 if (!dvb_attach(isl6421_attach,
1081 fe0->dvb.frontend,
1082 &dev->core->i2c_adap,
1083 0x08, ISL6421_DCL, 0x00, false))
1084 goto frontend_detach;
1086 /* MFE frontend 2 */
1087 fe1 = vb2_dvb_get_frontend(&dev->frontends, 2);
1088 if (!fe1)
1089 goto frontend_detach;
1090 /* DVB-T init */
1091 fe1->dvb.frontend = dvb_attach(cx22702_attach,
1092 &hauppauge_hvr_config,
1093 &dev->core->i2c_adap);
1094 if (fe1->dvb.frontend) {
1095 fe1->dvb.frontend->id = 1;
1096 if (!dvb_attach(simple_tuner_attach,
1097 fe1->dvb.frontend,
1098 &dev->core->i2c_adap,
1099 0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1100 goto frontend_detach;
1102 break;
1103 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
1104 fe0->dvb.frontend = dvb_attach(mt352_attach,
1105 &dvico_fusionhdtv,
1106 &core->i2c_adap);
1107 if (fe0->dvb.frontend) {
1108 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1109 0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1110 goto frontend_detach;
1111 break;
1113 /* ZL10353 replaces MT352 on later cards */
1114 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1115 &dvico_fusionhdtv_plus_v1_1,
1116 &core->i2c_adap);
1117 if (fe0->dvb.frontend) {
1118 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1119 0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1120 goto frontend_detach;
1122 break;
1123 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
1125 * The tin box says DEE1601, but it seems to be DTT7579
1126 * compatible, with a slightly different MT352 AGC gain.
1128 fe0->dvb.frontend = dvb_attach(mt352_attach,
1129 &dvico_fusionhdtv_dual,
1130 &core->i2c_adap);
1131 if (fe0->dvb.frontend) {
1132 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1133 0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1134 goto frontend_detach;
1135 break;
1137 /* ZL10353 replaces MT352 on later cards */
1138 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1139 &dvico_fusionhdtv_plus_v1_1,
1140 &core->i2c_adap);
1141 if (fe0->dvb.frontend) {
1142 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1143 0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1144 goto frontend_detach;
1146 break;
1147 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
1148 fe0->dvb.frontend = dvb_attach(mt352_attach,
1149 &dvico_fusionhdtv,
1150 &core->i2c_adap);
1151 if (fe0->dvb.frontend) {
1152 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1153 0x61, NULL, DVB_PLL_LG_Z201))
1154 goto frontend_detach;
1156 break;
1157 case CX88_BOARD_KWORLD_DVB_T:
1158 case CX88_BOARD_DNTV_LIVE_DVB_T:
1159 case CX88_BOARD_ADSTECH_DVB_T_PCI:
1160 fe0->dvb.frontend = dvb_attach(mt352_attach,
1161 &dntv_live_dvbt_config,
1162 &core->i2c_adap);
1163 if (fe0->dvb.frontend) {
1164 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1165 0x61, NULL, DVB_PLL_UNKNOWN_1))
1166 goto frontend_detach;
1168 break;
1169 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
1170 #if IS_ENABLED(CONFIG_VIDEO_CX88_VP3054)
1171 /* MT352 is on a secondary I2C bus made from some GPIO lines */
1172 fe0->dvb.frontend = dvb_attach(mt352_attach,
1173 &dntv_live_dvbt_pro_config,
1174 &dev->vp3054->adap);
1175 if (fe0->dvb.frontend) {
1176 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1177 &core->i2c_adap, 0x61,
1178 TUNER_PHILIPS_FMD1216ME_MK3))
1179 goto frontend_detach;
1181 #else
1182 pr_err("built without vp3054 support\n");
1183 #endif
1184 break;
1185 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
1186 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1187 &dvico_fusionhdtv_hybrid,
1188 &core->i2c_adap);
1189 if (fe0->dvb.frontend) {
1190 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1191 &core->i2c_adap, 0x61,
1192 TUNER_THOMSON_FE6600))
1193 goto frontend_detach;
1195 break;
1196 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
1197 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1198 &dvico_fusionhdtv_xc3028,
1199 &core->i2c_adap);
1200 if (!fe0->dvb.frontend)
1201 fe0->dvb.frontend = dvb_attach(mt352_attach,
1202 &dvico_fusionhdtv_mt352_xc3028,
1203 &core->i2c_adap);
1205 * On this board, the demod provides the I2C bus pullup.
1206 * We must not permit gate_ctrl to be performed, or
1207 * the xc3028 cannot communicate on the bus.
1209 if (fe0->dvb.frontend)
1210 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1211 if (attach_xc3028(0x61, dev) < 0)
1212 goto frontend_detach;
1213 break;
1214 case CX88_BOARD_PCHDTV_HD3000:
1215 fe0->dvb.frontend = dvb_attach(or51132_attach, &pchdtv_hd3000,
1216 &core->i2c_adap);
1217 if (fe0->dvb.frontend) {
1218 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1219 &core->i2c_adap, 0x61,
1220 TUNER_THOMSON_DTT761X))
1221 goto frontend_detach;
1223 break;
1224 case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q:
1225 dev->ts_gen_cntrl = 0x08;
1227 /* Do a hardware reset of chip before using it. */
1228 cx_clear(MO_GP0_IO, 1);
1229 msleep(100);
1230 cx_set(MO_GP0_IO, 1);
1231 msleep(200);
1233 /* Select RF connector callback */
1234 fusionhdtv_3_gold.pll_rf_set = lgdt330x_pll_rf_set;
1235 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1236 &fusionhdtv_3_gold,
1237 0x0e,
1238 &core->i2c_adap);
1239 if (fe0->dvb.frontend) {
1240 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1241 &core->i2c_adap, 0x61,
1242 TUNER_MICROTUNE_4042FI5))
1243 goto frontend_detach;
1245 break;
1246 case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T:
1247 dev->ts_gen_cntrl = 0x08;
1249 /* Do a hardware reset of chip before using it. */
1250 cx_clear(MO_GP0_IO, 1);
1251 msleep(100);
1252 cx_set(MO_GP0_IO, 9);
1253 msleep(200);
1254 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1255 &fusionhdtv_3_gold,
1256 0x0e,
1257 &core->i2c_adap);
1258 if (fe0->dvb.frontend) {
1259 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1260 &core->i2c_adap, 0x61,
1261 TUNER_THOMSON_DTT761X))
1262 goto frontend_detach;
1264 break;
1265 case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD:
1266 dev->ts_gen_cntrl = 0x08;
1268 /* Do a hardware reset of chip before using it. */
1269 cx_clear(MO_GP0_IO, 1);
1270 msleep(100);
1271 cx_set(MO_GP0_IO, 1);
1272 msleep(200);
1273 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1274 &fusionhdtv_5_gold,
1275 0x0e,
1276 &core->i2c_adap);
1277 if (fe0->dvb.frontend) {
1278 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1279 &core->i2c_adap, 0x61,
1280 TUNER_LG_TDVS_H06XF))
1281 goto frontend_detach;
1282 if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
1283 &core->i2c_adap, 0x43))
1284 goto frontend_detach;
1286 break;
1287 case CX88_BOARD_PCHDTV_HD5500:
1288 dev->ts_gen_cntrl = 0x08;
1290 /* Do a hardware reset of chip before using it. */
1291 cx_clear(MO_GP0_IO, 1);
1292 msleep(100);
1293 cx_set(MO_GP0_IO, 1);
1294 msleep(200);
1295 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1296 &pchdtv_hd5500,
1297 0x59,
1298 &core->i2c_adap);
1299 if (fe0->dvb.frontend) {
1300 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1301 &core->i2c_adap, 0x61,
1302 TUNER_LG_TDVS_H06XF))
1303 goto frontend_detach;
1304 if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
1305 &core->i2c_adap, 0x43))
1306 goto frontend_detach;
1308 break;
1309 case CX88_BOARD_ATI_HDTVWONDER:
1310 fe0->dvb.frontend = dvb_attach(nxt200x_attach,
1311 &ati_hdtvwonder,
1312 &core->i2c_adap);
1313 if (fe0->dvb.frontend) {
1314 if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1315 &core->i2c_adap, 0x61,
1316 TUNER_PHILIPS_TUV1236D))
1317 goto frontend_detach;
1319 break;
1320 case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
1321 case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
1322 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1323 &hauppauge_novas_config,
1324 &core->i2c_adap);
1325 if (fe0->dvb.frontend) {
1326 bool override_tone;
1328 if (core->model == 92001)
1329 override_tone = true;
1330 else
1331 override_tone = false;
1333 if (!dvb_attach(isl6421_attach, fe0->dvb.frontend,
1334 &core->i2c_adap, 0x08, ISL6421_DCL,
1335 0x00, override_tone))
1336 goto frontend_detach;
1338 break;
1339 case CX88_BOARD_KWORLD_DVBS_100:
1340 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1341 &kworld_dvbs_100_config,
1342 &core->i2c_adap);
1343 if (fe0->dvb.frontend) {
1344 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1345 fe0->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage;
1347 break;
1348 case CX88_BOARD_GENIATECH_DVBS:
1349 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1350 &geniatech_dvbs_config,
1351 &core->i2c_adap);
1352 if (fe0->dvb.frontend) {
1353 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1354 fe0->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage;
1356 break;
1357 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
1358 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1359 &pinnacle_pctv_hd_800i_config,
1360 &core->i2c_adap);
1361 if (fe0->dvb.frontend) {
1362 if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
1363 &core->i2c_adap,
1364 &pinnacle_pctv_hd_800i_tuner_config))
1365 goto frontend_detach;
1367 break;
1368 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
1369 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1370 &dvico_hdtv5_pci_nano_config,
1371 &core->i2c_adap);
1372 if (fe0->dvb.frontend) {
1373 struct dvb_frontend *fe;
1374 struct xc2028_config cfg = {
1375 .i2c_adap = &core->i2c_adap,
1376 .i2c_addr = 0x61,
1378 static struct xc2028_ctrl ctl = {
1379 .fname = XC2028_DEFAULT_FIRMWARE,
1380 .max_len = 64,
1381 .scode_table = XC3028_FE_OREN538,
1384 fe = dvb_attach(xc2028_attach,
1385 fe0->dvb.frontend, &cfg);
1386 if (fe && fe->ops.tuner_ops.set_config)
1387 fe->ops.tuner_ops.set_config(fe, &ctl);
1389 break;
1390 case CX88_BOARD_PINNACLE_HYBRID_PCTV:
1391 case CX88_BOARD_WINFAST_DTV1800H:
1392 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1393 &cx88_pinnacle_hybrid_pctv,
1394 &core->i2c_adap);
1395 if (fe0->dvb.frontend) {
1396 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1397 if (attach_xc3028(0x61, dev) < 0)
1398 goto frontend_detach;
1400 break;
1401 case CX88_BOARD_WINFAST_DTV1800H_XC4000:
1402 case CX88_BOARD_WINFAST_DTV2000H_PLUS:
1403 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1404 &cx88_pinnacle_hybrid_pctv,
1405 &core->i2c_adap);
1406 if (fe0->dvb.frontend) {
1407 struct xc4000_config cfg = {
1408 .i2c_address = 0x61,
1409 .default_pm = 0,
1410 .dvb_amplitude = 134,
1411 .set_smoothedcvbs = 1,
1412 .if_khz = 4560
1414 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1415 if (attach_xc4000(dev, &cfg) < 0)
1416 goto frontend_detach;
1418 break;
1419 case CX88_BOARD_GENIATECH_X8000_MT:
1420 dev->ts_gen_cntrl = 0x00;
1422 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1423 &cx88_geniatech_x8000_mt,
1424 &core->i2c_adap);
1425 if (attach_xc3028(0x61, dev) < 0)
1426 goto frontend_detach;
1427 break;
1428 case CX88_BOARD_KWORLD_ATSC_120:
1429 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1430 &kworld_atsc_120_config,
1431 &core->i2c_adap);
1432 if (attach_xc3028(0x61, dev) < 0)
1433 goto frontend_detach;
1434 break;
1435 case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
1436 fe0->dvb.frontend = dvb_attach(s5h1411_attach,
1437 &dvico_fusionhdtv7_config,
1438 &core->i2c_adap);
1439 if (fe0->dvb.frontend) {
1440 if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
1441 &core->i2c_adap,
1442 &dvico_fusionhdtv7_tuner_config))
1443 goto frontend_detach;
1445 break;
1446 case CX88_BOARD_HAUPPAUGE_HVR4000:
1447 /* MFE frontend 1 */
1448 mfe_shared = 1;
1449 dev->frontends.gate = 2;
1450 /* DVB-S/S2 Init */
1451 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1452 &hauppauge_hvr4000_config,
1453 &dev->core->i2c_adap);
1454 if (fe0->dvb.frontend) {
1455 if (!dvb_attach(isl6421_attach,
1456 fe0->dvb.frontend,
1457 &dev->core->i2c_adap,
1458 0x08, ISL6421_DCL, 0x00, false))
1459 goto frontend_detach;
1461 /* MFE frontend 2 */
1462 fe1 = vb2_dvb_get_frontend(&dev->frontends, 2);
1463 if (!fe1)
1464 goto frontend_detach;
1465 /* DVB-T Init */
1466 fe1->dvb.frontend = dvb_attach(cx22702_attach,
1467 &hauppauge_hvr_config,
1468 &dev->core->i2c_adap);
1469 if (fe1->dvb.frontend) {
1470 fe1->dvb.frontend->id = 1;
1471 if (!dvb_attach(simple_tuner_attach,
1472 fe1->dvb.frontend,
1473 &dev->core->i2c_adap,
1474 0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1475 goto frontend_detach;
1477 break;
1478 case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
1479 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1480 &hauppauge_hvr4000_config,
1481 &dev->core->i2c_adap);
1482 if (fe0->dvb.frontend) {
1483 if (!dvb_attach(isl6421_attach,
1484 fe0->dvb.frontend,
1485 &dev->core->i2c_adap,
1486 0x08, ISL6421_DCL, 0x00, false))
1487 goto frontend_detach;
1489 break;
1490 case CX88_BOARD_PROF_6200:
1491 case CX88_BOARD_TBS_8910:
1492 case CX88_BOARD_TEVII_S420:
1493 fe0->dvb.frontend = dvb_attach(stv0299_attach,
1494 &tevii_tuner_sharp_config,
1495 &core->i2c_adap);
1496 if (fe0->dvb.frontend) {
1497 if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
1498 &core->i2c_adap, DVB_PLL_OPERA1))
1499 goto frontend_detach;
1500 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1501 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1503 } else {
1504 fe0->dvb.frontend = dvb_attach(stv0288_attach,
1505 &tevii_tuner_earda_config,
1506 &core->i2c_adap);
1507 if (fe0->dvb.frontend) {
1508 if (!dvb_attach(stb6000_attach,
1509 fe0->dvb.frontend, 0x61,
1510 &core->i2c_adap))
1511 goto frontend_detach;
1512 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1513 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1516 break;
1517 case CX88_BOARD_TEVII_S460:
1518 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1519 &tevii_s460_config,
1520 &core->i2c_adap);
1521 if (fe0->dvb.frontend)
1522 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1523 break;
1524 case CX88_BOARD_TEVII_S464:
1525 fe0->dvb.frontend = dvb_attach(ds3000_attach,
1526 &tevii_ds3000_config,
1527 &core->i2c_adap);
1528 if (fe0->dvb.frontend) {
1529 dvb_attach(ts2020_attach, fe0->dvb.frontend,
1530 &tevii_ts2020_config, &core->i2c_adap);
1531 fe0->dvb.frontend->ops.set_voltage =
1532 tevii_dvbs_set_voltage;
1534 break;
1535 case CX88_BOARD_OMICOM_SS4_PCI:
1536 case CX88_BOARD_TBS_8920:
1537 case CX88_BOARD_PROF_7300:
1538 case CX88_BOARD_SATTRADE_ST4200:
1539 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1540 &hauppauge_hvr4000_config,
1541 &core->i2c_adap);
1542 if (fe0->dvb.frontend)
1543 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1544 break;
1545 case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
1546 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1547 &cx88_terratec_cinergy_ht_pci_mkii_config,
1548 &core->i2c_adap);
1549 if (fe0->dvb.frontend) {
1550 fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1551 if (attach_xc3028(0x61, dev) < 0)
1552 goto frontend_detach;
1554 break;
1555 case CX88_BOARD_PROF_7301:{
1556 struct dvb_tuner_ops *tuner_ops = NULL;
1558 fe0->dvb.frontend = dvb_attach(stv0900_attach,
1559 &prof_7301_stv0900_config,
1560 &core->i2c_adap, 0);
1561 if (fe0->dvb.frontend) {
1562 if (!dvb_attach(stb6100_attach, fe0->dvb.frontend,
1563 &prof_7301_stb6100_config,
1564 &core->i2c_adap))
1565 goto frontend_detach;
1567 tuner_ops = &fe0->dvb.frontend->ops.tuner_ops;
1568 tuner_ops->set_frequency = stb6100_set_freq;
1569 tuner_ops->get_frequency = stb6100_get_freq;
1570 tuner_ops->set_bandwidth = stb6100_set_bandw;
1571 tuner_ops->get_bandwidth = stb6100_get_bandw;
1573 core->prev_set_voltage =
1574 fe0->dvb.frontend->ops.set_voltage;
1575 fe0->dvb.frontend->ops.set_voltage =
1576 tevii_dvbs_set_voltage;
1578 break;
1580 case CX88_BOARD_SAMSUNG_SMT_7020:
1581 dev->ts_gen_cntrl = 0x08;
1583 cx_set(MO_GP0_IO, 0x0101);
1585 cx_clear(MO_GP0_IO, 0x01);
1586 msleep(100);
1587 cx_set(MO_GP0_IO, 0x01);
1588 msleep(200);
1590 fe0->dvb.frontend = dvb_attach(stv0299_attach,
1591 &samsung_stv0299_config,
1592 &dev->core->i2c_adap);
1593 if (fe0->dvb.frontend) {
1594 fe0->dvb.frontend->ops.tuner_ops.set_params =
1595 samsung_smt_7020_tuner_set_params;
1596 fe0->dvb.frontend->tuner_priv =
1597 &dev->core->i2c_adap;
1598 fe0->dvb.frontend->ops.set_voltage =
1599 samsung_smt_7020_set_voltage;
1600 fe0->dvb.frontend->ops.set_tone =
1601 samsung_smt_7020_set_tone;
1604 break;
1605 case CX88_BOARD_TWINHAN_VP1027_DVBS:
1606 dev->ts_gen_cntrl = 0x00;
1607 fe0->dvb.frontend = dvb_attach(mb86a16_attach,
1608 &twinhan_vp1027,
1609 &core->i2c_adap);
1610 if (fe0->dvb.frontend) {
1611 core->prev_set_voltage =
1612 fe0->dvb.frontend->ops.set_voltage;
1613 fe0->dvb.frontend->ops.set_voltage =
1614 vp1027_set_voltage;
1616 break;
1618 default:
1619 pr_err("The frontend of your DVB/ATSC card isn't supported yet\n");
1620 break;
1623 if ((NULL == fe0->dvb.frontend) || (fe1 && NULL == fe1->dvb.frontend)) {
1624 pr_err("frontend initialization failed\n");
1625 goto frontend_detach;
1627 /* define general-purpose callback pointer */
1628 fe0->dvb.frontend->callback = cx88_tuner_callback;
1630 /* Ensure all frontends negotiate bus access */
1631 fe0->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1632 if (fe1)
1633 fe1->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1635 /* Put the tuner in standby to keep it quiet */
1636 call_all(core, tuner, standby);
1638 /* register everything */
1639 res = vb2_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1640 &dev->pci->dev, NULL, adapter_nr,
1641 mfe_shared);
1642 if (res)
1643 goto frontend_detach;
1644 return res;
1646 frontend_detach:
1647 core->gate_ctrl = NULL;
1648 vb2_dvb_dealloc_frontends(&dev->frontends);
1649 return res;
1652 /* ----------------------------------------------------------- */
1654 /* CX8802 MPEG -> mini driver - We have been given the hardware */
1655 static int cx8802_dvb_advise_acquire(struct cx8802_driver *drv)
1657 struct cx88_core *core = drv->core;
1658 int err = 0;
1660 dprintk(1, "%s\n", __func__);
1662 switch (core->boardnr) {
1663 case CX88_BOARD_HAUPPAUGE_HVR1300:
1664 /* We arrive here with either the cx23416 or the cx22702
1665 * on the bus. Take the bus from the cx23416 and enable the
1666 * cx22702 demod
1668 /* Toggle reset on cx22702 leaving i2c active */
1669 cx_set(MO_GP0_IO, 0x00000080);
1670 udelay(1000);
1671 cx_clear(MO_GP0_IO, 0x00000080);
1672 udelay(50);
1673 cx_set(MO_GP0_IO, 0x00000080);
1674 udelay(1000);
1675 /* enable the cx22702 pins */
1676 cx_clear(MO_GP0_IO, 0x00000004);
1677 udelay(1000);
1678 break;
1680 case CX88_BOARD_HAUPPAUGE_HVR3000:
1681 case CX88_BOARD_HAUPPAUGE_HVR4000:
1682 /* Toggle reset on cx22702 leaving i2c active */
1683 cx_set(MO_GP0_IO, 0x00000080);
1684 udelay(1000);
1685 cx_clear(MO_GP0_IO, 0x00000080);
1686 udelay(50);
1687 cx_set(MO_GP0_IO, 0x00000080);
1688 udelay(1000);
1689 switch (core->dvbdev->frontends.active_fe_id) {
1690 case 1: /* DVB-S/S2 Enabled */
1691 /* tri-state the cx22702 pins */
1692 cx_set(MO_GP0_IO, 0x00000004);
1693 /* Take the cx24116/cx24123 out of reset */
1694 cx_write(MO_SRST_IO, 1);
1695 core->dvbdev->ts_gen_cntrl = 0x02; /* Parallel IO */
1696 break;
1697 case 2: /* DVB-T Enabled */
1698 /* Put the cx24116/cx24123 into reset */
1699 cx_write(MO_SRST_IO, 0);
1700 /* enable the cx22702 pins */
1701 cx_clear(MO_GP0_IO, 0x00000004);
1702 core->dvbdev->ts_gen_cntrl = 0x0c; /* Serial IO */
1703 break;
1705 udelay(1000);
1706 break;
1708 case CX88_BOARD_WINFAST_DTV2000H_PLUS:
1709 /* set RF input to AIR for DVB-T (GPIO 16) */
1710 cx_write(MO_GP2_IO, 0x0101);
1711 break;
1713 default:
1714 err = -ENODEV;
1716 return err;
1719 /* CX8802 MPEG -> mini driver - We no longer have the hardware */
1720 static int cx8802_dvb_advise_release(struct cx8802_driver *drv)
1722 struct cx88_core *core = drv->core;
1723 int err = 0;
1725 dprintk(1, "%s\n", __func__);
1727 switch (core->boardnr) {
1728 case CX88_BOARD_HAUPPAUGE_HVR1300:
1729 /* Do Nothing, leave the cx22702 on the bus. */
1730 break;
1731 case CX88_BOARD_HAUPPAUGE_HVR3000:
1732 case CX88_BOARD_HAUPPAUGE_HVR4000:
1733 break;
1734 default:
1735 err = -ENODEV;
1737 return err;
1740 static int cx8802_dvb_probe(struct cx8802_driver *drv)
1742 struct cx88_core *core = drv->core;
1743 struct cx8802_dev *dev = drv->core->dvbdev;
1744 int err;
1745 struct vb2_dvb_frontend *fe;
1746 int i;
1748 dprintk(1, "%s\n", __func__);
1749 dprintk(1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
1750 core->boardnr,
1751 core->name,
1752 core->pci_bus,
1753 core->pci_slot);
1755 err = -ENODEV;
1756 if (!(core->board.mpeg & CX88_MPEG_DVB))
1757 goto fail_core;
1759 /* If vp3054 isn't enabled, a stub will just return 0 */
1760 err = vp3054_i2c_probe(dev);
1761 if (err != 0)
1762 goto fail_core;
1764 /* dvb stuff */
1765 pr_info("cx2388x based DVB/ATSC card\n");
1766 dev->ts_gen_cntrl = 0x0c;
1768 err = cx8802_alloc_frontends(dev);
1769 if (err)
1770 goto fail_core;
1772 for (i = 1; i <= core->board.num_frontends; i++) {
1773 struct vb2_queue *q;
1775 fe = vb2_dvb_get_frontend(&core->dvbdev->frontends, i);
1776 if (!fe) {
1777 pr_err("%s() failed to get frontend(%d)\n",
1778 __func__, i);
1779 err = -ENODEV;
1780 goto fail_probe;
1782 q = &fe->dvb.dvbq;
1783 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1784 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF | VB2_READ;
1785 q->gfp_flags = GFP_DMA32;
1786 q->min_buffers_needed = 2;
1787 q->drv_priv = dev;
1788 q->buf_struct_size = sizeof(struct cx88_buffer);
1789 q->ops = &dvb_qops;
1790 q->mem_ops = &vb2_dma_sg_memops;
1791 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1792 q->lock = &core->lock;
1793 q->dev = &dev->pci->dev;
1795 err = vb2_queue_init(q);
1796 if (err < 0)
1797 goto fail_probe;
1799 /* init struct vb2_dvb */
1800 fe->dvb.name = dev->core->name;
1803 err = dvb_register(dev);
1804 if (err)
1805 /* frontends/adapter de-allocated in dvb_register */
1806 pr_err("dvb_register failed (err = %d)\n", err);
1807 return err;
1808 fail_probe:
1809 vb2_dvb_dealloc_frontends(&core->dvbdev->frontends);
1810 fail_core:
1811 return err;
1814 static int cx8802_dvb_remove(struct cx8802_driver *drv)
1816 struct cx88_core *core = drv->core;
1817 struct cx8802_dev *dev = drv->core->dvbdev;
1819 dprintk(1, "%s\n", __func__);
1821 vb2_dvb_unregister_bus(&dev->frontends);
1823 vp3054_i2c_remove(dev);
1825 core->gate_ctrl = NULL;
1827 return 0;
1830 static struct cx8802_driver cx8802_dvb_driver = {
1831 .type_id = CX88_MPEG_DVB,
1832 .hw_access = CX8802_DRVCTL_SHARED,
1833 .probe = cx8802_dvb_probe,
1834 .remove = cx8802_dvb_remove,
1835 .advise_acquire = cx8802_dvb_advise_acquire,
1836 .advise_release = cx8802_dvb_advise_release,
1839 static int __init dvb_init(void)
1841 pr_info("cx2388x dvb driver version %s loaded\n", CX88_VERSION);
1842 return cx8802_register_driver(&cx8802_dvb_driver);
1845 static void __exit dvb_fini(void)
1847 cx8802_unregister_driver(&cx8802_dvb_driver);
1850 module_init(dvb_init);
1851 module_exit(dvb_fini);