linux/drivers/media/usb/dvb-usb/dib0700_core.c
<<
>>
Prefs
   1/* Linux driver for devices based on the DiBcom DiB0700 USB bridge
   2 *
   3 *      This program is free software; you can redistribute it and/or modify it
   4 *      under the terms of the GNU General Public License as published by the Free
   5 *      Software Foundation, version 2.
   6 *
   7 *  Copyright (C) 2005-6 DiBcom, SA
   8 */
   9#include "dib0700.h"
  10
  11/* debug */
  12int dvb_usb_dib0700_debug;
  13module_param_named(debug,dvb_usb_dib0700_debug, int, 0644);
  14MODULE_PARM_DESC(debug, "set debugging level (1=info,2=fw,4=fwdata,8=data (or-able))." DVB_USB_DEBUG_STATUS);
  15
  16static int nb_packet_buffer_size = 21;
  17module_param(nb_packet_buffer_size, int, 0644);
  18MODULE_PARM_DESC(nb_packet_buffer_size,
  19        "Set the dib0700 driver data buffer size. This parameter corresponds to the number of TS packets. The actual size of the data buffer corresponds to this parameter multiplied by 188 (default: 21)");
  20
  21DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
  22
  23
  24int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
  25                        u32 *romversion, u32 *ramversion, u32 *fwtype)
  26{
  27        struct dib0700_state *st = d->priv;
  28        int ret;
  29
  30        if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
  31                err("could not acquire lock");
  32                return -EINTR;
  33        }
  34
  35        ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
  36                                  REQUEST_GET_VERSION,
  37                                  USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
  38                                  st->buf, 16, USB_CTRL_GET_TIMEOUT);
  39        if (hwversion != NULL)
  40                *hwversion  = (st->buf[0] << 24)  | (st->buf[1] << 16)  |
  41                        (st->buf[2] << 8)  | st->buf[3];
  42        if (romversion != NULL)
  43                *romversion = (st->buf[4] << 24)  | (st->buf[5] << 16)  |
  44                        (st->buf[6] << 8)  | st->buf[7];
  45        if (ramversion != NULL)
  46                *ramversion = (st->buf[8] << 24)  | (st->buf[9] << 16)  |
  47                        (st->buf[10] << 8) | st->buf[11];
  48        if (fwtype != NULL)
  49                *fwtype     = (st->buf[12] << 24) | (st->buf[13] << 16) |
  50                        (st->buf[14] << 8) | st->buf[15];
  51        mutex_unlock(&d->usb_mutex);
  52        return ret;
  53}
  54
  55/* expecting rx buffer: request data[0] data[1] ... data[2] */
  56static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen)
  57{
  58        int status;
  59
  60        deb_data(">>> ");
  61        debug_dump(tx, txlen, deb_data);
  62
  63        status = usb_control_msg(d->udev, usb_sndctrlpipe(d->udev,0),
  64                tx[0], USB_TYPE_VENDOR | USB_DIR_OUT, 0, 0, tx, txlen,
  65                USB_CTRL_GET_TIMEOUT);
  66
  67        if (status != txlen)
  68                deb_data("ep 0 write error (status = %d, len: %d)\n",status,txlen);
  69
  70        return status < 0 ? status : 0;
  71}
  72
  73/* expecting tx buffer: request data[0] ... data[n] (n <= 4) */
  74int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen)
  75{
  76        u16 index, value;
  77        int status;
  78
  79        if (txlen < 2) {
  80                err("tx buffer length is smaller than 2. Makes no sense.");
  81                return -EINVAL;
  82        }
  83        if (txlen > 4) {
  84                err("tx buffer length is larger than 4. Not supported.");
  85                return -EINVAL;
  86        }
  87
  88        deb_data(">>> ");
  89        debug_dump(tx,txlen,deb_data);
  90
  91        value = ((txlen - 2) << 8) | tx[1];
  92        index = 0;
  93        if (txlen > 2)
  94                index |= (tx[2] << 8);
  95        if (txlen > 3)
  96                index |= tx[3];
  97
  98        status = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev,0), tx[0],
  99                        USB_TYPE_VENDOR | USB_DIR_IN, value, index, rx, rxlen,
 100                        USB_CTRL_GET_TIMEOUT);
 101
 102        if (status < 0)
 103                deb_info("ep 0 read error (status = %d)\n",status);
 104
 105        deb_data("<<< ");
 106        debug_dump(rx, rxlen, deb_data);
 107
 108        return status; /* length in case of success */
 109}
 110
 111int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val)
 112{
 113        struct dib0700_state *st = d->priv;
 114        int ret;
 115
 116        if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
 117                err("could not acquire lock");
 118                return -EINTR;
 119        }
 120
 121        st->buf[0] = REQUEST_SET_GPIO;
 122        st->buf[1] = gpio;
 123        st->buf[2] = ((gpio_dir & 0x01) << 7) | ((gpio_val & 0x01) << 6);
 124
 125        ret = dib0700_ctrl_wr(d, st->buf, 3);
 126
 127        mutex_unlock(&d->usb_mutex);
 128        return ret;
 129}
 130
 131static int dib0700_set_usb_xfer_len(struct dvb_usb_device *d, u16 nb_ts_packets)
 132{
 133        struct dib0700_state *st = d->priv;
 134        int ret;
 135
 136        if (st->fw_version >= 0x10201) {
 137                if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
 138                        err("could not acquire lock");
 139                        return -EINTR;
 140                }
 141
 142                st->buf[0] = REQUEST_SET_USB_XFER_LEN;
 143                st->buf[1] = (nb_ts_packets >> 8) & 0xff;
 144                st->buf[2] = nb_ts_packets & 0xff;
 145
 146                deb_info("set the USB xfer len to %i Ts packet\n", nb_ts_packets);
 147
 148                ret = dib0700_ctrl_wr(d, st->buf, 3);
 149                mutex_unlock(&d->usb_mutex);
 150        } else {
 151                deb_info("this firmware does not allow to change the USB xfer len\n");
 152                ret = -EIO;
 153        }
 154
 155        return ret;
 156}
 157
 158/*
 159 * I2C master xfer function (supported in 1.20 firmware)
 160 */
 161static int dib0700_i2c_xfer_new(struct i2c_adapter *adap, struct i2c_msg *msg,
 162                                int num)
 163{
 164        /* The new i2c firmware messages are more reliable and in particular
 165           properly support i2c read calls not preceded by a write */
 166
 167        struct dvb_usb_device *d = i2c_get_adapdata(adap);
 168        struct dib0700_state *st = d->priv;
 169        uint8_t bus_mode = 1;  /* 0=eeprom bus, 1=frontend bus */
 170        uint8_t gen_mode = 0; /* 0=master i2c, 1=gpio i2c */
 171        uint8_t en_start = 0;
 172        uint8_t en_stop = 0;
 173        int result, i;
 174
 175        /* Ensure nobody else hits the i2c bus while we're sending our
 176           sequence of messages, (such as the remote control thread) */
 177        if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
 178                return -EINTR;
 179
 180        for (i = 0; i < num; i++) {
 181                if (i == 0) {
 182                        /* First message in the transaction */
 183                        en_start = 1;
 184                } else if (!(msg[i].flags & I2C_M_NOSTART)) {
 185                        /* Device supports repeated-start */
 186                        en_start = 1;
 187                } else {
 188                        /* Not the first packet and device doesn't support
 189                           repeated start */
 190                        en_start = 0;
 191                }
 192                if (i == (num - 1)) {
 193                        /* Last message in the transaction */
 194                        en_stop = 1;
 195                }
 196
 197                if (msg[i].flags & I2C_M_RD) {
 198                        /* Read request */
 199                        u16 index, value;
 200                        uint8_t i2c_dest;
 201
 202                        i2c_dest = (msg[i].addr << 1);
 203                        value = ((en_start << 7) | (en_stop << 6) |
 204                                 (msg[i].len & 0x3F)) << 8 | i2c_dest;
 205                        /* I2C ctrl + FE bus; */
 206                        index = ((gen_mode << 6) & 0xC0) |
 207                                ((bus_mode << 4) & 0x30);
 208
 209                        result = usb_control_msg(d->udev,
 210                                                 usb_rcvctrlpipe(d->udev, 0),
 211                                                 REQUEST_NEW_I2C_READ,
 212                                                 USB_TYPE_VENDOR | USB_DIR_IN,
 213                                                 value, index, st->buf,
 214                                                 msg[i].len,
 215                                                 USB_CTRL_GET_TIMEOUT);
 216                        if (result < 0) {
 217                                deb_info("i2c read error (status = %d)\n", result);
 218                                goto unlock;
 219                        }
 220
 221                        if (msg[i].len > sizeof(st->buf)) {
 222                                deb_info("buffer too small to fit %d bytes\n",
 223                                         msg[i].len);
 224                                result = -EIO;
 225                                goto unlock;
 226                        }
 227
 228                        memcpy(msg[i].buf, st->buf, msg[i].len);
 229
 230                        deb_data("<<< ");
 231                        debug_dump(msg[i].buf, msg[i].len, deb_data);
 232
 233                } else {
 234                        /* Write request */
 235                        if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
 236                                err("could not acquire lock");
 237                                result = -EINTR;
 238                                goto unlock;
 239                        }
 240                        st->buf[0] = REQUEST_NEW_I2C_WRITE;
 241                        st->buf[1] = msg[i].addr << 1;
 242                        st->buf[2] = (en_start << 7) | (en_stop << 6) |
 243                                (msg[i].len & 0x3F);
 244                        /* I2C ctrl + FE bus; */
 245                        st->buf[3] = ((gen_mode << 6) & 0xC0) |
 246                                 ((bus_mode << 4) & 0x30);
 247
 248                        if (msg[i].len > sizeof(st->buf) - 4) {
 249                                deb_info("i2c message to big: %d\n",
 250                                         msg[i].len);
 251                                mutex_unlock(&d->usb_mutex);
 252                                result = -EIO;
 253                                goto unlock;
 254                        }
 255
 256                        /* The Actual i2c payload */
 257                        memcpy(&st->buf[4], msg[i].buf, msg[i].len);
 258
 259                        deb_data(">>> ");
 260                        debug_dump(st->buf, msg[i].len + 4, deb_data);
 261
 262                        result = usb_control_msg(d->udev,
 263                                                 usb_sndctrlpipe(d->udev, 0),
 264                                                 REQUEST_NEW_I2C_WRITE,
 265                                                 USB_TYPE_VENDOR | USB_DIR_OUT,
 266                                                 0, 0, st->buf, msg[i].len + 4,
 267                                                 USB_CTRL_GET_TIMEOUT);
 268                        mutex_unlock(&d->usb_mutex);
 269                        if (result < 0) {
 270                                deb_info("i2c write error (status = %d)\n", result);
 271                                break;
 272                        }
 273                }
 274        }
 275        result = i;
 276
 277unlock:
 278        mutex_unlock(&d->i2c_mutex);
 279        return result;
 280}
 281
 282/*
 283 * I2C master xfer function (pre-1.20 firmware)
 284 */
 285static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap,
 286                                   struct i2c_msg *msg, int num)
 287{
 288        struct dvb_usb_device *d = i2c_get_adapdata(adap);
 289        struct dib0700_state *st = d->priv;
 290        int i, len, result;
 291
 292        if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
 293                return -EINTR;
 294        if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
 295                err("could not acquire lock");
 296                mutex_unlock(&d->i2c_mutex);
 297                return -EINTR;
 298        }
 299
 300        for (i = 0; i < num; i++) {
 301                /* fill in the address */
 302                st->buf[1] = msg[i].addr << 1;
 303                /* fill the buffer */
 304                if (msg[i].len > sizeof(st->buf) - 2) {
 305                        deb_info("i2c xfer to big: %d\n",
 306                                msg[i].len);
 307                        result = -EIO;
 308                        goto unlock;
 309                }
 310                memcpy(&st->buf[2], msg[i].buf, msg[i].len);
 311
 312                /* write/read request */
 313                if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
 314                        st->buf[0] = REQUEST_I2C_READ;
 315                        st->buf[1] |= 1;
 316
 317                        /* special thing in the current firmware: when length is zero the read-failed */
 318                        len = dib0700_ctrl_rd(d, st->buf, msg[i].len + 2,
 319                                              st->buf, msg[i + 1].len);
 320                        if (len <= 0) {
 321                                deb_info("I2C read failed on address 0x%02x\n",
 322                                                msg[i].addr);
 323                                result = -EIO;
 324                                goto unlock;
 325                        }
 326
 327                        if (msg[i + 1].len > sizeof(st->buf)) {
 328                                deb_info("i2c xfer buffer to small for %d\n",
 329                                        msg[i].len);
 330                                result = -EIO;
 331                                goto unlock;
 332                        }
 333                        memcpy(msg[i + 1].buf, st->buf, msg[i + 1].len);
 334
 335                        msg[i+1].len = len;
 336
 337                        i++;
 338                } else {
 339                        st->buf[0] = REQUEST_I2C_WRITE;
 340                        result = dib0700_ctrl_wr(d, st->buf, msg[i].len + 2);
 341                        if (result < 0)
 342                                goto unlock;
 343                }
 344        }
 345        result = i;
 346unlock:
 347        mutex_unlock(&d->usb_mutex);
 348        mutex_unlock(&d->i2c_mutex);
 349
 350        return result;
 351}
 352
 353static int dib0700_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
 354                            int num)
 355{
 356        struct dvb_usb_device *d = i2c_get_adapdata(adap);
 357        struct dib0700_state *st = d->priv;
 358
 359        if (st->fw_use_new_i2c_api == 1) {
 360                /* User running at least fw 1.20 */
 361                return dib0700_i2c_xfer_new(adap, msg, num);
 362        } else {
 363                /* Use legacy calls */
 364                return dib0700_i2c_xfer_legacy(adap, msg, num);
 365        }
 366}
 367
 368static u32 dib0700_i2c_func(struct i2c_adapter *adapter)
 369{
 370        return I2C_FUNC_I2C;
 371}
 372
 373struct i2c_algorithm dib0700_i2c_algo = {
 374        .master_xfer   = dib0700_i2c_xfer,
 375        .functionality = dib0700_i2c_func,
 376};
 377
 378int dib0700_identify_state(struct usb_device *udev, struct dvb_usb_device_properties *props,
 379                        struct dvb_usb_device_description **desc, int *cold)
 380{
 381        s16 ret;
 382        u8 *b;
 383
 384        b = kmalloc(16, GFP_KERNEL);
 385        if (!b)
 386                return  -ENOMEM;
 387
 388
 389        ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 390                REQUEST_GET_VERSION, USB_TYPE_VENDOR | USB_DIR_IN, 0, 0, b, 16, USB_CTRL_GET_TIMEOUT);
 391
 392        deb_info("FW GET_VERSION length: %d\n",ret);
 393
 394        *cold = ret <= 0;
 395        deb_info("cold: %d\n", *cold);
 396
 397        kfree(b);
 398        return 0;
 399}
 400
 401static int dib0700_set_clock(struct dvb_usb_device *d, u8 en_pll,
 402        u8 pll_src, u8 pll_range, u8 clock_gpio3, u16 pll_prediv,
 403        u16 pll_loopdiv, u16 free_div, u16 dsuScaler)
 404{
 405        struct dib0700_state *st = d->priv;
 406        int ret;
 407
 408        if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
 409                err("could not acquire lock");
 410                return -EINTR;
 411        }
 412
 413        st->buf[0] = REQUEST_SET_CLOCK;
 414        st->buf[1] = (en_pll << 7) | (pll_src << 6) |
 415                (pll_range << 5) | (clock_gpio3 << 4);
 416        st->buf[2] = (pll_prediv >> 8)  & 0xff; /* MSB */
 417        st->buf[3] =  pll_prediv        & 0xff; /* LSB */
 418        st->buf[4] = (pll_loopdiv >> 8) & 0xff; /* MSB */
 419        st->buf[5] =  pll_loopdiv       & 0xff; /* LSB */
 420        st->buf[6] = (free_div >> 8)    & 0xff; /* MSB */
 421        st->buf[7] =  free_div          & 0xff; /* LSB */
 422        st->buf[8] = (dsuScaler >> 8)   & 0xff; /* MSB */
 423        st->buf[9] =  dsuScaler         & 0xff; /* LSB */
 424
 425        ret = dib0700_ctrl_wr(d, st->buf, 10);
 426        mutex_unlock(&d->usb_mutex);
 427
 428        return ret;
 429}
 430
 431int dib0700_set_i2c_speed(struct dvb_usb_device *d, u16 scl_kHz)
 432{
 433        struct dib0700_state *st = d->priv;
 434        u16 divider;
 435        int ret;
 436
 437        if (scl_kHz == 0)
 438                return -EINVAL;
 439
 440        if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
 441                err("could not acquire lock");
 442                return -EINTR;
 443        }
 444
 445        st->buf[0] = REQUEST_SET_I2C_PARAM;
 446        divider = (u16) (30000 / scl_kHz);
 447        st->buf[1] = 0;
 448        st->buf[2] = (u8) (divider >> 8);
 449        st->buf[3] = (u8) (divider & 0xff);
 450        divider = (u16) (72000 / scl_kHz);
 451        st->buf[4] = (u8) (divider >> 8);
 452        st->buf[5] = (u8) (divider & 0xff);
 453        divider = (u16) (72000 / scl_kHz); /* clock: 72MHz */
 454        st->buf[6] = (u8) (divider >> 8);
 455        st->buf[7] = (u8) (divider & 0xff);
 456
 457        deb_info("setting I2C speed: %04x %04x %04x (%d kHz).",
 458                (st->buf[2] << 8) | (st->buf[3]), (st->buf[4] << 8) |
 459                st->buf[5], (st->buf[6] << 8) | st->buf[7], scl_kHz);
 460
 461        ret = dib0700_ctrl_wr(d, st->buf, 8);
 462        mutex_unlock(&d->usb_mutex);
 463
 464        return ret;
 465}
 466
 467
 468int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3)
 469{
 470        switch (clk_MHz) {
 471                case 72: dib0700_set_clock(d, 1, 0, 1, clock_out_gp3, 2, 24, 0, 0x4c); break;
 472                default: return -EINVAL;
 473        }
 474        return 0;
 475}
 476
 477static int dib0700_jumpram(struct usb_device *udev, u32 address)
 478{
 479        int ret = 0, actlen;
 480        u8 *buf;
 481
 482        buf = kmalloc(8, GFP_KERNEL);
 483        if (!buf)
 484                return -ENOMEM;
 485        buf[0] = REQUEST_JUMPRAM;
 486        buf[1] = 0;
 487        buf[2] = 0;
 488        buf[3] = 0;
 489        buf[4] = (address >> 24) & 0xff;
 490        buf[5] = (address >> 16) & 0xff;
 491        buf[6] = (address >> 8)  & 0xff;
 492        buf[7] =  address        & 0xff;
 493
 494        if ((ret = usb_bulk_msg(udev, usb_sndbulkpipe(udev, 0x01),buf,8,&actlen,1000)) < 0) {
 495                deb_fw("jumpram to 0x%x failed\n",address);
 496                goto out;
 497        }
 498        if (actlen != 8) {
 499                deb_fw("jumpram to 0x%x failed\n",address);
 500                ret = -EIO;
 501                goto out;
 502        }
 503out:
 504        kfree(buf);
 505        return ret;
 506}
 507
 508int dib0700_download_firmware(struct usb_device *udev, const struct firmware *fw)
 509{
 510        struct hexline hx;
 511        int pos = 0, ret, act_len, i, adap_num;
 512        u8 *buf;
 513        u32 fw_version;
 514
 515        buf = kmalloc(260, GFP_KERNEL);
 516        if (!buf)
 517                return -ENOMEM;
 518
 519        while ((ret = dvb_usb_get_hexline(fw, &hx, &pos)) > 0) {
 520                deb_fwdata("writing to address 0x%08x (buffer: 0x%02x %02x)\n",
 521                                hx.addr, hx.len, hx.chk);
 522
 523                buf[0] = hx.len;
 524                buf[1] = (hx.addr >> 8) & 0xff;
 525                buf[2] =  hx.addr       & 0xff;
 526                buf[3] = hx.type;
 527                memcpy(&buf[4],hx.data,hx.len);
 528                buf[4+hx.len] = hx.chk;
 529
 530                ret = usb_bulk_msg(udev,
 531                        usb_sndbulkpipe(udev, 0x01),
 532                        buf,
 533                        hx.len + 5,
 534                        &act_len,
 535                        1000);
 536
 537                if (ret < 0) {
 538                        err("firmware download failed at %d with %d",pos,ret);
 539                        goto out;
 540                }
 541        }
 542
 543        if (ret == 0) {
 544                /* start the firmware */
 545                if ((ret = dib0700_jumpram(udev, 0x70000000)) == 0) {
 546                        info("firmware started successfully.");
 547                        msleep(500);
 548                }
 549        } else
 550                ret = -EIO;
 551
 552        /* the number of ts packet has to be at least 1 */
 553        if (nb_packet_buffer_size < 1)
 554                nb_packet_buffer_size = 1;
 555
 556        /* get the firmware version */
 557        usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
 558                                  REQUEST_GET_VERSION,
 559                                  USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
 560                                  buf, 16, USB_CTRL_GET_TIMEOUT);
 561        fw_version = (buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | buf[11];
 562
 563        /* set the buffer size - DVB-USB is allocating URB buffers
 564         * only after the firwmare download was successful */
 565        for (i = 0; i < dib0700_device_count; i++) {
 566                for (adap_num = 0; adap_num < dib0700_devices[i].num_adapters;
 567                                adap_num++) {
 568                        if (fw_version >= 0x10201) {
 569                                dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 188*nb_packet_buffer_size;
 570                        } else {
 571                                /* for fw version older than 1.20.1,
 572                                 * the buffersize has to be n times 512 */
 573                                dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = ((188*nb_packet_buffer_size+188/2)/512)*512;
 574                                if (dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize < 512)
 575                                        dib0700_devices[i].adapter[adap_num].fe[0].stream.u.bulk.buffersize = 512;
 576                        }
 577                }
 578        }
 579out:
 580        kfree(buf);
 581        return ret;
 582}
 583
 584int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
 585{
 586        struct dib0700_state *st = adap->dev->priv;
 587        int ret;
 588
 589        if ((onoff != 0) && (st->fw_version >= 0x10201)) {
 590                /* for firmware later than 1.20.1,
 591                 * the USB xfer length can be set  */
 592                ret = dib0700_set_usb_xfer_len(adap->dev,
 593                        st->nb_packet_buffer_size);
 594                if (ret < 0) {
 595                        deb_info("can not set the USB xfer len\n");
 596                        return ret;
 597                }
 598        }
 599
 600        mutex_lock(&adap->dev->usb_mutex);
 601
 602        st->buf[0] = REQUEST_ENABLE_VIDEO;
 603        /* this bit gives a kind of command,
 604         * rather than enabling something or not */
 605        st->buf[1] = (onoff << 4) | 0x00;
 606
 607        if (st->disable_streaming_master_mode == 1)
 608                st->buf[2] = 0x00;
 609        else
 610                st->buf[2] = 0x01 << 4; /* Master mode */
 611
 612        st->buf[3] = 0x00;
 613
 614        deb_info("modifying (%d) streaming state for %d\n", onoff, adap->id);
 615
 616        st->channel_state &= ~0x3;
 617        if ((adap->fe_adap[0].stream.props.endpoint != 2)
 618                        && (adap->fe_adap[0].stream.props.endpoint != 3)) {
 619                deb_info("the endpoint number (%i) is not correct, use the adapter id instead", adap->fe_adap[0].stream.props.endpoint);
 620                if (onoff)
 621                        st->channel_state |=    1 << (adap->id);
 622                else
 623                        st->channel_state |=    1 << ~(adap->id);
 624        } else {
 625                if (onoff)
 626                        st->channel_state |=    1 << (adap->fe_adap[0].stream.props.endpoint-2);
 627                else
 628                        st->channel_state |=    1 << (3-adap->fe_adap[0].stream.props.endpoint);
 629        }
 630
 631        st->buf[2] |= st->channel_state;
 632
 633        deb_info("data for streaming: %x %x\n", st->buf[1], st->buf[2]);
 634
 635        ret = dib0700_ctrl_wr(adap->dev, st->buf, 4);
 636        mutex_unlock(&adap->dev->usb_mutex);
 637
 638        return ret;
 639}
 640
 641int dib0700_change_protocol(struct rc_dev *rc, u64 *rc_proto)
 642{
 643        struct dvb_usb_device *d = rc->priv;
 644        struct dib0700_state *st = d->priv;
 645        int new_proto, ret;
 646
 647        if (mutex_lock_interruptible(&d->usb_mutex) < 0) {
 648                err("could not acquire lock");
 649                return -EINTR;
 650        }
 651
 652        st->buf[0] = REQUEST_SET_RC;
 653        st->buf[1] = 0;
 654        st->buf[2] = 0;
 655
 656        /* Set the IR mode */
 657        if (*rc_proto & RC_PROTO_BIT_RC5) {
 658                new_proto = 1;
 659                *rc_proto = RC_PROTO_BIT_RC5;
 660        } else if (*rc_proto & RC_PROTO_BIT_NEC) {
 661                new_proto = 0;
 662                *rc_proto = RC_PROTO_BIT_NEC;
 663        } else if (*rc_proto & RC_PROTO_BIT_RC6_MCE) {
 664                if (st->fw_version < 0x10200) {
 665                        ret = -EINVAL;
 666                        goto out;
 667                }
 668                new_proto = 2;
 669                *rc_proto = RC_PROTO_BIT_RC6_MCE;
 670        } else {
 671                ret = -EINVAL;
 672                goto out;
 673        }
 674
 675        st->buf[1] = new_proto;
 676
 677        ret = dib0700_ctrl_wr(d, st->buf, 3);
 678        if (ret < 0) {
 679                err("ir protocol setup failed");
 680                goto out;
 681        }
 682
 683        d->props.rc.core.protocol = *rc_proto;
 684
 685out:
 686        mutex_unlock(&d->usb_mutex);
 687        return ret;
 688}
 689
 690/* This is the structure of the RC response packet starting in firmware 1.20 */
 691struct dib0700_rc_response {
 692        u8 report_id;
 693        u8 data_state;
 694        union {
 695                struct {
 696                        u8 system;
 697                        u8 not_system;
 698                        u8 data;
 699                        u8 not_data;
 700                } nec;
 701                struct {
 702                        u8 not_used;
 703                        u8 system;
 704                        u8 data;
 705                        u8 not_data;
 706                } rc5;
 707        };
 708};
 709#define RC_MSG_SIZE_V1_20 6
 710
 711static void dib0700_rc_urb_completion(struct urb *purb)
 712{
 713        struct dvb_usb_device *d = purb->context;
 714        struct dib0700_rc_response *poll_reply;
 715        enum rc_proto protocol;
 716        u32 keycode;
 717        u8 toggle;
 718
 719        deb_info("%s()\n", __func__);
 720        if (d->rc_dev == NULL) {
 721                /* This will occur if disable_rc_polling=1 */
 722                kfree(purb->transfer_buffer);
 723                usb_free_urb(purb);
 724                return;
 725        }
 726
 727        poll_reply = purb->transfer_buffer;
 728
 729        if (purb->status < 0) {
 730                deb_info("discontinuing polling\n");
 731                kfree(purb->transfer_buffer);
 732                usb_free_urb(purb);
 733                return;
 734        }
 735
 736        if (purb->actual_length != RC_MSG_SIZE_V1_20) {
 737                deb_info("malformed rc msg size=%d\n", purb->actual_length);
 738                goto resubmit;
 739        }
 740
 741        deb_data("IR ID = %02X state = %02X System = %02X %02X Cmd = %02X %02X (len %d)\n",
 742                 poll_reply->report_id, poll_reply->data_state,
 743                 poll_reply->nec.system, poll_reply->nec.not_system,
 744                 poll_reply->nec.data, poll_reply->nec.not_data,
 745                 purb->actual_length);
 746
 747        switch (d->props.rc.core.protocol) {
 748        case RC_PROTO_BIT_NEC:
 749                toggle = 0;
 750
 751                /* NEC protocol sends repeat code as 0 0 0 FF */
 752                if (poll_reply->nec.system     == 0x00 &&
 753                    poll_reply->nec.not_system == 0x00 &&
 754                    poll_reply->nec.data       == 0x00 &&
 755                    poll_reply->nec.not_data   == 0xff) {
 756                        poll_reply->data_state = 2;
 757                        rc_repeat(d->rc_dev);
 758                        goto resubmit;
 759                }
 760
 761                if ((poll_reply->nec.data ^ poll_reply->nec.not_data) != 0xff) {
 762                        deb_data("NEC32 protocol\n");
 763                        keycode = RC_SCANCODE_NEC32(poll_reply->nec.system     << 24 |
 764                                                     poll_reply->nec.not_system << 16 |
 765                                                     poll_reply->nec.data       << 8  |
 766                                                     poll_reply->nec.not_data);
 767                        protocol = RC_PROTO_NEC32;
 768                } else if ((poll_reply->nec.system ^ poll_reply->nec.not_system) != 0xff) {
 769                        deb_data("NEC extended protocol\n");
 770                        keycode = RC_SCANCODE_NECX(poll_reply->nec.system << 8 |
 771                                                    poll_reply->nec.not_system,
 772                                                    poll_reply->nec.data);
 773
 774                        protocol = RC_PROTO_NECX;
 775                } else {
 776                        deb_data("NEC normal protocol\n");
 777                        keycode = RC_SCANCODE_NEC(poll_reply->nec.system,
 778                                                   poll_reply->nec.data);
 779                        protocol = RC_PROTO_NEC;
 780                }
 781
 782                break;
 783        default:
 784                deb_data("RC5 protocol\n");
 785                protocol = RC_PROTO_RC5;
 786                toggle = poll_reply->report_id;
 787                keycode = RC_SCANCODE_RC5(poll_reply->rc5.system, poll_reply->rc5.data);
 788
 789                if ((poll_reply->rc5.data ^ poll_reply->rc5.not_data) != 0xff) {
 790                        /* Key failed integrity check */
 791                        err("key failed integrity check: %02x %02x %02x %02x",
 792                            poll_reply->rc5.not_used, poll_reply->rc5.system,
 793                            poll_reply->rc5.data, poll_reply->rc5.not_data);
 794                        goto resubmit;
 795                }
 796
 797                break;
 798        }
 799
 800        rc_keydown(d->rc_dev, protocol, keycode, toggle);
 801
 802resubmit:
 803        /* Clean the buffer before we requeue */
 804        memset(purb->transfer_buffer, 0, RC_MSG_SIZE_V1_20);
 805
 806        /* Requeue URB */
 807        usb_submit_urb(purb, GFP_ATOMIC);
 808}
 809
 810int dib0700_rc_setup(struct dvb_usb_device *d, struct usb_interface *intf)
 811{
 812        struct dib0700_state *st = d->priv;
 813        struct urb *purb;
 814        const struct usb_endpoint_descriptor *e;
 815        int ret, rc_ep = 1;
 816        unsigned int pipe = 0;
 817
 818        /* Poll-based. Don't initialize bulk mode */
 819        if (st->fw_version < 0x10200 || !intf)
 820                return 0;
 821
 822        /* Starting in firmware 1.20, the RC info is provided on a bulk pipe */
 823
 824        if (intf->altsetting[0].desc.bNumEndpoints < rc_ep + 1)
 825                return -ENODEV;
 826
 827        purb = usb_alloc_urb(0, GFP_KERNEL);
 828        if (purb == NULL)
 829                return -ENOMEM;
 830
 831        purb->transfer_buffer = kzalloc(RC_MSG_SIZE_V1_20, GFP_KERNEL);
 832        if (purb->transfer_buffer == NULL) {
 833                err("rc kzalloc failed");
 834                usb_free_urb(purb);
 835                return -ENOMEM;
 836        }
 837
 838        purb->status = -EINPROGRESS;
 839
 840        /*
 841         * Some devices like the Hauppauge NovaTD model 52009 use an interrupt
 842         * endpoint, while others use a bulk one.
 843         */
 844        e = &intf->altsetting[0].endpoint[rc_ep].desc;
 845        if (usb_endpoint_dir_in(e)) {
 846                if (usb_endpoint_xfer_bulk(e)) {
 847                        pipe = usb_rcvbulkpipe(d->udev, rc_ep);
 848                        usb_fill_bulk_urb(purb, d->udev, pipe,
 849                                          purb->transfer_buffer,
 850                                          RC_MSG_SIZE_V1_20,
 851                                          dib0700_rc_urb_completion, d);
 852
 853                } else if (usb_endpoint_xfer_int(e)) {
 854                        pipe = usb_rcvintpipe(d->udev, rc_ep);
 855                        usb_fill_int_urb(purb, d->udev, pipe,
 856                                          purb->transfer_buffer,
 857                                          RC_MSG_SIZE_V1_20,
 858                                          dib0700_rc_urb_completion, d, 1);
 859                }
 860        }
 861
 862        if (!pipe) {
 863                err("There's no endpoint for remote controller");
 864                kfree(purb->transfer_buffer);
 865                usb_free_urb(purb);
 866                return 0;
 867        }
 868
 869        ret = usb_submit_urb(purb, GFP_ATOMIC);
 870        if (ret) {
 871                err("rc submit urb failed");
 872                kfree(purb->transfer_buffer);
 873                usb_free_urb(purb);
 874        }
 875
 876        return ret;
 877}
 878
 879static int dib0700_probe(struct usb_interface *intf,
 880                const struct usb_device_id *id)
 881{
 882        int i;
 883        struct dvb_usb_device *dev;
 884
 885        for (i = 0; i < dib0700_device_count; i++)
 886                if (dvb_usb_device_init(intf, &dib0700_devices[i], THIS_MODULE,
 887                    &dev, adapter_nr) == 0) {
 888                        struct dib0700_state *st = dev->priv;
 889                        u32 hwversion, romversion, fw_version, fwtype;
 890
 891                        dib0700_get_version(dev, &hwversion, &romversion,
 892                                &fw_version, &fwtype);
 893
 894                        deb_info("Firmware version: %x, %d, 0x%x, %d\n",
 895                                hwversion, romversion, fw_version, fwtype);
 896
 897                        st->fw_version = fw_version;
 898                        st->nb_packet_buffer_size = (u32)nb_packet_buffer_size;
 899
 900                        /* Disable polling mode on newer firmwares */
 901                        if (st->fw_version >= 0x10200)
 902                                dev->props.rc.core.bulk_mode = true;
 903                        else
 904                                dev->props.rc.core.bulk_mode = false;
 905
 906                        dib0700_rc_setup(dev, intf);
 907
 908                        return 0;
 909                }
 910
 911        return -ENODEV;
 912}
 913
 914static void dib0700_disconnect(struct usb_interface *intf)
 915{
 916        struct dvb_usb_device *d = usb_get_intfdata(intf);
 917        struct dib0700_state *st = d->priv;
 918        struct i2c_client *client;
 919
 920        /* remove I2C client for tuner */
 921        client = st->i2c_client_tuner;
 922        if (client) {
 923                module_put(client->dev.driver->owner);
 924                i2c_unregister_device(client);
 925        }
 926
 927        /* remove I2C client for demodulator */
 928        client = st->i2c_client_demod;
 929        if (client) {
 930                module_put(client->dev.driver->owner);
 931                i2c_unregister_device(client);
 932        }
 933
 934        dvb_usb_device_exit(intf);
 935}
 936
 937
 938static struct usb_driver dib0700_driver = {
 939        .name       = "dvb_usb_dib0700",
 940        .probe      = dib0700_probe,
 941        .disconnect = dib0700_disconnect,
 942        .id_table   = dib0700_usb_id_table,
 943};
 944
 945module_usb_driver(dib0700_driver);
 946
 947MODULE_FIRMWARE("dvb-usb-dib0700-1.20.fw");
 948MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
 949MODULE_DESCRIPTION("Driver for devices based on DiBcom DiB0700 - USB bridge");
 950MODULE_VERSION("1.0");
 951MODULE_LICENSE("GPL");
 952