linux/drivers/media/usb/dvb-usb/cxusb.c
<<
>>
Prefs
   1/* DVB USB compliant linux driver for Conexant USB reference design.
   2 *
   3 * The Conexant reference design I saw on their website was only for analogue
   4 * capturing (using the cx25842). The box I took to write this driver (reverse
   5 * engineered) is the one labeled Medion MD95700. In addition to the cx25842
   6 * for analogue capturing it also has a cx22702 DVB-T demodulator on the main
   7 * board. Besides it has a atiremote (X10) and a USB2.0 hub onboard.
   8 *
   9 * Maybe it is a little bit premature to call this driver cxusb, but I assume
  10 * the USB protocol is identical or at least inherited from the reference
  11 * design, so it can be reused for the "analogue-only" device (if it will
  12 * appear at all).
  13 *
  14 * TODO: Use the cx25840-driver for the analogue part
  15 *
  16 * Copyright (C) 2005 Patrick Boettcher (patrick.boettcher@posteo.de)
  17 * Copyright (C) 2006 Michael Krufky (mkrufky@linuxtv.org)
  18 * Copyright (C) 2006, 2007 Chris Pascoe (c.pascoe@itee.uq.edu.au)
  19 *
  20 *   This program is free software; you can redistribute it and/or modify it
  21 *   under the terms of the GNU General Public License as published by the Free
  22 *   Software Foundation, version 2.
  23 *
  24 * see Documentation/dvb/README.dvb-usb for more information
  25 */
  26#include <media/tuner.h>
  27#include <linux/vmalloc.h>
  28#include <linux/slab.h>
  29
  30#include "cxusb.h"
  31
  32#include "cx22702.h"
  33#include "lgdt330x.h"
  34#include "mt352.h"
  35#include "mt352_priv.h"
  36#include "zl10353.h"
  37#include "tuner-xc2028.h"
  38#include "tuner-simple.h"
  39#include "mxl5005s.h"
  40#include "max2165.h"
  41#include "dib7000p.h"
  42#include "dib0070.h"
  43#include "lgs8gxx.h"
  44#include "atbm8830.h"
  45#include "si2168.h"
  46#include "si2157.h"
  47
  48/* debug */
  49static int dvb_usb_cxusb_debug;
  50module_param_named(debug, dvb_usb_cxusb_debug, int, 0644);
  51MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);
  52
  53DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  54
  55#define deb_info(args...)   dprintk(dvb_usb_cxusb_debug, 0x03, args)
  56#define deb_i2c(args...)    dprintk(dvb_usb_cxusb_debug, 0x02, args)
  57
  58static int cxusb_ctrl_msg(struct dvb_usb_device *d,
  59                          u8 cmd, u8 *wbuf, int wlen, u8 *rbuf, int rlen)
  60{
  61        struct cxusb_state *st = d->priv;
  62        int ret;
  63
  64        if (1 + wlen > MAX_XFER_SIZE) {
  65                warn("i2c wr: len=%d is too big!\n", wlen);
  66                return -EOPNOTSUPP;
  67        }
  68
  69        if (rlen > MAX_XFER_SIZE) {
  70                warn("i2c rd: len=%d is too big!\n", rlen);
  71                return -EOPNOTSUPP;
  72        }
  73
  74        mutex_lock(&d->data_mutex);
  75        st->data[0] = cmd;
  76        memcpy(&st->data[1], wbuf, wlen);
  77        ret = dvb_usb_generic_rw(d, st->data, 1 + wlen, st->data, rlen, 0);
  78        if (!ret && rbuf && rlen)
  79                memcpy(rbuf, st->data, rlen);
  80
  81        mutex_unlock(&d->data_mutex);
  82        return ret;
  83}
  84
  85/* GPIO */
  86static void cxusb_gpio_tuner(struct dvb_usb_device *d, int onoff)
  87{
  88        struct cxusb_state *st = d->priv;
  89        u8 o[2], i;
  90
  91        if (st->gpio_write_state[GPIO_TUNER] == onoff)
  92                return;
  93
  94        o[0] = GPIO_TUNER;
  95        o[1] = onoff;
  96        cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
  97
  98        if (i != 0x01)
  99                deb_info("gpio_write failed.\n");
 100
 101        st->gpio_write_state[GPIO_TUNER] = onoff;
 102}
 103
 104static int cxusb_bluebird_gpio_rw(struct dvb_usb_device *d, u8 changemask,
 105                                 u8 newval)
 106{
 107        u8 o[2], gpio_state;
 108        int rc;
 109
 110        o[0] = 0xff & ~changemask;      /* mask of bits to keep */
 111        o[1] = newval & changemask;     /* new values for bits  */
 112
 113        rc = cxusb_ctrl_msg(d, CMD_BLUEBIRD_GPIO_RW, o, 2, &gpio_state, 1);
 114        if (rc < 0 || (gpio_state & changemask) != (newval & changemask))
 115                deb_info("bluebird_gpio_write failed.\n");
 116
 117        return rc < 0 ? rc : gpio_state;
 118}
 119
 120static void cxusb_bluebird_gpio_pulse(struct dvb_usb_device *d, u8 pin, int low)
 121{
 122        cxusb_bluebird_gpio_rw(d, pin, low ? 0 : pin);
 123        msleep(5);
 124        cxusb_bluebird_gpio_rw(d, pin, low ? pin : 0);
 125}
 126
 127static void cxusb_nano2_led(struct dvb_usb_device *d, int onoff)
 128{
 129        cxusb_bluebird_gpio_rw(d, 0x40, onoff ? 0 : 0x40);
 130}
 131
 132static int cxusb_d680_dmb_gpio_tuner(struct dvb_usb_device *d,
 133                u8 addr, int onoff)
 134{
 135        u8  o[2] = {addr, onoff};
 136        u8  i;
 137        int rc;
 138
 139        rc = cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
 140
 141        if (rc < 0)
 142                return rc;
 143        if (i == 0x01)
 144                return 0;
 145        else {
 146                deb_info("gpio_write failed.\n");
 147                return -EIO;
 148        }
 149}
 150
 151/* I2C */
 152static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
 153                          int num)
 154{
 155        struct dvb_usb_device *d = i2c_get_adapdata(adap);
 156        int ret;
 157        int i;
 158
 159        if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
 160                return -EAGAIN;
 161
 162        for (i = 0; i < num; i++) {
 163
 164                if (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_MEDION)
 165                        switch (msg[i].addr) {
 166                        case 0x63:
 167                                cxusb_gpio_tuner(d, 0);
 168                                break;
 169                        default:
 170                                cxusb_gpio_tuner(d, 1);
 171                                break;
 172                        }
 173
 174                if (msg[i].flags & I2C_M_RD) {
 175                        /* read only */
 176                        u8 obuf[3], ibuf[MAX_XFER_SIZE];
 177
 178                        if (1 + msg[i].len > sizeof(ibuf)) {
 179                                warn("i2c rd: len=%d is too big!\n",
 180                                     msg[i].len);
 181                                ret = -EOPNOTSUPP;
 182                                goto unlock;
 183                        }
 184                        obuf[0] = 0;
 185                        obuf[1] = msg[i].len;
 186                        obuf[2] = msg[i].addr;
 187                        if (cxusb_ctrl_msg(d, CMD_I2C_READ,
 188                                           obuf, 3,
 189                                           ibuf, 1+msg[i].len) < 0) {
 190                                warn("i2c read failed");
 191                                break;
 192                        }
 193                        memcpy(msg[i].buf, &ibuf[1], msg[i].len);
 194                } else if (i+1 < num && (msg[i+1].flags & I2C_M_RD) &&
 195                           msg[i].addr == msg[i+1].addr) {
 196                        /* write to then read from same address */
 197                        u8 obuf[MAX_XFER_SIZE], ibuf[MAX_XFER_SIZE];
 198
 199                        if (3 + msg[i].len > sizeof(obuf)) {
 200                                warn("i2c wr: len=%d is too big!\n",
 201                                     msg[i].len);
 202                                ret = -EOPNOTSUPP;
 203                                goto unlock;
 204                        }
 205                        if (1 + msg[i + 1].len > sizeof(ibuf)) {
 206                                warn("i2c rd: len=%d is too big!\n",
 207                                     msg[i + 1].len);
 208                                ret = -EOPNOTSUPP;
 209                                goto unlock;
 210                        }
 211                        obuf[0] = msg[i].len;
 212                        obuf[1] = msg[i+1].len;
 213                        obuf[2] = msg[i].addr;
 214                        memcpy(&obuf[3], msg[i].buf, msg[i].len);
 215
 216                        if (cxusb_ctrl_msg(d, CMD_I2C_READ,
 217                                           obuf, 3+msg[i].len,
 218                                           ibuf, 1+msg[i+1].len) < 0)
 219                                break;
 220
 221                        if (ibuf[0] != 0x08)
 222                                deb_i2c("i2c read may have failed\n");
 223
 224                        memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
 225
 226                        i++;
 227                } else {
 228                        /* write only */
 229                        u8 obuf[MAX_XFER_SIZE], ibuf;
 230
 231                        if (2 + msg[i].len > sizeof(obuf)) {
 232                                warn("i2c wr: len=%d is too big!\n",
 233                                     msg[i].len);
 234                                ret = -EOPNOTSUPP;
 235                                goto unlock;
 236                        }
 237                        obuf[0] = msg[i].addr;
 238                        obuf[1] = msg[i].len;
 239                        memcpy(&obuf[2], msg[i].buf, msg[i].len);
 240
 241                        if (cxusb_ctrl_msg(d, CMD_I2C_WRITE, obuf,
 242                                           2+msg[i].len, &ibuf,1) < 0)
 243                                break;
 244                        if (ibuf != 0x08)
 245                                deb_i2c("i2c write may have failed\n");
 246                }
 247        }
 248
 249        if (i == num)
 250                ret = num;
 251        else
 252                ret = -EREMOTEIO;
 253
 254unlock:
 255        mutex_unlock(&d->i2c_mutex);
 256        return ret;
 257}
 258
 259static u32 cxusb_i2c_func(struct i2c_adapter *adapter)
 260{
 261        return I2C_FUNC_I2C;
 262}
 263
 264static struct i2c_algorithm cxusb_i2c_algo = {
 265        .master_xfer   = cxusb_i2c_xfer,
 266        .functionality = cxusb_i2c_func,
 267};
 268
 269static int cxusb_power_ctrl(struct dvb_usb_device *d, int onoff)
 270{
 271        u8 b = 0;
 272        if (onoff)
 273                return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
 274        else
 275                return cxusb_ctrl_msg(d, CMD_POWER_OFF, &b, 1, NULL, 0);
 276}
 277
 278static int cxusb_aver_power_ctrl(struct dvb_usb_device *d, int onoff)
 279{
 280        int ret;
 281        if (!onoff)
 282                return cxusb_ctrl_msg(d, CMD_POWER_OFF, NULL, 0, NULL, 0);
 283        if (d->state == DVB_USB_STATE_INIT &&
 284            usb_set_interface(d->udev, 0, 0) < 0)
 285                err("set interface failed");
 286        do {} while (!(ret = cxusb_ctrl_msg(d, CMD_POWER_ON, NULL, 0, NULL, 0)) &&
 287                   !(ret = cxusb_ctrl_msg(d, 0x15, NULL, 0, NULL, 0)) &&
 288                   !(ret = cxusb_ctrl_msg(d, 0x17, NULL, 0, NULL, 0)) && 0);
 289        if (!ret) {
 290                /* FIXME: We don't know why, but we need to configure the
 291                 * lgdt3303 with the register settings below on resume */
 292                int i;
 293                u8 buf, bufs[] = {
 294                        0x0e, 0x2, 0x00, 0x7f,
 295                        0x0e, 0x2, 0x02, 0xfe,
 296                        0x0e, 0x2, 0x02, 0x01,
 297                        0x0e, 0x2, 0x00, 0x03,
 298                        0x0e, 0x2, 0x0d, 0x40,
 299                        0x0e, 0x2, 0x0e, 0x87,
 300                        0x0e, 0x2, 0x0f, 0x8e,
 301                        0x0e, 0x2, 0x10, 0x01,
 302                        0x0e, 0x2, 0x14, 0xd7,
 303                        0x0e, 0x2, 0x47, 0x88,
 304                };
 305                msleep(20);
 306                for (i = 0; i < sizeof(bufs)/sizeof(u8); i += 4/sizeof(u8)) {
 307                        ret = cxusb_ctrl_msg(d, CMD_I2C_WRITE,
 308                                             bufs+i, 4, &buf, 1);
 309                        if (ret)
 310                                break;
 311                        if (buf != 0x8)
 312                                return -EREMOTEIO;
 313                }
 314        }
 315        return ret;
 316}
 317
 318static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
 319{
 320        u8 b = 0;
 321        if (onoff)
 322                return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
 323        else
 324                return 0;
 325}
 326
 327static int cxusb_nano2_power_ctrl(struct dvb_usb_device *d, int onoff)
 328{
 329        int rc = 0;
 330
 331        rc = cxusb_power_ctrl(d, onoff);
 332        if (!onoff)
 333                cxusb_nano2_led(d, 0);
 334
 335        return rc;
 336}
 337
 338static int cxusb_d680_dmb_power_ctrl(struct dvb_usb_device *d, int onoff)
 339{
 340        int ret;
 341        u8  b;
 342        ret = cxusb_power_ctrl(d, onoff);
 343        if (!onoff)
 344                return ret;
 345
 346        msleep(128);
 347        cxusb_ctrl_msg(d, CMD_DIGITAL, NULL, 0, &b, 1);
 348        msleep(100);
 349        return ret;
 350}
 351
 352static int cxusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 353{
 354        u8 buf[2] = { 0x03, 0x00 };
 355        if (onoff)
 356                cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON, buf, 2, NULL, 0);
 357        else
 358                cxusb_ctrl_msg(adap->dev, CMD_STREAMING_OFF, NULL, 0, NULL, 0);
 359
 360        return 0;
 361}
 362
 363static int cxusb_aver_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 364{
 365        if (onoff)
 366                cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_ON, NULL, 0, NULL, 0);
 367        else
 368                cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_OFF,
 369                               NULL, 0, NULL, 0);
 370        return 0;
 371}
 372
 373static int cxusb_read_status(struct dvb_frontend *fe,
 374                                  enum fe_status *status)
 375{
 376        struct dvb_usb_adapter *adap = (struct dvb_usb_adapter *)fe->dvb->priv;
 377        struct cxusb_state *state = (struct cxusb_state *)adap->dev->priv;
 378        int ret;
 379
 380        ret = state->fe_read_status(fe, status);
 381
 382        /* it need resync slave fifo when signal change from unlock to lock.*/
 383        if ((*status & FE_HAS_LOCK) && (!state->last_lock)) {
 384                mutex_lock(&state->stream_mutex);
 385                cxusb_streaming_ctrl(adap, 1);
 386                mutex_unlock(&state->stream_mutex);
 387        }
 388
 389        state->last_lock = (*status & FE_HAS_LOCK) ? 1 : 0;
 390        return ret;
 391}
 392
 393static void cxusb_d680_dmb_drain_message(struct dvb_usb_device *d)
 394{
 395        int       ep = d->props.generic_bulk_ctrl_endpoint;
 396        const int timeout = 100;
 397        const int junk_len = 32;
 398        u8        *junk;
 399        int       rd_count;
 400
 401        /* Discard remaining data in video pipe */
 402        junk = kmalloc(junk_len, GFP_KERNEL);
 403        if (!junk)
 404                return;
 405        while (1) {
 406                if (usb_bulk_msg(d->udev,
 407                        usb_rcvbulkpipe(d->udev, ep),
 408                        junk, junk_len, &rd_count, timeout) < 0)
 409                        break;
 410                if (!rd_count)
 411                        break;
 412        }
 413        kfree(junk);
 414}
 415
 416static void cxusb_d680_dmb_drain_video(struct dvb_usb_device *d)
 417{
 418        struct usb_data_stream_properties *p = &d->props.adapter[0].fe[0].stream;
 419        const int timeout = 100;
 420        const int junk_len = p->u.bulk.buffersize;
 421        u8        *junk;
 422        int       rd_count;
 423
 424        /* Discard remaining data in video pipe */
 425        junk = kmalloc(junk_len, GFP_KERNEL);
 426        if (!junk)
 427                return;
 428        while (1) {
 429                if (usb_bulk_msg(d->udev,
 430                        usb_rcvbulkpipe(d->udev, p->endpoint),
 431                        junk, junk_len, &rd_count, timeout) < 0)
 432                        break;
 433                if (!rd_count)
 434                        break;
 435        }
 436        kfree(junk);
 437}
 438
 439static int cxusb_d680_dmb_streaming_ctrl(
 440                struct dvb_usb_adapter *adap, int onoff)
 441{
 442        if (onoff) {
 443                u8 buf[2] = { 0x03, 0x00 };
 444                cxusb_d680_dmb_drain_video(adap->dev);
 445                return cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON,
 446                        buf, sizeof(buf), NULL, 0);
 447        } else {
 448                int ret = cxusb_ctrl_msg(adap->dev,
 449                        CMD_STREAMING_OFF, NULL, 0, NULL, 0);
 450                return ret;
 451        }
 452}
 453
 454static int cxusb_rc_query(struct dvb_usb_device *d)
 455{
 456        u8 ircode[4];
 457
 458        cxusb_ctrl_msg(d, CMD_GET_IR_CODE, NULL, 0, ircode, 4);
 459
 460        if (ircode[2] || ircode[3])
 461                rc_keydown(d->rc_dev, RC_TYPE_UNKNOWN,
 462                           RC_SCANCODE_RC5(ircode[2], ircode[3]), 0);
 463        return 0;
 464}
 465
 466static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d)
 467{
 468        u8 ircode[4];
 469        struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD,
 470                               .buf = ircode, .len = 4 };
 471
 472        if (cxusb_i2c_xfer(&d->i2c_adap, &msg, 1) != 1)
 473                return 0;
 474
 475        if (ircode[1] || ircode[2])
 476                rc_keydown(d->rc_dev, RC_TYPE_UNKNOWN,
 477                           RC_SCANCODE_RC5(ircode[1], ircode[2]), 0);
 478        return 0;
 479}
 480
 481static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d)
 482{
 483        u8 ircode[2];
 484
 485        if (cxusb_ctrl_msg(d, 0x10, NULL, 0, ircode, 2) < 0)
 486                return 0;
 487
 488        if (ircode[0] || ircode[1])
 489                rc_keydown(d->rc_dev, RC_TYPE_UNKNOWN,
 490                           RC_SCANCODE_RC5(ircode[0], ircode[1]), 0);
 491        return 0;
 492}
 493
 494static int cxusb_dee1601_demod_init(struct dvb_frontend* fe)
 495{
 496        static u8 clock_config []  = { CLOCK_CTL,  0x38, 0x28 };
 497        static u8 reset []         = { RESET,      0x80 };
 498        static u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
 499        static u8 agc_cfg []       = { AGC_TARGET, 0x28, 0x20 };
 500        static u8 gpp_ctl_cfg []   = { GPP_CTL,    0x33 };
 501        static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
 502
 503        mt352_write(fe, clock_config,   sizeof(clock_config));
 504        udelay(200);
 505        mt352_write(fe, reset,          sizeof(reset));
 506        mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
 507
 508        mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
 509        mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
 510        mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
 511
 512        return 0;
 513}
 514
 515static int cxusb_mt352_demod_init(struct dvb_frontend* fe)
 516{       /* used in both lgz201 and th7579 */
 517        static u8 clock_config []  = { CLOCK_CTL,  0x38, 0x29 };
 518        static u8 reset []         = { RESET,      0x80 };
 519        static u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
 520        static u8 agc_cfg []       = { AGC_TARGET, 0x24, 0x20 };
 521        static u8 gpp_ctl_cfg []   = { GPP_CTL,    0x33 };
 522        static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
 523
 524        mt352_write(fe, clock_config,   sizeof(clock_config));
 525        udelay(200);
 526        mt352_write(fe, reset,          sizeof(reset));
 527        mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
 528
 529        mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
 530        mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
 531        mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
 532        return 0;
 533}
 534
 535static struct cx22702_config cxusb_cx22702_config = {
 536        .demod_address = 0x63,
 537        .output_mode = CX22702_PARALLEL_OUTPUT,
 538};
 539
 540static struct lgdt330x_config cxusb_lgdt3303_config = {
 541        .demod_address = 0x0e,
 542        .demod_chip    = LGDT3303,
 543};
 544
 545static struct lgdt330x_config cxusb_aver_lgdt3303_config = {
 546        .demod_address       = 0x0e,
 547        .demod_chip          = LGDT3303,
 548        .clock_polarity_flip = 2,
 549};
 550
 551static struct mt352_config cxusb_dee1601_config = {
 552        .demod_address = 0x0f,
 553        .demod_init    = cxusb_dee1601_demod_init,
 554};
 555
 556static struct zl10353_config cxusb_zl10353_dee1601_config = {
 557        .demod_address = 0x0f,
 558        .parallel_ts = 1,
 559};
 560
 561static struct mt352_config cxusb_mt352_config = {
 562        /* used in both lgz201 and th7579 */
 563        .demod_address = 0x0f,
 564        .demod_init    = cxusb_mt352_demod_init,
 565};
 566
 567static struct zl10353_config cxusb_zl10353_xc3028_config = {
 568        .demod_address = 0x0f,
 569        .if2 = 45600,
 570        .no_tuner = 1,
 571        .parallel_ts = 1,
 572};
 573
 574static struct zl10353_config cxusb_zl10353_xc3028_config_no_i2c_gate = {
 575        .demod_address = 0x0f,
 576        .if2 = 45600,
 577        .no_tuner = 1,
 578        .parallel_ts = 1,
 579        .disable_i2c_gate_ctrl = 1,
 580};
 581
 582static struct mt352_config cxusb_mt352_xc3028_config = {
 583        .demod_address = 0x0f,
 584        .if2 = 4560,
 585        .no_tuner = 1,
 586        .demod_init = cxusb_mt352_demod_init,
 587};
 588
 589/* FIXME: needs tweaking */
 590static struct mxl5005s_config aver_a868r_tuner = {
 591        .i2c_address     = 0x63,
 592        .if_freq         = 6000000UL,
 593        .xtal_freq       = CRYSTAL_FREQ_16000000HZ,
 594        .agc_mode        = MXL_SINGLE_AGC,
 595        .tracking_filter = MXL_TF_C,
 596        .rssi_enable     = MXL_RSSI_ENABLE,
 597        .cap_select      = MXL_CAP_SEL_ENABLE,
 598        .div_out         = MXL_DIV_OUT_4,
 599        .clock_out       = MXL_CLOCK_OUT_DISABLE,
 600        .output_load     = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
 601        .top             = MXL5005S_TOP_25P2,
 602        .mod_mode        = MXL_DIGITAL_MODE,
 603        .if_mode         = MXL_ZERO_IF,
 604        .AgcMasterByte   = 0x00,
 605};
 606
 607/* FIXME: needs tweaking */
 608static struct mxl5005s_config d680_dmb_tuner = {
 609        .i2c_address     = 0x63,
 610        .if_freq         = 36125000UL,
 611        .xtal_freq       = CRYSTAL_FREQ_16000000HZ,
 612        .agc_mode        = MXL_SINGLE_AGC,
 613        .tracking_filter = MXL_TF_C,
 614        .rssi_enable     = MXL_RSSI_ENABLE,
 615        .cap_select      = MXL_CAP_SEL_ENABLE,
 616        .div_out         = MXL_DIV_OUT_4,
 617        .clock_out       = MXL_CLOCK_OUT_DISABLE,
 618        .output_load     = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
 619        .top             = MXL5005S_TOP_25P2,
 620        .mod_mode        = MXL_DIGITAL_MODE,
 621        .if_mode         = MXL_ZERO_IF,
 622        .AgcMasterByte   = 0x00,
 623};
 624
 625static struct max2165_config mygica_d689_max2165_cfg = {
 626        .i2c_address = 0x60,
 627        .osc_clk = 20
 628};
 629
 630/* Callbacks for DVB USB */
 631static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
 632{
 633        dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
 634                   &adap->dev->i2c_adap, 0x61,
 635                   TUNER_PHILIPS_FMD1216ME_MK3);
 636        return 0;
 637}
 638
 639static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
 640{
 641        dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61,
 642                   NULL, DVB_PLL_THOMSON_DTT7579);
 643        return 0;
 644}
 645
 646static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
 647{
 648        dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, NULL, DVB_PLL_LG_Z201);
 649        return 0;
 650}
 651
 652static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
 653{
 654        dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
 655                   NULL, DVB_PLL_THOMSON_DTT7579);
 656        return 0;
 657}
 658
 659static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
 660{
 661        dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
 662                   &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
 663        return 0;
 664}
 665
 666static int dvico_bluebird_xc2028_callback(void *ptr, int component,
 667                                          int command, int arg)
 668{
 669        struct dvb_usb_adapter *adap = ptr;
 670        struct dvb_usb_device *d = adap->dev;
 671
 672        switch (command) {
 673        case XC2028_TUNER_RESET:
 674                deb_info("%s: XC2028_TUNER_RESET %d\n", __func__, arg);
 675                cxusb_bluebird_gpio_pulse(d, 0x01, 1);
 676                break;
 677        case XC2028_RESET_CLK:
 678                deb_info("%s: XC2028_RESET_CLK %d\n", __func__, arg);
 679                break;
 680        default:
 681                deb_info("%s: unknown command %d, arg %d\n", __func__,
 682                         command, arg);
 683                return -EINVAL;
 684        }
 685
 686        return 0;
 687}
 688
 689static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
 690{
 691        struct dvb_frontend      *fe;
 692        struct xc2028_config      cfg = {
 693                .i2c_adap  = &adap->dev->i2c_adap,
 694                .i2c_addr  = 0x61,
 695        };
 696        static struct xc2028_ctrl ctl = {
 697                .fname       = XC2028_DEFAULT_FIRMWARE,
 698                .max_len     = 64,
 699                .demod       = XC3028_FE_ZARLINK456,
 700        };
 701
 702        /* FIXME: generalize & move to common area */
 703        adap->fe_adap[0].fe->callback = dvico_bluebird_xc2028_callback;
 704
 705        fe = dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &cfg);
 706        if (fe == NULL || fe->ops.tuner_ops.set_config == NULL)
 707                return -EIO;
 708
 709        fe->ops.tuner_ops.set_config(fe, &ctl);
 710
 711        return 0;
 712}
 713
 714static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
 715{
 716        dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
 717                   &adap->dev->i2c_adap, &aver_a868r_tuner);
 718        return 0;
 719}
 720
 721static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
 722{
 723        struct dvb_frontend *fe;
 724        fe = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
 725                        &adap->dev->i2c_adap, &d680_dmb_tuner);
 726        return (fe == NULL) ? -EIO : 0;
 727}
 728
 729static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap)
 730{
 731        struct dvb_frontend *fe;
 732        fe = dvb_attach(max2165_attach, adap->fe_adap[0].fe,
 733                        &adap->dev->i2c_adap, &mygica_d689_max2165_cfg);
 734        return (fe == NULL) ? -EIO : 0;
 735}
 736
 737static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
 738{
 739        u8 b;
 740        if (usb_set_interface(adap->dev->udev, 0, 6) < 0)
 741                err("set interface failed");
 742
 743        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1);
 744
 745        adap->fe_adap[0].fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
 746                                         &adap->dev->i2c_adap);
 747        if ((adap->fe_adap[0].fe) != NULL)
 748                return 0;
 749
 750        return -EIO;
 751}
 752
 753static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
 754{
 755        if (usb_set_interface(adap->dev->udev, 0, 7) < 0)
 756                err("set interface failed");
 757
 758        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 759
 760        adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach,
 761                                         &cxusb_lgdt3303_config,
 762                                         &adap->dev->i2c_adap);
 763        if ((adap->fe_adap[0].fe) != NULL)
 764                return 0;
 765
 766        return -EIO;
 767}
 768
 769static int cxusb_aver_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
 770{
 771        adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config,
 772                              &adap->dev->i2c_adap);
 773        if (adap->fe_adap[0].fe != NULL)
 774                return 0;
 775
 776        return -EIO;
 777}
 778
 779static int cxusb_mt352_frontend_attach(struct dvb_usb_adapter *adap)
 780{
 781        /* used in both lgz201 and th7579 */
 782        if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
 783                err("set interface failed");
 784
 785        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 786
 787        adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_mt352_config,
 788                                         &adap->dev->i2c_adap);
 789        if ((adap->fe_adap[0].fe) != NULL)
 790                return 0;
 791
 792        return -EIO;
 793}
 794
 795static int cxusb_dee1601_frontend_attach(struct dvb_usb_adapter *adap)
 796{
 797        if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
 798                err("set interface failed");
 799
 800        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 801
 802        adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_dee1601_config,
 803                                         &adap->dev->i2c_adap);
 804        if ((adap->fe_adap[0].fe) != NULL)
 805                return 0;
 806
 807        adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
 808                                         &cxusb_zl10353_dee1601_config,
 809                                         &adap->dev->i2c_adap);
 810        if ((adap->fe_adap[0].fe) != NULL)
 811                return 0;
 812
 813        return -EIO;
 814}
 815
 816static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
 817{
 818        u8 ircode[4];
 819        int i;
 820        struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD,
 821                               .buf = ircode, .len = 4 };
 822
 823        if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
 824                err("set interface failed");
 825
 826        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 827
 828        /* reset the tuner and demodulator */
 829        cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
 830        cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
 831        cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
 832
 833        adap->fe_adap[0].fe =
 834                dvb_attach(zl10353_attach,
 835                           &cxusb_zl10353_xc3028_config_no_i2c_gate,
 836                           &adap->dev->i2c_adap);
 837        if ((adap->fe_adap[0].fe) == NULL)
 838                return -EIO;
 839
 840        /* try to determine if there is no IR decoder on the I2C bus */
 841        for (i = 0; adap->dev->props.rc.core.rc_codes && i < 5; i++) {
 842                msleep(20);
 843                if (cxusb_i2c_xfer(&adap->dev->i2c_adap, &msg, 1) != 1)
 844                        goto no_IR;
 845                if (ircode[0] == 0 && ircode[1] == 0)
 846                        continue;
 847                if (ircode[2] + ircode[3] != 0xff) {
 848no_IR:
 849                        adap->dev->props.rc.core.rc_codes = NULL;
 850                        info("No IR receiver detected on this device.");
 851                        break;
 852                }
 853        }
 854
 855        return 0;
 856}
 857
 858static struct dibx000_agc_config dib7070_agc_config = {
 859        .band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
 860
 861        /*
 862         * P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5,
 863         * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
 864         * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0
 865         */
 866        .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) |
 867                 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
 868        .inv_gain = 600,
 869        .time_stabiliz = 10,
 870        .alpha_level = 0,
 871        .thlock = 118,
 872        .wbd_inv = 0,
 873        .wbd_ref = 3530,
 874        .wbd_sel = 1,
 875        .wbd_alpha = 5,
 876        .agc1_max = 65535,
 877        .agc1_min = 0,
 878        .agc2_max = 65535,
 879        .agc2_min = 0,
 880        .agc1_pt1 = 0,
 881        .agc1_pt2 = 40,
 882        .agc1_pt3 = 183,
 883        .agc1_slope1 = 206,
 884        .agc1_slope2 = 255,
 885        .agc2_pt1 = 72,
 886        .agc2_pt2 = 152,
 887        .agc2_slope1 = 88,
 888        .agc2_slope2 = 90,
 889        .alpha_mant = 17,
 890        .alpha_exp = 27,
 891        .beta_mant = 23,
 892        .beta_exp = 51,
 893        .perform_agc_softsplit = 0,
 894};
 895
 896static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
 897        .internal = 60000,
 898        .sampling = 15000,
 899        .pll_prediv = 1,
 900        .pll_ratio = 20,
 901        .pll_range = 3,
 902        .pll_reset = 1,
 903        .pll_bypass = 0,
 904        .enable_refdiv = 0,
 905        .bypclk_div = 0,
 906        .IO_CLK_en_core = 1,
 907        .ADClkSrc = 1,
 908        .modulo = 2,
 909        /* refsel, sel, freq_15k */
 910        .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
 911        .ifreq = (0 << 25) | 0,
 912        .timf = 20452225,
 913        .xtal_hz = 12000000,
 914};
 915
 916static struct dib7000p_config cxusb_dualdig4_rev2_config = {
 917        .output_mode = OUTMODE_MPEG2_PAR_GATED_CLK,
 918        .output_mpeg2_in_188_bytes = 1,
 919
 920        .agc_config_count = 1,
 921        .agc = &dib7070_agc_config,
 922        .bw  = &dib7070_bw_config_12_mhz,
 923        .tuner_is_baseband = 1,
 924        .spur_protect = 1,
 925
 926        .gpio_dir = 0xfcef,
 927        .gpio_val = 0x0110,
 928
 929        .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
 930
 931        .hostbus_diversity = 1,
 932};
 933
 934struct dib0700_adapter_state {
 935        int (*set_param_save)(struct dvb_frontend *);
 936        struct dib7000p_ops dib7000p_ops;
 937};
 938
 939static int cxusb_dualdig4_rev2_frontend_attach(struct dvb_usb_adapter *adap)
 940{
 941        struct dib0700_adapter_state *state = adap->priv;
 942
 943        if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
 944                err("set interface failed");
 945
 946        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
 947
 948        cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
 949
 950        if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
 951                return -ENODEV;
 952
 953        if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
 954                                       &cxusb_dualdig4_rev2_config) < 0) {
 955                printk(KERN_WARNING "Unable to enumerate dib7000p\n");
 956                return -ENODEV;
 957        }
 958
 959        adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80,
 960                                              &cxusb_dualdig4_rev2_config);
 961        if (adap->fe_adap[0].fe == NULL)
 962                return -EIO;
 963
 964        return 0;
 965}
 966
 967static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
 968{
 969        struct dvb_usb_adapter *adap = fe->dvb->priv;
 970        struct dib0700_adapter_state *state = adap->priv;
 971
 972        return state->dib7000p_ops.set_gpio(fe, 8, 0, !onoff);
 973}
 974
 975static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
 976{
 977        return 0;
 978}
 979
 980static struct dib0070_config dib7070p_dib0070_config = {
 981        .i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
 982        .reset = dib7070_tuner_reset,
 983        .sleep = dib7070_tuner_sleep,
 984        .clock_khz = 12000,
 985};
 986
 987static int dib7070_set_param_override(struct dvb_frontend *fe)
 988{
 989        struct dtv_frontend_properties *p = &fe->dtv_property_cache;
 990        struct dvb_usb_adapter *adap = fe->dvb->priv;
 991        struct dib0700_adapter_state *state = adap->priv;
 992
 993        u16 offset;
 994        u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
 995        switch (band) {
 996        case BAND_VHF: offset = 950; break;
 997        default:
 998        case BAND_UHF: offset = 550; break;
 999        }
1000
1001        state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1002
1003        return state->set_param_save(fe);
1004}
1005
1006static int cxusb_dualdig4_rev2_tuner_attach(struct dvb_usb_adapter *adap)
1007{
1008        struct dib0700_adapter_state *st = adap->priv;
1009        struct i2c_adapter *tun_i2c;
1010
1011        /*
1012         * No need to call dvb7000p_attach here, as it was called
1013         * already, as frontend_attach method is called first, and
1014         * tuner_attach is only called on sucess.
1015         */
1016        tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
1017                                        DIBX000_I2C_INTERFACE_TUNER, 1);
1018
1019        if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1020            &dib7070p_dib0070_config) == NULL)
1021                return -ENODEV;
1022
1023        st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1024        adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1025        return 0;
1026}
1027
1028static int cxusb_nano2_frontend_attach(struct dvb_usb_adapter *adap)
1029{
1030        if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
1031                err("set interface failed");
1032
1033        cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
1034
1035        /* reset the tuner and demodulator */
1036        cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
1037        cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
1038        cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
1039
1040        adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
1041                                         &cxusb_zl10353_xc3028_config,
1042                                         &adap->dev->i2c_adap);
1043        if ((adap->fe_adap[0].fe) != NULL)
1044                return 0;
1045
1046        adap->fe_adap[0].fe = dvb_attach(mt352_attach,
1047                                         &cxusb_mt352_xc3028_config,
1048                                         &adap->dev->i2c_adap);
1049        if ((adap->fe_adap[0].fe) != NULL)
1050                return 0;
1051
1052        return -EIO;
1053}
1054
1055static struct lgs8gxx_config d680_lgs8gl5_cfg = {
1056        .prod = LGS8GXX_PROD_LGS8GL5,
1057        .demod_address = 0x19,
1058        .serial_ts = 0,
1059        .ts_clk_pol = 0,
1060        .ts_clk_gated = 1,
1061        .if_clk_freq = 30400, /* 30.4 MHz */
1062        .if_freq = 5725, /* 5.725 MHz */
1063        .if_neg_center = 0,
1064        .ext_adc = 0,
1065        .adc_signed = 0,
1066        .if_neg_edge = 0,
1067};
1068
1069static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
1070{
1071        struct dvb_usb_device *d = adap->dev;
1072        int n;
1073
1074        /* Select required USB configuration */
1075        if (usb_set_interface(d->udev, 0, 0) < 0)
1076                err("set interface failed");
1077
1078        /* Unblock all USB pipes */
1079        usb_clear_halt(d->udev,
1080                usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1081        usb_clear_halt(d->udev,
1082                usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1083        usb_clear_halt(d->udev,
1084                usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1085
1086        /* Drain USB pipes to avoid hang after reboot */
1087        for (n = 0;  n < 5;  n++) {
1088                cxusb_d680_dmb_drain_message(d);
1089                cxusb_d680_dmb_drain_video(d);
1090                msleep(200);
1091        }
1092
1093        /* Reset the tuner */
1094        if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1095                err("clear tuner gpio failed");
1096                return -EIO;
1097        }
1098        msleep(100);
1099        if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1100                err("set tuner gpio failed");
1101                return -EIO;
1102        }
1103        msleep(100);
1104
1105        /* Attach frontend */
1106        adap->fe_adap[0].fe = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap);
1107        if (adap->fe_adap[0].fe == NULL)
1108                return -EIO;
1109
1110        return 0;
1111}
1112
1113static struct atbm8830_config mygica_d689_atbm8830_cfg = {
1114        .prod = ATBM8830_PROD_8830,
1115        .demod_address = 0x40,
1116        .serial_ts = 0,
1117        .ts_sampling_edge = 1,
1118        .ts_clk_gated = 0,
1119        .osc_clk_freq = 30400, /* in kHz */
1120        .if_freq = 0, /* zero IF */
1121        .zif_swap_iq = 1,
1122        .agc_min = 0x2E,
1123        .agc_max = 0x90,
1124        .agc_hold_loop = 0,
1125};
1126
1127static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
1128{
1129        struct dvb_usb_device *d = adap->dev;
1130
1131        /* Select required USB configuration */
1132        if (usb_set_interface(d->udev, 0, 0) < 0)
1133                err("set interface failed");
1134
1135        /* Unblock all USB pipes */
1136        usb_clear_halt(d->udev,
1137                usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1138        usb_clear_halt(d->udev,
1139                usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1140        usb_clear_halt(d->udev,
1141                usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1142
1143
1144        /* Reset the tuner */
1145        if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1146                err("clear tuner gpio failed");
1147                return -EIO;
1148        }
1149        msleep(100);
1150        if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1151                err("set tuner gpio failed");
1152                return -EIO;
1153        }
1154        msleep(100);
1155
1156        /* Attach frontend */
1157        adap->fe_adap[0].fe = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
1158                &d->i2c_adap);
1159        if (adap->fe_adap[0].fe == NULL)
1160                return -EIO;
1161
1162        return 0;
1163}
1164
1165static int cxusb_mygica_t230_frontend_attach(struct dvb_usb_adapter *adap)
1166{
1167        struct dvb_usb_device *d = adap->dev;
1168        struct cxusb_state *st = d->priv;
1169        struct i2c_adapter *adapter;
1170        struct i2c_client *client_demod;
1171        struct i2c_client *client_tuner;
1172        struct i2c_board_info info;
1173        struct si2168_config si2168_config;
1174        struct si2157_config si2157_config;
1175
1176        /* Select required USB configuration */
1177        if (usb_set_interface(d->udev, 0, 0) < 0)
1178                err("set interface failed");
1179
1180        /* Unblock all USB pipes */
1181        usb_clear_halt(d->udev,
1182                usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1183        usb_clear_halt(d->udev,
1184                usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1185        usb_clear_halt(d->udev,
1186                usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1187
1188        /* attach frontend */
1189        si2168_config.i2c_adapter = &adapter;
1190        si2168_config.fe = &adap->fe_adap[0].fe;
1191        si2168_config.ts_mode = SI2168_TS_PARALLEL;
1192        si2168_config.ts_clock_inv = 1;
1193        memset(&info, 0, sizeof(struct i2c_board_info));
1194        strlcpy(info.type, "si2168", I2C_NAME_SIZE);
1195        info.addr = 0x64;
1196        info.platform_data = &si2168_config;
1197        request_module(info.type);
1198        client_demod = i2c_new_device(&d->i2c_adap, &info);
1199        if (client_demod == NULL || client_demod->dev.driver == NULL)
1200                return -ENODEV;
1201
1202        if (!try_module_get(client_demod->dev.driver->owner)) {
1203                i2c_unregister_device(client_demod);
1204                return -ENODEV;
1205        }
1206
1207        st->i2c_client_demod = client_demod;
1208
1209        /* attach tuner */
1210        memset(&si2157_config, 0, sizeof(si2157_config));
1211        si2157_config.fe = adap->fe_adap[0].fe;
1212        si2157_config.if_port = 1;
1213        memset(&info, 0, sizeof(struct i2c_board_info));
1214        strlcpy(info.type, "si2157", I2C_NAME_SIZE);
1215        info.addr = 0x60;
1216        info.platform_data = &si2157_config;
1217        request_module(info.type);
1218        client_tuner = i2c_new_device(adapter, &info);
1219        if (client_tuner == NULL || client_tuner->dev.driver == NULL) {
1220                module_put(client_demod->dev.driver->owner);
1221                i2c_unregister_device(client_demod);
1222                return -ENODEV;
1223        }
1224        if (!try_module_get(client_tuner->dev.driver->owner)) {
1225                i2c_unregister_device(client_tuner);
1226                module_put(client_demod->dev.driver->owner);
1227                i2c_unregister_device(client_demod);
1228                return -ENODEV;
1229        }
1230
1231        st->i2c_client_tuner = client_tuner;
1232
1233        /* hook fe: need to resync the slave fifo when signal locks. */
1234        mutex_init(&st->stream_mutex);
1235        st->last_lock = 0;
1236        st->fe_read_status = adap->fe_adap[0].fe->ops.read_status;
1237        adap->fe_adap[0].fe->ops.read_status = cxusb_read_status;
1238
1239        return 0;
1240}
1241
1242/*
1243 * DViCO has shipped two devices with the same USB ID, but only one of them
1244 * needs a firmware download.  Check the device class details to see if they
1245 * have non-default values to decide whether the device is actually cold or
1246 * not, and forget a match if it turns out we selected the wrong device.
1247 */
1248static int bluebird_fx2_identify_state(struct usb_device *udev,
1249                                       struct dvb_usb_device_properties *props,
1250                                       struct dvb_usb_device_description **desc,
1251                                       int *cold)
1252{
1253        int wascold = *cold;
1254
1255        *cold = udev->descriptor.bDeviceClass == 0xff &&
1256                udev->descriptor.bDeviceSubClass == 0xff &&
1257                udev->descriptor.bDeviceProtocol == 0xff;
1258
1259        if (*cold && !wascold)
1260                *desc = NULL;
1261
1262        return 0;
1263}
1264
1265/*
1266 * DViCO bluebird firmware needs the "warm" product ID to be patched into the
1267 * firmware file before download.
1268 */
1269
1270static const int dvico_firmware_id_offsets[] = { 6638, 3204 };
1271static int bluebird_patch_dvico_firmware_download(struct usb_device *udev,
1272                                                  const struct firmware *fw)
1273{
1274        int pos;
1275
1276        for (pos = 0; pos < ARRAY_SIZE(dvico_firmware_id_offsets); pos++) {
1277                int idoff = dvico_firmware_id_offsets[pos];
1278
1279                if (fw->size < idoff + 4)
1280                        continue;
1281
1282                if (fw->data[idoff] == (USB_VID_DVICO & 0xff) &&
1283                    fw->data[idoff + 1] == USB_VID_DVICO >> 8) {
1284                        struct firmware new_fw;
1285                        u8 *new_fw_data = vmalloc(fw->size);
1286                        int ret;
1287
1288                        if (!new_fw_data)
1289                                return -ENOMEM;
1290
1291                        memcpy(new_fw_data, fw->data, fw->size);
1292                        new_fw.size = fw->size;
1293                        new_fw.data = new_fw_data;
1294
1295                        new_fw_data[idoff + 2] =
1296                                le16_to_cpu(udev->descriptor.idProduct) + 1;
1297                        new_fw_data[idoff + 3] =
1298                                le16_to_cpu(udev->descriptor.idProduct) >> 8;
1299
1300                        ret = usb_cypress_load_firmware(udev, &new_fw,
1301                                                        CYPRESS_FX2);
1302                        vfree(new_fw_data);
1303                        return ret;
1304                }
1305        }
1306
1307        return -EINVAL;
1308}
1309
1310/* DVB USB Driver stuff */
1311static struct dvb_usb_device_properties cxusb_medion_properties;
1312static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties;
1313static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties;
1314static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties;
1315static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties;
1316static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties;
1317static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties;
1318static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties;
1319static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties;
1320static struct dvb_usb_device_properties cxusb_aver_a868r_properties;
1321static struct dvb_usb_device_properties cxusb_d680_dmb_properties;
1322static struct dvb_usb_device_properties cxusb_mygica_d689_properties;
1323static struct dvb_usb_device_properties cxusb_mygica_t230_properties;
1324
1325static int cxusb_probe(struct usb_interface *intf,
1326                       const struct usb_device_id *id)
1327{
1328        if (0 == dvb_usb_device_init(intf, &cxusb_medion_properties,
1329                                     THIS_MODULE, NULL, adapter_nr) ||
1330            0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgh064f_properties,
1331                                     THIS_MODULE, NULL, adapter_nr) ||
1332            0 == dvb_usb_device_init(intf, &cxusb_bluebird_dee1601_properties,
1333                                     THIS_MODULE, NULL, adapter_nr) ||
1334            0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgz201_properties,
1335                                     THIS_MODULE, NULL, adapter_nr) ||
1336            0 == dvb_usb_device_init(intf, &cxusb_bluebird_dtt7579_properties,
1337                                     THIS_MODULE, NULL, adapter_nr) ||
1338            0 == dvb_usb_device_init(intf, &cxusb_bluebird_dualdig4_properties,
1339                                     THIS_MODULE, NULL, adapter_nr) ||
1340            0 == dvb_usb_device_init(intf, &cxusb_bluebird_nano2_properties,
1341                                     THIS_MODULE, NULL, adapter_nr) ||
1342            0 == dvb_usb_device_init(intf,
1343                                &cxusb_bluebird_nano2_needsfirmware_properties,
1344                                     THIS_MODULE, NULL, adapter_nr) ||
1345            0 == dvb_usb_device_init(intf, &cxusb_aver_a868r_properties,
1346                                     THIS_MODULE, NULL, adapter_nr) ||
1347            0 == dvb_usb_device_init(intf,
1348                                     &cxusb_bluebird_dualdig4_rev2_properties,
1349                                     THIS_MODULE, NULL, adapter_nr) ||
1350            0 == dvb_usb_device_init(intf, &cxusb_d680_dmb_properties,
1351                                     THIS_MODULE, NULL, adapter_nr) ||
1352            0 == dvb_usb_device_init(intf, &cxusb_mygica_d689_properties,
1353                                     THIS_MODULE, NULL, adapter_nr) ||
1354            0 == dvb_usb_device_init(intf, &cxusb_mygica_t230_properties,
1355                                     THIS_MODULE, NULL, adapter_nr) ||
1356            0)
1357                return 0;
1358
1359        return -EINVAL;
1360}
1361
1362static void cxusb_disconnect(struct usb_interface *intf)
1363{
1364        struct dvb_usb_device *d = usb_get_intfdata(intf);
1365        struct cxusb_state *st = d->priv;
1366        struct i2c_client *client;
1367
1368        /* remove I2C client for tuner */
1369        client = st->i2c_client_tuner;
1370        if (client) {
1371                module_put(client->dev.driver->owner);
1372                i2c_unregister_device(client);
1373        }
1374
1375        /* remove I2C client for demodulator */
1376        client = st->i2c_client_demod;
1377        if (client) {
1378                module_put(client->dev.driver->owner);
1379                i2c_unregister_device(client);
1380        }
1381
1382        dvb_usb_device_exit(intf);
1383}
1384
1385enum cxusb_table_index {
1386        MEDION_MD95700,
1387        DVICO_BLUEBIRD_LG064F_COLD,
1388        DVICO_BLUEBIRD_LG064F_WARM,
1389        DVICO_BLUEBIRD_DUAL_1_COLD,
1390        DVICO_BLUEBIRD_DUAL_1_WARM,
1391        DVICO_BLUEBIRD_LGZ201_COLD,
1392        DVICO_BLUEBIRD_LGZ201_WARM,
1393        DVICO_BLUEBIRD_TH7579_COLD,
1394        DVICO_BLUEBIRD_TH7579_WARM,
1395        DIGITALNOW_BLUEBIRD_DUAL_1_COLD,
1396        DIGITALNOW_BLUEBIRD_DUAL_1_WARM,
1397        DVICO_BLUEBIRD_DUAL_2_COLD,
1398        DVICO_BLUEBIRD_DUAL_2_WARM,
1399        DVICO_BLUEBIRD_DUAL_4,
1400        DVICO_BLUEBIRD_DVB_T_NANO_2,
1401        DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM,
1402        AVERMEDIA_VOLAR_A868R,
1403        DVICO_BLUEBIRD_DUAL_4_REV_2,
1404        CONEXANT_D680_DMB,
1405        MYGICA_D689,
1406        MYGICA_T230,
1407        NR__cxusb_table_index
1408};
1409
1410static struct usb_device_id cxusb_table[NR__cxusb_table_index + 1] = {
1411        [MEDION_MD95700] = {
1412                USB_DEVICE(USB_VID_MEDION, USB_PID_MEDION_MD95700)
1413        },
1414        [DVICO_BLUEBIRD_LG064F_COLD] = {
1415                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_COLD)
1416        },
1417        [DVICO_BLUEBIRD_LG064F_WARM] = {
1418                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_WARM)
1419        },
1420        [DVICO_BLUEBIRD_DUAL_1_COLD] = {
1421                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_COLD)
1422        },
1423        [DVICO_BLUEBIRD_DUAL_1_WARM] = {
1424                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_WARM)
1425        },
1426        [DVICO_BLUEBIRD_LGZ201_COLD] = {
1427                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_COLD)
1428        },
1429        [DVICO_BLUEBIRD_LGZ201_WARM] = {
1430                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_WARM)
1431        },
1432        [DVICO_BLUEBIRD_TH7579_COLD] = {
1433                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_COLD)
1434        },
1435        [DVICO_BLUEBIRD_TH7579_WARM] = {
1436                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_WARM)
1437        },
1438        [DIGITALNOW_BLUEBIRD_DUAL_1_COLD] = {
1439                USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD)
1440        },
1441        [DIGITALNOW_BLUEBIRD_DUAL_1_WARM] = {
1442                USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_WARM)
1443        },
1444        [DVICO_BLUEBIRD_DUAL_2_COLD] = {
1445                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_COLD)
1446        },
1447        [DVICO_BLUEBIRD_DUAL_2_WARM] = {
1448                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_WARM)
1449        },
1450        [DVICO_BLUEBIRD_DUAL_4] = {
1451                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4)
1452        },
1453        [DVICO_BLUEBIRD_DVB_T_NANO_2] = {
1454                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2)
1455        },
1456        [DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM] = {
1457                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM)
1458        },
1459        [AVERMEDIA_VOLAR_A868R] = {
1460                USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_A868R)
1461        },
1462        [DVICO_BLUEBIRD_DUAL_4_REV_2] = {
1463                USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4_REV_2)
1464        },
1465        [CONEXANT_D680_DMB] = {
1466                USB_DEVICE(USB_VID_CONEXANT, USB_PID_CONEXANT_D680_DMB)
1467        },
1468        [MYGICA_D689] = {
1469                USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_D689)
1470        },
1471        [MYGICA_T230] = {
1472                USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230)
1473        },
1474        {}              /* Terminating entry */
1475};
1476MODULE_DEVICE_TABLE (usb, cxusb_table);
1477
1478static struct dvb_usb_device_properties cxusb_medion_properties = {
1479        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1480
1481        .usb_ctrl = CYPRESS_FX2,
1482
1483        .size_of_priv     = sizeof(struct cxusb_state),
1484
1485        .num_adapters = 1,
1486        .adapter = {
1487                {
1488                .num_frontends = 1,
1489                .fe = {{
1490                        .streaming_ctrl   = cxusb_streaming_ctrl,
1491                        .frontend_attach  = cxusb_cx22702_frontend_attach,
1492                        .tuner_attach     = cxusb_fmd1216me_tuner_attach,
1493                        /* parameter for the MPEG2-data transfer */
1494                                        .stream = {
1495                                                .type = USB_BULK,
1496                                .count = 5,
1497                                .endpoint = 0x02,
1498                                .u = {
1499                                        .bulk = {
1500                                                .buffersize = 8192,
1501                                        }
1502                                }
1503                        },
1504                }},
1505                },
1506        },
1507        .power_ctrl       = cxusb_power_ctrl,
1508
1509        .i2c_algo         = &cxusb_i2c_algo,
1510
1511        .generic_bulk_ctrl_endpoint = 0x01,
1512
1513        .num_device_descs = 1,
1514        .devices = {
1515                {   "Medion MD95700 (MDUSBTV-HYBRID)",
1516                        { NULL },
1517                        { &cxusb_table[MEDION_MD95700], NULL },
1518                },
1519        }
1520};
1521
1522static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
1523        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1524
1525        .usb_ctrl          = DEVICE_SPECIFIC,
1526        .firmware          = "dvb-usb-bluebird-01.fw",
1527        .download_firmware = bluebird_patch_dvico_firmware_download,
1528        /* use usb alt setting 0 for EP4 transfer (dvb-t),
1529           use usb alt setting 7 for EP2 transfer (atsc) */
1530
1531        .size_of_priv     = sizeof(struct cxusb_state),
1532
1533        .num_adapters = 1,
1534        .adapter = {
1535                {
1536                .num_frontends = 1,
1537                .fe = {{
1538                        .streaming_ctrl   = cxusb_streaming_ctrl,
1539                        .frontend_attach  = cxusb_lgdt3303_frontend_attach,
1540                        .tuner_attach     = cxusb_lgh064f_tuner_attach,
1541
1542                        /* parameter for the MPEG2-data transfer */
1543                                        .stream = {
1544                                                .type = USB_BULK,
1545                                .count = 5,
1546                                .endpoint = 0x02,
1547                                .u = {
1548                                        .bulk = {
1549                                                .buffersize = 8192,
1550                                        }
1551                                }
1552                        },
1553                }},
1554                },
1555        },
1556
1557        .power_ctrl       = cxusb_bluebird_power_ctrl,
1558
1559        .i2c_algo         = &cxusb_i2c_algo,
1560
1561        .rc.core = {
1562                .rc_interval    = 100,
1563                .rc_codes       = RC_MAP_DVICO_PORTABLE,
1564                .module_name    = KBUILD_MODNAME,
1565                .rc_query       = cxusb_rc_query,
1566                .allowed_protos = RC_BIT_UNKNOWN,
1567        },
1568
1569        .generic_bulk_ctrl_endpoint = 0x01,
1570
1571        .num_device_descs = 1,
1572        .devices = {
1573                {   "DViCO FusionHDTV5 USB Gold",
1574                        { &cxusb_table[DVICO_BLUEBIRD_LG064F_COLD], NULL },
1575                        { &cxusb_table[DVICO_BLUEBIRD_LG064F_WARM], NULL },
1576                },
1577        }
1578};
1579
1580static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
1581        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1582
1583        .usb_ctrl          = DEVICE_SPECIFIC,
1584        .firmware          = "dvb-usb-bluebird-01.fw",
1585        .download_firmware = bluebird_patch_dvico_firmware_download,
1586        /* use usb alt setting 0 for EP4 transfer (dvb-t),
1587           use usb alt setting 7 for EP2 transfer (atsc) */
1588
1589        .size_of_priv     = sizeof(struct cxusb_state),
1590
1591        .num_adapters = 1,
1592        .adapter = {
1593                {
1594                .num_frontends = 1,
1595                .fe = {{
1596                        .streaming_ctrl   = cxusb_streaming_ctrl,
1597                        .frontend_attach  = cxusb_dee1601_frontend_attach,
1598                        .tuner_attach     = cxusb_dee1601_tuner_attach,
1599                        /* parameter for the MPEG2-data transfer */
1600                        .stream = {
1601                                .type = USB_BULK,
1602                                .count = 5,
1603                                .endpoint = 0x04,
1604                                .u = {
1605                                        .bulk = {
1606                                                .buffersize = 8192,
1607                                        }
1608                                }
1609                        },
1610                }},
1611                },
1612        },
1613
1614        .power_ctrl       = cxusb_bluebird_power_ctrl,
1615
1616        .i2c_algo         = &cxusb_i2c_algo,
1617
1618        .rc.core = {
1619                .rc_interval    = 100,
1620                .rc_codes       = RC_MAP_DVICO_MCE,
1621                .module_name    = KBUILD_MODNAME,
1622                .rc_query       = cxusb_rc_query,
1623                .allowed_protos = RC_BIT_UNKNOWN,
1624        },
1625
1626        .generic_bulk_ctrl_endpoint = 0x01,
1627
1628        .num_device_descs = 3,
1629        .devices = {
1630                {   "DViCO FusionHDTV DVB-T Dual USB",
1631                        { &cxusb_table[DVICO_BLUEBIRD_DUAL_1_COLD], NULL },
1632                        { &cxusb_table[DVICO_BLUEBIRD_DUAL_1_WARM], NULL },
1633                },
1634                {   "DigitalNow DVB-T Dual USB",
1635                        { &cxusb_table[DIGITALNOW_BLUEBIRD_DUAL_1_COLD],  NULL },
1636                        { &cxusb_table[DIGITALNOW_BLUEBIRD_DUAL_1_WARM], NULL },
1637                },
1638                {   "DViCO FusionHDTV DVB-T Dual Digital 2",
1639                        { &cxusb_table[DVICO_BLUEBIRD_DUAL_2_COLD], NULL },
1640                        { &cxusb_table[DVICO_BLUEBIRD_DUAL_2_WARM], NULL },
1641                },
1642        }
1643};
1644
1645static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
1646        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1647
1648        .usb_ctrl          = DEVICE_SPECIFIC,
1649        .firmware          = "dvb-usb-bluebird-01.fw",
1650        .download_firmware = bluebird_patch_dvico_firmware_download,
1651        /* use usb alt setting 0 for EP4 transfer (dvb-t),
1652           use usb alt setting 7 for EP2 transfer (atsc) */
1653
1654        .size_of_priv     = sizeof(struct cxusb_state),
1655
1656        .num_adapters = 2,
1657        .adapter = {
1658                {
1659                .num_frontends = 1,
1660                .fe = {{
1661                        .streaming_ctrl   = cxusb_streaming_ctrl,
1662                        .frontend_attach  = cxusb_mt352_frontend_attach,
1663                        .tuner_attach     = cxusb_lgz201_tuner_attach,
1664
1665                        /* parameter for the MPEG2-data transfer */
1666                        .stream = {
1667                                .type = USB_BULK,
1668                                .count = 5,
1669                                .endpoint = 0x04,
1670                                .u = {
1671                                        .bulk = {
1672                                                .buffersize = 8192,
1673                                        }
1674                                }
1675                        },
1676                }},
1677                },
1678        },
1679        .power_ctrl       = cxusb_bluebird_power_ctrl,
1680
1681        .i2c_algo         = &cxusb_i2c_algo,
1682
1683        .rc.core = {
1684                .rc_interval    = 100,
1685                .rc_codes       = RC_MAP_DVICO_PORTABLE,
1686                .module_name    = KBUILD_MODNAME,
1687                .rc_query       = cxusb_rc_query,
1688                .allowed_protos = RC_BIT_UNKNOWN,
1689        },
1690
1691        .generic_bulk_ctrl_endpoint = 0x01,
1692        .num_device_descs = 1,
1693        .devices = {
1694                {   "DViCO FusionHDTV DVB-T USB (LGZ201)",
1695                        { &cxusb_table[DVICO_BLUEBIRD_LGZ201_COLD], NULL },
1696                        { &cxusb_table[DVICO_BLUEBIRD_LGZ201_WARM], NULL },
1697                },
1698        }
1699};
1700
1701static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
1702        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1703
1704        .usb_ctrl          = DEVICE_SPECIFIC,
1705        .firmware          = "dvb-usb-bluebird-01.fw",
1706        .download_firmware = bluebird_patch_dvico_firmware_download,
1707        /* use usb alt setting 0 for EP4 transfer (dvb-t),
1708           use usb alt setting 7 for EP2 transfer (atsc) */
1709
1710        .size_of_priv     = sizeof(struct cxusb_state),
1711
1712        .num_adapters = 1,
1713        .adapter = {
1714                {
1715                .num_frontends = 1,
1716                .fe = {{
1717                        .streaming_ctrl   = cxusb_streaming_ctrl,
1718                        .frontend_attach  = cxusb_mt352_frontend_attach,
1719                        .tuner_attach     = cxusb_dtt7579_tuner_attach,
1720
1721                        /* parameter for the MPEG2-data transfer */
1722                        .stream = {
1723                                .type = USB_BULK,
1724                                .count = 5,
1725                                .endpoint = 0x04,
1726                                .u = {
1727                                        .bulk = {
1728                                                .buffersize = 8192,
1729                                        }
1730                                }
1731                        },
1732                }},
1733                },
1734        },
1735        .power_ctrl       = cxusb_bluebird_power_ctrl,
1736
1737        .i2c_algo         = &cxusb_i2c_algo,
1738
1739        .rc.core = {
1740                .rc_interval    = 100,
1741                .rc_codes       = RC_MAP_DVICO_PORTABLE,
1742                .module_name    = KBUILD_MODNAME,
1743                .rc_query       = cxusb_rc_query,
1744                .allowed_protos = RC_BIT_UNKNOWN,
1745        },
1746
1747        .generic_bulk_ctrl_endpoint = 0x01,
1748
1749        .num_device_descs = 1,
1750        .devices = {
1751                {   "DViCO FusionHDTV DVB-T USB (TH7579)",
1752                        { &cxusb_table[DVICO_BLUEBIRD_TH7579_COLD], NULL },
1753                        { &cxusb_table[DVICO_BLUEBIRD_TH7579_WARM], NULL },
1754                },
1755        }
1756};
1757
1758static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
1759        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1760
1761        .usb_ctrl         = CYPRESS_FX2,
1762
1763        .size_of_priv     = sizeof(struct cxusb_state),
1764
1765        .num_adapters = 1,
1766        .adapter = {
1767                {
1768                .num_frontends = 1,
1769                .fe = {{
1770                        .streaming_ctrl   = cxusb_streaming_ctrl,
1771                        .frontend_attach  = cxusb_dualdig4_frontend_attach,
1772                        .tuner_attach     = cxusb_dvico_xc3028_tuner_attach,
1773                        /* parameter for the MPEG2-data transfer */
1774                        .stream = {
1775                                .type = USB_BULK,
1776                                .count = 5,
1777                                .endpoint = 0x02,
1778                                .u = {
1779                                        .bulk = {
1780                                                .buffersize = 8192,
1781                                        }
1782                                }
1783                        },
1784                }},
1785                },
1786        },
1787
1788        .power_ctrl       = cxusb_power_ctrl,
1789
1790        .i2c_algo         = &cxusb_i2c_algo,
1791
1792        .generic_bulk_ctrl_endpoint = 0x01,
1793
1794        .rc.core = {
1795                .rc_interval    = 100,
1796                .rc_codes       = RC_MAP_DVICO_MCE,
1797                .module_name    = KBUILD_MODNAME,
1798                .rc_query       = cxusb_bluebird2_rc_query,
1799                .allowed_protos = RC_BIT_UNKNOWN,
1800        },
1801
1802        .num_device_descs = 1,
1803        .devices = {
1804                {   "DViCO FusionHDTV DVB-T Dual Digital 4",
1805                        { NULL },
1806                        { &cxusb_table[DVICO_BLUEBIRD_DUAL_4], NULL },
1807                },
1808        }
1809};
1810
1811static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
1812        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1813
1814        .usb_ctrl         = CYPRESS_FX2,
1815        .identify_state   = bluebird_fx2_identify_state,
1816
1817        .size_of_priv     = sizeof(struct cxusb_state),
1818
1819        .num_adapters = 1,
1820        .adapter = {
1821                {
1822                .num_frontends = 1,
1823                .fe = {{
1824                        .streaming_ctrl   = cxusb_streaming_ctrl,
1825                        .frontend_attach  = cxusb_nano2_frontend_attach,
1826                        .tuner_attach     = cxusb_dvico_xc3028_tuner_attach,
1827                        /* parameter for the MPEG2-data transfer */
1828                        .stream = {
1829                                .type = USB_BULK,
1830                                .count = 5,
1831                                .endpoint = 0x02,
1832                                .u = {
1833                                        .bulk = {
1834                                                .buffersize = 8192,
1835                                        }
1836                                }
1837                        },
1838                }},
1839                },
1840        },
1841
1842        .power_ctrl       = cxusb_nano2_power_ctrl,
1843
1844        .i2c_algo         = &cxusb_i2c_algo,
1845
1846        .generic_bulk_ctrl_endpoint = 0x01,
1847
1848        .rc.core = {
1849                .rc_interval    = 100,
1850                .rc_codes       = RC_MAP_DVICO_PORTABLE,
1851                .module_name    = KBUILD_MODNAME,
1852                .rc_query       = cxusb_bluebird2_rc_query,
1853                .allowed_protos = RC_BIT_UNKNOWN,
1854        },
1855
1856        .num_device_descs = 1,
1857        .devices = {
1858                {   "DViCO FusionHDTV DVB-T NANO2",
1859                        { NULL },
1860                        { &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2], NULL },
1861                },
1862        }
1863};
1864
1865static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties = {
1866        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1867
1868        .usb_ctrl          = DEVICE_SPECIFIC,
1869        .firmware          = "dvb-usb-bluebird-02.fw",
1870        .download_firmware = bluebird_patch_dvico_firmware_download,
1871        .identify_state    = bluebird_fx2_identify_state,
1872
1873        .size_of_priv      = sizeof(struct cxusb_state),
1874
1875        .num_adapters = 1,
1876        .adapter = {
1877                {
1878                .num_frontends = 1,
1879                .fe = {{
1880                        .streaming_ctrl   = cxusb_streaming_ctrl,
1881                        .frontend_attach  = cxusb_nano2_frontend_attach,
1882                        .tuner_attach     = cxusb_dvico_xc3028_tuner_attach,
1883                        /* parameter for the MPEG2-data transfer */
1884                        .stream = {
1885                                .type = USB_BULK,
1886                                .count = 5,
1887                                .endpoint = 0x02,
1888                                .u = {
1889                                        .bulk = {
1890                                                .buffersize = 8192,
1891                                        }
1892                                }
1893                        },
1894                }},
1895                },
1896        },
1897
1898        .power_ctrl       = cxusb_nano2_power_ctrl,
1899
1900        .i2c_algo         = &cxusb_i2c_algo,
1901
1902        .generic_bulk_ctrl_endpoint = 0x01,
1903
1904        .rc.core = {
1905                .rc_interval    = 100,
1906                .rc_codes       = RC_MAP_DVICO_PORTABLE,
1907                .module_name    = KBUILD_MODNAME,
1908                .rc_query       = cxusb_rc_query,
1909                .allowed_protos = RC_BIT_UNKNOWN,
1910        },
1911
1912        .num_device_descs = 1,
1913        .devices = {
1914                {   "DViCO FusionHDTV DVB-T NANO2 w/o firmware",
1915                        { &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2], NULL },
1916                        { &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM], NULL },
1917                },
1918        }
1919};
1920
1921static struct dvb_usb_device_properties cxusb_aver_a868r_properties = {
1922        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1923
1924        .usb_ctrl         = CYPRESS_FX2,
1925
1926        .size_of_priv     = sizeof(struct cxusb_state),
1927
1928        .num_adapters = 1,
1929        .adapter = {
1930                {
1931                .num_frontends = 1,
1932                .fe = {{
1933                        .streaming_ctrl   = cxusb_aver_streaming_ctrl,
1934                        .frontend_attach  = cxusb_aver_lgdt3303_frontend_attach,
1935                        .tuner_attach     = cxusb_mxl5003s_tuner_attach,
1936                        /* parameter for the MPEG2-data transfer */
1937                        .stream = {
1938                                .type = USB_BULK,
1939                                .count = 5,
1940                                .endpoint = 0x04,
1941                                .u = {
1942                                        .bulk = {
1943                                                .buffersize = 8192,
1944                                        }
1945                                }
1946                        },
1947                }},
1948                },
1949        },
1950        .power_ctrl       = cxusb_aver_power_ctrl,
1951
1952        .i2c_algo         = &cxusb_i2c_algo,
1953
1954        .generic_bulk_ctrl_endpoint = 0x01,
1955
1956        .num_device_descs = 1,
1957        .devices = {
1958                {   "AVerMedia AVerTVHD Volar (A868R)",
1959                        { NULL },
1960                        { &cxusb_table[AVERMEDIA_VOLAR_A868R], NULL },
1961                },
1962        }
1963};
1964
1965static
1966struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
1967        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
1968
1969        .usb_ctrl         = CYPRESS_FX2,
1970
1971        .size_of_priv     = sizeof(struct cxusb_state),
1972
1973        .num_adapters = 1,
1974        .adapter = {
1975                {
1976                .size_of_priv    = sizeof(struct dib0700_adapter_state),
1977                .num_frontends = 1,
1978                .fe = {{
1979                        .streaming_ctrl  = cxusb_streaming_ctrl,
1980                        .frontend_attach = cxusb_dualdig4_rev2_frontend_attach,
1981                        .tuner_attach    = cxusb_dualdig4_rev2_tuner_attach,
1982                        /* parameter for the MPEG2-data transfer */
1983                        .stream = {
1984                                .type = USB_BULK,
1985                                .count = 7,
1986                                .endpoint = 0x02,
1987                                .u = {
1988                                        .bulk = {
1989                                                .buffersize = 4096,
1990                                        }
1991                                }
1992                        },
1993                }},
1994                },
1995        },
1996
1997        .power_ctrl       = cxusb_bluebird_power_ctrl,
1998
1999        .i2c_algo         = &cxusb_i2c_algo,
2000
2001        .generic_bulk_ctrl_endpoint = 0x01,
2002
2003        .rc.core = {
2004                .rc_interval    = 100,
2005                .rc_codes       = RC_MAP_DVICO_MCE,
2006                .module_name    = KBUILD_MODNAME,
2007                .rc_query       = cxusb_rc_query,
2008                .allowed_protos = RC_BIT_UNKNOWN,
2009        },
2010
2011        .num_device_descs = 1,
2012        .devices = {
2013                {   "DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)",
2014                        { NULL },
2015                        { &cxusb_table[DVICO_BLUEBIRD_DUAL_4_REV_2], NULL },
2016                },
2017        }
2018};
2019
2020static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
2021        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
2022
2023        .usb_ctrl         = CYPRESS_FX2,
2024
2025        .size_of_priv     = sizeof(struct cxusb_state),
2026
2027        .num_adapters = 1,
2028        .adapter = {
2029                {
2030                .num_frontends = 1,
2031                .fe = {{
2032                        .streaming_ctrl   = cxusb_d680_dmb_streaming_ctrl,
2033                        .frontend_attach  = cxusb_d680_dmb_frontend_attach,
2034                        .tuner_attach     = cxusb_d680_dmb_tuner_attach,
2035
2036                        /* parameter for the MPEG2-data transfer */
2037                        .stream = {
2038                                .type = USB_BULK,
2039                                .count = 5,
2040                                .endpoint = 0x02,
2041                                .u = {
2042                                        .bulk = {
2043                                                .buffersize = 8192,
2044                                        }
2045                                }
2046                        },
2047                }},
2048                },
2049        },
2050
2051        .power_ctrl       = cxusb_d680_dmb_power_ctrl,
2052
2053        .i2c_algo         = &cxusb_i2c_algo,
2054
2055        .generic_bulk_ctrl_endpoint = 0x01,
2056
2057        .rc.core = {
2058                .rc_interval    = 100,
2059                .rc_codes       = RC_MAP_D680_DMB,
2060                .module_name    = KBUILD_MODNAME,
2061                .rc_query       = cxusb_d680_dmb_rc_query,
2062                .allowed_protos = RC_BIT_UNKNOWN,
2063        },
2064
2065        .num_device_descs = 1,
2066        .devices = {
2067                {
2068                        "Conexant DMB-TH Stick",
2069                        { NULL },
2070                        { &cxusb_table[CONEXANT_D680_DMB], NULL },
2071                },
2072        }
2073};
2074
2075static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
2076        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
2077
2078        .usb_ctrl         = CYPRESS_FX2,
2079
2080        .size_of_priv     = sizeof(struct cxusb_state),
2081
2082        .num_adapters = 1,
2083        .adapter = {
2084                {
2085                .num_frontends = 1,
2086                .fe = {{
2087                        .streaming_ctrl   = cxusb_d680_dmb_streaming_ctrl,
2088                        .frontend_attach  = cxusb_mygica_d689_frontend_attach,
2089                        .tuner_attach     = cxusb_mygica_d689_tuner_attach,
2090
2091                        /* parameter for the MPEG2-data transfer */
2092                        .stream = {
2093                                .type = USB_BULK,
2094                                .count = 5,
2095                                .endpoint = 0x02,
2096                                .u = {
2097                                        .bulk = {
2098                                                .buffersize = 8192,
2099                                        }
2100                                }
2101                        },
2102                }},
2103                },
2104        },
2105
2106        .power_ctrl       = cxusb_d680_dmb_power_ctrl,
2107
2108        .i2c_algo         = &cxusb_i2c_algo,
2109
2110        .generic_bulk_ctrl_endpoint = 0x01,
2111
2112        .rc.core = {
2113                .rc_interval    = 100,
2114                .rc_codes       = RC_MAP_D680_DMB,
2115                .module_name    = KBUILD_MODNAME,
2116                .rc_query       = cxusb_d680_dmb_rc_query,
2117                .allowed_protos = RC_BIT_UNKNOWN,
2118        },
2119
2120        .num_device_descs = 1,
2121        .devices = {
2122                {
2123                        "Mygica D689 DMB-TH",
2124                        { NULL },
2125                        { &cxusb_table[MYGICA_D689], NULL },
2126                },
2127        }
2128};
2129
2130static struct dvb_usb_device_properties cxusb_mygica_t230_properties = {
2131        .caps = DVB_USB_IS_AN_I2C_ADAPTER,
2132
2133        .usb_ctrl         = CYPRESS_FX2,
2134
2135        .size_of_priv     = sizeof(struct cxusb_state),
2136
2137        .num_adapters = 1,
2138        .adapter = {
2139                {
2140                .num_frontends = 1,
2141                .fe = {{
2142                        .streaming_ctrl   = cxusb_streaming_ctrl,
2143                        .frontend_attach  = cxusb_mygica_t230_frontend_attach,
2144
2145                        /* parameter for the MPEG2-data transfer */
2146                        .stream = {
2147                                .type = USB_BULK,
2148                                .count = 5,
2149                                .endpoint = 0x02,
2150                                .u = {
2151                                        .bulk = {
2152                                                .buffersize = 8192,
2153                                        }
2154                                }
2155                        },
2156                } },
2157                },
2158        },
2159
2160        .power_ctrl       = cxusb_d680_dmb_power_ctrl,
2161
2162        .i2c_algo         = &cxusb_i2c_algo,
2163
2164        .generic_bulk_ctrl_endpoint = 0x01,
2165
2166        .rc.core = {
2167                .rc_interval    = 100,
2168                .rc_codes       = RC_MAP_D680_DMB,
2169                .module_name    = KBUILD_MODNAME,
2170                .rc_query       = cxusb_d680_dmb_rc_query,
2171                .allowed_protos = RC_BIT_UNKNOWN,
2172        },
2173
2174        .num_device_descs = 1,
2175        .devices = {
2176                {
2177                        "Mygica T230 DVB-T/T2/C",
2178                        { NULL },
2179                        { &cxusb_table[MYGICA_T230], NULL },
2180                },
2181        }
2182};
2183
2184static struct usb_driver cxusb_driver = {
2185        .name           = "dvb_usb_cxusb",
2186        .probe          = cxusb_probe,
2187        .disconnect     = cxusb_disconnect,
2188        .id_table       = cxusb_table,
2189};
2190
2191module_usb_driver(cxusb_driver);
2192
2193MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
2194MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
2195MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
2196MODULE_DESCRIPTION("Driver for Conexant USB2.0 hybrid reference design");
2197MODULE_VERSION("1.0-alpha");
2198MODULE_LICENSE("GPL");
2199