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