Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cx88-dvb.c
Go to the documentation of this file.
1 /*
2  *
3  * device driver for Conexant 2388x based TV cards
4  * MPEG Transport Stream (DVB) routines
5  *
6  * (c) 2004, 2005 Chris Pascoe <[email protected]>
7  * (c) 2004 Gerd Knorr <[email protected]> [SuSE Labs]
8  *
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.
13  *
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.
18  *
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.
22  */
23 
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>
31 
32 #include "cx88.h"
33 #include "dvb-pll.h"
34 #include <media/v4l2-common.h>
35 
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 "ds3000.h"
62 
63 MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
64 MODULE_AUTHOR("Chris Pascoe <[email protected]>");
65 MODULE_AUTHOR("Gerd Knorr <[email protected]> [SuSE Labs]");
66 MODULE_LICENSE("GPL");
68 
69 static unsigned int debug;
70 module_param(debug, int, 0644);
71 MODULE_PARM_DESC(debug,"enable debug messages [dvb]");
72 
73 static unsigned int dvb_buf_tscnt = 32;
74 module_param(dvb_buf_tscnt, int, 0644);
75 MODULE_PARM_DESC(dvb_buf_tscnt, "DVB Buffer TS count [dvb]");
76 
78 
79 #define dprintk(level,fmt, arg...) if (debug >= level) \
80  printk(KERN_DEBUG "%s/2-dvb: " fmt, core->name, ## arg)
81 
82 /* ------------------------------------------------------------------ */
83 
84 static int dvb_buf_setup(struct videobuf_queue *q,
85  unsigned int *count, unsigned int *size)
86 {
87  struct cx8802_dev *dev = q->priv_data;
88 
89  dev->ts_packet_size = 188 * 4;
90  dev->ts_packet_count = dvb_buf_tscnt;
91 
92  *size = dev->ts_packet_size * dev->ts_packet_count;
93  *count = dvb_buf_tscnt;
94  return 0;
95 }
96 
97 static int dvb_buf_prepare(struct videobuf_queue *q,
98  struct videobuf_buffer *vb, enum v4l2_field field)
99 {
100  struct cx8802_dev *dev = q->priv_data;
101  return cx8802_buf_prepare(q, dev, (struct cx88_buffer*)vb,field);
102 }
103 
104 static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
105 {
106  struct cx8802_dev *dev = q->priv_data;
107  cx8802_buf_queue(dev, (struct cx88_buffer*)vb);
108 }
109 
110 static void dvb_buf_release(struct videobuf_queue *q,
111  struct videobuf_buffer *vb)
112 {
113  cx88_free_buffer(q, (struct cx88_buffer*)vb);
114 }
115 
116 static const struct videobuf_queue_ops dvb_qops = {
117  .buf_setup = dvb_buf_setup,
118  .buf_prepare = dvb_buf_prepare,
119  .buf_queue = dvb_buf_queue,
120  .buf_release = dvb_buf_release,
121 };
122 
123 /* ------------------------------------------------------------------ */
124 
125 static int cx88_dvb_bus_ctrl(struct dvb_frontend* fe, int acquire)
126 {
127  struct cx8802_dev *dev= fe->dvb->priv;
128  struct cx8802_driver *drv = NULL;
129  int ret = 0;
130  int fe_id;
131 
132  fe_id = videobuf_dvb_find_frontend(&dev->frontends, fe);
133  if (!fe_id) {
134  printk(KERN_ERR "%s() No frontend found\n", __func__);
135  return -EINVAL;
136  }
137 
138  mutex_lock(&dev->core->lock);
139  drv = cx8802_get_driver(dev, CX88_MPEG_DVB);
140  if (drv) {
141  if (acquire){
142  dev->frontends.active_fe_id = fe_id;
143  ret = drv->request_acquire(drv);
144  } else {
145  ret = drv->request_release(drv);
146  dev->frontends.active_fe_id = 0;
147  }
148  }
149  mutex_unlock(&dev->core->lock);
150 
151  return ret;
152 }
153 
154 static void cx88_dvb_gate_ctrl(struct cx88_core *core, int open)
155 {
156  struct videobuf_dvb_frontends *f;
157  struct videobuf_dvb_frontend *fe;
158 
159  if (!core->dvbdev)
160  return;
161 
162  f = &core->dvbdev->frontends;
163 
164  if (!f)
165  return;
166 
167  if (f->gate <= 1) /* undefined or fe0 */
168  fe = videobuf_dvb_get_frontend(f, 1);
169  else
170  fe = videobuf_dvb_get_frontend(f, f->gate);
171 
172  if (fe && fe->dvb.frontend && fe->dvb.frontend->ops.i2c_gate_ctrl)
173  fe->dvb.frontend->ops.i2c_gate_ctrl(fe->dvb.frontend, open);
174 }
175 
176 /* ------------------------------------------------------------------ */
177 
178 static int dvico_fusionhdtv_demod_init(struct dvb_frontend* fe)
179 {
180  static const u8 clock_config [] = { CLOCK_CTL, 0x38, 0x39 };
181  static const u8 reset [] = { RESET, 0x80 };
182  static const u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
183  static const u8 agc_cfg [] = { AGC_TARGET, 0x24, 0x20 };
184  static const u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
185  static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
186 
187  mt352_write(fe, clock_config, sizeof(clock_config));
188  udelay(200);
189  mt352_write(fe, reset, sizeof(reset));
190  mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
191 
192  mt352_write(fe, agc_cfg, sizeof(agc_cfg));
193  mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
194  mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
195  return 0;
196 }
197 
198 static int dvico_dual_demod_init(struct dvb_frontend *fe)
199 {
200  static const u8 clock_config [] = { CLOCK_CTL, 0x38, 0x38 };
201  static const u8 reset [] = { RESET, 0x80 };
202  static const u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
203  static const u8 agc_cfg [] = { AGC_TARGET, 0x28, 0x20 };
204  static const u8 gpp_ctl_cfg [] = { GPP_CTL, 0x33 };
205  static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
206 
207  mt352_write(fe, clock_config, sizeof(clock_config));
208  udelay(200);
209  mt352_write(fe, reset, sizeof(reset));
210  mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
211 
212  mt352_write(fe, agc_cfg, sizeof(agc_cfg));
213  mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
214  mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
215 
216  return 0;
217 }
218 
219 static int dntv_live_dvbt_demod_init(struct dvb_frontend* fe)
220 {
221  static const u8 clock_config [] = { 0x89, 0x38, 0x39 };
222  static const u8 reset [] = { 0x50, 0x80 };
223  static const u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 };
224  static const u8 agc_cfg [] = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF,
225  0x00, 0xFF, 0x00, 0x40, 0x40 };
226  static const u8 dntv_extra[] = { 0xB5, 0x7A };
227  static const u8 capt_range_cfg[] = { 0x75, 0x32 };
228 
229  mt352_write(fe, clock_config, sizeof(clock_config));
230  udelay(2000);
231  mt352_write(fe, reset, sizeof(reset));
232  mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
233 
234  mt352_write(fe, agc_cfg, sizeof(agc_cfg));
235  udelay(2000);
236  mt352_write(fe, dntv_extra, sizeof(dntv_extra));
237  mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
238 
239  return 0;
240 }
241 
242 static const struct mt352_config dvico_fusionhdtv = {
243  .demod_address = 0x0f,
244  .demod_init = dvico_fusionhdtv_demod_init,
245 };
246 
247 static const struct mt352_config dntv_live_dvbt_config = {
248  .demod_address = 0x0f,
249  .demod_init = dntv_live_dvbt_demod_init,
250 };
251 
252 static const struct mt352_config dvico_fusionhdtv_dual = {
253  .demod_address = 0x0f,
254  .demod_init = dvico_dual_demod_init,
255 };
256 
257 static const struct zl10353_config cx88_terratec_cinergy_ht_pci_mkii_config = {
258  .demod_address = (0x1e >> 1),
259  .no_tuner = 1,
260  .if2 = 45600,
261 };
262 
263 static struct mb86a16_config twinhan_vp1027 = {
264  .demod_address = 0x08,
265 };
266 
267 #if defined(CONFIG_VIDEO_CX88_VP3054) || (defined(CONFIG_VIDEO_CX88_VP3054_MODULE) && defined(MODULE))
268 static int dntv_live_dvbt_pro_demod_init(struct dvb_frontend* fe)
269 {
270  static const u8 clock_config [] = { 0x89, 0x38, 0x38 };
271  static const u8 reset [] = { 0x50, 0x80 };
272  static const u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 };
273  static const u8 agc_cfg [] = { 0x67, 0x10, 0x20, 0x00, 0xFF, 0xFF,
274  0x00, 0xFF, 0x00, 0x40, 0x40 };
275  static const u8 dntv_extra[] = { 0xB5, 0x7A };
276  static const u8 capt_range_cfg[] = { 0x75, 0x32 };
277 
278  mt352_write(fe, clock_config, sizeof(clock_config));
279  udelay(2000);
280  mt352_write(fe, reset, sizeof(reset));
281  mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
282 
283  mt352_write(fe, agc_cfg, sizeof(agc_cfg));
284  udelay(2000);
285  mt352_write(fe, dntv_extra, sizeof(dntv_extra));
286  mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
287 
288  return 0;
289 }
290 
291 static const struct mt352_config dntv_live_dvbt_pro_config = {
292  .demod_address = 0x0f,
293  .no_tuner = 1,
294  .demod_init = dntv_live_dvbt_pro_demod_init,
295 };
296 #endif
297 
298 static const struct zl10353_config dvico_fusionhdtv_hybrid = {
299  .demod_address = 0x0f,
300  .no_tuner = 1,
301 };
302 
303 static const struct zl10353_config dvico_fusionhdtv_xc3028 = {
304  .demod_address = 0x0f,
305  .if2 = 45600,
306  .no_tuner = 1,
307 };
308 
309 static const struct mt352_config dvico_fusionhdtv_mt352_xc3028 = {
310  .demod_address = 0x0f,
311  .if2 = 4560,
312  .no_tuner = 1,
313  .demod_init = dvico_fusionhdtv_demod_init,
314 };
315 
316 static const struct zl10353_config dvico_fusionhdtv_plus_v1_1 = {
317  .demod_address = 0x0f,
318 };
319 
320 static const struct cx22702_config connexant_refboard_config = {
321  .demod_address = 0x43,
322  .output_mode = CX22702_SERIAL_OUTPUT,
323 };
324 
325 static const struct cx22702_config hauppauge_hvr_config = {
326  .demod_address = 0x63,
327  .output_mode = CX22702_SERIAL_OUTPUT,
328 };
329 
330 static int or51132_set_ts_param(struct dvb_frontend* fe, int is_punctured)
331 {
332  struct cx8802_dev *dev= fe->dvb->priv;
333  dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
334  return 0;
335 }
336 
337 static const struct or51132_config pchdtv_hd3000 = {
338  .demod_address = 0x15,
339  .set_ts_params = or51132_set_ts_param,
340 };
341 
342 static int lgdt330x_pll_rf_set(struct dvb_frontend* fe, int index)
343 {
344  struct cx8802_dev *dev= fe->dvb->priv;
345  struct cx88_core *core = dev->core;
346 
347  dprintk(1, "%s: index = %d\n", __func__, index);
348  if (index == 0)
349  cx_clear(MO_GP0_IO, 8);
350  else
351  cx_set(MO_GP0_IO, 8);
352  return 0;
353 }
354 
355 static int lgdt330x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
356 {
357  struct cx8802_dev *dev= fe->dvb->priv;
358  if (is_punctured)
359  dev->ts_gen_cntrl |= 0x04;
360  else
361  dev->ts_gen_cntrl &= ~0x04;
362  return 0;
363 }
364 
365 static struct lgdt330x_config fusionhdtv_3_gold = {
366  .demod_address = 0x0e,
367  .demod_chip = LGDT3302,
368  .serial_mpeg = 0x04, /* TPSERIAL for 3302 in TOP_CONTROL */
369  .set_ts_params = lgdt330x_set_ts_param,
370 };
371 
372 static const struct lgdt330x_config fusionhdtv_5_gold = {
373  .demod_address = 0x0e,
374  .demod_chip = LGDT3303,
375  .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
376  .set_ts_params = lgdt330x_set_ts_param,
377 };
378 
379 static const struct lgdt330x_config pchdtv_hd5500 = {
380  .demod_address = 0x59,
381  .demod_chip = LGDT3303,
382  .serial_mpeg = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
383  .set_ts_params = lgdt330x_set_ts_param,
384 };
385 
386 static int nxt200x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
387 {
388  struct cx8802_dev *dev= fe->dvb->priv;
389  dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
390  return 0;
391 }
392 
393 static const struct nxt200x_config ati_hdtvwonder = {
394  .demod_address = 0x0a,
395  .set_ts_params = nxt200x_set_ts_param,
396 };
397 
398 static int cx24123_set_ts_param(struct dvb_frontend* fe,
399  int is_punctured)
400 {
401  struct cx8802_dev *dev= fe->dvb->priv;
402  dev->ts_gen_cntrl = 0x02;
403  return 0;
404 }
405 
406 static int kworld_dvbs_100_set_voltage(struct dvb_frontend* fe,
407  fe_sec_voltage_t voltage)
408 {
409  struct cx8802_dev *dev= fe->dvb->priv;
410  struct cx88_core *core = dev->core;
411 
412  if (voltage == SEC_VOLTAGE_OFF)
413  cx_write(MO_GP0_IO, 0x000006fb);
414  else
415  cx_write(MO_GP0_IO, 0x000006f9);
416 
417  if (core->prev_set_voltage)
418  return core->prev_set_voltage(fe, voltage);
419  return 0;
420 }
421 
422 static int geniatech_dvbs_set_voltage(struct dvb_frontend *fe,
423  fe_sec_voltage_t voltage)
424 {
425  struct cx8802_dev *dev= fe->dvb->priv;
426  struct cx88_core *core = dev->core;
427 
428  if (voltage == SEC_VOLTAGE_OFF) {
429  dprintk(1,"LNB Voltage OFF\n");
430  cx_write(MO_GP0_IO, 0x0000efff);
431  }
432 
433  if (core->prev_set_voltage)
434  return core->prev_set_voltage(fe, voltage);
435  return 0;
436 }
437 
438 static int tevii_dvbs_set_voltage(struct dvb_frontend *fe,
439  fe_sec_voltage_t voltage)
440 {
441  struct cx8802_dev *dev= fe->dvb->priv;
442  struct cx88_core *core = dev->core;
443 
444  cx_set(MO_GP0_IO, 0x6040);
445  switch (voltage) {
446  case SEC_VOLTAGE_13:
447  cx_clear(MO_GP0_IO, 0x20);
448  break;
449  case SEC_VOLTAGE_18:
450  cx_set(MO_GP0_IO, 0x20);
451  break;
452  case SEC_VOLTAGE_OFF:
453  cx_clear(MO_GP0_IO, 0x20);
454  break;
455  }
456 
457  if (core->prev_set_voltage)
458  return core->prev_set_voltage(fe, voltage);
459  return 0;
460 }
461 
462 static int vp1027_set_voltage(struct dvb_frontend *fe,
463  fe_sec_voltage_t voltage)
464 {
465  struct cx8802_dev *dev = fe->dvb->priv;
466  struct cx88_core *core = dev->core;
467 
468  switch (voltage) {
469  case SEC_VOLTAGE_13:
470  dprintk(1, "LNB SEC Voltage=13\n");
471  cx_write(MO_GP0_IO, 0x00001220);
472  break;
473  case SEC_VOLTAGE_18:
474  dprintk(1, "LNB SEC Voltage=18\n");
475  cx_write(MO_GP0_IO, 0x00001222);
476  break;
477  case SEC_VOLTAGE_OFF:
478  dprintk(1, "LNB Voltage OFF\n");
479  cx_write(MO_GP0_IO, 0x00001230);
480  break;
481  }
482 
483  if (core->prev_set_voltage)
484  return core->prev_set_voltage(fe, voltage);
485  return 0;
486 }
487 
488 static const struct cx24123_config geniatech_dvbs_config = {
489  .demod_address = 0x55,
490  .set_ts_params = cx24123_set_ts_param,
491 };
492 
493 static const struct cx24123_config hauppauge_novas_config = {
494  .demod_address = 0x55,
495  .set_ts_params = cx24123_set_ts_param,
496 };
497 
498 static const struct cx24123_config kworld_dvbs_100_config = {
499  .demod_address = 0x15,
500  .set_ts_params = cx24123_set_ts_param,
501  .lnb_polarity = 1,
502 };
503 
504 static const struct s5h1409_config pinnacle_pctv_hd_800i_config = {
505  .demod_address = 0x32 >> 1,
506  .output_mode = S5H1409_PARALLEL_OUTPUT,
507  .gpio = S5H1409_GPIO_ON,
508  .qam_if = 44000,
509  .inversion = S5H1409_INVERSION_OFF,
510  .status_mode = S5H1409_DEMODLOCKING,
512 };
513 
514 static const struct s5h1409_config dvico_hdtv5_pci_nano_config = {
515  .demod_address = 0x32 >> 1,
516  .output_mode = S5H1409_SERIAL_OUTPUT,
517  .gpio = S5H1409_GPIO_OFF,
518  .inversion = S5H1409_INVERSION_OFF,
519  .status_mode = S5H1409_DEMODLOCKING,
521 };
522 
523 static const struct s5h1409_config kworld_atsc_120_config = {
524  .demod_address = 0x32 >> 1,
525  .output_mode = S5H1409_SERIAL_OUTPUT,
526  .gpio = S5H1409_GPIO_OFF,
527  .inversion = S5H1409_INVERSION_OFF,
528  .status_mode = S5H1409_DEMODLOCKING,
530 };
531 
532 static const struct xc5000_config pinnacle_pctv_hd_800i_tuner_config = {
533  .i2c_address = 0x64,
534  .if_khz = 5380,
535 };
536 
537 static const struct zl10353_config cx88_pinnacle_hybrid_pctv = {
538  .demod_address = (0x1e >> 1),
539  .no_tuner = 1,
540  .if2 = 45600,
541 };
542 
543 static const struct zl10353_config cx88_geniatech_x8000_mt = {
544  .demod_address = (0x1e >> 1),
545  .no_tuner = 1,
547 };
548 
549 static const struct s5h1411_config dvico_fusionhdtv7_config = {
550  .output_mode = S5H1411_SERIAL_OUTPUT,
551  .gpio = S5H1411_GPIO_ON,
553  .qam_if = S5H1411_IF_44000,
554  .vsb_if = S5H1411_IF_44000,
555  .inversion = S5H1411_INVERSION_OFF,
556  .status_mode = S5H1411_DEMODLOCKING
557 };
558 
559 static const struct xc5000_config dvico_fusionhdtv7_tuner_config = {
560  .i2c_address = 0xc2 >> 1,
561  .if_khz = 5380,
562 };
563 
564 static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
565 {
566  struct dvb_frontend *fe;
567  struct videobuf_dvb_frontend *fe0 = NULL;
568  struct xc2028_ctrl ctl;
569  struct xc2028_config cfg = {
570  .i2c_adap = &dev->core->i2c_adap,
571  .i2c_addr = addr,
572  .ctrl = &ctl,
573  };
574 
575  /* Get the first frontend */
576  fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
577  if (!fe0)
578  return -EINVAL;
579 
580  if (!fe0->dvb.frontend) {
581  printk(KERN_ERR "%s/2: dvb frontend not attached. "
582  "Can't attach xc3028\n",
583  dev->core->name);
584  return -EINVAL;
585  }
586 
587  /*
588  * Some xc3028 devices may be hidden by an I2C gate. This is known
589  * to happen with some s5h1409-based devices.
590  * Now that I2C gate is open, sets up xc3028 configuration
591  */
592  cx88_setup_xc3028(dev->core, &ctl);
593 
594  fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
595  if (!fe) {
596  printk(KERN_ERR "%s/2: xc3028 attach failed\n",
597  dev->core->name);
598  dvb_frontend_detach(fe0->dvb.frontend);
599  dvb_unregister_frontend(fe0->dvb.frontend);
600  fe0->dvb.frontend = NULL;
601  return -EINVAL;
602  }
603 
604  printk(KERN_INFO "%s/2: xc3028 attached\n",
605  dev->core->name);
606 
607  return 0;
608 }
609 
610 static int attach_xc4000(struct cx8802_dev *dev, struct xc4000_config *cfg)
611 {
612  struct dvb_frontend *fe;
613  struct videobuf_dvb_frontend *fe0 = NULL;
614 
615  /* Get the first frontend */
616  fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
617  if (!fe0)
618  return -EINVAL;
619 
620  if (!fe0->dvb.frontend) {
621  printk(KERN_ERR "%s/2: dvb frontend not attached. "
622  "Can't attach xc4000\n",
623  dev->core->name);
624  return -EINVAL;
625  }
626 
627  fe = dvb_attach(xc4000_attach, fe0->dvb.frontend, &dev->core->i2c_adap,
628  cfg);
629  if (!fe) {
630  printk(KERN_ERR "%s/2: xc4000 attach failed\n",
631  dev->core->name);
632  dvb_frontend_detach(fe0->dvb.frontend);
633  dvb_unregister_frontend(fe0->dvb.frontend);
634  fe0->dvb.frontend = NULL;
635  return -EINVAL;
636  }
637 
638  printk(KERN_INFO "%s/2: xc4000 attached\n", dev->core->name);
639 
640  return 0;
641 }
642 
643 static int cx24116_set_ts_param(struct dvb_frontend *fe,
644  int is_punctured)
645 {
646  struct cx8802_dev *dev = fe->dvb->priv;
647  dev->ts_gen_cntrl = 0x2;
648 
649  return 0;
650 }
651 
652 static int stv0900_set_ts_param(struct dvb_frontend *fe,
653  int is_punctured)
654 {
655  struct cx8802_dev *dev = fe->dvb->priv;
656  dev->ts_gen_cntrl = 0;
657 
658  return 0;
659 }
660 
661 static int cx24116_reset_device(struct dvb_frontend *fe)
662 {
663  struct cx8802_dev *dev = fe->dvb->priv;
664  struct cx88_core *core = dev->core;
665 
666  /* Reset the part */
667  /* Put the cx24116 into reset */
668  cx_write(MO_SRST_IO, 0);
669  msleep(10);
670  /* Take the cx24116 out of reset */
671  cx_write(MO_SRST_IO, 1);
672  msleep(10);
673 
674  return 0;
675 }
676 
677 static const struct cx24116_config hauppauge_hvr4000_config = {
678  .demod_address = 0x05,
679  .set_ts_params = cx24116_set_ts_param,
680  .reset_device = cx24116_reset_device,
681 };
682 
683 static const struct cx24116_config tevii_s460_config = {
684  .demod_address = 0x55,
685  .set_ts_params = cx24116_set_ts_param,
686  .reset_device = cx24116_reset_device,
687 };
688 
689 static int ds3000_set_ts_param(struct dvb_frontend *fe,
690  int is_punctured)
691 {
692  struct cx8802_dev *dev = fe->dvb->priv;
693  dev->ts_gen_cntrl = 4;
694 
695  return 0;
696 }
697 
698 static struct ds3000_config tevii_ds3000_config = {
699  .demod_address = 0x68,
700  .set_ts_params = ds3000_set_ts_param,
701 };
702 
703 static const struct stv0900_config prof_7301_stv0900_config = {
704  .demod_address = 0x6a,
705 /* demod_mode = 0,*/
706  .xtal = 27000000,
707  .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
708  .diseqc_mode = 2,/* 2/3 PWM */
709  .tun1_maddress = 0,/* 0x60 */
710  .tun1_adc = 0,/* 2 Vpp */
711  .path1_mode = 3,
712  .set_ts_params = stv0900_set_ts_param,
713 };
714 
715 static const struct stb6100_config prof_7301_stb6100_config = {
716  .tuner_address = 0x60,
717  .refclock = 27000000,
718 };
719 
720 static const struct stv0299_config tevii_tuner_sharp_config = {
721  .demod_address = 0x68,
722  .inittab = sharp_z0194a_inittab,
723  .mclk = 88000000UL,
724  .invert = 1,
725  .skip_reinit = 0,
726  .lock_output = 1,
727  .volt13_op0_op1 = STV0299_VOLT13_OP1,
728  .min_delay_ms = 100,
729  .set_symbol_rate = sharp_z0194a_set_symbol_rate,
730  .set_ts_params = cx24116_set_ts_param,
731 };
732 
733 static const struct stv0288_config tevii_tuner_earda_config = {
734  .demod_address = 0x68,
735  .min_delay_ms = 100,
736  .set_ts_params = cx24116_set_ts_param,
737 };
738 
739 static int cx8802_alloc_frontends(struct cx8802_dev *dev)
740 {
741  struct cx88_core *core = dev->core;
742  struct videobuf_dvb_frontend *fe = NULL;
743  int i;
744 
745  mutex_init(&dev->frontends.lock);
746  INIT_LIST_HEAD(&dev->frontends.felist);
747 
748  if (!core->board.num_frontends)
749  return -ENODEV;
750 
751  printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
752  core->board.num_frontends);
753  for (i = 1; i <= core->board.num_frontends; i++) {
754  fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
755  if (!fe) {
756  printk(KERN_ERR "%s() failed to alloc\n", __func__);
757  videobuf_dvb_dealloc_frontends(&dev->frontends);
758  return -ENOMEM;
759  }
760  }
761  return 0;
762 }
763 
764 
765 
766 static const u8 samsung_smt_7020_inittab[] = {
767  0x01, 0x15,
768  0x02, 0x00,
769  0x03, 0x00,
770  0x04, 0x7D,
771  0x05, 0x0F,
772  0x06, 0x02,
773  0x07, 0x00,
774  0x08, 0x60,
775 
776  0x0A, 0xC2,
777  0x0B, 0x00,
778  0x0C, 0x01,
779  0x0D, 0x81,
780  0x0E, 0x44,
781  0x0F, 0x09,
782  0x10, 0x3C,
783  0x11, 0x84,
784  0x12, 0xDA,
785  0x13, 0x99,
786  0x14, 0x8D,
787  0x15, 0xCE,
788  0x16, 0xE8,
789  0x17, 0x43,
790  0x18, 0x1C,
791  0x19, 0x1B,
792  0x1A, 0x1D,
793 
794  0x1C, 0x12,
795  0x1D, 0x00,
796  0x1E, 0x00,
797  0x1F, 0x00,
798  0x20, 0x00,
799  0x21, 0x00,
800  0x22, 0x00,
801  0x23, 0x00,
802 
803  0x28, 0x02,
804  0x29, 0x28,
805  0x2A, 0x14,
806  0x2B, 0x0F,
807  0x2C, 0x09,
808  0x2D, 0x05,
809 
810  0x31, 0x1F,
811  0x32, 0x19,
812  0x33, 0xFC,
813  0x34, 0x13,
814  0xff, 0xff,
815 };
816 
817 
818 static int samsung_smt_7020_tuner_set_params(struct dvb_frontend *fe)
819 {
821  struct cx8802_dev *dev = fe->dvb->priv;
822  u8 buf[4];
823  u32 div;
824  struct i2c_msg msg = {
825  .addr = 0x61,
826  .flags = 0,
827  .buf = buf,
828  .len = sizeof(buf) };
829 
830  div = c->frequency / 125;
831 
832  buf[0] = (div >> 8) & 0x7f;
833  buf[1] = div & 0xff;
834  buf[2] = 0x84; /* 0xC4 */
835  buf[3] = 0x00;
836 
837  if (c->frequency < 1500000)
838  buf[3] |= 0x10;
839 
840  if (fe->ops.i2c_gate_ctrl)
841  fe->ops.i2c_gate_ctrl(fe, 1);
842 
843  if (i2c_transfer(&dev->core->i2c_adap, &msg, 1) != 1)
844  return -EIO;
845 
846  return 0;
847 }
848 
849 static int samsung_smt_7020_set_tone(struct dvb_frontend *fe,
850  fe_sec_tone_mode_t tone)
851 {
852  struct cx8802_dev *dev = fe->dvb->priv;
853  struct cx88_core *core = dev->core;
854 
855  cx_set(MO_GP0_IO, 0x0800);
856 
857  switch (tone) {
858  case SEC_TONE_ON:
859  cx_set(MO_GP0_IO, 0x08);
860  break;
861  case SEC_TONE_OFF:
862  cx_clear(MO_GP0_IO, 0x08);
863  break;
864  default:
865  return -EINVAL;
866  }
867 
868  return 0;
869 }
870 
871 static int samsung_smt_7020_set_voltage(struct dvb_frontend *fe,
872  fe_sec_voltage_t voltage)
873 {
874  struct cx8802_dev *dev = fe->dvb->priv;
875  struct cx88_core *core = dev->core;
876 
877  u8 data;
878  struct i2c_msg msg = {
879  .addr = 8,
880  .flags = 0,
881  .buf = &data,
882  .len = sizeof(data) };
883 
884  cx_set(MO_GP0_IO, 0x8000);
885 
886  switch (voltage) {
887  case SEC_VOLTAGE_OFF:
888  break;
889  case SEC_VOLTAGE_13:
890  data = ISL6421_EN1 | ISL6421_LLC1;
891  cx_clear(MO_GP0_IO, 0x80);
892  break;
893  case SEC_VOLTAGE_18:
895  cx_clear(MO_GP0_IO, 0x80);
896  break;
897  default:
898  return -EINVAL;
899  }
900 
901  return (i2c_transfer(&dev->core->i2c_adap, &msg, 1) == 1) ? 0 : -EIO;
902 }
903 
904 static int samsung_smt_7020_stv0299_set_symbol_rate(struct dvb_frontend *fe,
905  u32 srate, u32 ratio)
906 {
907  u8 aclk = 0;
908  u8 bclk = 0;
909 
910  if (srate < 1500000) {
911  aclk = 0xb7;
912  bclk = 0x47;
913  } else if (srate < 3000000) {
914  aclk = 0xb7;
915  bclk = 0x4b;
916  } else if (srate < 7000000) {
917  aclk = 0xb7;
918  bclk = 0x4f;
919  } else if (srate < 14000000) {
920  aclk = 0xb7;
921  bclk = 0x53;
922  } else if (srate < 30000000) {
923  aclk = 0xb6;
924  bclk = 0x53;
925  } else if (srate < 45000000) {
926  aclk = 0xb4;
927  bclk = 0x51;
928  }
929 
930  stv0299_writereg(fe, 0x13, aclk);
931  stv0299_writereg(fe, 0x14, bclk);
932  stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
933  stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
934  stv0299_writereg(fe, 0x21, ratio & 0xf0);
935 
936  return 0;
937 }
938 
939 
940 static const struct stv0299_config samsung_stv0299_config = {
941  .demod_address = 0x68,
942  .inittab = samsung_smt_7020_inittab,
943  .mclk = 88000000UL,
944  .invert = 0,
945  .skip_reinit = 0,
946  .lock_output = STV0299_LOCKOUTPUT_LK,
947  .volt13_op0_op1 = STV0299_VOLT13_OP1,
948  .min_delay_ms = 100,
949  .set_symbol_rate = samsung_smt_7020_stv0299_set_symbol_rate,
950 };
951 
952 static int dvb_register(struct cx8802_dev *dev)
953 {
954  struct cx88_core *core = dev->core;
955  struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
956  int mfe_shared = 0; /* bus not shared by default */
957  int res = -EINVAL;
958 
959  if (0 != core->i2c_rc) {
960  printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
961  goto frontend_detach;
962  }
963 
964  /* Get the first frontend */
965  fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
966  if (!fe0)
967  goto frontend_detach;
968 
969  /* multi-frontend gate control is undefined or defaults to fe0 */
970  dev->frontends.gate = 0;
971 
972  /* Sets the gate control callback to be used by i2c command calls */
973  core->gate_ctrl = cx88_dvb_gate_ctrl;
974 
975  /* init frontend(s) */
976  switch (core->boardnr) {
978  fe0->dvb.frontend = dvb_attach(cx22702_attach,
979  &connexant_refboard_config,
980  &core->i2c_adap);
981  if (fe0->dvb.frontend != NULL) {
982  if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
983  0x61, &core->i2c_adap,
985  goto frontend_detach;
986  }
987  break;
992  fe0->dvb.frontend = dvb_attach(cx22702_attach,
993  &connexant_refboard_config,
994  &core->i2c_adap);
995  if (fe0->dvb.frontend != NULL) {
996  if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
997  0x60, &core->i2c_adap,
999  goto frontend_detach;
1000  }
1001  break;
1006  fe0->dvb.frontend = dvb_attach(cx22702_attach,
1007  &hauppauge_hvr_config,
1008  &core->i2c_adap);
1009  if (fe0->dvb.frontend != NULL) {
1010  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1011  &core->i2c_adap, 0x61,
1012  TUNER_PHILIPS_FMD1216ME_MK3))
1013  goto frontend_detach;
1014  }
1015  break;
1017  fe0->dvb.frontend = dvb_attach(cx22702_attach,
1018  &hauppauge_hvr_config,
1019  &core->i2c_adap);
1020  if (fe0->dvb.frontend != NULL) {
1021  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1022  &core->i2c_adap, 0x61,
1023  TUNER_PHILIPS_FMD1216MEX_MK3))
1024  goto frontend_detach;
1025  }
1026  break;
1028  /* MFE frontend 1 */
1029  mfe_shared = 1;
1030  dev->frontends.gate = 2;
1031  /* DVB-S init */
1032  fe0->dvb.frontend = dvb_attach(cx24123_attach,
1033  &hauppauge_novas_config,
1034  &dev->core->i2c_adap);
1035  if (fe0->dvb.frontend) {
1037  fe0->dvb.frontend,
1038  &dev->core->i2c_adap,
1039  0x08, ISL6421_DCL, 0x00))
1040  goto frontend_detach;
1041  }
1042  /* MFE frontend 2 */
1043  fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
1044  if (!fe1)
1045  goto frontend_detach;
1046  /* DVB-T init */
1047  fe1->dvb.frontend = dvb_attach(cx22702_attach,
1048  &hauppauge_hvr_config,
1049  &dev->core->i2c_adap);
1050  if (fe1->dvb.frontend) {
1051  fe1->dvb.frontend->id = 1;
1053  fe1->dvb.frontend,
1054  &dev->core->i2c_adap,
1055  0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1056  goto frontend_detach;
1057  }
1058  break;
1060  fe0->dvb.frontend = dvb_attach(mt352_attach,
1061  &dvico_fusionhdtv,
1062  &core->i2c_adap);
1063  if (fe0->dvb.frontend != NULL) {
1064  if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1065  0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1066  goto frontend_detach;
1067  break;
1068  }
1069  /* ZL10353 replaces MT352 on later cards */
1070  fe0->dvb.frontend = dvb_attach(zl10353_attach,
1071  &dvico_fusionhdtv_plus_v1_1,
1072  &core->i2c_adap);
1073  if (fe0->dvb.frontend != NULL) {
1074  if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1075  0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1076  goto frontend_detach;
1077  }
1078  break;
1080  /* The tin box says DEE1601, but it seems to be DTT7579
1081  * compatible, with a slightly different MT352 AGC gain. */
1082  fe0->dvb.frontend = dvb_attach(mt352_attach,
1083  &dvico_fusionhdtv_dual,
1084  &core->i2c_adap);
1085  if (fe0->dvb.frontend != NULL) {
1086  if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1087  0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1088  goto frontend_detach;
1089  break;
1090  }
1091  /* ZL10353 replaces MT352 on later cards */
1092  fe0->dvb.frontend = dvb_attach(zl10353_attach,
1093  &dvico_fusionhdtv_plus_v1_1,
1094  &core->i2c_adap);
1095  if (fe0->dvb.frontend != NULL) {
1096  if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1097  0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1098  goto frontend_detach;
1099  }
1100  break;
1102  fe0->dvb.frontend = dvb_attach(mt352_attach,
1103  &dvico_fusionhdtv,
1104  &core->i2c_adap);
1105  if (fe0->dvb.frontend != NULL) {
1106  if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1107  0x61, NULL, DVB_PLL_LG_Z201))
1108  goto frontend_detach;
1109  }
1110  break;
1114  fe0->dvb.frontend = dvb_attach(mt352_attach,
1115  &dntv_live_dvbt_config,
1116  &core->i2c_adap);
1117  if (fe0->dvb.frontend != NULL) {
1118  if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1119  0x61, NULL, DVB_PLL_UNKNOWN_1))
1120  goto frontend_detach;
1121  }
1122  break;
1124 #if defined(CONFIG_VIDEO_CX88_VP3054) || (defined(CONFIG_VIDEO_CX88_VP3054_MODULE) && defined(MODULE))
1125  /* MT352 is on a secondary I2C bus made from some GPIO lines */
1126  fe0->dvb.frontend = dvb_attach(mt352_attach, &dntv_live_dvbt_pro_config,
1127  &dev->vp3054->adap);
1128  if (fe0->dvb.frontend != NULL) {
1129  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1130  &core->i2c_adap, 0x61,
1131  TUNER_PHILIPS_FMD1216ME_MK3))
1132  goto frontend_detach;
1133  }
1134 #else
1135  printk(KERN_ERR "%s/2: built without vp3054 support\n",
1136  core->name);
1137 #endif
1138  break;
1140  fe0->dvb.frontend = dvb_attach(zl10353_attach,
1141  &dvico_fusionhdtv_hybrid,
1142  &core->i2c_adap);
1143  if (fe0->dvb.frontend != NULL) {
1144  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1145  &core->i2c_adap, 0x61,
1146  TUNER_THOMSON_FE6600))
1147  goto frontend_detach;
1148  }
1149  break;
1151  fe0->dvb.frontend = dvb_attach(zl10353_attach,
1152  &dvico_fusionhdtv_xc3028,
1153  &core->i2c_adap);
1154  if (fe0->dvb.frontend == NULL)
1155  fe0->dvb.frontend = dvb_attach(mt352_attach,
1156  &dvico_fusionhdtv_mt352_xc3028,
1157  &core->i2c_adap);
1158  /*
1159  * On this board, the demod provides the I2C bus pullup.
1160  * We must not permit gate_ctrl to be performed, or
1161  * the xc3028 cannot communicate on the bus.
1162  */
1163  if (fe0->dvb.frontend)
1164  fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1165  if (attach_xc3028(0x61, dev) < 0)
1166  goto frontend_detach;
1167  break;
1169  fe0->dvb.frontend = dvb_attach(or51132_attach, &pchdtv_hd3000,
1170  &core->i2c_adap);
1171  if (fe0->dvb.frontend != NULL) {
1172  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1173  &core->i2c_adap, 0x61,
1174  TUNER_THOMSON_DTT761X))
1175  goto frontend_detach;
1176  }
1177  break;
1179  dev->ts_gen_cntrl = 0x08;
1180 
1181  /* Do a hardware reset of chip before using it. */
1182  cx_clear(MO_GP0_IO, 1);
1183  mdelay(100);
1184  cx_set(MO_GP0_IO, 1);
1185  mdelay(200);
1186 
1187  /* Select RF connector callback */
1188  fusionhdtv_3_gold.pll_rf_set = lgdt330x_pll_rf_set;
1189  fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1190  &fusionhdtv_3_gold,
1191  &core->i2c_adap);
1192  if (fe0->dvb.frontend != NULL) {
1193  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1194  &core->i2c_adap, 0x61,
1195  TUNER_MICROTUNE_4042FI5))
1196  goto frontend_detach;
1197  }
1198  break;
1200  dev->ts_gen_cntrl = 0x08;
1201 
1202  /* Do a hardware reset of chip before using it. */
1203  cx_clear(MO_GP0_IO, 1);
1204  mdelay(100);
1205  cx_set(MO_GP0_IO, 9);
1206  mdelay(200);
1207  fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1208  &fusionhdtv_3_gold,
1209  &core->i2c_adap);
1210  if (fe0->dvb.frontend != NULL) {
1211  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1212  &core->i2c_adap, 0x61,
1213  TUNER_THOMSON_DTT761X))
1214  goto frontend_detach;
1215  }
1216  break;
1218  dev->ts_gen_cntrl = 0x08;
1219 
1220  /* Do a hardware reset of chip before using it. */
1221  cx_clear(MO_GP0_IO, 1);
1222  mdelay(100);
1223  cx_set(MO_GP0_IO, 1);
1224  mdelay(200);
1225  fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1226  &fusionhdtv_5_gold,
1227  &core->i2c_adap);
1228  if (fe0->dvb.frontend != NULL) {
1229  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1230  &core->i2c_adap, 0x61,
1231  TUNER_LG_TDVS_H06XF))
1232  goto frontend_detach;
1233  if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
1234  &core->i2c_adap, 0x43))
1235  goto frontend_detach;
1236  }
1237  break;
1239  dev->ts_gen_cntrl = 0x08;
1240 
1241  /* Do a hardware reset of chip before using it. */
1242  cx_clear(MO_GP0_IO, 1);
1243  mdelay(100);
1244  cx_set(MO_GP0_IO, 1);
1245  mdelay(200);
1246  fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1247  &pchdtv_hd5500,
1248  &core->i2c_adap);
1249  if (fe0->dvb.frontend != NULL) {
1250  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1251  &core->i2c_adap, 0x61,
1252  TUNER_LG_TDVS_H06XF))
1253  goto frontend_detach;
1254  if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
1255  &core->i2c_adap, 0x43))
1256  goto frontend_detach;
1257  }
1258  break;
1260  fe0->dvb.frontend = dvb_attach(nxt200x_attach,
1261  &ati_hdtvwonder,
1262  &core->i2c_adap);
1263  if (fe0->dvb.frontend != NULL) {
1264  if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1265  &core->i2c_adap, 0x61,
1266  TUNER_PHILIPS_TUV1236D))
1267  goto frontend_detach;
1268  }
1269  break;
1272  fe0->dvb.frontend = dvb_attach(cx24123_attach,
1273  &hauppauge_novas_config,
1274  &core->i2c_adap);
1275  if (fe0->dvb.frontend) {
1276  if (!dvb_attach(isl6421_attach, fe0->dvb.frontend,
1277  &core->i2c_adap, 0x08, ISL6421_DCL, 0x00))
1278  goto frontend_detach;
1279  }
1280  break;
1282  fe0->dvb.frontend = dvb_attach(cx24123_attach,
1283  &kworld_dvbs_100_config,
1284  &core->i2c_adap);
1285  if (fe0->dvb.frontend) {
1286  core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1287  fe0->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage;
1288  }
1289  break;
1291  fe0->dvb.frontend = dvb_attach(cx24123_attach,
1292  &geniatech_dvbs_config,
1293  &core->i2c_adap);
1294  if (fe0->dvb.frontend) {
1295  core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1296  fe0->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage;
1297  }
1298  break;
1300  fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1301  &pinnacle_pctv_hd_800i_config,
1302  &core->i2c_adap);
1303  if (fe0->dvb.frontend != NULL) {
1304  if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
1305  &core->i2c_adap,
1306  &pinnacle_pctv_hd_800i_tuner_config))
1307  goto frontend_detach;
1308  }
1309  break;
1311  fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1312  &dvico_hdtv5_pci_nano_config,
1313  &core->i2c_adap);
1314  if (fe0->dvb.frontend != NULL) {
1315  struct dvb_frontend *fe;
1316  struct xc2028_config cfg = {
1317  .i2c_adap = &core->i2c_adap,
1318  .i2c_addr = 0x61,
1319  };
1320  static struct xc2028_ctrl ctl = {
1321  .fname = XC2028_DEFAULT_FIRMWARE,
1322  .max_len = 64,
1323  .scode_table = XC3028_FE_OREN538,
1324  };
1325 
1327  fe0->dvb.frontend, &cfg);
1328  if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
1329  fe->ops.tuner_ops.set_config(fe, &ctl);
1330  }
1331  break;
1334  fe0->dvb.frontend = dvb_attach(zl10353_attach,
1335  &cx88_pinnacle_hybrid_pctv,
1336  &core->i2c_adap);
1337  if (fe0->dvb.frontend) {
1338  fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1339  if (attach_xc3028(0x61, dev) < 0)
1340  goto frontend_detach;
1341  }
1342  break;
1345  fe0->dvb.frontend = dvb_attach(zl10353_attach,
1346  &cx88_pinnacle_hybrid_pctv,
1347  &core->i2c_adap);
1348  if (fe0->dvb.frontend) {
1349  struct xc4000_config cfg = {
1350  .i2c_address = 0x61,
1351  .default_pm = 0,
1352  .dvb_amplitude = 134,
1353  .set_smoothedcvbs = 1,
1354  .if_khz = 4560
1355  };
1356  fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1357  if (attach_xc4000(dev, &cfg) < 0)
1358  goto frontend_detach;
1359  }
1360  break;
1362  dev->ts_gen_cntrl = 0x00;
1363 
1364  fe0->dvb.frontend = dvb_attach(zl10353_attach,
1365  &cx88_geniatech_x8000_mt,
1366  &core->i2c_adap);
1367  if (attach_xc3028(0x61, dev) < 0)
1368  goto frontend_detach;
1369  break;
1371  fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1372  &kworld_atsc_120_config,
1373  &core->i2c_adap);
1374  if (attach_xc3028(0x61, dev) < 0)
1375  goto frontend_detach;
1376  break;
1378  fe0->dvb.frontend = dvb_attach(s5h1411_attach,
1379  &dvico_fusionhdtv7_config,
1380  &core->i2c_adap);
1381  if (fe0->dvb.frontend != NULL) {
1382  if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
1383  &core->i2c_adap,
1384  &dvico_fusionhdtv7_tuner_config))
1385  goto frontend_detach;
1386  }
1387  break;
1389  /* MFE frontend 1 */
1390  mfe_shared = 1;
1391  dev->frontends.gate = 2;
1392  /* DVB-S/S2 Init */
1393  fe0->dvb.frontend = dvb_attach(cx24116_attach,
1394  &hauppauge_hvr4000_config,
1395  &dev->core->i2c_adap);
1396  if (fe0->dvb.frontend) {
1398  fe0->dvb.frontend,
1399  &dev->core->i2c_adap,
1400  0x08, ISL6421_DCL, 0x00))
1401  goto frontend_detach;
1402  }
1403  /* MFE frontend 2 */
1404  fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
1405  if (!fe1)
1406  goto frontend_detach;
1407  /* DVB-T Init */
1408  fe1->dvb.frontend = dvb_attach(cx22702_attach,
1409  &hauppauge_hvr_config,
1410  &dev->core->i2c_adap);
1411  if (fe1->dvb.frontend) {
1412  fe1->dvb.frontend->id = 1;
1414  fe1->dvb.frontend,
1415  &dev->core->i2c_adap,
1416  0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1417  goto frontend_detach;
1418  }
1419  break;
1421  fe0->dvb.frontend = dvb_attach(cx24116_attach,
1422  &hauppauge_hvr4000_config,
1423  &dev->core->i2c_adap);
1424  if (fe0->dvb.frontend) {
1426  fe0->dvb.frontend,
1427  &dev->core->i2c_adap,
1428  0x08, ISL6421_DCL, 0x00))
1429  goto frontend_detach;
1430  }
1431  break;
1432  case CX88_BOARD_PROF_6200:
1433  case CX88_BOARD_TBS_8910:
1434  case CX88_BOARD_TEVII_S420:
1435  fe0->dvb.frontend = dvb_attach(stv0299_attach,
1436  &tevii_tuner_sharp_config,
1437  &core->i2c_adap);
1438  if (fe0->dvb.frontend != NULL) {
1439  if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
1440  &core->i2c_adap, DVB_PLL_OPERA1))
1441  goto frontend_detach;
1442  core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1443  fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1444 
1445  } else {
1446  fe0->dvb.frontend = dvb_attach(stv0288_attach,
1447  &tevii_tuner_earda_config,
1448  &core->i2c_adap);
1449  if (fe0->dvb.frontend != NULL) {
1450  if (!dvb_attach(stb6000_attach, fe0->dvb.frontend, 0x61,
1451  &core->i2c_adap))
1452  goto frontend_detach;
1453  core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1454  fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1455  }
1456  }
1457  break;
1458  case CX88_BOARD_TEVII_S460:
1459  fe0->dvb.frontend = dvb_attach(cx24116_attach,
1460  &tevii_s460_config,
1461  &core->i2c_adap);
1462  if (fe0->dvb.frontend != NULL)
1463  fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1464  break;
1465  case CX88_BOARD_TEVII_S464:
1466  fe0->dvb.frontend = dvb_attach(ds3000_attach,
1467  &tevii_ds3000_config,
1468  &core->i2c_adap);
1469  if (fe0->dvb.frontend != NULL)
1470  fe0->dvb.frontend->ops.set_voltage =
1471  tevii_dvbs_set_voltage;
1472  break;
1474  case CX88_BOARD_TBS_8920:
1475  case CX88_BOARD_PROF_7300:
1477  fe0->dvb.frontend = dvb_attach(cx24116_attach,
1478  &hauppauge_hvr4000_config,
1479  &core->i2c_adap);
1480  if (fe0->dvb.frontend != NULL)
1481  fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1482  break;
1484  fe0->dvb.frontend = dvb_attach(zl10353_attach,
1485  &cx88_terratec_cinergy_ht_pci_mkii_config,
1486  &core->i2c_adap);
1487  if (fe0->dvb.frontend) {
1488  fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1489  if (attach_xc3028(0x61, dev) < 0)
1490  goto frontend_detach;
1491  }
1492  break;
1493  case CX88_BOARD_PROF_7301:{
1494  struct dvb_tuner_ops *tuner_ops = NULL;
1495 
1496  fe0->dvb.frontend = dvb_attach(stv0900_attach,
1497  &prof_7301_stv0900_config,
1498  &core->i2c_adap, 0);
1499  if (fe0->dvb.frontend != NULL) {
1500  if (!dvb_attach(stb6100_attach, fe0->dvb.frontend,
1501  &prof_7301_stb6100_config,
1502  &core->i2c_adap))
1503  goto frontend_detach;
1504 
1505  tuner_ops = &fe0->dvb.frontend->ops.tuner_ops;
1506  tuner_ops->set_frequency = stb6100_set_freq;
1507  tuner_ops->get_frequency = stb6100_get_freq;
1508  tuner_ops->set_bandwidth = stb6100_set_bandw;
1509  tuner_ops->get_bandwidth = stb6100_get_bandw;
1510 
1511  core->prev_set_voltage =
1512  fe0->dvb.frontend->ops.set_voltage;
1513  fe0->dvb.frontend->ops.set_voltage =
1514  tevii_dvbs_set_voltage;
1515  }
1516  break;
1517  }
1519  dev->ts_gen_cntrl = 0x08;
1520 
1521  cx_set(MO_GP0_IO, 0x0101);
1522 
1523  cx_clear(MO_GP0_IO, 0x01);
1524  mdelay(100);
1525  cx_set(MO_GP0_IO, 0x01);
1526  mdelay(200);
1527 
1528  fe0->dvb.frontend = dvb_attach(stv0299_attach,
1529  &samsung_stv0299_config,
1530  &dev->core->i2c_adap);
1531  if (fe0->dvb.frontend) {
1532  fe0->dvb.frontend->ops.tuner_ops.set_params =
1533  samsung_smt_7020_tuner_set_params;
1534  fe0->dvb.frontend->tuner_priv =
1535  &dev->core->i2c_adap;
1536  fe0->dvb.frontend->ops.set_voltage =
1537  samsung_smt_7020_set_voltage;
1538  fe0->dvb.frontend->ops.set_tone =
1539  samsung_smt_7020_set_tone;
1540  }
1541 
1542  break;
1544  dev->ts_gen_cntrl = 0x00;
1545  fe0->dvb.frontend = dvb_attach(mb86a16_attach,
1546  &twinhan_vp1027,
1547  &core->i2c_adap);
1548  if (fe0->dvb.frontend) {
1549  core->prev_set_voltage =
1550  fe0->dvb.frontend->ops.set_voltage;
1551  fe0->dvb.frontend->ops.set_voltage =
1552  vp1027_set_voltage;
1553  }
1554  break;
1555 
1556  default:
1557  printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
1558  core->name);
1559  break;
1560  }
1561 
1562  if ( (NULL == fe0->dvb.frontend) || (fe1 && NULL == fe1->dvb.frontend) ) {
1564  "%s/2: frontend initialization failed\n",
1565  core->name);
1566  goto frontend_detach;
1567  }
1568  /* define general-purpose callback pointer */
1569  fe0->dvb.frontend->callback = cx88_tuner_callback;
1570 
1571  /* Ensure all frontends negotiate bus access */
1572  fe0->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1573  if (fe1)
1574  fe1->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1575 
1576  /* Put the analog decoder in standby to keep it quiet */
1577  call_all(core, core, s_power, 0);
1578 
1579  /* register everything */
1580  res = videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1581  &dev->pci->dev, adapter_nr, mfe_shared);
1582  if (res)
1583  goto frontend_detach;
1584  return res;
1585 
1586 frontend_detach:
1587  core->gate_ctrl = NULL;
1588  videobuf_dvb_dealloc_frontends(&dev->frontends);
1589  return res;
1590 }
1591 
1592 /* ----------------------------------------------------------- */
1593 
1594 /* CX8802 MPEG -> mini driver - We have been given the hardware */
1595 static int cx8802_dvb_advise_acquire(struct cx8802_driver *drv)
1596 {
1597  struct cx88_core *core = drv->core;
1598  int err = 0;
1599  dprintk( 1, "%s\n", __func__);
1600 
1601  switch (core->boardnr) {
1603  /* We arrive here with either the cx23416 or the cx22702
1604  * on the bus. Take the bus from the cx23416 and enable the
1605  * cx22702 demod
1606  */
1607  /* Toggle reset on cx22702 leaving i2c active */
1608  cx_set(MO_GP0_IO, 0x00000080);
1609  udelay(1000);
1610  cx_clear(MO_GP0_IO, 0x00000080);
1611  udelay(50);
1612  cx_set(MO_GP0_IO, 0x00000080);
1613  udelay(1000);
1614  /* enable the cx22702 pins */
1615  cx_clear(MO_GP0_IO, 0x00000004);
1616  udelay(1000);
1617  break;
1618 
1621  /* Toggle reset on cx22702 leaving i2c active */
1622  cx_set(MO_GP0_IO, 0x00000080);
1623  udelay(1000);
1624  cx_clear(MO_GP0_IO, 0x00000080);
1625  udelay(50);
1626  cx_set(MO_GP0_IO, 0x00000080);
1627  udelay(1000);
1628  switch (core->dvbdev->frontends.active_fe_id) {
1629  case 1: /* DVB-S/S2 Enabled */
1630  /* tri-state the cx22702 pins */
1631  cx_set(MO_GP0_IO, 0x00000004);
1632  /* Take the cx24116/cx24123 out of reset */
1633  cx_write(MO_SRST_IO, 1);
1634  core->dvbdev->ts_gen_cntrl = 0x02; /* Parallel IO */
1635  break;
1636  case 2: /* DVB-T Enabled */
1637  /* Put the cx24116/cx24123 into reset */
1638  cx_write(MO_SRST_IO, 0);
1639  /* enable the cx22702 pins */
1640  cx_clear(MO_GP0_IO, 0x00000004);
1641  core->dvbdev->ts_gen_cntrl = 0x0c; /* Serial IO */
1642  break;
1643  }
1644  udelay(1000);
1645  break;
1646 
1648  /* set RF input to AIR for DVB-T (GPIO 16) */
1649  cx_write(MO_GP2_IO, 0x0101);
1650  break;
1651 
1652  default:
1653  err = -ENODEV;
1654  }
1655  return err;
1656 }
1657 
1658 /* CX8802 MPEG -> mini driver - We no longer have the hardware */
1659 static int cx8802_dvb_advise_release(struct cx8802_driver *drv)
1660 {
1661  struct cx88_core *core = drv->core;
1662  int err = 0;
1663  dprintk( 1, "%s\n", __func__);
1664 
1665  switch (core->boardnr) {
1667  /* Do Nothing, leave the cx22702 on the bus. */
1668  break;
1671  break;
1672  default:
1673  err = -ENODEV;
1674  }
1675  return err;
1676 }
1677 
1678 static int cx8802_dvb_probe(struct cx8802_driver *drv)
1679 {
1680  struct cx88_core *core = drv->core;
1681  struct cx8802_dev *dev = drv->core->dvbdev;
1682  int err;
1683  struct videobuf_dvb_frontend *fe;
1684  int i;
1685 
1686  dprintk( 1, "%s\n", __func__);
1687  dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
1688  core->boardnr,
1689  core->name,
1690  core->pci_bus,
1691  core->pci_slot);
1692 
1693  err = -ENODEV;
1694  if (!(core->board.mpeg & CX88_MPEG_DVB))
1695  goto fail_core;
1696 
1697  /* If vp3054 isn't enabled, a stub will just return 0 */
1698  err = vp3054_i2c_probe(dev);
1699  if (0 != err)
1700  goto fail_core;
1701 
1702  /* dvb stuff */
1703  printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
1704  dev->ts_gen_cntrl = 0x0c;
1705 
1706  err = cx8802_alloc_frontends(dev);
1707  if (err)
1708  goto fail_core;
1709 
1710  err = -ENODEV;
1711  for (i = 1; i <= core->board.num_frontends; i++) {
1712  fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
1713  if (fe == NULL) {
1714  printk(KERN_ERR "%s() failed to get frontend(%d)\n",
1715  __func__, i);
1716  goto fail_probe;
1717  }
1718  videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
1719  &dev->pci->dev, &dev->slock,
1722  sizeof(struct cx88_buffer),
1723  dev, NULL);
1724  /* init struct videobuf_dvb */
1725  fe->dvb.name = dev->core->name;
1726  }
1727 
1728  err = dvb_register(dev);
1729  if (err)
1730  /* frontends/adapter de-allocated in dvb_register */
1731  printk(KERN_ERR "%s/2: dvb_register failed (err = %d)\n",
1732  core->name, err);
1733  return err;
1734 fail_probe:
1735  videobuf_dvb_dealloc_frontends(&core->dvbdev->frontends);
1736 fail_core:
1737  return err;
1738 }
1739 
1740 static int cx8802_dvb_remove(struct cx8802_driver *drv)
1741 {
1742  struct cx88_core *core = drv->core;
1743  struct cx8802_dev *dev = drv->core->dvbdev;
1744 
1745  dprintk( 1, "%s\n", __func__);
1746 
1747  videobuf_dvb_unregister_bus(&dev->frontends);
1748 
1749  vp3054_i2c_remove(dev);
1750 
1751  core->gate_ctrl = NULL;
1752 
1753  return 0;
1754 }
1755 
1756 static struct cx8802_driver cx8802_dvb_driver = {
1757  .type_id = CX88_MPEG_DVB,
1758  .hw_access = CX8802_DRVCTL_SHARED,
1759  .probe = cx8802_dvb_probe,
1760  .remove = cx8802_dvb_remove,
1761  .advise_acquire = cx8802_dvb_advise_acquire,
1762  .advise_release = cx8802_dvb_advise_release,
1763 };
1764 
1765 static int __init dvb_init(void)
1766 {
1767  printk(KERN_INFO "cx88/2: cx2388x dvb driver version %s loaded\n",
1768  CX88_VERSION);
1769  return cx8802_register_driver(&cx8802_dvb_driver);
1770 }
1771 
1772 static void __exit dvb_fini(void)
1773 {
1774  cx8802_unregister_driver(&cx8802_dvb_driver);
1775 }
1776 
1777 module_init(dvb_init);
1778 module_exit(dvb_fini);