linux/drivers/media/usb/cx231xx/cx231xx-core.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3   cx231xx-core.c - driver for Conexant Cx23100/101/102
   4                                USB video capture devices
   5
   6   Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
   7                                Based on em28xx driver
   8
   9 */
  10
  11#include "cx231xx.h"
  12#include <linux/init.h>
  13#include <linux/list.h>
  14#include <linux/module.h>
  15#include <linux/slab.h>
  16#include <linux/vmalloc.h>
  17#include <media/v4l2-common.h>
  18#include <media/tuner.h>
  19
  20#include "cx231xx-reg.h"
  21
  22/* #define ENABLE_DEBUG_ISOC_FRAMES */
  23
  24static unsigned int core_debug;
  25module_param(core_debug, int, 0644);
  26MODULE_PARM_DESC(core_debug, "enable debug messages [core]");
  27
  28#define cx231xx_coredbg(fmt, arg...) do {\
  29        if (core_debug) \
  30                printk(KERN_INFO "%s %s :"fmt, \
  31                         dev->name, __func__ , ##arg); } while (0)
  32
  33static unsigned int reg_debug;
  34module_param(reg_debug, int, 0644);
  35MODULE_PARM_DESC(reg_debug, "enable debug messages [URB reg]");
  36
  37static int alt = CX231XX_PINOUT;
  38module_param(alt, int, 0644);
  39MODULE_PARM_DESC(alt, "alternate setting to use for video endpoint");
  40
  41#define cx231xx_isocdbg(fmt, arg...) do {\
  42        if (core_debug) \
  43                printk(KERN_INFO "%s %s :"fmt, \
  44                         dev->name, __func__ , ##arg); } while (0)
  45
  46/*****************************************************************
  47*             Device control list functions                                      *
  48******************************************************************/
  49
  50LIST_HEAD(cx231xx_devlist);
  51static DEFINE_MUTEX(cx231xx_devlist_mutex);
  52
  53/*
  54 * cx231xx_realease_resources()
  55 * unregisters the v4l2,i2c and usb devices
  56 * called when the device gets disconnected or at module unload
  57*/
  58void cx231xx_remove_from_devlist(struct cx231xx *dev)
  59{
  60        if (dev == NULL)
  61                return;
  62        if (dev->udev == NULL)
  63                return;
  64
  65        if (atomic_read(&dev->devlist_count) > 0) {
  66                mutex_lock(&cx231xx_devlist_mutex);
  67                list_del(&dev->devlist);
  68                atomic_dec(&dev->devlist_count);
  69                mutex_unlock(&cx231xx_devlist_mutex);
  70        }
  71};
  72
  73void cx231xx_add_into_devlist(struct cx231xx *dev)
  74{
  75        mutex_lock(&cx231xx_devlist_mutex);
  76        list_add_tail(&dev->devlist, &cx231xx_devlist);
  77        atomic_inc(&dev->devlist_count);
  78        mutex_unlock(&cx231xx_devlist_mutex);
  79};
  80
  81static LIST_HEAD(cx231xx_extension_devlist);
  82
  83int cx231xx_register_extension(struct cx231xx_ops *ops)
  84{
  85        struct cx231xx *dev = NULL;
  86
  87        mutex_lock(&cx231xx_devlist_mutex);
  88        list_add_tail(&ops->next, &cx231xx_extension_devlist);
  89        list_for_each_entry(dev, &cx231xx_devlist, devlist) {
  90                ops->init(dev);
  91                dev_info(dev->dev, "%s initialized\n", ops->name);
  92        }
  93        mutex_unlock(&cx231xx_devlist_mutex);
  94        return 0;
  95}
  96EXPORT_SYMBOL(cx231xx_register_extension);
  97
  98void cx231xx_unregister_extension(struct cx231xx_ops *ops)
  99{
 100        struct cx231xx *dev = NULL;
 101
 102        mutex_lock(&cx231xx_devlist_mutex);
 103        list_for_each_entry(dev, &cx231xx_devlist, devlist) {
 104                ops->fini(dev);
 105                dev_info(dev->dev, "%s removed\n", ops->name);
 106        }
 107
 108        list_del(&ops->next);
 109        mutex_unlock(&cx231xx_devlist_mutex);
 110}
 111EXPORT_SYMBOL(cx231xx_unregister_extension);
 112
 113void cx231xx_init_extension(struct cx231xx *dev)
 114{
 115        struct cx231xx_ops *ops = NULL;
 116
 117        mutex_lock(&cx231xx_devlist_mutex);
 118        list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
 119                if (ops->init)
 120                        ops->init(dev);
 121        }
 122        mutex_unlock(&cx231xx_devlist_mutex);
 123}
 124
 125void cx231xx_close_extension(struct cx231xx *dev)
 126{
 127        struct cx231xx_ops *ops = NULL;
 128
 129        mutex_lock(&cx231xx_devlist_mutex);
 130        list_for_each_entry(ops, &cx231xx_extension_devlist, next) {
 131                if (ops->fini)
 132                        ops->fini(dev);
 133        }
 134        mutex_unlock(&cx231xx_devlist_mutex);
 135}
 136
 137/****************************************************************
 138*               U S B related functions                         *
 139*****************************************************************/
 140int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
 141                             struct cx231xx_i2c_xfer_data *req_data)
 142{
 143        int status = 0;
 144        struct cx231xx *dev = i2c_bus->dev;
 145        struct VENDOR_REQUEST_IN ven_req;
 146
 147        u8 saddr_len = 0;
 148        u8 _i2c_period = 0;
 149        u8 _i2c_nostop = 0;
 150        u8 _i2c_reserve = 0;
 151
 152        if (dev->state & DEV_DISCONNECTED)
 153                return -ENODEV;
 154
 155        /* Get the I2C period, nostop and reserve parameters */
 156        _i2c_period = i2c_bus->i2c_period;
 157        _i2c_nostop = i2c_bus->i2c_nostop;
 158        _i2c_reserve = i2c_bus->i2c_reserve;
 159
 160        saddr_len = req_data->saddr_len;
 161
 162        /* Set wValue */
 163        ven_req.wValue = (req_data->dev_addr << 9 | _i2c_period << 4 |
 164                          saddr_len << 2 | _i2c_nostop << 1 | I2C_SYNC |
 165                          _i2c_reserve << 6);
 166
 167        /* set channel number */
 168        if (req_data->direction & I2C_M_RD) {
 169                /* channel number, for read,spec required channel_num +4 */
 170                ven_req.bRequest = i2c_bus->nr + 4;
 171        } else
 172                ven_req.bRequest = i2c_bus->nr; /* channel number,  */
 173
 174        /* set index value */
 175        switch (saddr_len) {
 176        case 0:
 177                ven_req.wIndex = 0;     /* need check */
 178                break;
 179        case 1:
 180                ven_req.wIndex = (req_data->saddr_dat & 0xff);
 181                break;
 182        case 2:
 183                ven_req.wIndex = req_data->saddr_dat;
 184                break;
 185        }
 186
 187        /* set wLength value */
 188        ven_req.wLength = req_data->buf_size;
 189
 190        /* set bData value */
 191        ven_req.bData = 0;
 192
 193        /* set the direction */
 194        if (req_data->direction) {
 195                ven_req.direction = USB_DIR_IN;
 196                memset(req_data->p_buffer, 0x00, ven_req.wLength);
 197        } else
 198                ven_req.direction = USB_DIR_OUT;
 199
 200        /* set the buffer for read / write */
 201        ven_req.pBuff = req_data->p_buffer;
 202
 203
 204        /* call common vendor command request */
 205        status = cx231xx_send_vendor_cmd(dev, &ven_req);
 206        if (status < 0 && !dev->i2c_scan_running) {
 207                dev_err(dev->dev, "%s: failed with status -%d\n",
 208                        __func__, status);
 209        }
 210
 211        return status;
 212}
 213EXPORT_SYMBOL_GPL(cx231xx_send_usb_command);
 214
 215/*
 216 * Sends/Receives URB control messages, assuring to use a kalloced buffer
 217 * for all operations (dev->urb_buf), to avoid using stacked buffers, as
 218 * they aren't safe for usage with USB, due to DMA restrictions.
 219 * Also implements the debug code for control URB's.
 220 */
 221static int __usb_control_msg(struct cx231xx *dev, unsigned int pipe,
 222        __u8 request, __u8 requesttype, __u16 value, __u16 index,
 223        void *data, __u16 size, int timeout)
 224{
 225        int rc, i;
 226
 227        if (reg_debug) {
 228                printk(KERN_DEBUG "%s: (pipe 0x%08x): %s:  %02x %02x %02x %02x %02x %02x %02x %02x ",
 229                                dev->name,
 230                                pipe,
 231                                (requesttype & USB_DIR_IN) ? "IN" : "OUT",
 232                                requesttype,
 233                                request,
 234                                value & 0xff, value >> 8,
 235                                index & 0xff, index >> 8,
 236                                size & 0xff, size >> 8);
 237                if (!(requesttype & USB_DIR_IN)) {
 238                        printk(KERN_CONT ">>>");
 239                        for (i = 0; i < size; i++)
 240                                printk(KERN_CONT " %02x",
 241                                       ((unsigned char *)data)[i]);
 242                }
 243        }
 244
 245        /* Do the real call to usb_control_msg */
 246        mutex_lock(&dev->ctrl_urb_lock);
 247        if (!(requesttype & USB_DIR_IN) && size)
 248                memcpy(dev->urb_buf, data, size);
 249        rc = usb_control_msg(dev->udev, pipe, request, requesttype, value,
 250                             index, dev->urb_buf, size, timeout);
 251        if ((requesttype & USB_DIR_IN) && size)
 252                memcpy(data, dev->urb_buf, size);
 253        mutex_unlock(&dev->ctrl_urb_lock);
 254
 255        if (reg_debug) {
 256                if (unlikely(rc < 0)) {
 257                        printk(KERN_CONT "FAILED!\n");
 258                        return rc;
 259                }
 260
 261                if ((requesttype & USB_DIR_IN)) {
 262                        printk(KERN_CONT "<<<");
 263                        for (i = 0; i < size; i++)
 264                                printk(KERN_CONT " %02x",
 265                                       ((unsigned char *)data)[i]);
 266                }
 267                printk(KERN_CONT "\n");
 268        }
 269
 270        return rc;
 271}
 272
 273
 274/*
 275 * cx231xx_read_ctrl_reg()
 276 * reads data from the usb device specifying bRequest and wValue
 277 */
 278int cx231xx_read_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg,
 279                          char *buf, int len)
 280{
 281        u8 val = 0;
 282        int ret;
 283        int pipe = usb_rcvctrlpipe(dev->udev, 0);
 284
 285        if (dev->state & DEV_DISCONNECTED)
 286                return -ENODEV;
 287
 288        if (len > URB_MAX_CTRL_SIZE)
 289                return -EINVAL;
 290
 291        switch (len) {
 292        case 1:
 293                val = ENABLE_ONE_BYTE;
 294                break;
 295        case 2:
 296                val = ENABLE_TWE_BYTE;
 297                break;
 298        case 3:
 299                val = ENABLE_THREE_BYTE;
 300                break;
 301        case 4:
 302                val = ENABLE_FOUR_BYTE;
 303                break;
 304        default:
 305                val = 0xFF;     /* invalid option */
 306        }
 307
 308        if (val == 0xFF)
 309                return -EINVAL;
 310
 311        ret = __usb_control_msg(dev, pipe, req,
 312                              USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 313                              val, reg, buf, len, HZ);
 314        return ret;
 315}
 316
 317int cx231xx_send_vendor_cmd(struct cx231xx *dev,
 318                                struct VENDOR_REQUEST_IN *ven_req)
 319{
 320        int ret;
 321        int pipe = 0;
 322        int unsend_size = 0;
 323        u8 *pdata;
 324
 325        if (dev->state & DEV_DISCONNECTED)
 326                return -ENODEV;
 327
 328        if ((ven_req->wLength > URB_MAX_CTRL_SIZE))
 329                return -EINVAL;
 330
 331        if (ven_req->direction)
 332                pipe = usb_rcvctrlpipe(dev->udev, 0);
 333        else
 334                pipe = usb_sndctrlpipe(dev->udev, 0);
 335
 336        /*
 337         * If the cx23102 read more than 4 bytes with i2c bus,
 338         * need chop to 4 byte per request
 339         */
 340        if ((ven_req->wLength > 4) && ((ven_req->bRequest == 0x4) ||
 341                                        (ven_req->bRequest == 0x5) ||
 342                                        (ven_req->bRequest == 0x6) ||
 343
 344                                        /* Internal Master 3 Bus can send
 345                                         * and receive only 4 bytes per time
 346                                         */
 347                                        (ven_req->bRequest == 0x2))) {
 348                unsend_size = 0;
 349                pdata = ven_req->pBuff;
 350
 351
 352                unsend_size = ven_req->wLength;
 353
 354                /* the first package */
 355                ven_req->wValue = ven_req->wValue & 0xFFFB;
 356                ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x2;
 357                ret = __usb_control_msg(dev, pipe, ven_req->bRequest,
 358                        ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 359                        ven_req->wValue, ven_req->wIndex, pdata,
 360                        0x0004, HZ);
 361                unsend_size = unsend_size - 4;
 362
 363                /* the middle package */
 364                ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x42;
 365                while (unsend_size - 4 > 0) {
 366                        pdata = pdata + 4;
 367                        ret = __usb_control_msg(dev, pipe,
 368                                ven_req->bRequest,
 369                                ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 370                                ven_req->wValue, ven_req->wIndex, pdata,
 371                                0x0004, HZ);
 372                        unsend_size = unsend_size - 4;
 373                }
 374
 375                /* the last package */
 376                ven_req->wValue = (ven_req->wValue & 0xFFBD) | 0x40;
 377                pdata = pdata + 4;
 378                ret = __usb_control_msg(dev, pipe, ven_req->bRequest,
 379                        ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 380                        ven_req->wValue, ven_req->wIndex, pdata,
 381                        unsend_size, HZ);
 382        } else {
 383                ret = __usb_control_msg(dev, pipe, ven_req->bRequest,
 384                                ven_req->direction | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 385                                ven_req->wValue, ven_req->wIndex,
 386                                ven_req->pBuff, ven_req->wLength, HZ);
 387        }
 388
 389        return ret;
 390}
 391
 392/*
 393 * cx231xx_write_ctrl_reg()
 394 * sends data to the usb device, specifying bRequest
 395 */
 396int cx231xx_write_ctrl_reg(struct cx231xx *dev, u8 req, u16 reg, char *buf,
 397                           int len)
 398{
 399        u8 val = 0;
 400        int ret;
 401        int pipe = usb_sndctrlpipe(dev->udev, 0);
 402
 403        if (dev->state & DEV_DISCONNECTED)
 404                return -ENODEV;
 405
 406        if ((len < 1) || (len > URB_MAX_CTRL_SIZE))
 407                return -EINVAL;
 408
 409        switch (len) {
 410        case 1:
 411                val = ENABLE_ONE_BYTE;
 412                break;
 413        case 2:
 414                val = ENABLE_TWE_BYTE;
 415                break;
 416        case 3:
 417                val = ENABLE_THREE_BYTE;
 418                break;
 419        case 4:
 420                val = ENABLE_FOUR_BYTE;
 421                break;
 422        default:
 423                val = 0xFF;     /* invalid option */
 424        }
 425
 426        if (val == 0xFF)
 427                return -EINVAL;
 428
 429        if (reg_debug) {
 430                int byte;
 431
 432                cx231xx_isocdbg("(pipe 0x%08x): OUT: %02x %02x %02x %02x %02x %02x %02x %02x >>>",
 433                        pipe,
 434                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 435                        req, 0, val, reg & 0xff,
 436                        reg >> 8, len & 0xff, len >> 8);
 437
 438                for (byte = 0; byte < len; byte++)
 439                        cx231xx_isocdbg(" %02x", (unsigned char)buf[byte]);
 440                cx231xx_isocdbg("\n");
 441        }
 442
 443        ret = __usb_control_msg(dev, pipe, req,
 444                              USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 445                              val, reg, buf, len, HZ);
 446
 447        return ret;
 448}
 449
 450/****************************************************************
 451*           USB Alternate Setting functions                     *
 452*****************************************************************/
 453
 454int cx231xx_set_video_alternate(struct cx231xx *dev)
 455{
 456        int errCode, prev_alt = dev->video_mode.alt;
 457        unsigned int min_pkt_size = dev->width * 2 + 4;
 458        u32 usb_interface_index = 0;
 459
 460        /* When image size is bigger than a certain value,
 461           the frame size should be increased, otherwise, only
 462           green screen will be received.
 463         */
 464        if (dev->width * 2 * dev->height > 720 * 240 * 2)
 465                min_pkt_size *= 2;
 466
 467        if (dev->width > 360) {
 468                /* resolutions: 720,704,640 */
 469                dev->video_mode.alt = 3;
 470        } else if (dev->width > 180) {
 471                /* resolutions: 360,352,320,240 */
 472                dev->video_mode.alt = 2;
 473        } else if (dev->width > 0) {
 474                /* resolutions: 180,176,160,128,88 */
 475                dev->video_mode.alt = 1;
 476        } else {
 477                /* Change to alt0 BULK to release USB bandwidth */
 478                dev->video_mode.alt = 0;
 479        }
 480
 481        if (dev->USE_ISO == 0)
 482                dev->video_mode.alt = 0;
 483
 484        cx231xx_coredbg("dev->video_mode.alt= %d\n", dev->video_mode.alt);
 485
 486        /* Get the correct video interface Index */
 487        usb_interface_index =
 488            dev->current_pcb_config.hs_config_info[0].interface_info.
 489            video_index + 1;
 490
 491        if (dev->video_mode.alt != prev_alt) {
 492                cx231xx_coredbg("minimum isoc packet size: %u (alt=%d)\n",
 493                                min_pkt_size, dev->video_mode.alt);
 494
 495                if (dev->video_mode.alt_max_pkt_size != NULL)
 496                        dev->video_mode.max_pkt_size =
 497                        dev->video_mode.alt_max_pkt_size[dev->video_mode.alt];
 498                cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u\n",
 499                                dev->video_mode.alt,
 500                                dev->video_mode.max_pkt_size);
 501                errCode =
 502                    usb_set_interface(dev->udev, usb_interface_index,
 503                                      dev->video_mode.alt);
 504                if (errCode < 0) {
 505                        dev_err(dev->dev,
 506                                "cannot change alt number to %d (error=%i)\n",
 507                                dev->video_mode.alt, errCode);
 508                        return errCode;
 509                }
 510        }
 511        return 0;
 512}
 513
 514int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt)
 515{
 516        int status = 0;
 517        u32 usb_interface_index = 0;
 518        u32 max_pkt_size = 0;
 519
 520        switch (index) {
 521        case INDEX_TS1:
 522                usb_interface_index =
 523                    dev->current_pcb_config.hs_config_info[0].interface_info.
 524                    ts1_index + 1;
 525                dev->ts1_mode.alt = alt;
 526                if (dev->ts1_mode.alt_max_pkt_size != NULL)
 527                        max_pkt_size = dev->ts1_mode.max_pkt_size =
 528                            dev->ts1_mode.alt_max_pkt_size[dev->ts1_mode.alt];
 529                break;
 530        case INDEX_TS2:
 531                usb_interface_index =
 532                    dev->current_pcb_config.hs_config_info[0].interface_info.
 533                    ts2_index + 1;
 534                break;
 535        case INDEX_AUDIO:
 536                usb_interface_index =
 537                    dev->current_pcb_config.hs_config_info[0].interface_info.
 538                    audio_index + 1;
 539                dev->adev.alt = alt;
 540                if (dev->adev.alt_max_pkt_size != NULL)
 541                        max_pkt_size = dev->adev.max_pkt_size =
 542                            dev->adev.alt_max_pkt_size[dev->adev.alt];
 543                break;
 544        case INDEX_VIDEO:
 545                usb_interface_index =
 546                    dev->current_pcb_config.hs_config_info[0].interface_info.
 547                    video_index + 1;
 548                dev->video_mode.alt = alt;
 549                if (dev->video_mode.alt_max_pkt_size != NULL)
 550                        max_pkt_size = dev->video_mode.max_pkt_size =
 551                            dev->video_mode.alt_max_pkt_size[dev->video_mode.
 552                                                             alt];
 553                break;
 554        case INDEX_VANC:
 555                if (dev->board.no_alt_vanc)
 556                        return 0;
 557                usb_interface_index =
 558                    dev->current_pcb_config.hs_config_info[0].interface_info.
 559                    vanc_index + 1;
 560                dev->vbi_mode.alt = alt;
 561                if (dev->vbi_mode.alt_max_pkt_size != NULL)
 562                        max_pkt_size = dev->vbi_mode.max_pkt_size =
 563                            dev->vbi_mode.alt_max_pkt_size[dev->vbi_mode.alt];
 564                break;
 565        case INDEX_HANC:
 566                usb_interface_index =
 567                    dev->current_pcb_config.hs_config_info[0].interface_info.
 568                    hanc_index + 1;
 569                dev->sliced_cc_mode.alt = alt;
 570                if (dev->sliced_cc_mode.alt_max_pkt_size != NULL)
 571                        max_pkt_size = dev->sliced_cc_mode.max_pkt_size =
 572                            dev->sliced_cc_mode.alt_max_pkt_size[dev->
 573                                                                 sliced_cc_mode.
 574                                                                 alt];
 575                break;
 576        default:
 577                break;
 578        }
 579
 580        if (alt > 0 && max_pkt_size == 0) {
 581                dev_err(dev->dev,
 582                        "can't change interface %d alt no. to %d: Max. Pkt size = 0\n",
 583                        usb_interface_index, alt);
 584                /*To workaround error number=-71 on EP0 for videograbber,
 585                 need add following codes.*/
 586                if (dev->board.no_alt_vanc)
 587                        return -1;
 588        }
 589
 590        cx231xx_coredbg("setting alternate %d with wMaxPacketSize=%u,Interface = %d\n",
 591                        alt, max_pkt_size,
 592                        usb_interface_index);
 593
 594        if (usb_interface_index > 0) {
 595                status = usb_set_interface(dev->udev, usb_interface_index, alt);
 596                if (status < 0) {
 597                        dev_err(dev->dev,
 598                                "can't change interface %d alt no. to %d (err=%i)\n",
 599                                usb_interface_index, alt, status);
 600                        return status;
 601                }
 602        }
 603
 604        return status;
 605}
 606EXPORT_SYMBOL_GPL(cx231xx_set_alt_setting);
 607
 608int cx231xx_gpio_set(struct cx231xx *dev, struct cx231xx_reg_seq *gpio)
 609{
 610        int rc = 0;
 611
 612        if (!gpio)
 613                return rc;
 614
 615        /* Send GPIO reset sequences specified at board entry */
 616        while (gpio->sleep >= 0) {
 617                rc = cx231xx_set_gpio_value(dev, gpio->bit, gpio->val);
 618                if (rc < 0)
 619                        return rc;
 620
 621                if (gpio->sleep > 0)
 622                        msleep(gpio->sleep);
 623
 624                gpio++;
 625        }
 626        return rc;
 627}
 628
 629int cx231xx_demod_reset(struct cx231xx *dev)
 630{
 631
 632        u8 status = 0;
 633        u8 value[4] = { 0, 0, 0, 0 };
 634
 635        status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
 636                                 value, 4);
 637
 638        cx231xx_coredbg("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN,
 639                        value[0], value[1], value[2], value[3]);
 640
 641        cx231xx_coredbg("Enter cx231xx_demod_reset()\n");
 642
 643        value[1] = (u8) 0x3;
 644        status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
 645                                        PWR_CTL_EN, value, 4);
 646        msleep(10);
 647
 648        value[1] = (u8) 0x0;
 649        status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
 650                                        PWR_CTL_EN, value, 4);
 651        msleep(10);
 652
 653        value[1] = (u8) 0x3;
 654        status = cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
 655                                        PWR_CTL_EN, value, 4);
 656        msleep(10);
 657
 658        status = cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, PWR_CTL_EN,
 659                                 value, 4);
 660
 661        cx231xx_coredbg("reg0x%x=0x%x 0x%x 0x%x 0x%x\n", PWR_CTL_EN,
 662                        value[0], value[1], value[2], value[3]);
 663
 664        return status;
 665}
 666EXPORT_SYMBOL_GPL(cx231xx_demod_reset);
 667int is_fw_load(struct cx231xx *dev)
 668{
 669        return cx231xx_check_fw(dev);
 670}
 671EXPORT_SYMBOL_GPL(is_fw_load);
 672
 673int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
 674{
 675        int errCode = 0;
 676
 677        if (dev->mode == set_mode)
 678                return 0;
 679
 680        if (set_mode == CX231XX_SUSPEND) {
 681                /* Set the chip in power saving mode */
 682                dev->mode = set_mode;
 683        }
 684
 685        /* Resource is locked */
 686        if (dev->mode != CX231XX_SUSPEND)
 687                return -EINVAL;
 688
 689        dev->mode = set_mode;
 690
 691        if (dev->mode == CX231XX_DIGITAL_MODE)/* Set Digital power mode */ {
 692        /* set AGC mode to Digital */
 693                switch (dev->model) {
 694                case CX231XX_BOARD_CNXT_CARRAERA:
 695                case CX231XX_BOARD_CNXT_RDE_250:
 696                case CX231XX_BOARD_CNXT_SHELBY:
 697                case CX231XX_BOARD_CNXT_RDU_250:
 698                errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
 699                        break;
 700                case CX231XX_BOARD_CNXT_RDE_253S:
 701                case CX231XX_BOARD_CNXT_RDU_253S:
 702                case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
 703                        errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
 704                        break;
 705                case CX231XX_BOARD_HAUPPAUGE_EXETER:
 706                case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
 707                        errCode = cx231xx_set_power_mode(dev,
 708                                                POLARIS_AVMODE_DIGITAL);
 709                        break;
 710                default:
 711                        break;
 712                }
 713        } else/* Set Analog Power mode */ {
 714        /* set AGC mode to Analog */
 715                switch (dev->model) {
 716                case CX231XX_BOARD_CNXT_CARRAERA:
 717                case CX231XX_BOARD_CNXT_RDE_250:
 718                case CX231XX_BOARD_CNXT_SHELBY:
 719                case CX231XX_BOARD_CNXT_RDU_250:
 720                errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
 721                        break;
 722                case CX231XX_BOARD_CNXT_RDE_253S:
 723                case CX231XX_BOARD_CNXT_RDU_253S:
 724                case CX231XX_BOARD_HAUPPAUGE_EXETER:
 725                case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
 726                case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
 727                case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
 728                case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
 729                        errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
 730                        break;
 731                default:
 732                        break;
 733                }
 734        }
 735
 736        if (errCode < 0) {
 737                dev_err(dev->dev, "Failed to set devmode to %s: error: %i",
 738                        dev->mode == CX231XX_DIGITAL_MODE ? "digital" : "analog",
 739                        errCode);
 740                return errCode;
 741        }
 742
 743        return 0;
 744}
 745EXPORT_SYMBOL_GPL(cx231xx_set_mode);
 746
 747int cx231xx_ep5_bulkout(struct cx231xx *dev, u8 *firmware, u16 size)
 748{
 749        int errCode = 0;
 750        int actlen = -1;
 751        int ret = -ENOMEM;
 752        u32 *buffer;
 753
 754        buffer = kzalloc(4096, GFP_KERNEL);
 755        if (buffer == NULL)
 756                return -ENOMEM;
 757        memcpy(&buffer[0], firmware, 4096);
 758
 759        ret = usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 5),
 760                        buffer, 4096, &actlen, 2000);
 761
 762        if (ret)
 763                dev_err(dev->dev,
 764                        "bulk message failed: %d (%d/%d)", ret,
 765                        size, actlen);
 766        else {
 767                errCode = actlen != size ? -1 : 0;
 768        }
 769        kfree(buffer);
 770        return errCode;
 771}
 772
 773/*****************************************************************
 774*                URB Streaming functions                         *
 775******************************************************************/
 776
 777/*
 778 * IRQ callback, called by URB callback
 779 */
 780static void cx231xx_isoc_irq_callback(struct urb *urb)
 781{
 782        struct cx231xx_dmaqueue *dma_q = urb->context;
 783        struct cx231xx_video_mode *vmode =
 784            container_of(dma_q, struct cx231xx_video_mode, vidq);
 785        struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
 786        unsigned long flags;
 787        int i;
 788
 789        switch (urb->status) {
 790        case 0:         /* success */
 791        case -ETIMEDOUT:        /* NAK */
 792                break;
 793        case -ECONNRESET:       /* kill */
 794        case -ENOENT:
 795        case -ESHUTDOWN:
 796                return;
 797        default:                /* error */
 798                cx231xx_isocdbg("urb completion error %d.\n", urb->status);
 799                break;
 800        }
 801
 802        /* Copy data from URB */
 803        spin_lock_irqsave(&dev->video_mode.slock, flags);
 804        dev->video_mode.isoc_ctl.isoc_copy(dev, urb);
 805        spin_unlock_irqrestore(&dev->video_mode.slock, flags);
 806
 807        /* Reset urb buffers */
 808        for (i = 0; i < urb->number_of_packets; i++) {
 809                urb->iso_frame_desc[i].status = 0;
 810                urb->iso_frame_desc[i].actual_length = 0;
 811        }
 812
 813        urb->status = usb_submit_urb(urb, GFP_ATOMIC);
 814        if (urb->status) {
 815                cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
 816                                urb->status);
 817        }
 818}
 819/*****************************************************************
 820*                URB Streaming functions                         *
 821******************************************************************/
 822
 823/*
 824 * IRQ callback, called by URB callback
 825 */
 826static void cx231xx_bulk_irq_callback(struct urb *urb)
 827{
 828        struct cx231xx_dmaqueue *dma_q = urb->context;
 829        struct cx231xx_video_mode *vmode =
 830            container_of(dma_q, struct cx231xx_video_mode, vidq);
 831        struct cx231xx *dev = container_of(vmode, struct cx231xx, video_mode);
 832        unsigned long flags;
 833
 834        switch (urb->status) {
 835        case 0:         /* success */
 836        case -ETIMEDOUT:        /* NAK */
 837                break;
 838        case -ECONNRESET:       /* kill */
 839        case -ENOENT:
 840        case -ESHUTDOWN:
 841                return;
 842        case -EPIPE:            /* stall */
 843                cx231xx_isocdbg("urb completion error - device is stalled.\n");
 844                return;
 845        default:                /* error */
 846                cx231xx_isocdbg("urb completion error %d.\n", urb->status);
 847                break;
 848        }
 849
 850        /* Copy data from URB */
 851        spin_lock_irqsave(&dev->video_mode.slock, flags);
 852        dev->video_mode.bulk_ctl.bulk_copy(dev, urb);
 853        spin_unlock_irqrestore(&dev->video_mode.slock, flags);
 854
 855        /* Reset urb buffers */
 856        urb->status = usb_submit_urb(urb, GFP_ATOMIC);
 857        if (urb->status) {
 858                cx231xx_isocdbg("urb resubmit failed (error=%i)\n",
 859                                urb->status);
 860        }
 861}
 862/*
 863 * Stop and Deallocate URBs
 864 */
 865void cx231xx_uninit_isoc(struct cx231xx *dev)
 866{
 867        struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
 868        struct urb *urb;
 869        int i;
 870        bool broken_pipe = false;
 871
 872        cx231xx_isocdbg("cx231xx: called cx231xx_uninit_isoc\n");
 873
 874        dev->video_mode.isoc_ctl.nfields = -1;
 875        for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
 876                urb = dev->video_mode.isoc_ctl.urb[i];
 877                if (urb) {
 878                        if (!irqs_disabled())
 879                                usb_kill_urb(urb);
 880                        else
 881                                usb_unlink_urb(urb);
 882
 883                        if (dev->video_mode.isoc_ctl.transfer_buffer[i]) {
 884                                usb_free_coherent(dev->udev,
 885                                                  urb->transfer_buffer_length,
 886                                                  dev->video_mode.isoc_ctl.
 887                                                  transfer_buffer[i],
 888                                                  urb->transfer_dma);
 889                        }
 890                        if (urb->status == -EPIPE) {
 891                                broken_pipe = true;
 892                        }
 893                        usb_free_urb(urb);
 894                        dev->video_mode.isoc_ctl.urb[i] = NULL;
 895                }
 896                dev->video_mode.isoc_ctl.transfer_buffer[i] = NULL;
 897        }
 898
 899        if (broken_pipe) {
 900                cx231xx_isocdbg("Reset endpoint to recover broken pipe.");
 901                usb_reset_endpoint(dev->udev, dev->video_mode.end_point_addr);
 902        }
 903        kfree(dev->video_mode.isoc_ctl.urb);
 904        kfree(dev->video_mode.isoc_ctl.transfer_buffer);
 905        kfree(dma_q->p_left_data);
 906
 907        dev->video_mode.isoc_ctl.urb = NULL;
 908        dev->video_mode.isoc_ctl.transfer_buffer = NULL;
 909        dev->video_mode.isoc_ctl.num_bufs = 0;
 910        dma_q->p_left_data = NULL;
 911
 912        if (dev->mode_tv == 0)
 913                cx231xx_capture_start(dev, 0, Raw_Video);
 914        else
 915                cx231xx_capture_start(dev, 0, TS1_serial_mode);
 916
 917
 918}
 919EXPORT_SYMBOL_GPL(cx231xx_uninit_isoc);
 920
 921/*
 922 * Stop and Deallocate URBs
 923 */
 924void cx231xx_uninit_bulk(struct cx231xx *dev)
 925{
 926        struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
 927        struct urb *urb;
 928        int i;
 929        bool broken_pipe = false;
 930
 931        cx231xx_isocdbg("cx231xx: called cx231xx_uninit_bulk\n");
 932
 933        dev->video_mode.bulk_ctl.nfields = -1;
 934        for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
 935                urb = dev->video_mode.bulk_ctl.urb[i];
 936                if (urb) {
 937                        if (!irqs_disabled())
 938                                usb_kill_urb(urb);
 939                        else
 940                                usb_unlink_urb(urb);
 941
 942                        if (dev->video_mode.bulk_ctl.transfer_buffer[i]) {
 943                                usb_free_coherent(dev->udev,
 944                                                urb->transfer_buffer_length,
 945                                                dev->video_mode.bulk_ctl.
 946                                                transfer_buffer[i],
 947                                                urb->transfer_dma);
 948                        }
 949                        if (urb->status == -EPIPE) {
 950                                broken_pipe = true;
 951                        }
 952                        usb_free_urb(urb);
 953                        dev->video_mode.bulk_ctl.urb[i] = NULL;
 954                }
 955                dev->video_mode.bulk_ctl.transfer_buffer[i] = NULL;
 956        }
 957
 958        if (broken_pipe) {
 959                cx231xx_isocdbg("Reset endpoint to recover broken pipe.");
 960                usb_reset_endpoint(dev->udev, dev->video_mode.end_point_addr);
 961        }
 962        kfree(dev->video_mode.bulk_ctl.urb);
 963        kfree(dev->video_mode.bulk_ctl.transfer_buffer);
 964        kfree(dma_q->p_left_data);
 965
 966        dev->video_mode.bulk_ctl.urb = NULL;
 967        dev->video_mode.bulk_ctl.transfer_buffer = NULL;
 968        dev->video_mode.bulk_ctl.num_bufs = 0;
 969        dma_q->p_left_data = NULL;
 970
 971        if (dev->mode_tv == 0)
 972                cx231xx_capture_start(dev, 0, Raw_Video);
 973        else
 974                cx231xx_capture_start(dev, 0, TS1_serial_mode);
 975
 976
 977}
 978EXPORT_SYMBOL_GPL(cx231xx_uninit_bulk);
 979
 980/*
 981 * Allocate URBs and start IRQ
 982 */
 983int cx231xx_init_isoc(struct cx231xx *dev, int max_packets,
 984                      int num_bufs, int max_pkt_size,
 985                      int (*isoc_copy) (struct cx231xx *dev, struct urb *urb))
 986{
 987        struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
 988        int i;
 989        int sb_size, pipe;
 990        struct urb *urb;
 991        int j, k;
 992        int rc;
 993
 994        /* De-allocates all pending stuff */
 995        cx231xx_uninit_isoc(dev);
 996
 997        dma_q->p_left_data = kzalloc(4096, GFP_KERNEL);
 998        if (dma_q->p_left_data == NULL)
 999                return -ENOMEM;
1000
1001        dev->video_mode.isoc_ctl.isoc_copy = isoc_copy;
1002        dev->video_mode.isoc_ctl.num_bufs = num_bufs;
1003        dma_q->pos = 0;
1004        dma_q->is_partial_line = 0;
1005        dma_q->last_sav = 0;
1006        dma_q->current_field = -1;
1007        dma_q->field1_done = 0;
1008        dma_q->lines_per_field = dev->height / 2;
1009        dma_q->bytes_left_in_line = dev->width << 1;
1010        dma_q->lines_completed = 0;
1011        dma_q->mpeg_buffer_done = 0;
1012        dma_q->left_data_count = 0;
1013        dma_q->mpeg_buffer_completed = 0;
1014        dma_q->add_ps_package_head = CX231XX_NEED_ADD_PS_PACKAGE_HEAD;
1015        dma_q->ps_head[0] = 0x00;
1016        dma_q->ps_head[1] = 0x00;
1017        dma_q->ps_head[2] = 0x01;
1018        dma_q->ps_head[3] = 0xBA;
1019        for (i = 0; i < 8; i++)
1020                dma_q->partial_buf[i] = 0;
1021
1022        dev->video_mode.isoc_ctl.urb =
1023            kcalloc(num_bufs, sizeof(void *), GFP_KERNEL);
1024        if (!dev->video_mode.isoc_ctl.urb) {
1025                dev_err(dev->dev,
1026                        "cannot alloc memory for usb buffers\n");
1027                return -ENOMEM;
1028        }
1029
1030        dev->video_mode.isoc_ctl.transfer_buffer =
1031            kcalloc(num_bufs, sizeof(void *), GFP_KERNEL);
1032        if (!dev->video_mode.isoc_ctl.transfer_buffer) {
1033                dev_err(dev->dev,
1034                        "cannot allocate memory for usbtransfer\n");
1035                kfree(dev->video_mode.isoc_ctl.urb);
1036                return -ENOMEM;
1037        }
1038
1039        dev->video_mode.isoc_ctl.max_pkt_size = max_pkt_size;
1040        dev->video_mode.isoc_ctl.buf = NULL;
1041
1042        sb_size = max_packets * dev->video_mode.isoc_ctl.max_pkt_size;
1043
1044        if (dev->mode_tv == 1)
1045                dev->video_mode.end_point_addr = 0x81;
1046        else
1047                dev->video_mode.end_point_addr = 0x84;
1048
1049
1050        /* allocate urbs and transfer buffers */
1051        for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1052                urb = usb_alloc_urb(max_packets, GFP_KERNEL);
1053                if (!urb) {
1054                        cx231xx_uninit_isoc(dev);
1055                        return -ENOMEM;
1056                }
1057                dev->video_mode.isoc_ctl.urb[i] = urb;
1058
1059                dev->video_mode.isoc_ctl.transfer_buffer[i] =
1060                    usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1061                                       &urb->transfer_dma);
1062                if (!dev->video_mode.isoc_ctl.transfer_buffer[i]) {
1063                        dev_err(dev->dev,
1064                                "unable to allocate %i bytes for transfer buffer %i\n",
1065                                sb_size, i);
1066                        cx231xx_uninit_isoc(dev);
1067                        return -ENOMEM;
1068                }
1069                memset(dev->video_mode.isoc_ctl.transfer_buffer[i], 0, sb_size);
1070
1071                pipe =
1072                    usb_rcvisocpipe(dev->udev, dev->video_mode.end_point_addr);
1073
1074                usb_fill_int_urb(urb, dev->udev, pipe,
1075                                 dev->video_mode.isoc_ctl.transfer_buffer[i],
1076                                 sb_size, cx231xx_isoc_irq_callback, dma_q, 1);
1077
1078                urb->number_of_packets = max_packets;
1079                urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
1080
1081                k = 0;
1082                for (j = 0; j < max_packets; j++) {
1083                        urb->iso_frame_desc[j].offset = k;
1084                        urb->iso_frame_desc[j].length =
1085                            dev->video_mode.isoc_ctl.max_pkt_size;
1086                        k += dev->video_mode.isoc_ctl.max_pkt_size;
1087                }
1088        }
1089
1090        init_waitqueue_head(&dma_q->wq);
1091
1092        /* submit urbs and enables IRQ */
1093        for (i = 0; i < dev->video_mode.isoc_ctl.num_bufs; i++) {
1094                rc = usb_submit_urb(dev->video_mode.isoc_ctl.urb[i],
1095                                    GFP_ATOMIC);
1096                if (rc) {
1097                        dev_err(dev->dev,
1098                                "submit of urb %i failed (error=%i)\n", i,
1099                                rc);
1100                        cx231xx_uninit_isoc(dev);
1101                        return rc;
1102                }
1103        }
1104
1105        if (dev->mode_tv == 0)
1106                cx231xx_capture_start(dev, 1, Raw_Video);
1107        else
1108                cx231xx_capture_start(dev, 1, TS1_serial_mode);
1109
1110        return 0;
1111}
1112EXPORT_SYMBOL_GPL(cx231xx_init_isoc);
1113
1114/*
1115 * Allocate URBs and start IRQ
1116 */
1117int cx231xx_init_bulk(struct cx231xx *dev, int max_packets,
1118                      int num_bufs, int max_pkt_size,
1119                      int (*bulk_copy) (struct cx231xx *dev, struct urb *urb))
1120{
1121        struct cx231xx_dmaqueue *dma_q = &dev->video_mode.vidq;
1122        int i;
1123        int sb_size, pipe;
1124        struct urb *urb;
1125        int rc;
1126
1127        dev->video_input = dev->video_input > 2 ? 2 : dev->video_input;
1128
1129        cx231xx_coredbg("Setting Video mux to %d\n", dev->video_input);
1130
1131        video_mux(dev, dev->video_input);
1132
1133        /* De-allocates all pending stuff */
1134        cx231xx_uninit_bulk(dev);
1135
1136        dev->video_mode.bulk_ctl.bulk_copy = bulk_copy;
1137        dev->video_mode.bulk_ctl.num_bufs = num_bufs;
1138        dma_q->pos = 0;
1139        dma_q->is_partial_line = 0;
1140        dma_q->last_sav = 0;
1141        dma_q->current_field = -1;
1142        dma_q->field1_done = 0;
1143        dma_q->lines_per_field = dev->height / 2;
1144        dma_q->bytes_left_in_line = dev->width << 1;
1145        dma_q->lines_completed = 0;
1146        dma_q->mpeg_buffer_done = 0;
1147        dma_q->left_data_count = 0;
1148        dma_q->mpeg_buffer_completed = 0;
1149        dma_q->ps_head[0] = 0x00;
1150        dma_q->ps_head[1] = 0x00;
1151        dma_q->ps_head[2] = 0x01;
1152        dma_q->ps_head[3] = 0xBA;
1153        for (i = 0; i < 8; i++)
1154                dma_q->partial_buf[i] = 0;
1155
1156        dev->video_mode.bulk_ctl.urb =
1157            kcalloc(num_bufs, sizeof(void *), GFP_KERNEL);
1158        if (!dev->video_mode.bulk_ctl.urb) {
1159                dev_err(dev->dev,
1160                        "cannot alloc memory for usb buffers\n");
1161                return -ENOMEM;
1162        }
1163
1164        dev->video_mode.bulk_ctl.transfer_buffer =
1165            kcalloc(num_bufs, sizeof(void *), GFP_KERNEL);
1166        if (!dev->video_mode.bulk_ctl.transfer_buffer) {
1167                dev_err(dev->dev,
1168                        "cannot allocate memory for usbtransfer\n");
1169                kfree(dev->video_mode.bulk_ctl.urb);
1170                return -ENOMEM;
1171        }
1172
1173        dev->video_mode.bulk_ctl.max_pkt_size = max_pkt_size;
1174        dev->video_mode.bulk_ctl.buf = NULL;
1175
1176        sb_size = max_packets * dev->video_mode.bulk_ctl.max_pkt_size;
1177
1178        if (dev->mode_tv == 1)
1179                dev->video_mode.end_point_addr = 0x81;
1180        else
1181                dev->video_mode.end_point_addr = 0x84;
1182
1183
1184        /* allocate urbs and transfer buffers */
1185        for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1186                urb = usb_alloc_urb(0, GFP_KERNEL);
1187                if (!urb) {
1188                        cx231xx_uninit_bulk(dev);
1189                        return -ENOMEM;
1190                }
1191                dev->video_mode.bulk_ctl.urb[i] = urb;
1192                urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
1193
1194                dev->video_mode.bulk_ctl.transfer_buffer[i] =
1195                    usb_alloc_coherent(dev->udev, sb_size, GFP_KERNEL,
1196                                     &urb->transfer_dma);
1197                if (!dev->video_mode.bulk_ctl.transfer_buffer[i]) {
1198                        dev_err(dev->dev,
1199                                "unable to allocate %i bytes for transfer buffer %i\n",
1200                                sb_size, i);
1201                        cx231xx_uninit_bulk(dev);
1202                        return -ENOMEM;
1203                }
1204                memset(dev->video_mode.bulk_ctl.transfer_buffer[i], 0, sb_size);
1205
1206                pipe = usb_rcvbulkpipe(dev->udev,
1207                                 dev->video_mode.end_point_addr);
1208                usb_fill_bulk_urb(urb, dev->udev, pipe,
1209                                  dev->video_mode.bulk_ctl.transfer_buffer[i],
1210                                  sb_size, cx231xx_bulk_irq_callback, dma_q);
1211        }
1212
1213        /* clear halt */
1214        rc = usb_clear_halt(dev->udev, dev->video_mode.bulk_ctl.urb[0]->pipe);
1215        if (rc < 0) {
1216                dev_err(dev->dev,
1217                        "failed to clear USB bulk endpoint stall/halt condition (error=%i)\n",
1218                        rc);
1219                cx231xx_uninit_bulk(dev);
1220                return rc;
1221        }
1222
1223        init_waitqueue_head(&dma_q->wq);
1224
1225        /* submit urbs and enables IRQ */
1226        for (i = 0; i < dev->video_mode.bulk_ctl.num_bufs; i++) {
1227                rc = usb_submit_urb(dev->video_mode.bulk_ctl.urb[i],
1228                                    GFP_ATOMIC);
1229                if (rc) {
1230                        dev_err(dev->dev,
1231                                "submit of urb %i failed (error=%i)\n", i, rc);
1232                        cx231xx_uninit_bulk(dev);
1233                        return rc;
1234                }
1235        }
1236
1237        if (dev->mode_tv == 0)
1238                cx231xx_capture_start(dev, 1, Raw_Video);
1239        else
1240                cx231xx_capture_start(dev, 1, TS1_serial_mode);
1241
1242        return 0;
1243}
1244EXPORT_SYMBOL_GPL(cx231xx_init_bulk);
1245void cx231xx_stop_TS1(struct cx231xx *dev)
1246{
1247        u8 val[4] = { 0, 0, 0, 0 };
1248
1249        val[0] = 0x00;
1250        val[1] = 0x03;
1251        val[2] = 0x00;
1252        val[3] = 0x00;
1253        cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1254                        TS_MODE_REG, val, 4);
1255
1256        val[0] = 0x00;
1257        val[1] = 0x70;
1258        val[2] = 0x04;
1259        val[3] = 0x00;
1260        cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1261                        TS1_CFG_REG, val, 4);
1262}
1263/* EXPORT_SYMBOL_GPL(cx231xx_stop_TS1); */
1264void cx231xx_start_TS1(struct cx231xx *dev)
1265{
1266        u8 val[4] = { 0, 0, 0, 0 };
1267
1268        val[0] = 0x03;
1269        val[1] = 0x03;
1270        val[2] = 0x00;
1271        val[3] = 0x00;
1272        cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1273                        TS_MODE_REG, val, 4);
1274
1275        val[0] = 0x04;
1276        val[1] = 0xA3;
1277        val[2] = 0x3B;
1278        val[3] = 0x00;
1279        cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER,
1280                        TS1_CFG_REG, val, 4);
1281}
1282/* EXPORT_SYMBOL_GPL(cx231xx_start_TS1); */
1283/*****************************************************************
1284*             Device Init/UnInit functions                       *
1285******************************************************************/
1286int cx231xx_dev_init(struct cx231xx *dev)
1287{
1288        int errCode = 0;
1289
1290        /* Initialize I2C bus */
1291
1292        /* External Master 1 Bus */
1293        dev->i2c_bus[0].nr = 0;
1294        dev->i2c_bus[0].dev = dev;
1295        dev->i2c_bus[0].i2c_period = I2C_SPEED_100K;    /* 100 KHz */
1296        dev->i2c_bus[0].i2c_nostop = 0;
1297        dev->i2c_bus[0].i2c_reserve = 0;
1298        dev->i2c_bus[0].i2c_rc = -ENODEV;
1299
1300        /* External Master 2 Bus */
1301        dev->i2c_bus[1].nr = 1;
1302        dev->i2c_bus[1].dev = dev;
1303        dev->i2c_bus[1].i2c_period = I2C_SPEED_100K;    /* 100 KHz */
1304        dev->i2c_bus[1].i2c_nostop = 0;
1305        dev->i2c_bus[1].i2c_reserve = 0;
1306        dev->i2c_bus[1].i2c_rc = -ENODEV;
1307
1308        /* Internal Master 3 Bus */
1309        dev->i2c_bus[2].nr = 2;
1310        dev->i2c_bus[2].dev = dev;
1311        dev->i2c_bus[2].i2c_period = I2C_SPEED_100K;    /* 100kHz */
1312        dev->i2c_bus[2].i2c_nostop = 0;
1313        dev->i2c_bus[2].i2c_reserve = 0;
1314        dev->i2c_bus[2].i2c_rc = -ENODEV;
1315
1316        /* register I2C buses */
1317        errCode = cx231xx_i2c_register(&dev->i2c_bus[0]);
1318        if (errCode < 0)
1319                return errCode;
1320        errCode = cx231xx_i2c_register(&dev->i2c_bus[1]);
1321        if (errCode < 0)
1322                return errCode;
1323        errCode = cx231xx_i2c_register(&dev->i2c_bus[2]);
1324        if (errCode < 0)
1325                return errCode;
1326
1327        errCode = cx231xx_i2c_mux_create(dev);
1328        if (errCode < 0) {
1329                dev_err(dev->dev,
1330                        "%s: Failed to create I2C mux\n", __func__);
1331                return errCode;
1332        }
1333        errCode = cx231xx_i2c_mux_register(dev, 0);
1334        if (errCode < 0)
1335                return errCode;
1336
1337        errCode = cx231xx_i2c_mux_register(dev, 1);
1338        if (errCode < 0)
1339                return errCode;
1340
1341        /* scan the real bus segments in the order of physical port numbers */
1342        cx231xx_do_i2c_scan(dev, I2C_0);
1343        cx231xx_do_i2c_scan(dev, I2C_1_MUX_1);
1344        cx231xx_do_i2c_scan(dev, I2C_2);
1345        cx231xx_do_i2c_scan(dev, I2C_1_MUX_3);
1346
1347        /* init hardware */
1348        /* Note : with out calling set power mode function,
1349        afe can not be set up correctly */
1350        if (dev->board.external_av) {
1351                errCode = cx231xx_set_power_mode(dev,
1352                                 POLARIS_AVMODE_ENXTERNAL_AV);
1353                if (errCode < 0) {
1354                        dev_err(dev->dev,
1355                                "%s: Failed to set Power - errCode [%d]!\n",
1356                                __func__, errCode);
1357                        return errCode;
1358                }
1359        } else {
1360                errCode = cx231xx_set_power_mode(dev,
1361                                 POLARIS_AVMODE_ANALOGT_TV);
1362                if (errCode < 0) {
1363                        dev_err(dev->dev,
1364                                "%s: Failed to set Power - errCode [%d]!\n",
1365                                __func__, errCode);
1366                        return errCode;
1367                }
1368        }
1369
1370        /* reset the Tuner, if it is a Xceive tuner */
1371        if ((dev->board.tuner_type == TUNER_XC5000) ||
1372            (dev->board.tuner_type == TUNER_XC2028))
1373                        cx231xx_gpio_set(dev, dev->board.tuner_gpio);
1374
1375        /* initialize Colibri block */
1376        errCode = cx231xx_afe_init_super_block(dev, 0x23c);
1377        if (errCode < 0) {
1378                dev_err(dev->dev,
1379                        "%s: cx231xx_afe init super block - errCode [%d]!\n",
1380                        __func__, errCode);
1381                return errCode;
1382        }
1383        errCode = cx231xx_afe_init_channels(dev);
1384        if (errCode < 0) {
1385                dev_err(dev->dev,
1386                        "%s: cx231xx_afe init channels - errCode [%d]!\n",
1387                        __func__, errCode);
1388                return errCode;
1389        }
1390
1391        /* Set DIF in By pass mode */
1392        errCode = cx231xx_dif_set_standard(dev, DIF_USE_BASEBAND);
1393        if (errCode < 0) {
1394                dev_err(dev->dev,
1395                        "%s: cx231xx_dif set to By pass mode - errCode [%d]!\n",
1396                        __func__, errCode);
1397                return errCode;
1398        }
1399
1400        /* I2S block related functions */
1401        errCode = cx231xx_i2s_blk_initialize(dev);
1402        if (errCode < 0) {
1403                dev_err(dev->dev,
1404                        "%s: cx231xx_i2s block initialize - errCode [%d]!\n",
1405                        __func__, errCode);
1406                return errCode;
1407        }
1408
1409        /* init control pins */
1410        errCode = cx231xx_init_ctrl_pin_status(dev);
1411        if (errCode < 0) {
1412                dev_err(dev->dev,
1413                        "%s: cx231xx_init ctrl pins - errCode [%d]!\n",
1414                        __func__, errCode);
1415                return errCode;
1416        }
1417
1418        /* set AGC mode to Analog */
1419        switch (dev->model) {
1420        case CX231XX_BOARD_CNXT_CARRAERA:
1421        case CX231XX_BOARD_CNXT_RDE_250:
1422        case CX231XX_BOARD_CNXT_SHELBY:
1423        case CX231XX_BOARD_CNXT_RDU_250:
1424        errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
1425                break;
1426        case CX231XX_BOARD_CNXT_RDE_253S:
1427        case CX231XX_BOARD_CNXT_RDU_253S:
1428        case CX231XX_BOARD_HAUPPAUGE_EXETER:
1429        case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
1430        case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
1431        case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
1432        case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
1433        errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 0);
1434                break;
1435        default:
1436                break;
1437        }
1438        if (errCode < 0) {
1439                dev_err(dev->dev,
1440                        "%s: cx231xx_AGC mode to Analog - errCode [%d]!\n",
1441                        __func__, errCode);
1442                return errCode;
1443        }
1444
1445        /* set all alternate settings to zero initially */
1446        cx231xx_set_alt_setting(dev, INDEX_VIDEO, 0);
1447        cx231xx_set_alt_setting(dev, INDEX_VANC, 0);
1448        cx231xx_set_alt_setting(dev, INDEX_HANC, 0);
1449        if (dev->board.has_dvb)
1450                cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
1451
1452        errCode = 0;
1453        return errCode;
1454}
1455EXPORT_SYMBOL_GPL(cx231xx_dev_init);
1456
1457void cx231xx_dev_uninit(struct cx231xx *dev)
1458{
1459        /* Un Initialize I2C bus */
1460        cx231xx_i2c_mux_unregister(dev);
1461        cx231xx_i2c_unregister(&dev->i2c_bus[2]);
1462        cx231xx_i2c_unregister(&dev->i2c_bus[1]);
1463        cx231xx_i2c_unregister(&dev->i2c_bus[0]);
1464}
1465EXPORT_SYMBOL_GPL(cx231xx_dev_uninit);
1466
1467/*****************************************************************
1468*              G P I O related functions                         *
1469******************************************************************/
1470int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val,
1471                          u8 len, u8 request, u8 direction)
1472{
1473        int status = 0;
1474        struct VENDOR_REQUEST_IN ven_req;
1475
1476        /* Set wValue */
1477        ven_req.wValue = (u16) (gpio_bit >> 16 & 0xffff);
1478
1479        /* set request */
1480        if (!request) {
1481                if (direction)
1482                        ven_req.bRequest = VRT_GET_GPIO;        /* 0x9 gpio */
1483                else
1484                        ven_req.bRequest = VRT_SET_GPIO;        /* 0x8 gpio */
1485        } else {
1486                if (direction)
1487                        ven_req.bRequest = VRT_GET_GPIE;        /* 0xb gpie */
1488                else
1489                        ven_req.bRequest = VRT_SET_GPIE;        /* 0xa gpie */
1490        }
1491
1492        /* set index value */
1493        ven_req.wIndex = (u16) (gpio_bit & 0xffff);
1494
1495        /* set wLength value */
1496        ven_req.wLength = len;
1497
1498        /* set bData value */
1499        ven_req.bData = 0;
1500
1501        /* set the buffer for read / write */
1502        ven_req.pBuff = gpio_val;
1503
1504        /* set the direction */
1505        if (direction) {
1506                ven_req.direction = USB_DIR_IN;
1507                memset(ven_req.pBuff, 0x00, ven_req.wLength);
1508        } else
1509                ven_req.direction = USB_DIR_OUT;
1510
1511
1512        /* call common vendor command request */
1513        status = cx231xx_send_vendor_cmd(dev, &ven_req);
1514        if (status < 0) {
1515                dev_err(dev->dev, "%s: failed with status -%d\n",
1516                        __func__, status);
1517        }
1518
1519        return status;
1520}
1521EXPORT_SYMBOL_GPL(cx231xx_send_gpio_cmd);
1522
1523/*****************************************************************
1524 *    C O N T R O L - Register R E A D / W R I T E functions     *
1525 *****************************************************************/
1526int cx231xx_mode_register(struct cx231xx *dev, u16 address, u32 mode)
1527{
1528        u8 value[4] = { 0x0, 0x0, 0x0, 0x0 };
1529        u32 tmp = 0;
1530        int status = 0;
1531
1532        status =
1533            cx231xx_read_ctrl_reg(dev, VRT_GET_REGISTER, address, value, 4);
1534        if (status < 0)
1535                return status;
1536
1537        tmp = le32_to_cpu(*((__le32 *) value));
1538        tmp |= mode;
1539
1540        value[0] = (u8) tmp;
1541        value[1] = (u8) (tmp >> 8);
1542        value[2] = (u8) (tmp >> 16);
1543        value[3] = (u8) (tmp >> 24);
1544
1545        status =
1546            cx231xx_write_ctrl_reg(dev, VRT_SET_REGISTER, address, value, 4);
1547
1548        return status;
1549}
1550
1551/*****************************************************************
1552 *            I 2 C Internal C O N T R O L   functions           *
1553 *****************************************************************/
1554int cx231xx_read_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1555                          u8 saddr_len, u32 *data, u8 data_len, int master)
1556{
1557        int status = 0;
1558        struct cx231xx_i2c_xfer_data req_data;
1559        u8 value[64] = "0";
1560
1561        if (saddr_len == 0)
1562                saddr = 0;
1563        else if (saddr_len == 1)
1564                saddr &= 0xff;
1565
1566        /* prepare xfer_data struct */
1567        req_data.dev_addr = dev_addr >> 1;
1568        req_data.direction = I2C_M_RD;
1569        req_data.saddr_len = saddr_len;
1570        req_data.saddr_dat = saddr;
1571        req_data.buf_size = data_len;
1572        req_data.p_buffer = (u8 *) value;
1573
1574        /* usb send command */
1575        if (master == 0)
1576                status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1577                                         &req_data);
1578        else if (master == 1)
1579                status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1580                                         &req_data);
1581        else if (master == 2)
1582                status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1583                                         &req_data);
1584
1585        if (status >= 0) {
1586                /* Copy the data read back to main buffer */
1587                if (data_len == 1)
1588                        *data = value[0];
1589                else if (data_len == 4)
1590                        *data =
1591                            value[0] | value[1] << 8 | value[2] << 16 | value[3]
1592                            << 24;
1593                else if (data_len > 4)
1594                        *data = value[saddr];
1595        }
1596
1597        return status;
1598}
1599
1600int cx231xx_write_i2c_master(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1601                           u8 saddr_len, u32 data, u8 data_len, int master)
1602{
1603        int status = 0;
1604        u8 value[4] = { 0, 0, 0, 0 };
1605        struct cx231xx_i2c_xfer_data req_data;
1606
1607        value[0] = (u8) data;
1608        value[1] = (u8) (data >> 8);
1609        value[2] = (u8) (data >> 16);
1610        value[3] = (u8) (data >> 24);
1611
1612        if (saddr_len == 0)
1613                saddr = 0;
1614        else if (saddr_len == 1)
1615                saddr &= 0xff;
1616
1617        /* prepare xfer_data struct */
1618        req_data.dev_addr = dev_addr >> 1;
1619        req_data.direction = 0;
1620        req_data.saddr_len = saddr_len;
1621        req_data.saddr_dat = saddr;
1622        req_data.buf_size = data_len;
1623        req_data.p_buffer = value;
1624
1625        /* usb send command */
1626        if (master == 0)
1627                status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0],
1628                                 &req_data);
1629        else if (master == 1)
1630                status = dev->cx231xx_send_usb_command(&dev->i2c_bus[1],
1631                                 &req_data);
1632        else if (master == 2)
1633                status = dev->cx231xx_send_usb_command(&dev->i2c_bus[2],
1634                                 &req_data);
1635
1636        return status;
1637}
1638
1639int cx231xx_read_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1640                          u8 saddr_len, u32 *data, u8 data_len)
1641{
1642        int status = 0;
1643        struct cx231xx_i2c_xfer_data req_data;
1644        u8 value[4] = { 0, 0, 0, 0 };
1645
1646        if (saddr_len == 0)
1647                saddr = 0;
1648        else if (saddr_len == 1)
1649                saddr &= 0xff;
1650
1651        /* prepare xfer_data struct */
1652        req_data.dev_addr = dev_addr >> 1;
1653        req_data.direction = I2C_M_RD;
1654        req_data.saddr_len = saddr_len;
1655        req_data.saddr_dat = saddr;
1656        req_data.buf_size = data_len;
1657        req_data.p_buffer = (u8 *) value;
1658
1659        /* usb send command */
1660        status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1661
1662        if (status >= 0) {
1663                /* Copy the data read back to main buffer */
1664                if (data_len == 1)
1665                        *data = value[0];
1666                else
1667                        *data =
1668                            value[0] | value[1] << 8 | value[2] << 16 | value[3]
1669                            << 24;
1670        }
1671
1672        return status;
1673}
1674
1675int cx231xx_write_i2c_data(struct cx231xx *dev, u8 dev_addr, u16 saddr,
1676                           u8 saddr_len, u32 data, u8 data_len)
1677{
1678        int status = 0;
1679        u8 value[4] = { 0, 0, 0, 0 };
1680        struct cx231xx_i2c_xfer_data req_data;
1681
1682        value[0] = (u8) data;
1683        value[1] = (u8) (data >> 8);
1684        value[2] = (u8) (data >> 16);
1685        value[3] = (u8) (data >> 24);
1686
1687        if (saddr_len == 0)
1688                saddr = 0;
1689        else if (saddr_len == 1)
1690                saddr &= 0xff;
1691
1692        /* prepare xfer_data struct */
1693        req_data.dev_addr = dev_addr >> 1;
1694        req_data.direction = 0;
1695        req_data.saddr_len = saddr_len;
1696        req_data.saddr_dat = saddr;
1697        req_data.buf_size = data_len;
1698        req_data.p_buffer = value;
1699
1700        /* usb send command */
1701        status = dev->cx231xx_send_usb_command(&dev->i2c_bus[0], &req_data);
1702
1703        return status;
1704}
1705
1706int cx231xx_reg_mask_write(struct cx231xx *dev, u8 dev_addr, u8 size,
1707                           u16 register_address, u8 bit_start, u8 bit_end,
1708                           u32 value)
1709{
1710        int status = 0;
1711        u32 tmp;
1712        u32 mask = 0;
1713        int i;
1714
1715        if (bit_start > (size - 1) || bit_end > (size - 1))
1716                return -1;
1717
1718        if (size == 8) {
1719                status =
1720                    cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1721                                          &tmp, 1);
1722        } else {
1723                status =
1724                    cx231xx_read_i2c_data(dev, dev_addr, register_address, 2,
1725                                          &tmp, 4);
1726        }
1727
1728        if (status < 0)
1729                return status;
1730
1731        mask = 1 << bit_end;
1732        for (i = bit_end; i > bit_start && i > 0; i--)
1733                mask = mask + (1 << (i - 1));
1734
1735        value <<= bit_start;
1736
1737        if (size == 8) {
1738                tmp &= ~mask;
1739                tmp |= value;
1740                tmp &= 0xff;
1741                status =
1742                    cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1743                                           tmp, 1);
1744        } else {
1745                tmp &= ~mask;
1746                tmp |= value;
1747                status =
1748                    cx231xx_write_i2c_data(dev, dev_addr, register_address, 2,
1749                                           tmp, 4);
1750        }
1751
1752        return status;
1753}
1754
1755int cx231xx_read_modify_write_i2c_dword(struct cx231xx *dev, u8 dev_addr,
1756                                        u16 saddr, u32 mask, u32 value)
1757{
1758        u32 temp;
1759        int status = 0;
1760
1761        status = cx231xx_read_i2c_data(dev, dev_addr, saddr, 2, &temp, 4);
1762
1763        if (status < 0)
1764                return status;
1765
1766        temp &= ~mask;
1767        temp |= value;
1768
1769        status = cx231xx_write_i2c_data(dev, dev_addr, saddr, 2, temp, 4);
1770
1771        return status;
1772}
1773
1774u32 cx231xx_set_field(u32 field_mask, u32 data)
1775{
1776        u32 temp;
1777
1778        for (temp = field_mask; (temp & 1) == 0; temp >>= 1)
1779                data <<= 1;
1780
1781        return data;
1782}
1783