linux/drivers/media/usb/cx231xx/cx231xx-dvb.c
<<
>>
Prefs
   1/*
   2 DVB device driver for cx231xx
   3
   4 Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
   5                Based on em28xx driver
   6
   7 This program is free software; you can redistribute it and/or modify
   8   it under the terms of the GNU General Public License as published by
   9   the Free Software Foundation; either version 2 of the License, or
  10   (at your option) any later version.
  11
  12   This program is distributed in the hope that it will be useful,
  13   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15   GNU General Public License for more details.
  16
  17   You should have received a copy of the GNU General Public License
  18   along with this program; if not, write to the Free Software
  19   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20 */
  21
  22#include "cx231xx.h"
  23#include <linux/kernel.h>
  24#include <linux/slab.h>
  25
  26#include <media/v4l2-common.h>
  27#include <media/videobuf-vmalloc.h>
  28#include <media/tuner.h>
  29
  30#include "xc5000.h"
  31#include "s5h1432.h"
  32#include "tda18271.h"
  33#include "s5h1411.h"
  34#include "lgdt3305.h"
  35#include "si2165.h"
  36#include "si2168.h"
  37#include "mb86a20s.h"
  38#include "si2157.h"
  39#include "lgdt3306a.h"
  40#include "r820t.h"
  41#include "mn88473.h"
  42
  43MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
  44MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
  45MODULE_LICENSE("GPL");
  46
  47static unsigned int debug;
  48module_param(debug, int, 0644);
  49MODULE_PARM_DESC(debug, "enable debug messages [dvb]");
  50
  51DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  52
  53#define CX231XX_DVB_NUM_BUFS 5
  54#define CX231XX_DVB_MAX_PACKETSIZE 564
  55#define CX231XX_DVB_MAX_PACKETS 64
  56
  57struct cx231xx_dvb {
  58        struct dvb_frontend *frontend;
  59
  60        /* feed count management */
  61        struct mutex lock;
  62        int nfeeds;
  63
  64        /* general boilerplate stuff */
  65        struct dvb_adapter adapter;
  66        struct dvb_demux demux;
  67        struct dmxdev dmxdev;
  68        struct dmx_frontend fe_hw;
  69        struct dmx_frontend fe_mem;
  70        struct dvb_net net;
  71        struct i2c_client *i2c_client_demod;
  72        struct i2c_client *i2c_client_tuner;
  73};
  74
  75static struct s5h1432_config dvico_s5h1432_config = {
  76        .output_mode   = S5H1432_SERIAL_OUTPUT,
  77        .gpio          = S5H1432_GPIO_ON,
  78        .qam_if        = S5H1432_IF_4000,
  79        .vsb_if        = S5H1432_IF_4000,
  80        .inversion     = S5H1432_INVERSION_OFF,
  81        .status_mode   = S5H1432_DEMODLOCKING,
  82        .mpeg_timing   = S5H1432_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
  83};
  84
  85static struct tda18271_std_map cnxt_rde253s_tda18271_std_map = {
  86        .dvbt_6   = { .if_freq = 4000, .agc_mode = 3, .std = 4,
  87                      .if_lvl = 1, .rfagc_top = 0x37, },
  88        .dvbt_7   = { .if_freq = 4000, .agc_mode = 3, .std = 5,
  89                      .if_lvl = 1, .rfagc_top = 0x37, },
  90        .dvbt_8   = { .if_freq = 4000, .agc_mode = 3, .std = 6,
  91                      .if_lvl = 1, .rfagc_top = 0x37, },
  92};
  93
  94static struct tda18271_std_map mb86a20s_tda18271_config = {
  95        .dvbt_6   = { .if_freq = 4000, .agc_mode = 3, .std = 4,
  96                      .if_lvl = 0, .rfagc_top = 0x37, },
  97};
  98
  99static struct tda18271_config cnxt_rde253s_tunerconfig = {
 100        .std_map = &cnxt_rde253s_tda18271_std_map,
 101        .gate    = TDA18271_GATE_ANALOG,
 102};
 103
 104static struct s5h1411_config tda18271_s5h1411_config = {
 105        .output_mode   = S5H1411_SERIAL_OUTPUT,
 106        .gpio          = S5H1411_GPIO_OFF,
 107        .vsb_if        = S5H1411_IF_3250,
 108        .qam_if        = S5H1411_IF_4000,
 109        .inversion     = S5H1411_INVERSION_ON,
 110        .status_mode   = S5H1411_DEMODLOCKING,
 111        .mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
 112};
 113static struct s5h1411_config xc5000_s5h1411_config = {
 114        .output_mode   = S5H1411_SERIAL_OUTPUT,
 115        .gpio          = S5H1411_GPIO_OFF,
 116        .vsb_if        = S5H1411_IF_3250,
 117        .qam_if        = S5H1411_IF_3250,
 118        .inversion     = S5H1411_INVERSION_OFF,
 119        .status_mode   = S5H1411_DEMODLOCKING,
 120        .mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
 121};
 122
 123static struct lgdt3305_config hcw_lgdt3305_config = {
 124        .i2c_addr           = 0x0e,
 125        .mpeg_mode          = LGDT3305_MPEG_SERIAL,
 126        .tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
 127        .tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
 128        .deny_i2c_rptr      = 1,
 129        .spectral_inversion = 1,
 130        .qam_if_khz         = 4000,
 131        .vsb_if_khz         = 3250,
 132};
 133
 134static struct tda18271_std_map hauppauge_tda18271_std_map = {
 135        .atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 4,
 136                      .if_lvl = 1, .rfagc_top = 0x58, },
 137        .qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 5,
 138                      .if_lvl = 1, .rfagc_top = 0x58, },
 139};
 140
 141static struct tda18271_config hcw_tda18271_config = {
 142        .std_map = &hauppauge_tda18271_std_map,
 143        .gate    = TDA18271_GATE_DIGITAL,
 144};
 145
 146static const struct mb86a20s_config pv_mb86a20s_config = {
 147        .demod_address = 0x10,
 148        .is_serial = true,
 149};
 150
 151static struct tda18271_config pv_tda18271_config = {
 152        .std_map = &mb86a20s_tda18271_config,
 153        .gate    = TDA18271_GATE_DIGITAL,
 154        .small_i2c = TDA18271_03_BYTE_CHUNK_INIT,
 155};
 156
 157static struct lgdt3306a_config hauppauge_955q_lgdt3306a_config = {
 158        .i2c_addr           = 0x59,
 159        .qam_if_khz         = 4000,
 160        .vsb_if_khz         = 3250,
 161        .deny_i2c_rptr      = 1,
 162        .spectral_inversion = 1,
 163        .mpeg_mode          = LGDT3306A_MPEG_SERIAL,
 164        .tpclk_edge         = LGDT3306A_TPCLK_RISING_EDGE,
 165        .tpvalid_polarity   = LGDT3306A_TP_VALID_HIGH,
 166        .xtalMHz            = 25,
 167};
 168
 169static struct r820t_config astrometa_t2hybrid_r820t_config = {
 170        .i2c_addr               = 0x3a, /* 0x74 >> 1 */
 171        .xtal                   = 16000000,
 172        .rafael_chip            = CHIP_R828D,
 173        .max_i2c_msg_len        = 2,
 174};
 175
 176static inline void print_err_status(struct cx231xx *dev, int packet, int status)
 177{
 178        char *errmsg = "Unknown";
 179
 180        switch (status) {
 181        case -ENOENT:
 182                errmsg = "unlinked synchronuously";
 183                break;
 184        case -ECONNRESET:
 185                errmsg = "unlinked asynchronuously";
 186                break;
 187        case -ENOSR:
 188                errmsg = "Buffer error (overrun)";
 189                break;
 190        case -EPIPE:
 191                errmsg = "Stalled (device not responding)";
 192                break;
 193        case -EOVERFLOW:
 194                errmsg = "Babble (bad cable?)";
 195                break;
 196        case -EPROTO:
 197                errmsg = "Bit-stuff error (bad cable?)";
 198                break;
 199        case -EILSEQ:
 200                errmsg = "CRC/Timeout (could be anything)";
 201                break;
 202        case -ETIME:
 203                errmsg = "Device does not respond";
 204                break;
 205        }
 206        if (packet < 0) {
 207                dev_dbg(dev->dev,
 208                        "URB status %d [%s].\n", status, errmsg);
 209        } else {
 210                dev_dbg(dev->dev,
 211                        "URB packet %d, status %d [%s].\n",
 212                        packet, status, errmsg);
 213        }
 214}
 215
 216static inline int dvb_isoc_copy(struct cx231xx *dev, struct urb *urb)
 217{
 218        int i;
 219
 220        if (!dev)
 221                return 0;
 222
 223        if (dev->state & DEV_DISCONNECTED)
 224                return 0;
 225
 226        if (urb->status < 0) {
 227                print_err_status(dev, -1, urb->status);
 228                if (urb->status == -ENOENT)
 229                        return 0;
 230        }
 231
 232        for (i = 0; i < urb->number_of_packets; i++) {
 233                int status = urb->iso_frame_desc[i].status;
 234
 235                if (status < 0) {
 236                        print_err_status(dev, i, status);
 237                        if (urb->iso_frame_desc[i].status != -EPROTO)
 238                                continue;
 239                }
 240
 241                dvb_dmx_swfilter(&dev->dvb->demux,
 242                                 urb->transfer_buffer +
 243                                urb->iso_frame_desc[i].offset,
 244                                urb->iso_frame_desc[i].actual_length);
 245        }
 246
 247        return 0;
 248}
 249
 250static inline int dvb_bulk_copy(struct cx231xx *dev, struct urb *urb)
 251{
 252        if (!dev)
 253                return 0;
 254
 255        if (dev->state & DEV_DISCONNECTED)
 256                return 0;
 257
 258        if (urb->status < 0) {
 259                print_err_status(dev, -1, urb->status);
 260                if (urb->status == -ENOENT)
 261                        return 0;
 262        }
 263
 264        /* Feed the transport payload into the kernel demux */
 265        dvb_dmx_swfilter(&dev->dvb->demux,
 266                urb->transfer_buffer, urb->actual_length);
 267
 268        return 0;
 269}
 270
 271static int start_streaming(struct cx231xx_dvb *dvb)
 272{
 273        int rc;
 274        struct cx231xx *dev = dvb->adapter.priv;
 275
 276        if (dev->USE_ISO) {
 277                dev_dbg(dev->dev, "DVB transfer mode is ISO.\n");
 278                cx231xx_set_alt_setting(dev, INDEX_TS1, 4);
 279                rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
 280                if (rc < 0)
 281                        return rc;
 282                dev->mode_tv = 1;
 283                return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
 284                                        CX231XX_DVB_NUM_BUFS,
 285                                        dev->ts1_mode.max_pkt_size,
 286                                        dvb_isoc_copy);
 287        } else {
 288                dev_dbg(dev->dev, "DVB transfer mode is BULK.\n");
 289                cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
 290                rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
 291                if (rc < 0)
 292                        return rc;
 293                dev->mode_tv = 1;
 294                return cx231xx_init_bulk(dev, CX231XX_DVB_MAX_PACKETS,
 295                                        CX231XX_DVB_NUM_BUFS,
 296                                        dev->ts1_mode.max_pkt_size,
 297                                        dvb_bulk_copy);
 298        }
 299
 300}
 301
 302static int stop_streaming(struct cx231xx_dvb *dvb)
 303{
 304        struct cx231xx *dev = dvb->adapter.priv;
 305
 306        if (dev->USE_ISO)
 307                cx231xx_uninit_isoc(dev);
 308        else
 309                cx231xx_uninit_bulk(dev);
 310
 311        cx231xx_set_mode(dev, CX231XX_SUSPEND);
 312
 313        return 0;
 314}
 315
 316static int start_feed(struct dvb_demux_feed *feed)
 317{
 318        struct dvb_demux *demux = feed->demux;
 319        struct cx231xx_dvb *dvb = demux->priv;
 320        int rc, ret;
 321
 322        if (!demux->dmx.frontend)
 323                return -EINVAL;
 324
 325        mutex_lock(&dvb->lock);
 326        dvb->nfeeds++;
 327        rc = dvb->nfeeds;
 328
 329        if (dvb->nfeeds == 1) {
 330                ret = start_streaming(dvb);
 331                if (ret < 0)
 332                        rc = ret;
 333        }
 334
 335        mutex_unlock(&dvb->lock);
 336        return rc;
 337}
 338
 339static int stop_feed(struct dvb_demux_feed *feed)
 340{
 341        struct dvb_demux *demux = feed->demux;
 342        struct cx231xx_dvb *dvb = demux->priv;
 343        int err = 0;
 344
 345        mutex_lock(&dvb->lock);
 346        dvb->nfeeds--;
 347
 348        if (0 == dvb->nfeeds)
 349                err = stop_streaming(dvb);
 350
 351        mutex_unlock(&dvb->lock);
 352        return err;
 353}
 354
 355/* ------------------------------------------------------------------ */
 356static int cx231xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
 357{
 358        struct cx231xx *dev = fe->dvb->priv;
 359
 360        if (acquire)
 361                return cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
 362        else
 363                return cx231xx_set_mode(dev, CX231XX_SUSPEND);
 364}
 365
 366/* ------------------------------------------------------------------ */
 367
 368static struct xc5000_config cnxt_rde250_tunerconfig = {
 369        .i2c_address = 0x61,
 370        .if_khz = 4000,
 371};
 372static struct xc5000_config cnxt_rdu250_tunerconfig = {
 373        .i2c_address = 0x61,
 374        .if_khz = 3250,
 375};
 376
 377/* ------------------------------------------------------------------ */
 378#if 0
 379static int attach_xc5000(u8 addr, struct cx231xx *dev)
 380{
 381
 382        struct dvb_frontend *fe;
 383        struct xc5000_config cfg;
 384
 385        memset(&cfg, 0, sizeof(cfg));
 386        cfg.i2c_adap = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
 387        cfg.i2c_addr = addr;
 388
 389        if (!dev->dvb->frontend) {
 390                dev_err(dev->dev, "%s/2: dvb frontend not attached. Can't attach xc5000\n",
 391                        dev->name);
 392                return -EINVAL;
 393        }
 394
 395        fe = dvb_attach(xc5000_attach, dev->dvb->frontend, &cfg);
 396        if (!fe) {
 397                dev_err(dev->dev, "%s/2: xc5000 attach failed\n", dev->name);
 398                dvb_frontend_detach(dev->dvb->frontend);
 399                dev->dvb->frontend = NULL;
 400                return -EINVAL;
 401        }
 402
 403        dev_info(dev->dev, "%s/2: xc5000 attached\n", dev->name);
 404
 405        return 0;
 406}
 407#endif
 408
 409int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq)
 410{
 411        if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
 412
 413                struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
 414
 415                if (dops->set_analog_params != NULL) {
 416                        struct analog_parameters params;
 417
 418                        params.frequency = freq;
 419                        params.std = dev->norm;
 420                        params.mode = 0;        /* 0- Air; 1 - cable */
 421                        /*params.audmode = ;       */
 422
 423                        /* Set the analog parameters to set the frequency */
 424                        dops->set_analog_params(dev->dvb->frontend, &params);
 425                }
 426
 427        }
 428
 429        return 0;
 430}
 431
 432int cx231xx_reset_analog_tuner(struct cx231xx *dev)
 433{
 434        int status = 0;
 435
 436        if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
 437
 438                struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
 439
 440                if (dops->init != NULL && !dev->xc_fw_load_done) {
 441
 442                        dev_dbg(dev->dev,
 443                                "Reloading firmware for XC5000\n");
 444                        status = dops->init(dev->dvb->frontend);
 445                        if (status == 0) {
 446                                dev->xc_fw_load_done = 1;
 447                                dev_dbg(dev->dev,
 448                                        "XC5000 firmware download completed\n");
 449                        } else {
 450                                dev->xc_fw_load_done = 0;
 451                                dev_dbg(dev->dev,
 452                                        "XC5000 firmware download failed !!!\n");
 453                        }
 454                }
 455
 456        }
 457
 458        return status;
 459}
 460
 461/* ------------------------------------------------------------------ */
 462
 463static int register_dvb(struct cx231xx_dvb *dvb,
 464                        struct module *module,
 465                        struct cx231xx *dev, struct device *device)
 466{
 467        int result;
 468
 469        mutex_init(&dvb->lock);
 470
 471
 472        /* register adapter */
 473        result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
 474                                      adapter_nr);
 475        if (result < 0) {
 476                dev_warn(dev->dev,
 477                       "%s: dvb_register_adapter failed (errno = %d)\n",
 478                       dev->name, result);
 479                goto fail_adapter;
 480        }
 481        dvb_register_media_controller(&dvb->adapter, dev->media_dev);
 482
 483        /* Ensure all frontends negotiate bus access */
 484        dvb->frontend->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl;
 485
 486        dvb->adapter.priv = dev;
 487
 488        /* register frontend */
 489        result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
 490        if (result < 0) {
 491                dev_warn(dev->dev,
 492                       "%s: dvb_register_frontend failed (errno = %d)\n",
 493                       dev->name, result);
 494                goto fail_frontend;
 495        }
 496
 497        /* register demux stuff */
 498        dvb->demux.dmx.capabilities =
 499            DMX_TS_FILTERING | DMX_SECTION_FILTERING |
 500            DMX_MEMORY_BASED_FILTERING;
 501        dvb->demux.priv = dvb;
 502        dvb->demux.filternum = 256;
 503        dvb->demux.feednum = 256;
 504        dvb->demux.start_feed = start_feed;
 505        dvb->demux.stop_feed = stop_feed;
 506
 507        result = dvb_dmx_init(&dvb->demux);
 508        if (result < 0) {
 509                dev_warn(dev->dev,
 510                         "%s: dvb_dmx_init failed (errno = %d)\n",
 511                       dev->name, result);
 512                goto fail_dmx;
 513        }
 514
 515        dvb->dmxdev.filternum = 256;
 516        dvb->dmxdev.demux = &dvb->demux.dmx;
 517        dvb->dmxdev.capabilities = 0;
 518        result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
 519        if (result < 0) {
 520                dev_warn(dev->dev,
 521                         "%s: dvb_dmxdev_init failed (errno = %d)\n",
 522                         dev->name, result);
 523                goto fail_dmxdev;
 524        }
 525
 526        dvb->fe_hw.source = DMX_FRONTEND_0;
 527        result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
 528        if (result < 0) {
 529                dev_warn(dev->dev,
 530                       "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
 531                       dev->name, result);
 532                goto fail_fe_hw;
 533        }
 534
 535        dvb->fe_mem.source = DMX_MEMORY_FE;
 536        result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
 537        if (result < 0) {
 538                dev_warn(dev->dev,
 539                         "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
 540                         dev->name, result);
 541                goto fail_fe_mem;
 542        }
 543
 544        result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
 545        if (result < 0) {
 546                dev_warn(dev->dev,
 547                         "%s: connect_frontend failed (errno = %d)\n",
 548                         dev->name, result);
 549                goto fail_fe_conn;
 550        }
 551
 552        /* register network adapter */
 553        dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
 554        result = dvb_create_media_graph(&dvb->adapter,
 555                                        dev->tuner_type == TUNER_ABSENT);
 556        if (result < 0)
 557                goto fail_create_graph;
 558
 559        return 0;
 560
 561fail_create_graph:
 562        dvb_net_release(&dvb->net);
 563fail_fe_conn:
 564        dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
 565fail_fe_mem:
 566        dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
 567fail_fe_hw:
 568        dvb_dmxdev_release(&dvb->dmxdev);
 569fail_dmxdev:
 570        dvb_dmx_release(&dvb->demux);
 571fail_dmx:
 572        dvb_unregister_frontend(dvb->frontend);
 573fail_frontend:
 574        dvb_frontend_detach(dvb->frontend);
 575        dvb_unregister_adapter(&dvb->adapter);
 576fail_adapter:
 577        return result;
 578}
 579
 580static void unregister_dvb(struct cx231xx_dvb *dvb)
 581{
 582        struct i2c_client *client;
 583        dvb_net_release(&dvb->net);
 584        dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
 585        dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
 586        dvb_dmxdev_release(&dvb->dmxdev);
 587        dvb_dmx_release(&dvb->demux);
 588        dvb_unregister_frontend(dvb->frontend);
 589        dvb_frontend_detach(dvb->frontend);
 590        dvb_unregister_adapter(&dvb->adapter);
 591        /* remove I2C tuner */
 592        client = dvb->i2c_client_tuner;
 593        if (client) {
 594                module_put(client->dev.driver->owner);
 595                i2c_unregister_device(client);
 596        }
 597        /* remove I2C demod */
 598        client = dvb->i2c_client_demod;
 599        if (client) {
 600                module_put(client->dev.driver->owner);
 601                i2c_unregister_device(client);
 602        }
 603}
 604
 605static int dvb_init(struct cx231xx *dev)
 606{
 607        int result = 0;
 608        struct cx231xx_dvb *dvb;
 609        struct i2c_adapter *tuner_i2c;
 610        struct i2c_adapter *demod_i2c;
 611
 612        if (!dev->board.has_dvb) {
 613                /* This device does not support the extension */
 614                return 0;
 615        }
 616
 617        dvb = kzalloc(sizeof(struct cx231xx_dvb), GFP_KERNEL);
 618
 619        if (dvb == NULL) {
 620                dev_info(dev->dev,
 621                         "cx231xx_dvb: memory allocation failed\n");
 622                return -ENOMEM;
 623        }
 624        dev->dvb = dvb;
 625        dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
 626        dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
 627
 628        tuner_i2c = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
 629        demod_i2c = cx231xx_get_i2c_adap(dev, dev->board.demod_i2c_master);
 630        mutex_lock(&dev->lock);
 631        cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
 632        cx231xx_demod_reset(dev);
 633        /* init frontend */
 634        switch (dev->model) {
 635        case CX231XX_BOARD_CNXT_CARRAERA:
 636        case CX231XX_BOARD_CNXT_RDE_250:
 637
 638                dev->dvb->frontend = dvb_attach(s5h1432_attach,
 639                                        &dvico_s5h1432_config,
 640                                        demod_i2c);
 641
 642                if (dev->dvb->frontend == NULL) {
 643                        dev_err(dev->dev,
 644                                "Failed to attach s5h1432 front end\n");
 645                        result = -EINVAL;
 646                        goto out_free;
 647                }
 648
 649                /* define general-purpose callback pointer */
 650                dvb->frontend->callback = cx231xx_tuner_callback;
 651
 652                if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
 653                               tuner_i2c,
 654                               &cnxt_rde250_tunerconfig)) {
 655                        result = -EINVAL;
 656                        goto out_free;
 657                }
 658
 659                break;
 660        case CX231XX_BOARD_CNXT_SHELBY:
 661        case CX231XX_BOARD_CNXT_RDU_250:
 662
 663                dev->dvb->frontend = dvb_attach(s5h1411_attach,
 664                                               &xc5000_s5h1411_config,
 665                                               demod_i2c);
 666
 667                if (dev->dvb->frontend == NULL) {
 668                        dev_err(dev->dev,
 669                                "Failed to attach s5h1411 front end\n");
 670                        result = -EINVAL;
 671                        goto out_free;
 672                }
 673
 674                /* define general-purpose callback pointer */
 675                dvb->frontend->callback = cx231xx_tuner_callback;
 676
 677                if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
 678                               tuner_i2c,
 679                               &cnxt_rdu250_tunerconfig)) {
 680                        result = -EINVAL;
 681                        goto out_free;
 682                }
 683                break;
 684        case CX231XX_BOARD_CNXT_RDE_253S:
 685
 686                dev->dvb->frontend = dvb_attach(s5h1432_attach,
 687                                        &dvico_s5h1432_config,
 688                                        demod_i2c);
 689
 690                if (dev->dvb->frontend == NULL) {
 691                        dev_err(dev->dev,
 692                                "Failed to attach s5h1432 front end\n");
 693                        result = -EINVAL;
 694                        goto out_free;
 695                }
 696
 697                /* define general-purpose callback pointer */
 698                dvb->frontend->callback = cx231xx_tuner_callback;
 699
 700                if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
 701                               0x60, tuner_i2c,
 702                               &cnxt_rde253s_tunerconfig)) {
 703                        result = -EINVAL;
 704                        goto out_free;
 705                }
 706                break;
 707        case CX231XX_BOARD_CNXT_RDU_253S:
 708        case CX231XX_BOARD_KWORLD_UB445_USB_HYBRID:
 709
 710                dev->dvb->frontend = dvb_attach(s5h1411_attach,
 711                                               &tda18271_s5h1411_config,
 712                                               demod_i2c);
 713
 714                if (dev->dvb->frontend == NULL) {
 715                        dev_err(dev->dev,
 716                                "Failed to attach s5h1411 front end\n");
 717                        result = -EINVAL;
 718                        goto out_free;
 719                }
 720
 721                /* define general-purpose callback pointer */
 722                dvb->frontend->callback = cx231xx_tuner_callback;
 723
 724                if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
 725                               0x60, tuner_i2c,
 726                               &cnxt_rde253s_tunerconfig)) {
 727                        result = -EINVAL;
 728                        goto out_free;
 729                }
 730                break;
 731        case CX231XX_BOARD_HAUPPAUGE_EXETER:
 732
 733                dev_info(dev->dev,
 734                         "%s: looking for tuner / demod on i2c bus: %d\n",
 735                       __func__, i2c_adapter_id(tuner_i2c));
 736
 737                dev->dvb->frontend = dvb_attach(lgdt3305_attach,
 738                                                &hcw_lgdt3305_config,
 739                                                demod_i2c);
 740
 741                if (dev->dvb->frontend == NULL) {
 742                        dev_err(dev->dev,
 743                                "Failed to attach LG3305 front end\n");
 744                        result = -EINVAL;
 745                        goto out_free;
 746                }
 747
 748                /* define general-purpose callback pointer */
 749                dvb->frontend->callback = cx231xx_tuner_callback;
 750
 751                dvb_attach(tda18271_attach, dev->dvb->frontend,
 752                           0x60, tuner_i2c,
 753                           &hcw_tda18271_config);
 754                break;
 755
 756        case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
 757        {
 758                struct i2c_client *client;
 759                struct i2c_board_info info;
 760                struct si2165_platform_data si2165_pdata;
 761
 762                /* attach demod */
 763                memset(&si2165_pdata, 0, sizeof(si2165_pdata));
 764                si2165_pdata.fe = &dev->dvb->frontend;
 765                si2165_pdata.chip_mode = SI2165_MODE_PLL_XTAL,
 766                si2165_pdata.ref_freq_Hz = 16000000,
 767
 768                memset(&info, 0, sizeof(struct i2c_board_info));
 769                strlcpy(info.type, "si2165", I2C_NAME_SIZE);
 770                info.addr = 0x64;
 771                info.platform_data = &si2165_pdata;
 772                request_module(info.type);
 773                client = i2c_new_device(demod_i2c, &info);
 774                if (client == NULL || client->dev.driver == NULL || dev->dvb->frontend == NULL) {
 775                        dev_err(dev->dev,
 776                                "Failed to attach SI2165 front end\n");
 777                        result = -EINVAL;
 778                        goto out_free;
 779                }
 780
 781                if (!try_module_get(client->dev.driver->owner)) {
 782                        i2c_unregister_device(client);
 783                        result = -ENODEV;
 784                        goto out_free;
 785                }
 786
 787                dvb->i2c_client_demod = client;
 788
 789                dev->dvb->frontend->ops.i2c_gate_ctrl = NULL;
 790
 791                /* define general-purpose callback pointer */
 792                dvb->frontend->callback = cx231xx_tuner_callback;
 793
 794                dvb_attach(tda18271_attach, dev->dvb->frontend,
 795                        0x60,
 796                        tuner_i2c,
 797                        &hcw_tda18271_config);
 798
 799                dev->cx231xx_reset_analog_tuner = NULL;
 800                break;
 801        }
 802        case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
 803        {
 804                struct i2c_client *client;
 805                struct i2c_board_info info;
 806                struct si2165_platform_data si2165_pdata;
 807                struct si2157_config si2157_config;
 808
 809                /* attach demod */
 810                memset(&si2165_pdata, 0, sizeof(si2165_pdata));
 811                si2165_pdata.fe = &dev->dvb->frontend;
 812                si2165_pdata.chip_mode = SI2165_MODE_PLL_EXT,
 813                si2165_pdata.ref_freq_Hz = 24000000,
 814
 815                memset(&info, 0, sizeof(struct i2c_board_info));
 816                strlcpy(info.type, "si2165", I2C_NAME_SIZE);
 817                info.addr = 0x64;
 818                info.platform_data = &si2165_pdata;
 819                request_module(info.type);
 820                client = i2c_new_device(demod_i2c, &info);
 821                if (client == NULL || client->dev.driver == NULL || dev->dvb->frontend == NULL) {
 822                        dev_err(dev->dev,
 823                                "Failed to attach SI2165 front end\n");
 824                        result = -EINVAL;
 825                        goto out_free;
 826                }
 827
 828                if (!try_module_get(client->dev.driver->owner)) {
 829                        i2c_unregister_device(client);
 830                        result = -ENODEV;
 831                        goto out_free;
 832                }
 833
 834                dvb->i2c_client_demod = client;
 835
 836                memset(&info, 0, sizeof(struct i2c_board_info));
 837
 838                dev->dvb->frontend->ops.i2c_gate_ctrl = NULL;
 839
 840                /* define general-purpose callback pointer */
 841                dvb->frontend->callback = cx231xx_tuner_callback;
 842
 843                /* attach tuner */
 844                memset(&si2157_config, 0, sizeof(si2157_config));
 845                si2157_config.fe = dev->dvb->frontend;
 846#ifdef CONFIG_MEDIA_CONTROLLER_DVB
 847                si2157_config.mdev = dev->media_dev;
 848#endif
 849                si2157_config.if_port = 1;
 850                si2157_config.inversion = true;
 851                strlcpy(info.type, "si2157", I2C_NAME_SIZE);
 852                info.addr = 0x60;
 853                info.platform_data = &si2157_config;
 854                request_module("si2157");
 855
 856                client = i2c_new_device(
 857                        tuner_i2c,
 858                        &info);
 859                if (client == NULL || client->dev.driver == NULL) {
 860                        dvb_frontend_detach(dev->dvb->frontend);
 861                        result = -ENODEV;
 862                        goto out_free;
 863                }
 864
 865                if (!try_module_get(client->dev.driver->owner)) {
 866                        i2c_unregister_device(client);
 867                        dvb_frontend_detach(dev->dvb->frontend);
 868                        result = -ENODEV;
 869                        goto out_free;
 870                }
 871
 872                dev->cx231xx_reset_analog_tuner = NULL;
 873
 874                dev->dvb->i2c_client_tuner = client;
 875                break;
 876        }
 877        case CX231XX_BOARD_HAUPPAUGE_955Q:
 878        {
 879                struct i2c_client *client;
 880                struct i2c_board_info info;
 881                struct si2157_config si2157_config;
 882
 883                memset(&info, 0, sizeof(struct i2c_board_info));
 884
 885                dev->dvb->frontend = dvb_attach(lgdt3306a_attach,
 886                        &hauppauge_955q_lgdt3306a_config,
 887                        demod_i2c
 888                        );
 889
 890                if (dev->dvb->frontend == NULL) {
 891                        dev_err(dev->dev,
 892                                "Failed to attach LGDT3306A frontend.\n");
 893                        result = -EINVAL;
 894                        goto out_free;
 895                }
 896
 897                dev->dvb->frontend->ops.i2c_gate_ctrl = NULL;
 898
 899                /* define general-purpose callback pointer */
 900                dvb->frontend->callback = cx231xx_tuner_callback;
 901
 902                /* attach tuner */
 903                memset(&si2157_config, 0, sizeof(si2157_config));
 904                si2157_config.fe = dev->dvb->frontend;
 905#ifdef CONFIG_MEDIA_CONTROLLER_DVB
 906                si2157_config.mdev = dev->media_dev;
 907#endif
 908                si2157_config.if_port = 1;
 909                si2157_config.inversion = true;
 910                strlcpy(info.type, "si2157", I2C_NAME_SIZE);
 911                info.addr = 0x60;
 912                info.platform_data = &si2157_config;
 913                request_module("si2157");
 914
 915                client = i2c_new_device(
 916                        tuner_i2c,
 917                        &info);
 918                if (client == NULL || client->dev.driver == NULL) {
 919                        dvb_frontend_detach(dev->dvb->frontend);
 920                        result = -ENODEV;
 921                        goto out_free;
 922                }
 923
 924                if (!try_module_get(client->dev.driver->owner)) {
 925                        i2c_unregister_device(client);
 926                        dvb_frontend_detach(dev->dvb->frontend);
 927                        result = -ENODEV;
 928                        goto out_free;
 929                }
 930
 931                dev->cx231xx_reset_analog_tuner = NULL;
 932
 933                dev->dvb->i2c_client_tuner = client;
 934                break;
 935        }
 936        case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
 937        case CX231XX_BOARD_KWORLD_UB430_USB_HYBRID:
 938
 939                dev_info(dev->dev,
 940                         "%s: looking for demod on i2c bus: %d\n",
 941                         __func__, i2c_adapter_id(tuner_i2c));
 942
 943                dev->dvb->frontend = dvb_attach(mb86a20s_attach,
 944                                                &pv_mb86a20s_config,
 945                                                demod_i2c);
 946
 947                if (dev->dvb->frontend == NULL) {
 948                        dev_err(dev->dev,
 949                                "Failed to attach mb86a20s demod\n");
 950                        result = -EINVAL;
 951                        goto out_free;
 952                }
 953
 954                /* define general-purpose callback pointer */
 955                dvb->frontend->callback = cx231xx_tuner_callback;
 956
 957                dvb_attach(tda18271_attach, dev->dvb->frontend,
 958                           0x60, tuner_i2c,
 959                           &pv_tda18271_config);
 960                break;
 961
 962        case CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD:
 963        {
 964                struct si2157_config si2157_config = {};
 965                struct si2168_config si2168_config = {};
 966                struct i2c_board_info info = {};
 967                struct i2c_client *client;
 968                struct i2c_adapter *adapter;
 969
 970                /* attach demodulator chip */
 971                si2168_config.ts_mode = SI2168_TS_SERIAL; /* from *.inf file */
 972                si2168_config.fe = &dev->dvb->frontend;
 973                si2168_config.i2c_adapter = &adapter;
 974                si2168_config.ts_clock_inv = true;
 975
 976                strlcpy(info.type, "si2168", sizeof(info.type));
 977                info.addr = dev->board.demod_addr;
 978                info.platform_data = &si2168_config;
 979
 980                request_module(info.type);
 981                client = i2c_new_device(demod_i2c, &info);
 982
 983                if (client == NULL || client->dev.driver == NULL) {
 984                        result = -ENODEV;
 985                        goto out_free;
 986                }
 987
 988                if (!try_module_get(client->dev.driver->owner)) {
 989                        i2c_unregister_device(client);
 990                        result = -ENODEV;
 991                        goto out_free;
 992                }
 993
 994                dvb->i2c_client_demod = client;
 995
 996                /* attach tuner chip */
 997                si2157_config.fe = dev->dvb->frontend;
 998#ifdef CONFIG_MEDIA_CONTROLLER_DVB
 999                si2157_config.mdev = dev->media_dev;
1000#endif
1001                si2157_config.if_port = 1;
1002                si2157_config.inversion = false;
1003
1004                memset(&info, 0, sizeof(info));
1005                strlcpy(info.type, "si2157", sizeof(info.type));
1006                info.addr = dev->board.tuner_addr;
1007                info.platform_data = &si2157_config;
1008
1009                request_module(info.type);
1010                client = i2c_new_device(tuner_i2c, &info);
1011
1012                if (client == NULL || client->dev.driver == NULL) {
1013                        module_put(dvb->i2c_client_demod->dev.driver->owner);
1014                        i2c_unregister_device(dvb->i2c_client_demod);
1015                        result = -ENODEV;
1016                        goto out_free;
1017                }
1018
1019                if (!try_module_get(client->dev.driver->owner)) {
1020                        i2c_unregister_device(client);
1021                        module_put(dvb->i2c_client_demod->dev.driver->owner);
1022                        i2c_unregister_device(dvb->i2c_client_demod);
1023                        result = -ENODEV;
1024                        goto out_free;
1025                }
1026
1027                dev->cx231xx_reset_analog_tuner = NULL;
1028                dev->dvb->i2c_client_tuner = client;
1029                break;
1030        }
1031        case CX231XX_BOARD_ASTROMETA_T2HYBRID:
1032        {
1033                struct i2c_client *client;
1034                struct i2c_board_info info = {};
1035                struct mn88473_config mn88473_config = {};
1036
1037                /* attach demodulator chip */
1038                mn88473_config.i2c_wr_max = 16;
1039                mn88473_config.xtal = 25000000;
1040                mn88473_config.fe = &dev->dvb->frontend;
1041
1042                strlcpy(info.type, "mn88473", sizeof(info.type));
1043                info.addr = dev->board.demod_addr;
1044                info.platform_data = &mn88473_config;
1045
1046                request_module(info.type);
1047                client = i2c_new_device(demod_i2c, &info);
1048
1049                if (client == NULL || client->dev.driver == NULL) {
1050                        result = -ENODEV;
1051                        goto out_free;
1052                }
1053
1054                if (!try_module_get(client->dev.driver->owner)) {
1055                        i2c_unregister_device(client);
1056                        result = -ENODEV;
1057                        goto out_free;
1058                }
1059
1060                dvb->i2c_client_demod = client;
1061
1062                /* define general-purpose callback pointer */
1063                dvb->frontend->callback = cx231xx_tuner_callback;
1064
1065                /* attach tuner chip */
1066                dvb_attach(r820t_attach, dev->dvb->frontend,
1067                           tuner_i2c,
1068                           &astrometa_t2hybrid_r820t_config);
1069                break;
1070        }
1071        default:
1072                dev_err(dev->dev,
1073                        "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
1074                        dev->name);
1075                break;
1076        }
1077        if (NULL == dvb->frontend) {
1078                dev_err(dev->dev,
1079                       "%s/2: frontend initialization failed\n", dev->name);
1080                result = -EINVAL;
1081                goto out_free;
1082        }
1083
1084        /* register everything */
1085        result = register_dvb(dvb, THIS_MODULE, dev, dev->dev);
1086
1087        if (result < 0)
1088                goto out_free;
1089
1090
1091        dev_info(dev->dev, "Successfully loaded cx231xx-dvb\n");
1092
1093ret:
1094        cx231xx_set_mode(dev, CX231XX_SUSPEND);
1095        mutex_unlock(&dev->lock);
1096        return result;
1097
1098out_free:
1099        kfree(dvb);
1100        dev->dvb = NULL;
1101        goto ret;
1102}
1103
1104static int dvb_fini(struct cx231xx *dev)
1105{
1106        if (!dev->board.has_dvb) {
1107                /* This device does not support the extension */
1108                return 0;
1109        }
1110
1111        if (dev->dvb) {
1112                unregister_dvb(dev->dvb);
1113                dev->dvb = NULL;
1114        }
1115
1116        return 0;
1117}
1118
1119static struct cx231xx_ops dvb_ops = {
1120        .id = CX231XX_DVB,
1121        .name = "Cx231xx dvb Extension",
1122        .init = dvb_init,
1123        .fini = dvb_fini,
1124};
1125
1126static int __init cx231xx_dvb_register(void)
1127{
1128        return cx231xx_register_extension(&dvb_ops);
1129}
1130
1131static void __exit cx231xx_dvb_unregister(void)
1132{
1133        cx231xx_unregister_extension(&dvb_ops);
1134}
1135
1136module_init(cx231xx_dvb_register);
1137module_exit(cx231xx_dvb_unregister);
1138