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