root/drivers/media/pci/cx88/cx88-dvb.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. queue_setup
  2. buffer_prepare
  3. buffer_finish
  4. buffer_queue
  5. start_streaming
  6. stop_streaming
  7. cx88_dvb_bus_ctrl
  8. cx88_dvb_gate_ctrl
  9. dvico_fusionhdtv_demod_init
  10. dvico_dual_demod_init
  11. dntv_live_dvbt_demod_init
  12. dntv_live_dvbt_pro_demod_init
  13. or51132_set_ts_param
  14. lgdt330x_pll_rf_set
  15. lgdt330x_set_ts_param
  16. nxt200x_set_ts_param
  17. cx24123_set_ts_param
  18. kworld_dvbs_100_set_voltage
  19. geniatech_dvbs_set_voltage
  20. tevii_dvbs_set_voltage
  21. vp1027_set_voltage
  22. attach_xc3028
  23. attach_xc4000
  24. cx24116_set_ts_param
  25. stv0900_set_ts_param
  26. cx24116_reset_device
  27. ds3000_set_ts_param
  28. cx8802_alloc_frontends
  29. samsung_smt_7020_tuner_set_params
  30. samsung_smt_7020_set_tone
  31. samsung_smt_7020_set_voltage
  32. samsung_smt_7020_stv0299_set_symbol_rate
  33. dvb_register
  34. cx8802_dvb_advise_acquire
  35. cx8802_dvb_advise_release
  36. cx8802_dvb_probe
  37. cx8802_dvb_remove
  38. dvb_init
  39. dvb_fini

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

/* [<][>][^][v][top][bottom][index][help] */