linux/drivers/media/video/em28xx/em28xx-dvb.c
<<
>>
Prefs
   1/*
   2 DVB device driver for em28xx
   3
   4 (c) 2008-2011 Mauro Carvalho Chehab <mchehab@infradead.org>
   5
   6 (c) 2008 Devin Heitmueller <devin.heitmueller@gmail.com>
   7        - Fixes for the driver to properly work with HVR-950
   8        - Fixes for the driver to properly work with Pinnacle PCTV HD Pro Stick
   9        - Fixes for the driver to properly work with AMD ATI TV Wonder HD 600
  10
  11 (c) 2008 Aidan Thornton <makosoft@googlemail.com>
  12
  13 Based on cx88-dvb, saa7134-dvb and videobuf-dvb originally written by:
  14        (c) 2004, 2005 Chris Pascoe <c.pascoe@itee.uq.edu.au>
  15        (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
  16
  17 This program is free software; you can redistribute it and/or modify
  18 it under the terms of the GNU General Public License as published by
  19 the Free Software Foundation; either version 2 of the License.
  20 */
  21
  22#include <linux/kernel.h>
  23#include <linux/slab.h>
  24#include <linux/usb.h>
  25
  26#include "em28xx.h"
  27#include <media/v4l2-common.h>
  28#include <media/videobuf-vmalloc.h>
  29#include <media/tuner.h>
  30#include "tuner-simple.h"
  31
  32#include "lgdt330x.h"
  33#include "lgdt3305.h"
  34#include "zl10353.h"
  35#include "s5h1409.h"
  36#include "mt352.h"
  37#include "mt352_priv.h" /* FIXME */
  38#include "tda1002x.h"
  39#include "tda18271.h"
  40#include "s921.h"
  41#include "drxd.h"
  42#include "cxd2820r.h"
  43#include "tda18271c2dd.h"
  44#include "drxk.h"
  45#include "tda10071.h"
  46#include "a8293.h"
  47#include "qt1010.h"
  48
  49MODULE_DESCRIPTION("driver for em28xx based DVB cards");
  50MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
  51MODULE_LICENSE("GPL");
  52
  53static unsigned int debug;
  54module_param(debug, int, 0644);
  55MODULE_PARM_DESC(debug, "enable debug messages [dvb]");
  56
  57DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  58
  59#define dprintk(level, fmt, arg...) do {                        \
  60if (debug >= level)                                             \
  61        printk(KERN_DEBUG "%s/2-dvb: " fmt, dev->name, ## arg); \
  62} while (0)
  63
  64#define EM28XX_DVB_NUM_BUFS 5
  65#define EM28XX_DVB_MAX_PACKETS 64
  66
  67struct em28xx_dvb {
  68        struct dvb_frontend        *fe[2];
  69
  70        /* feed count management */
  71        struct mutex               lock;
  72        int                        nfeeds;
  73
  74        /* general boilerplate stuff */
  75        struct dvb_adapter         adapter;
  76        struct dvb_demux           demux;
  77        struct dmxdev              dmxdev;
  78        struct dmx_frontend        fe_hw;
  79        struct dmx_frontend        fe_mem;
  80        struct dvb_net             net;
  81
  82        /* Due to DRX-K - probably need changes */
  83        int (*gate_ctrl)(struct dvb_frontend *, int);
  84        struct semaphore      pll_mutex;
  85        bool                    dont_attach_fe1;
  86};
  87
  88
  89static inline void print_err_status(struct em28xx *dev,
  90                                     int packet, int status)
  91{
  92        char *errmsg = "Unknown";
  93
  94        switch (status) {
  95        case -ENOENT:
  96                errmsg = "unlinked synchronuously";
  97                break;
  98        case -ECONNRESET:
  99                errmsg = "unlinked asynchronuously";
 100                break;
 101        case -ENOSR:
 102                errmsg = "Buffer error (overrun)";
 103                break;
 104        case -EPIPE:
 105                errmsg = "Stalled (device not responding)";
 106                break;
 107        case -EOVERFLOW:
 108                errmsg = "Babble (bad cable?)";
 109                break;
 110        case -EPROTO:
 111                errmsg = "Bit-stuff error (bad cable?)";
 112                break;
 113        case -EILSEQ:
 114                errmsg = "CRC/Timeout (could be anything)";
 115                break;
 116        case -ETIME:
 117                errmsg = "Device does not respond";
 118                break;
 119        }
 120        if (packet < 0) {
 121                dprintk(1, "URB status %d [%s].\n", status, errmsg);
 122        } else {
 123                dprintk(1, "URB packet %d, status %d [%s].\n",
 124                        packet, status, errmsg);
 125        }
 126}
 127
 128static inline int em28xx_dvb_isoc_copy(struct em28xx *dev, struct urb *urb)
 129{
 130        int i;
 131
 132        if (!dev)
 133                return 0;
 134
 135        if ((dev->state & DEV_DISCONNECTED) || (dev->state & DEV_MISCONFIGURED))
 136                return 0;
 137
 138        if (urb->status < 0) {
 139                print_err_status(dev, -1, urb->status);
 140                if (urb->status == -ENOENT)
 141                        return 0;
 142        }
 143
 144        for (i = 0; i < urb->number_of_packets; i++) {
 145                int status = urb->iso_frame_desc[i].status;
 146
 147                if (status < 0) {
 148                        print_err_status(dev, i, status);
 149                        if (urb->iso_frame_desc[i].status != -EPROTO)
 150                                continue;
 151                }
 152
 153                dvb_dmx_swfilter(&dev->dvb->demux, urb->transfer_buffer +
 154                                 urb->iso_frame_desc[i].offset,
 155                                 urb->iso_frame_desc[i].actual_length);
 156        }
 157
 158        return 0;
 159}
 160
 161static int em28xx_start_streaming(struct em28xx_dvb *dvb)
 162{
 163        int rc;
 164        struct em28xx *dev = dvb->adapter.priv;
 165        int max_dvb_packet_size;
 166
 167        usb_set_interface(dev->udev, 0, dev->dvb_alt);
 168        rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
 169        if (rc < 0)
 170                return rc;
 171
 172        max_dvb_packet_size = dev->dvb_max_pkt_size;
 173        if (max_dvb_packet_size < 0)
 174                return max_dvb_packet_size;
 175        dprintk(1, "Using %d buffers each with %d bytes\n",
 176                EM28XX_DVB_NUM_BUFS,
 177                max_dvb_packet_size);
 178
 179        return em28xx_init_isoc(dev, EM28XX_DVB_MAX_PACKETS,
 180                                EM28XX_DVB_NUM_BUFS, max_dvb_packet_size,
 181                                em28xx_dvb_isoc_copy);
 182}
 183
 184static int em28xx_stop_streaming(struct em28xx_dvb *dvb)
 185{
 186        struct em28xx *dev = dvb->adapter.priv;
 187
 188        em28xx_uninit_isoc(dev);
 189
 190        em28xx_set_mode(dev, EM28XX_SUSPEND);
 191
 192        return 0;
 193}
 194
 195static int em28xx_start_feed(struct dvb_demux_feed *feed)
 196{
 197        struct dvb_demux *demux  = feed->demux;
 198        struct em28xx_dvb *dvb = demux->priv;
 199        int rc, ret;
 200
 201        if (!demux->dmx.frontend)
 202                return -EINVAL;
 203
 204        mutex_lock(&dvb->lock);
 205        dvb->nfeeds++;
 206        rc = dvb->nfeeds;
 207
 208        if (dvb->nfeeds == 1) {
 209                ret = em28xx_start_streaming(dvb);
 210                if (ret < 0)
 211                        rc = ret;
 212        }
 213
 214        mutex_unlock(&dvb->lock);
 215        return rc;
 216}
 217
 218static int em28xx_stop_feed(struct dvb_demux_feed *feed)
 219{
 220        struct dvb_demux *demux  = feed->demux;
 221        struct em28xx_dvb *dvb = demux->priv;
 222        int err = 0;
 223
 224        mutex_lock(&dvb->lock);
 225        dvb->nfeeds--;
 226
 227        if (0 == dvb->nfeeds)
 228                err = em28xx_stop_streaming(dvb);
 229
 230        mutex_unlock(&dvb->lock);
 231        return err;
 232}
 233
 234
 235
 236/* ------------------------------------------------------------------ */
 237static int em28xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
 238{
 239        struct em28xx *dev = fe->dvb->priv;
 240
 241        if (acquire)
 242                return em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
 243        else
 244                return em28xx_set_mode(dev, EM28XX_SUSPEND);
 245}
 246
 247/* ------------------------------------------------------------------ */
 248
 249static struct lgdt330x_config em2880_lgdt3303_dev = {
 250        .demod_address = 0x0e,
 251        .demod_chip = LGDT3303,
 252};
 253
 254static struct lgdt3305_config em2870_lgdt3304_dev = {
 255        .i2c_addr           = 0x0e,
 256        .demod_chip         = LGDT3304,
 257        .spectral_inversion = 1,
 258        .deny_i2c_rptr      = 1,
 259        .mpeg_mode          = LGDT3305_MPEG_PARALLEL,
 260        .tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
 261        .tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
 262        .vsb_if_khz         = 3250,
 263        .qam_if_khz         = 4000,
 264};
 265
 266static struct s921_config sharp_isdbt = {
 267        .demod_address = 0x30 >> 1
 268};
 269
 270static struct zl10353_config em28xx_zl10353_with_xc3028 = {
 271        .demod_address = (0x1e >> 1),
 272        .no_tuner = 1,
 273        .parallel_ts = 1,
 274        .if2 = 45600,
 275};
 276
 277static struct s5h1409_config em28xx_s5h1409_with_xc3028 = {
 278        .demod_address = 0x32 >> 1,
 279        .output_mode   = S5H1409_PARALLEL_OUTPUT,
 280        .gpio          = S5H1409_GPIO_OFF,
 281        .inversion     = S5H1409_INVERSION_OFF,
 282        .status_mode   = S5H1409_DEMODLOCKING,
 283        .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK
 284};
 285
 286static struct tda18271_std_map kworld_a340_std_map = {
 287        .atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 0,
 288                      .if_lvl = 1, .rfagc_top = 0x37, },
 289        .qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 1,
 290                      .if_lvl = 1, .rfagc_top = 0x37, },
 291};
 292
 293static struct tda18271_config kworld_a340_config = {
 294        .std_map           = &kworld_a340_std_map,
 295};
 296
 297static struct zl10353_config em28xx_zl10353_xc3028_no_i2c_gate = {
 298        .demod_address = (0x1e >> 1),
 299        .no_tuner = 1,
 300        .disable_i2c_gate_ctrl = 1,
 301        .parallel_ts = 1,
 302        .if2 = 45600,
 303};
 304
 305static struct drxd_config em28xx_drxd = {
 306        .demod_address = 0x70,
 307        .demod_revision = 0xa2,
 308        .pll_type = DRXD_PLL_NONE,
 309        .clock = 12000,
 310        .insert_rs_byte = 1,
 311        .IF = 42800000,
 312        .disable_i2c_gate_ctrl = 1,
 313};
 314
 315struct drxk_config terratec_h5_drxk = {
 316        .adr = 0x29,
 317        .single_master = 1,
 318        .no_i2c_bridge = 1,
 319        .microcode_name = "dvb-usb-terratec-h5-drxk.fw",
 320};
 321
 322struct drxk_config hauppauge_930c_drxk = {
 323        .adr = 0x29,
 324        .single_master = 1,
 325        .no_i2c_bridge = 1,
 326        .microcode_name = "dvb-usb-hauppauge-hvr930c-drxk.fw",
 327        .chunk_size = 56,
 328};
 329
 330static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
 331{
 332        struct em28xx_dvb *dvb = fe->sec_priv;
 333        int status;
 334
 335        if (!dvb)
 336                return -EINVAL;
 337
 338        if (enable) {
 339                down(&dvb->pll_mutex);
 340                status = dvb->gate_ctrl(fe, 1);
 341        } else {
 342                status = dvb->gate_ctrl(fe, 0);
 343                up(&dvb->pll_mutex);
 344        }
 345        return status;
 346}
 347
 348static void hauppauge_hvr930c_init(struct em28xx *dev)
 349{
 350        int i;
 351
 352        struct em28xx_reg_seq hauppauge_hvr930c_init[] = {
 353                {EM2874_R80_GPIO,       0xff,   0xff,   0x65},
 354                {EM2874_R80_GPIO,       0xfb,   0xff,   0x32},
 355                {EM2874_R80_GPIO,       0xff,   0xff,   0xb8},
 356                { -1,                   -1,     -1,     -1},
 357        };
 358        struct em28xx_reg_seq hauppauge_hvr930c_end[] = {
 359                {EM2874_R80_GPIO,       0xef,   0xff,   0x01},
 360                {EM2874_R80_GPIO,       0xaf,   0xff,   0x65},
 361                {EM2874_R80_GPIO,       0xef,   0xff,   0x76},
 362                {EM2874_R80_GPIO,       0xef,   0xff,   0x01},
 363                {EM2874_R80_GPIO,       0xcf,   0xff,   0x0b},
 364                {EM2874_R80_GPIO,       0xef,   0xff,   0x40},
 365
 366                {EM2874_R80_GPIO,       0xcf,   0xff,   0x65},
 367                {EM2874_R80_GPIO,       0xef,   0xff,   0x65},
 368                {EM2874_R80_GPIO,       0xcf,   0xff,   0x0b},
 369                {EM2874_R80_GPIO,       0xef,   0xff,   0x65},
 370
 371                { -1,                   -1,     -1,     -1},
 372        };
 373
 374        struct {
 375                unsigned char r[4];
 376                int len;
 377        } regs[] = {
 378                {{ 0x06, 0x02, 0x00, 0x31 }, 4},
 379                {{ 0x01, 0x02 }, 2},
 380                {{ 0x01, 0x02, 0x00, 0xc6 }, 4},
 381                {{ 0x01, 0x00 }, 2},
 382                {{ 0x01, 0x00, 0xff, 0xaf }, 4},
 383                {{ 0x01, 0x00, 0x03, 0xa0 }, 4},
 384                {{ 0x01, 0x00 }, 2},
 385                {{ 0x01, 0x00, 0x73, 0xaf }, 4},
 386                {{ 0x04, 0x00 }, 2},
 387                {{ 0x00, 0x04 }, 2},
 388                {{ 0x00, 0x04, 0x00, 0x0a }, 4},
 389                {{ 0x04, 0x14 }, 2},
 390                {{ 0x04, 0x14, 0x00, 0x00 }, 4},
 391        };
 392
 393        em28xx_gpio_set(dev, hauppauge_hvr930c_init);
 394        em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
 395        msleep(10);
 396        em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44);
 397        msleep(10);
 398
 399        dev->i2c_client.addr = 0x82 >> 1;
 400
 401        for (i = 0; i < ARRAY_SIZE(regs); i++)
 402                i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
 403        em28xx_gpio_set(dev, hauppauge_hvr930c_end);
 404
 405        msleep(100);
 406
 407        em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44);
 408        msleep(30);
 409
 410        em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x45);
 411        msleep(10);
 412
 413}
 414
 415static void terratec_h5_init(struct em28xx *dev)
 416{
 417        int i;
 418        struct em28xx_reg_seq terratec_h5_init[] = {
 419                {EM28XX_R08_GPIO,       0xff,   0xff,   10},
 420                {EM2874_R80_GPIO,       0xf6,   0xff,   100},
 421                {EM2874_R80_GPIO,       0xf2,   0xff,   50},
 422                {EM2874_R80_GPIO,       0xf6,   0xff,   100},
 423                { -1,                   -1,     -1,     -1},
 424        };
 425        struct em28xx_reg_seq terratec_h5_end[] = {
 426                {EM2874_R80_GPIO,       0xe6,   0xff,   100},
 427                {EM2874_R80_GPIO,       0xa6,   0xff,   50},
 428                {EM2874_R80_GPIO,       0xe6,   0xff,   100},
 429                { -1,                   -1,     -1,     -1},
 430        };
 431        struct {
 432                unsigned char r[4];
 433                int len;
 434        } regs[] = {
 435                {{ 0x06, 0x02, 0x00, 0x31 }, 4},
 436                {{ 0x01, 0x02 }, 2},
 437                {{ 0x01, 0x02, 0x00, 0xc6 }, 4},
 438                {{ 0x01, 0x00 }, 2},
 439                {{ 0x01, 0x00, 0xff, 0xaf }, 4},
 440                {{ 0x01, 0x00, 0x03, 0xa0 }, 4},
 441                {{ 0x01, 0x00 }, 2},
 442                {{ 0x01, 0x00, 0x73, 0xaf }, 4},
 443                {{ 0x04, 0x00 }, 2},
 444                {{ 0x00, 0x04 }, 2},
 445                {{ 0x00, 0x04, 0x00, 0x0a }, 4},
 446                {{ 0x04, 0x14 }, 2},
 447                {{ 0x04, 0x14, 0x00, 0x00 }, 4},
 448        };
 449
 450        em28xx_gpio_set(dev, terratec_h5_init);
 451        em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
 452        msleep(10);
 453        em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x45);
 454        msleep(10);
 455
 456        dev->i2c_client.addr = 0x82 >> 1;
 457
 458        for (i = 0; i < ARRAY_SIZE(regs); i++)
 459                i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
 460        em28xx_gpio_set(dev, terratec_h5_end);
 461};
 462
 463static int em28xx_mt352_terratec_xs_init(struct dvb_frontend *fe)
 464{
 465        /* Values extracted from a USB trace of the Terratec Windows driver */
 466        static u8 clock_config[]   = { CLOCK_CTL,  0x38, 0x2c };
 467        static u8 reset[]          = { RESET,      0x80 };
 468        static u8 adc_ctl_1_cfg[]  = { ADC_CTL_1,  0x40 };
 469        static u8 agc_cfg[]        = { AGC_TARGET, 0x28, 0xa0 };
 470        static u8 input_freq_cfg[] = { INPUT_FREQ_1, 0x31, 0xb8 };
 471        static u8 rs_err_cfg[]     = { RS_ERR_PER_1, 0x00, 0x4d };
 472        static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
 473        static u8 trl_nom_cfg[]    = { TRL_NOMINAL_RATE_1, 0x64, 0x00 };
 474        static u8 tps_given_cfg[]  = { TPS_GIVEN_1, 0x40, 0x80, 0x50 };
 475        static u8 tuner_go[]       = { TUNER_GO, 0x01};
 476
 477        mt352_write(fe, clock_config,   sizeof(clock_config));
 478        udelay(200);
 479        mt352_write(fe, reset,          sizeof(reset));
 480        mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
 481        mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
 482        mt352_write(fe, input_freq_cfg, sizeof(input_freq_cfg));
 483        mt352_write(fe, rs_err_cfg,     sizeof(rs_err_cfg));
 484        mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
 485        mt352_write(fe, trl_nom_cfg,    sizeof(trl_nom_cfg));
 486        mt352_write(fe, tps_given_cfg,  sizeof(tps_given_cfg));
 487        mt352_write(fe, tuner_go,       sizeof(tuner_go));
 488        return 0;
 489}
 490
 491static struct mt352_config terratec_xs_mt352_cfg = {
 492        .demod_address = (0x1e >> 1),
 493        .no_tuner = 1,
 494        .if2 = 45600,
 495        .demod_init = em28xx_mt352_terratec_xs_init,
 496};
 497
 498static struct tda10023_config em28xx_tda10023_config = {
 499        .demod_address = 0x0c,
 500        .invert = 1,
 501};
 502
 503static struct cxd2820r_config em28xx_cxd2820r_config = {
 504        .i2c_address = (0xd8 >> 1),
 505        .ts_mode = CXD2820R_TS_SERIAL,
 506
 507        /* enable LNA for DVB-T2 and DVB-C */
 508        .gpio_dvbt2[0] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | CXD2820R_GPIO_L,
 509        .gpio_dvbc[0] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | CXD2820R_GPIO_L,
 510};
 511
 512static struct tda18271_config em28xx_cxd2820r_tda18271_config = {
 513        .output_opt = TDA18271_OUTPUT_LT_OFF,
 514        .gate = TDA18271_GATE_DIGITAL,
 515};
 516
 517static const struct tda10071_config em28xx_tda10071_config = {
 518        .i2c_address = 0x55, /* (0xaa >> 1) */
 519        .i2c_wr_max = 64,
 520        .ts_mode = TDA10071_TS_SERIAL,
 521        .spec_inv = 0,
 522        .xtal = 40444000, /* 40.444 MHz */
 523        .pll_multiplier = 20,
 524};
 525
 526static const struct a8293_config em28xx_a8293_config = {
 527        .i2c_addr = 0x08, /* (0x10 >> 1) */
 528};
 529
 530static struct zl10353_config em28xx_zl10353_no_i2c_gate_dev = {
 531        .demod_address = (0x1e >> 1),
 532        .disable_i2c_gate_ctrl = 1,
 533        .no_tuner = 1,
 534        .parallel_ts = 1,
 535};
 536static struct qt1010_config em28xx_qt1010_config = {
 537        .i2c_address = 0x62
 538
 539};
 540
 541/* ------------------------------------------------------------------ */
 542
 543static int em28xx_attach_xc3028(u8 addr, struct em28xx *dev)
 544{
 545        struct dvb_frontend *fe;
 546        struct xc2028_config cfg;
 547
 548        memset(&cfg, 0, sizeof(cfg));
 549        cfg.i2c_adap  = &dev->i2c_adap;
 550        cfg.i2c_addr  = addr;
 551
 552        if (!dev->dvb->fe[0]) {
 553                em28xx_errdev("/2: dvb frontend not attached. "
 554                                "Can't attach xc3028\n");
 555                return -EINVAL;
 556        }
 557
 558        fe = dvb_attach(xc2028_attach, dev->dvb->fe[0], &cfg);
 559        if (!fe) {
 560                em28xx_errdev("/2: xc3028 attach failed\n");
 561                dvb_frontend_detach(dev->dvb->fe[0]);
 562                dev->dvb->fe[0] = NULL;
 563                return -EINVAL;
 564        }
 565
 566        em28xx_info("%s/2: xc3028 attached\n", dev->name);
 567
 568        return 0;
 569}
 570
 571/* ------------------------------------------------------------------ */
 572
 573static int em28xx_register_dvb(struct em28xx_dvb *dvb, struct module *module,
 574                               struct em28xx *dev, struct device *device)
 575{
 576        int result;
 577
 578        mutex_init(&dvb->lock);
 579
 580        /* register adapter */
 581        result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
 582                                      adapter_nr);
 583        if (result < 0) {
 584                printk(KERN_WARNING "%s: dvb_register_adapter failed (errno = %d)\n",
 585                       dev->name, result);
 586                goto fail_adapter;
 587        }
 588
 589        /* Ensure all frontends negotiate bus access */
 590        dvb->fe[0]->ops.ts_bus_ctrl = em28xx_dvb_bus_ctrl;
 591        if (dvb->fe[1])
 592                dvb->fe[1]->ops.ts_bus_ctrl = em28xx_dvb_bus_ctrl;
 593
 594        dvb->adapter.priv = dev;
 595
 596        /* register frontend */
 597        result = dvb_register_frontend(&dvb->adapter, dvb->fe[0]);
 598        if (result < 0) {
 599                printk(KERN_WARNING "%s: dvb_register_frontend failed (errno = %d)\n",
 600                       dev->name, result);
 601                goto fail_frontend0;
 602        }
 603
 604        /* register 2nd frontend */
 605        if (dvb->fe[1]) {
 606                result = dvb_register_frontend(&dvb->adapter, dvb->fe[1]);
 607                if (result < 0) {
 608                        printk(KERN_WARNING "%s: 2nd dvb_register_frontend failed (errno = %d)\n",
 609                                dev->name, result);
 610                        goto fail_frontend1;
 611                }
 612        }
 613
 614        /* register demux stuff */
 615        dvb->demux.dmx.capabilities =
 616                DMX_TS_FILTERING | DMX_SECTION_FILTERING |
 617                DMX_MEMORY_BASED_FILTERING;
 618        dvb->demux.priv       = dvb;
 619        dvb->demux.filternum  = 256;
 620        dvb->demux.feednum    = 256;
 621        dvb->demux.start_feed = em28xx_start_feed;
 622        dvb->demux.stop_feed  = em28xx_stop_feed;
 623
 624        result = dvb_dmx_init(&dvb->demux);
 625        if (result < 0) {
 626                printk(KERN_WARNING "%s: dvb_dmx_init failed (errno = %d)\n",
 627                       dev->name, result);
 628                goto fail_dmx;
 629        }
 630
 631        dvb->dmxdev.filternum    = 256;
 632        dvb->dmxdev.demux        = &dvb->demux.dmx;
 633        dvb->dmxdev.capabilities = 0;
 634        result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
 635        if (result < 0) {
 636                printk(KERN_WARNING "%s: dvb_dmxdev_init failed (errno = %d)\n",
 637                       dev->name, result);
 638                goto fail_dmxdev;
 639        }
 640
 641        dvb->fe_hw.source = DMX_FRONTEND_0;
 642        result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
 643        if (result < 0) {
 644                printk(KERN_WARNING "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
 645                       dev->name, result);
 646                goto fail_fe_hw;
 647        }
 648
 649        dvb->fe_mem.source = DMX_MEMORY_FE;
 650        result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
 651        if (result < 0) {
 652                printk(KERN_WARNING "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
 653                       dev->name, result);
 654                goto fail_fe_mem;
 655        }
 656
 657        result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
 658        if (result < 0) {
 659                printk(KERN_WARNING "%s: connect_frontend failed (errno = %d)\n",
 660                       dev->name, result);
 661                goto fail_fe_conn;
 662        }
 663
 664        /* register network adapter */
 665        dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
 666        return 0;
 667
 668fail_fe_conn:
 669        dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
 670fail_fe_mem:
 671        dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
 672fail_fe_hw:
 673        dvb_dmxdev_release(&dvb->dmxdev);
 674fail_dmxdev:
 675        dvb_dmx_release(&dvb->demux);
 676fail_dmx:
 677        if (dvb->fe[1])
 678                dvb_unregister_frontend(dvb->fe[1]);
 679        dvb_unregister_frontend(dvb->fe[0]);
 680fail_frontend1:
 681        if (dvb->fe[1])
 682                dvb_frontend_detach(dvb->fe[1]);
 683fail_frontend0:
 684        dvb_frontend_detach(dvb->fe[0]);
 685        dvb_unregister_adapter(&dvb->adapter);
 686fail_adapter:
 687        return result;
 688}
 689
 690static void em28xx_unregister_dvb(struct em28xx_dvb *dvb)
 691{
 692        dvb_net_release(&dvb->net);
 693        dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
 694        dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
 695        dvb_dmxdev_release(&dvb->dmxdev);
 696        dvb_dmx_release(&dvb->demux);
 697        if (dvb->fe[1])
 698                dvb_unregister_frontend(dvb->fe[1]);
 699        dvb_unregister_frontend(dvb->fe[0]);
 700        if (dvb->fe[1] && !dvb->dont_attach_fe1)
 701                dvb_frontend_detach(dvb->fe[1]);
 702        dvb_frontend_detach(dvb->fe[0]);
 703        dvb_unregister_adapter(&dvb->adapter);
 704}
 705
 706static int em28xx_dvb_init(struct em28xx *dev)
 707{
 708        int result = 0, mfe_shared = 0;
 709        struct em28xx_dvb *dvb;
 710
 711        if (!dev->board.has_dvb) {
 712                /* This device does not support the extension */
 713                printk(KERN_INFO "em28xx_dvb: This device does not support the extension\n");
 714                return 0;
 715        }
 716
 717        dvb = kzalloc(sizeof(struct em28xx_dvb), GFP_KERNEL);
 718
 719        if (dvb == NULL) {
 720                em28xx_info("em28xx_dvb: memory allocation failed\n");
 721                return -ENOMEM;
 722        }
 723        dev->dvb = dvb;
 724        dvb->fe[0] = dvb->fe[1] = NULL;
 725
 726        mutex_lock(&dev->lock);
 727        em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
 728        /* init frontend */
 729        switch (dev->model) {
 730        case EM2874_BOARD_LEADERSHIP_ISDBT:
 731                dvb->fe[0] = dvb_attach(s921_attach,
 732                                &sharp_isdbt, &dev->i2c_adap);
 733
 734                if (!dvb->fe[0]) {
 735                        result = -EINVAL;
 736                        goto out_free;
 737                }
 738
 739                break;
 740        case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
 741        case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
 742        case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
 743        case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
 744                dvb->fe[0] = dvb_attach(lgdt330x_attach,
 745                                           &em2880_lgdt3303_dev,
 746                                           &dev->i2c_adap);
 747                if (em28xx_attach_xc3028(0x61, dev) < 0) {
 748                        result = -EINVAL;
 749                        goto out_free;
 750                }
 751                break;
 752        case EM2880_BOARD_KWORLD_DVB_310U:
 753                dvb->fe[0] = dvb_attach(zl10353_attach,
 754                                           &em28xx_zl10353_with_xc3028,
 755                                           &dev->i2c_adap);
 756                if (em28xx_attach_xc3028(0x61, dev) < 0) {
 757                        result = -EINVAL;
 758                        goto out_free;
 759                }
 760                break;
 761        case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
 762        case EM2882_BOARD_TERRATEC_HYBRID_XS:
 763        case EM2880_BOARD_EMPIRE_DUAL_TV:
 764                dvb->fe[0] = dvb_attach(zl10353_attach,
 765                                           &em28xx_zl10353_xc3028_no_i2c_gate,
 766                                           &dev->i2c_adap);
 767                if (em28xx_attach_xc3028(0x61, dev) < 0) {
 768                        result = -EINVAL;
 769                        goto out_free;
 770                }
 771                break;
 772        case EM2880_BOARD_TERRATEC_HYBRID_XS:
 773        case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
 774        case EM2881_BOARD_PINNACLE_HYBRID_PRO:
 775        case EM2882_BOARD_DIKOM_DK300:
 776        case EM2882_BOARD_KWORLD_VS_DVBT:
 777                dvb->fe[0] = dvb_attach(zl10353_attach,
 778                                           &em28xx_zl10353_xc3028_no_i2c_gate,
 779                                           &dev->i2c_adap);
 780                if (dvb->fe[0] == NULL) {
 781                        /* This board could have either a zl10353 or a mt352.
 782                           If the chip id isn't for zl10353, try mt352 */
 783                        dvb->fe[0] = dvb_attach(mt352_attach,
 784                                                   &terratec_xs_mt352_cfg,
 785                                                   &dev->i2c_adap);
 786                }
 787
 788                if (em28xx_attach_xc3028(0x61, dev) < 0) {
 789                        result = -EINVAL;
 790                        goto out_free;
 791                }
 792                break;
 793        case EM2870_BOARD_KWORLD_355U:
 794                dvb->fe[0] = dvb_attach(zl10353_attach,
 795                                           &em28xx_zl10353_no_i2c_gate_dev,
 796                                           &dev->i2c_adap);
 797                if (dvb->fe[0] != NULL)
 798                        dvb_attach(qt1010_attach, dvb->fe[0],
 799                                   &dev->i2c_adap, &em28xx_qt1010_config);
 800                break;
 801        case EM2883_BOARD_KWORLD_HYBRID_330U:
 802        case EM2882_BOARD_EVGA_INDTUBE:
 803                dvb->fe[0] = dvb_attach(s5h1409_attach,
 804                                           &em28xx_s5h1409_with_xc3028,
 805                                           &dev->i2c_adap);
 806                if (em28xx_attach_xc3028(0x61, dev) < 0) {
 807                        result = -EINVAL;
 808                        goto out_free;
 809                }
 810                break;
 811        case EM2882_BOARD_KWORLD_ATSC_315U:
 812                dvb->fe[0] = dvb_attach(lgdt330x_attach,
 813                                           &em2880_lgdt3303_dev,
 814                                           &dev->i2c_adap);
 815                if (dvb->fe[0] != NULL) {
 816                        if (!dvb_attach(simple_tuner_attach, dvb->fe[0],
 817                                &dev->i2c_adap, 0x61, TUNER_THOMSON_DTT761X)) {
 818                                result = -EINVAL;
 819                                goto out_free;
 820                        }
 821                }
 822                break;
 823        case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
 824        case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:
 825                dvb->fe[0] = dvb_attach(drxd_attach, &em28xx_drxd, NULL,
 826                                           &dev->i2c_adap, &dev->udev->dev);
 827                if (em28xx_attach_xc3028(0x61, dev) < 0) {
 828                        result = -EINVAL;
 829                        goto out_free;
 830                }
 831                break;
 832        case EM2870_BOARD_REDDO_DVB_C_USB_BOX:
 833                /* Philips CU1216L NIM (Philips TDA10023 + Infineon TUA6034) */
 834                dvb->fe[0] = dvb_attach(tda10023_attach,
 835                        &em28xx_tda10023_config,
 836                        &dev->i2c_adap, 0x48);
 837                if (dvb->fe[0]) {
 838                        if (!dvb_attach(simple_tuner_attach, dvb->fe[0],
 839                                &dev->i2c_adap, 0x60, TUNER_PHILIPS_CU1216L)) {
 840                                result = -EINVAL;
 841                                goto out_free;
 842                        }
 843                }
 844                break;
 845        case EM2870_BOARD_KWORLD_A340:
 846                dvb->fe[0] = dvb_attach(lgdt3305_attach,
 847                                           &em2870_lgdt3304_dev,
 848                                           &dev->i2c_adap);
 849                if (dvb->fe[0] != NULL)
 850                        dvb_attach(tda18271_attach, dvb->fe[0], 0x60,
 851                                   &dev->i2c_adap, &kworld_a340_config);
 852                break;
 853        case EM28174_BOARD_PCTV_290E:
 854                dvb->fe[0] = dvb_attach(cxd2820r_attach,
 855                                        &em28xx_cxd2820r_config,
 856                                        &dev->i2c_adap);
 857                if (dvb->fe[0]) {
 858                        /* FE 0 attach tuner */
 859                        if (!dvb_attach(tda18271_attach,
 860                                        dvb->fe[0],
 861                                        0x60,
 862                                        &dev->i2c_adap,
 863                                        &em28xx_cxd2820r_tda18271_config)) {
 864
 865                                dvb_frontend_detach(dvb->fe[0]);
 866                                result = -EINVAL;
 867                                goto out_free;
 868                        }
 869                }
 870                break;
 871        case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
 872        {
 873                struct xc5000_config cfg;
 874                hauppauge_hvr930c_init(dev);
 875
 876                dvb->fe[0] = dvb_attach(drxk_attach,
 877                                        &hauppauge_930c_drxk, &dev->i2c_adap);
 878                if (!dvb->fe[0]) {
 879                        result = -EINVAL;
 880                        goto out_free;
 881                }
 882                /* FIXME: do we need a pll semaphore? */
 883                dvb->fe[0]->sec_priv = dvb;
 884                sema_init(&dvb->pll_mutex, 1);
 885                dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl;
 886                dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl;
 887
 888                /* Attach xc5000 */
 889                memset(&cfg, 0, sizeof(cfg));
 890                cfg.i2c_address  = 0x61;
 891                cfg.if_khz = 4000;
 892
 893                if (dvb->fe[0]->ops.i2c_gate_ctrl)
 894                        dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 1);
 895                if (!dvb_attach(xc5000_attach, dvb->fe[0], &dev->i2c_adap,
 896                                &cfg)) {
 897                        result = -EINVAL;
 898                        goto out_free;
 899                }
 900                if (dvb->fe[0]->ops.i2c_gate_ctrl)
 901                        dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0);
 902
 903                break;
 904        }
 905        case EM2884_BOARD_TERRATEC_H5:
 906        case EM2884_BOARD_CINERGY_HTC_STICK:
 907                terratec_h5_init(dev);
 908
 909                dvb->fe[0] = dvb_attach(drxk_attach, &terratec_h5_drxk, &dev->i2c_adap);
 910                if (!dvb->fe[0]) {
 911                        result = -EINVAL;
 912                        goto out_free;
 913                }
 914                /* FIXME: do we need a pll semaphore? */
 915                dvb->fe[0]->sec_priv = dvb;
 916                sema_init(&dvb->pll_mutex, 1);
 917                dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl;
 918                dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl;
 919
 920                /* Attach tda18271 to DVB-C frontend */
 921                if (dvb->fe[0]->ops.i2c_gate_ctrl)
 922                        dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 1);
 923                if (!dvb_attach(tda18271c2dd_attach, dvb->fe[0], &dev->i2c_adap, 0x60)) {
 924                        result = -EINVAL;
 925                        goto out_free;
 926                }
 927                if (dvb->fe[0]->ops.i2c_gate_ctrl)
 928                        dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0);
 929
 930                break;
 931        case EM28174_BOARD_PCTV_460E:
 932                /* attach demod */
 933                dvb->fe[0] = dvb_attach(tda10071_attach,
 934                        &em28xx_tda10071_config, &dev->i2c_adap);
 935
 936                /* attach SEC */
 937                if (dvb->fe[0])
 938                        dvb_attach(a8293_attach, dvb->fe[0], &dev->i2c_adap,
 939                                &em28xx_a8293_config);
 940                break;
 941        default:
 942                em28xx_errdev("/2: The frontend of your DVB/ATSC card"
 943                                " isn't supported yet\n");
 944                break;
 945        }
 946        if (NULL == dvb->fe[0]) {
 947                em28xx_errdev("/2: frontend initialization failed\n");
 948                result = -EINVAL;
 949                goto out_free;
 950        }
 951        /* define general-purpose callback pointer */
 952        dvb->fe[0]->callback = em28xx_tuner_callback;
 953        if (dvb->fe[1])
 954                dvb->fe[1]->callback = em28xx_tuner_callback;
 955
 956        /* register everything */
 957        result = em28xx_register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev);
 958
 959        if (result < 0)
 960                goto out_free;
 961
 962        /* MFE lock */
 963        dvb->adapter.mfe_shared = mfe_shared;
 964
 965        em28xx_info("Successfully loaded em28xx-dvb\n");
 966ret:
 967        em28xx_set_mode(dev, EM28XX_SUSPEND);
 968        mutex_unlock(&dev->lock);
 969        return result;
 970
 971out_free:
 972        kfree(dvb);
 973        dev->dvb = NULL;
 974        goto ret;
 975}
 976
 977static inline void prevent_sleep(struct dvb_frontend_ops *ops)
 978{
 979        ops->set_voltage = NULL;
 980        ops->sleep = NULL;
 981        ops->tuner_ops.sleep = NULL;
 982}
 983
 984static int em28xx_dvb_fini(struct em28xx *dev)
 985{
 986        if (!dev->board.has_dvb) {
 987                /* This device does not support the extension */
 988                return 0;
 989        }
 990
 991        if (dev->dvb) {
 992                struct em28xx_dvb *dvb = dev->dvb;
 993
 994                if (dev->state & DEV_DISCONNECTED) {
 995                        /* We cannot tell the device to sleep
 996                         * once it has been unplugged. */
 997                        if (dvb->fe[0])
 998                                prevent_sleep(&dvb->fe[0]->ops);
 999                        if (dvb->fe[1])
1000                                prevent_sleep(&dvb->fe[1]->ops);
1001                }
1002
1003                em28xx_unregister_dvb(dvb);
1004                kfree(dvb);
1005                dev->dvb = NULL;
1006        }
1007
1008        return 0;
1009}
1010
1011static struct em28xx_ops dvb_ops = {
1012        .id   = EM28XX_DVB,
1013        .name = "Em28xx dvb Extension",
1014        .init = em28xx_dvb_init,
1015        .fini = em28xx_dvb_fini,
1016};
1017
1018static int __init em28xx_dvb_register(void)
1019{
1020        return em28xx_register_extension(&dvb_ops);
1021}
1022
1023static void __exit em28xx_dvb_unregister(void)
1024{
1025        em28xx_unregister_extension(&dvb_ops);
1026}
1027
1028module_init(em28xx_dvb_register);
1029module_exit(em28xx_dvb_unregister);
1030
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.